diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..7e3649acc2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab diff --git a/.eslintrc b/.eslintrc new file mode 100755 index 0000000000..b6d3fb664f --- /dev/null +++ b/.eslintrc @@ -0,0 +1,45 @@ +{ + "extends": [ + "eslint-config-egg" + ], + "globals": { + "AMap": true, + "L7": true, + }, + "env": { + "browser": true, + "node": true + }, + "parser": "babel-eslint", + "parserOptions": { + "sourceType": "module" + }, + "plugins": [ + "html" + ], + "rules": { + "no-console": [ + "error", + { + "allow": [ + "warn", + "error" + ] + } + ], + "no-bitwise": [ + 0 + ], + "experimentalDecorators": [ + 0 + ], + "comma-dangle": [ + "error", + "never" + ], + "jsdoc/require-param": 0, + "linebreak-style": [ + 0 + ] + } +} diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100755 index 0000000000..6ed9d91adb --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,24 @@ + + +* **L7 Version**: +* **Platform**: +* **Mini Showcase(like screenshots)**: +* **CodePen Link**: + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100755 index 0000000000..fd86cfc330 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,19 @@ + + +##### Checklist + + +- [ ] `npm test` passes +- [ ] tests and/or benchmarks are included +- [ ] commit message follows commit guidelines + +##### Description of change + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..1dc69bff9f --- /dev/null +++ b/.gitignore @@ -0,0 +1,75 @@ + +# Created by https://www.gitignore.io/api/node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +# typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + + +# End of https://www.gitignore.io/api/node + +lib/ +dist/ + +.DS_Store +public +.cache + +yarn.lock +package-lock.json diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000000..a531dea305 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "singleQuote": true, + "trailingComma": "all", + "arrowParens": "always" +} diff --git a/.storybook/addons.ts b/.storybook/addons.ts new file mode 100644 index 0000000000..06915d6e12 --- /dev/null +++ b/.storybook/addons.ts @@ -0,0 +1,3 @@ +import '@storybook/addon-actions/register'; +import '@storybook/addon-notes/register'; +import '@storybook/addon-storysource/register'; diff --git a/.storybook/config.ts b/.storybook/config.ts new file mode 100644 index 0000000000..e2e73a0586 --- /dev/null +++ b/.storybook/config.ts @@ -0,0 +1,32 @@ +// tslint:disable-next-line:no-submodule-imports +import '!style-loader!css-loader!sass-loader!./iframe.scss'; +import '@storybook/addon-console'; +import { addParameters, configure } from '@storybook/react'; +import { create } from '@storybook/theming'; + +addParameters({ + options: { + isFullscreen: false, + showAddonsPanel: true, + showSearchBox: false, + panelPosition: 'bottom', + hierarchySeparator: /\./, + // hierarchyRootSeparator: /\|/, + enableShortcuts: true, + theme: create({ + base: 'light', + brandTitle: 'L7 POC for new architecture', + brandUrl: 'https://github.com/xiaoiver/L7-POC', + gridCellSize: 12, + }), + }, +}); + +// automatically import all files ending in *.stories.tsx +const req = require.context('../stories', true, /\.stories\.tsx$/); + +function loadStories() { + req.keys().forEach(req); +} + +configure(loadStories, module); diff --git a/.storybook/iframe.scss b/.storybook/iframe.scss new file mode 100644 index 0000000000..fd9c693afd --- /dev/null +++ b/.storybook/iframe.scss @@ -0,0 +1,7 @@ +html, body { + margin: 0; +} + +.dg.ac { + z-index: 999 !important; +} \ No newline at end of file diff --git a/.storybook/l7.css b/.storybook/l7.css new file mode 100644 index 0000000000..ca0e4f1fa9 --- /dev/null +++ b/.storybook/l7.css @@ -0,0 +1,400 @@ +.l7-marker-container { + width:100% +} +.l7-marker { + position: absolute !important; + top: 0; + left: 0; + z-index: 5; +} +.l7-popup-anchor-top, +.l7-popup-anchor-top-left, +.l7-popup-anchor-top-right { + -webkit-flex-direction: column; + flex-direction: column; +} + +.l7-popup-anchor-bottom, +.l7-popup-anchor-bottom-left, +.l7-popup-anchor-bottom-right { + -webkit-flex-direction: column-reverse; + flex-direction: column-reverse; +} + +.l7-popup-anchor-left { + -webkit-flex-direction: row; + flex-direction: row; +} + +.l7-popup-anchor-right { + -webkit-flex-direction: row-reverse; + flex-direction: row-reverse; +} +.l7-popup { + position: absolute; + top: 0; + left: 0; + display: -webkit-flex; + display: flex; + will-change: transform; + pointer-events: none; + z-index: 5; +} +.l7-popup-tip { + width: 0; + height: 0; + border: 10px solid transparent; + z-index: 1; +} +.l7-popup-anchor-top .l7-popup-tip { + -webkit-align-self: center; + align-self: center; + border-top: none; + border-bottom-color: #fff; +} + +.l7-popup-anchor-top-left .l7-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-top: none; + border-left: none; + border-bottom-color: #fff; +} + +.l7-popup-anchor-top-right .l7-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-top: none; + border-right: none; + border-bottom-color: #fff; +} + +.l7-popup-anchor-bottom .l7-popup-tip { + -webkit-align-self: center; + align-self: center; + border-bottom: none; + border-top-color: #fff; +} + +.l7-popup-anchor-bottom-left .l7-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-bottom: none; + border-left: none; + border-top-color: #fff; +} + +.l7-popup-anchor-bottom-right .l7-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-bottom: none; + border-right: none; + border-top-color: #fff; +} + +.l7-popup-anchor-left .l7-popup-tip { + -webkit-align-self: center; + align-self: center; + border-left: none; + border-right-color: #fff; +} + +.l7-popup-anchor-right .l7-popup-tip { + -webkit-align-self: center; + align-self: center; + border-right: none; + border-left-color: #fff; +} + +.l7-popup-close-button { + position: absolute; + right: 0; + top: 0; + border: 0; + padding: 0; + font-size: 25px; + line-height: 20px; + border-radius: 0 3px 0 0; + cursor: pointer; + background-color: transparent; +} + +.l7-popup-close-button:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.l7-popup-content { + position: relative; + background: #fff; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + padding: 10px 10px 15px; + pointer-events: auto; +} + +.l7-popup-anchor-top-left .l7-popup-content { + border-top-left-radius: 0; +} + +.l7-popup-anchor-top-right .l7-popup-content { + border-top-right-radius: 0; +} + +.l7-popup-anchor-bottom-left .l7-popup-content { + border-bottom-left-radius: 0; +} + +.l7-popup-anchor-bottom-right .l7-popup-content { + border-bottom-right-radius: 0; +} + +.l7-popup-track-pointer { + display: none; +} + +.l7-popup-track-pointer * { + pointer-events: none; + user-select: none; +} + +.l7-map:hover .l7-popup-track-pointer { + display: flex; +} + +.l7-map:active .l7-popup-track-pointer { + display: none; +} + +.l7-popup-close-button { + position: absolute; + right: 0; + top: 0; + border: 0; + border-radius: 0 3px 0 0; + cursor: pointer; + background-color: transparent; +} + +.l7-popup-close-button:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.l7-popup-content { + position: relative; + background: #fff; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + padding: 10px 10px 15px; + pointer-events: auto; +} + +/* general toolbar styles */ + +.l7-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.l7-bar a, +.l7-bar a:hover { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; + } +.l7-bar a, +.l7-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.l7-bar a:hover { + background-color: #f4f4f4; + } +.l7-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } +.l7-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; + } +.l7-bar a.l7-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } + + +/* control positioning */ + +.l7-control-container { + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; +} +.l7-control-hide { + display: none; +} +.l7-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } +.l7-top, +.l7-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.l7-top { + top: 0; + } +.l7-right { + right: 0; + } +.l7-bottom { + bottom: 0; + } +.l7-left { + left: 0; + } +.l7-control { + float: left; + clear: both; + } +.l7-right .l7-control { + float: right; + } +.l7-top .l7-control { + margin-top: 10px; + } +.l7-bottom .l7-control { + margin-bottom: 10px; + } +.l7-left .l7-control { + margin-left: 10px; + } +.l7-right .l7-control { + margin-right: 10px; + } + + /* attribution and scale controls */ + +.l7-control-container .l7-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.7); + margin: 0; + } +.l7-control-attribution, +.l7-control-scale-line { + padding: 0 5px; + color: #333; + } +.l7-control-attribution a { + text-decoration: none; + } +.l7-control-attribution a:hover { + text-decoration: underline; + } +.l7-container .l7-control-attribution, +.l7-container .l7-control-scale { + font-size: 11px; + } +.l7-left .l7-control-scale { + margin-left: 5px; + } +.l7-bottom .l7-control-scale { + margin-bottom: 5px; + } +.l7-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + font-size: 11px; + white-space: nowrap; + overflow: hidden; + -moz-box-sizing: border-box; + box-sizing: border-box; + + background: #fff; + background: rgba(255, 255, 255, 0.5); + } +.l7-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + } +.l7-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.l7-touch .l7-control-attribution, +.l7-touch .l7-control-layers, +.l7-touch .l7-bar { + box-shadow: none; + } +.l7-touch .l7-control-layers, +.l7-touch .l7-bar { + border: 2px solid rgba(0,0,0,0.2); + background-clip: padding-box; + } + + + /* layers control */ + +.l7-control-layers { + box-shadow: 0 1px 5px rgba(0,0,0,0.4); + background: #fff; + border-radius: 5px; + } +.l7-control-layers-toggle { + background-image: url(../images/layers.svg); + width: 36px; + height: 36px; + } +.l7-retina .l7-control-layers-toggle { + background-image: url(../images/layers.svg); + background-size: 26px 26px; + } +.l7-touch .l7-control-layers-toggle { + width: 44px; + height: 44px; + } +.l7-control-layers .l7-control-layers-list, +.l7-control-layers-expanded .l7-control-layers-toggle { + display: none; + } +.l7-control-layers-expanded .l7-control-layers-list { + display: block; + position: relative; + } +.l7-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.l7-control-layers-scrollbar { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 5px; + } +.l7-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.l7-control-layers label { + display: block; + } +.l7-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + diff --git a/.storybook/webpack.config.js b/.storybook/webpack.config.js new file mode 100644 index 0000000000..2d3b00e6e0 --- /dev/null +++ b/.storybook/webpack.config.js @@ -0,0 +1,39 @@ +module.exports = ({ config }) => { + + // config.module.rules.push({ + // test: /\.glsl$/, + // loader: 'raw-loader' + // }); + + // config.module.rules.push({ + // test: /\.worker\.(js|ts)$/, + // use: { + // loader: 'worker-loader', + // options: { inline: true, fallback: false } + // } + // }); + + config.module.rules.push({ + test: /\.(ts|tsx)$/, + loader: require.resolve('awesome-typescript-loader'), + }); + + config.module.rules.push({ + test: /\.stories\.tsx?$/, + loaders: [ + { + loader: require.resolve('@storybook/addon-storysource/loader'), + options: { parser: 'typescript' }, + }, + ], + enforce: 'pre', + },{ + test: /\.stories\.css?$/, + use: ['style-loader', 'css-loader'], + }, + ); + + config.resolve.extensions.push('.ts', '.tsx', '.js', '.glsl'); + + return config; +}; diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 0000000000..0a81b4570a --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,7 @@ +{ + "processors": ["stylelint-processor-styled-components"], + "extends": [ + "stylelint-config-standard", + "stylelint-config-styled-components" + ] +} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..bc97a5937e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,12 @@ +sudo: false +language: node_js +node_js: +- '12' +branches: + only: + - next +install: +- yarn install +script: +- yarn test +- yarn coveralls diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..0db3279e44 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000000..7da54ea95c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Alipay.inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000000..d4dd765c88 --- /dev/null +++ b/README.md @@ -0,0 +1,84 @@ +# L7 + +![最近提交](https://badgen.net/github/last-commit/antvis/L7) + +L7 Large-scale WebGL-powered Geospatial data visualization analysis framework + + +<<<<<<< HEAD + + + +======= +>>>>>>> f40e44f... fix(fix): fix +### Installation + +``` + npm install @antv/l7 + +``` + +### Features + +<<<<<<< HEAD + +======= +>>>>>>> f40e44f... fix(fix): fix +### Links + + +## Development + +使用 Yarn Workspace 完成依赖安装以及各包之间的 link 工作: +```bash +yarn install +``` + +开发模式: +```bash +yarn watch +``` + +运行 Demo +```bash +yarn storybook +``` + +代替 `git commit` 提交: +```bash +yarn commit +``` + +## view doc example + +```bash + npm start +``` +visit http://localhost:8000/ + +## Add Package + +add new package: +```bash +lerna create my-pack -y +``` + +将 ui-lib 作为 my-pack 的依赖: +```bash +yarn workspace my-pack add ui-lib/1.0.0 +``` + +将 lodash 添加为所有 package 的依赖(不包含root) +```bash +yarn workspaces run add lodash +``` + +将 typescript 设置为 root 的开发依赖 +```bash +yarn add -W -D typescript jest +``` diff --git a/README.zh.md b/README.zh.md new file mode 100644 index 0000000000..12ec4f7481 --- /dev/null +++ b/README.zh.md @@ -0,0 +1,141 @@ +## L7 地理空间数据可视分析引擎 + +L7 是由蚂蚁金服 AntV 数据可视化团队推出的基于 WebGL 的开源大规模地理空间数据可视分析开发框架。L7 中的 L 代表 Location,7 代表世界七大洲,寓意能为全球位置数据提供可视分析的能力。L7 以图形符号学为理论基础,将抽象复杂的空间数据转化成 2D、3D 符号,通过颜色、大小、体积、纹理等视觉变量实现丰富的可视化表达。 + + + + +### Installation + +``` + npm install @antv/l7 + +``` + + +## 核心特性 + +<<<<<<< HEAD +🌏 数据驱动可视化展示 + +数据驱动,从数到形,支持丰富的地图可视化类型,更好洞察数据。 + +🌏 2D,3D 一体化的海量数据高性能渲染 + +百万级空间数据实时,动态渲染。 + +🌏 简单灵活的数据接入 + +支持CSV,JSON,geojson等数据格式接入,可以根据需求自定义数据格式,无需复杂的空间数据转换。 + +🌏 多地图底图支持,支持离线内网部署 +======= +### 🌏 数据驱动可视化展示 + +数据驱动,从数到形,支持丰富的地图可视化类型,更好洞察数据。 + +### 🌏 2D,3D 一体化的海量数据高性能渲染 + +百万级空间数据实时,动态渲染。 + +### 🌏简单灵活的数据接入 + +支持CSV,JSON,geojson等数据格式接入,可以根据需求自定义数据格式,无需复杂的空间数据转换。 + +### 🌏 多地图底图支持,支持离线内网部署 +>>>>>>> f40e44f... fix(fix): fix + +高德地图国内合法合规的地理底图,Mapbox 满足国际化业务需求。 + +## 支持丰富的图表类型 + +### 点图层 + + - 气泡图 + - 散点图 + - 符号地图 + - 3D柱状地图 + - 聚合地图 + - 复合图表地图 + - 自定义Marker + +### 线图层 + +- 路径地图 +- 弧线,支持2D弧线、3D弧线以及大圆航线 +- 等值线 + +### 面图层 + +- 填充图 +- 3D填充图 + +### 热力图 + +- 经典热力图 +- 蜂窝热力图 +- 网格热力图 + +### 栅格地图 +- 图片 +- Raster + +## L7 2.0 Roadmap + +![L7 Road Map](https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*3j9HTLTQT2MAAAAAAAAAAABkARQnAQ) + +## Development + +使用 Yarn Workspace 完成依赖安装以及各包之间的 link 工作: +```bash +yarn install +``` + +开发模式: +```bash +yarn watch +``` + +运行 Demo +```bash +yarn storybook +``` + +代替 `git commit` 提交: +```bash +yarn commit +``` + +## view doc example + +```bash + npm start +``` +visit http://localhost:8000/ + +## Add Package + +add new package: +```bash +lerna create my-pack -y +``` + +将 ui-lib 作为 my-pack 的依赖: +```bash +yarn workspace my-pack add ui-lib/1.0.0 +``` + +将 lodash 添加为所有 package 的依赖(不包含root) +```bash +yarn workspaces run add lodash +``` + +将 typescript 设置为 root 的开发依赖 +```bash +yarn add -W -D typescript jest +``` \ No newline at end of file diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000000..439b91afb5 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,120 @@ +// @see https://babeljs.io/docs/en/next/config-files#project-wide-configuration +module.exports = api => { + api.cache(() => process.env.NODE_ENV); + + const isSite = api.env('site'); + const isCDNBundle = api.env('bundle'); + const isCommonJS = api.env('cjs'); + const isESModule = api.env('esm'); + const isTest = api.env('test'); + + if (isSite) { // + return { + presets: [ + 'babel-preset-gatsby' + ], + plugins: [ + '@babel/plugin-proposal-optional-chaining', + '@babel/plugin-proposal-nullish-coalescing-operator', + [ + '@babel/plugin-proposal-decorators', + { + legacy: true + } + ], + [ + // import glsl as raw text + 'babel-plugin-inline-import', + { + extensions: [ + // 由于使用了 TS 的 resolveJsonModule 选项,JSON 可以直接引入,不需要当作纯文本 + // '.json', + '.glsl' + ] + } + ] + ] + }; + } + return { + presets: [ + [ + '@babel/env', + { + targets: { + browsers: 'Last 2 Chrome versions, Firefox ESR', + node: 'current' + }, + // set `modules: false` when building CDN bundle, let rollup do commonjs works + // @see https://github.com/rollup/rollup-plugin-babel#modules + modules: (isCDNBundle || isESModule) ? false : 'auto' + } + ], + [ + '@babel/preset-react', + { + development: isCommonJS + } + ], + '@babel/preset-typescript' + ], + plugins: [ + '@babel/plugin-proposal-optional-chaining', + '@babel/plugin-proposal-nullish-coalescing-operator', + [ + '@babel/plugin-proposal-decorators', + { + legacy: true + } + ], + [ + '@babel/plugin-proposal-class-properties', + { + // @see https://github.com/storybookjs/storybook/issues/6069#issuecomment-472544973 + loose: true + } + ], + '@babel/plugin-syntax-dynamic-import', + // let rollup do commonjs works + // @see https://github.com/rollup/rollup-plugin-babel#modules + (isCDNBundle || isESModule) ? {} : '@babel/plugin-transform-modules-commonjs', + // '@babel/plugin-transform-modules-commonjs', + // 开发模式下以原始文本引入,便于调试 + isCDNBundle ? {} : [ + // import glsl as raw text + 'babel-plugin-inline-import', + { + extensions: [ + // 由于使用了 TS 的 resolveJsonModule 选项,JSON 可以直接引入,不需要当作纯文本 + // '.json', + '.glsl' + ] + } + ], + [ + // @see https://github.com/babel/babel/issues/8741#issuecomment-509041135 + 'const-enum', + { + transform: 'constObject' + } + ], + // 按需引用 @see https://github.com/lodash/babel-plugin-lodash + 'lodash', + // 内联 WebGL 常量 @see https://www.npmjs.com/package/babel-plugin-inline-webgl-constants + isCDNBundle ? 'inline-webgl-constants' : {} + ], + ignore: [ + 'node_modules', + ...!isTest ? [ + '**/*.test.tsx', + '**/*.test.ts', + '**/*.story.tsx', + '__snapshots__', + '__tests__', + '__stories__', + '**/*/__snapshots__', + '**/*/__tests__' + ] : [] + ] + }; +}; diff --git a/build/bundle.ts b/build/bundle.ts new file mode 100644 index 0000000000..737cb99736 --- /dev/null +++ b/build/bundle.ts @@ -0,0 +1,7 @@ +// @ts-ignore +export * from '@l7/scene'; +// @ts-ignore +export * from '@l7/layers'; + +// @ts-ignore +export * from '@l7/component'; diff --git a/build/rollup-plugin-glsl.js b/build/rollup-plugin-glsl.js new file mode 100644 index 0000000000..892ddbe944 --- /dev/null +++ b/build/rollup-plugin-glsl.js @@ -0,0 +1,33 @@ +import { createFilter } from 'rollup-pluginutils'; + +// borrow from https://github.com/uber/luma.gl/blob/master/dev-modules/babel-plugin-remove-glsl-comments/index.js#L4-L5 +const INLINE_COMMENT_REGEX = /\s*\/\/.*[\n\r]/g; +const BLOCK_COMMENT_REGEX = /\s*\/\*(\*(?!\/)|[^*])*\*\//g; + +// 生产环境压缩 GLSL +export default function glsl(include, minify) { + const filter = createFilter(include); + return { + name: 'glsl', + transform(code, id) { + if (!filter(id)) return; + + if (minify) { + code = code + .trim() // strip whitespace at the start/end + .replace(/\n+/g, '\n') // collapse multi line breaks + // remove comments + .replace(INLINE_COMMENT_REGEX, '\n') + .replace(BLOCK_COMMENT_REGEX, '') + .replace(/\n\s+/g, '\n') // strip identation + // .replace(/\s?([+-\/*=,])\s?/g, '$1') // strip whitespace around operators + // .replace(/([;\(\),\{\}])\n(?=[^#])/g, '$1'); // strip more line breaks + } + + return { + code: `export default ${JSON.stringify(code)};`, + map: { mappings: '' } + }; + } + }; +} \ No newline at end of file diff --git a/build/rollup.config.js b/build/rollup.config.js new file mode 100644 index 0000000000..cf07153724 --- /dev/null +++ b/build/rollup.config.js @@ -0,0 +1,79 @@ +import path from 'path'; +import alias from '@rollup/plugin-alias'; +import json from '@rollup/plugin-json'; +import resolve from 'rollup-plugin-node-resolve'; +import commonjs from 'rollup-plugin-commonjs'; +import { terser } from "rollup-plugin-terser"; +import analyze from 'rollup-plugin-analyzer'; +import babel from 'rollup-plugin-babel'; +import glsl from './rollup-plugin-glsl'; + +function resolveFile(filePath) { + return path.join(__dirname, '..', filePath) +} + +module.exports = [ + { + input: resolveFile('build/bundle.ts'), + output: { + file: resolveFile('dist/bundle.js'), + format: 'umd', + name: 'L7', + globals: { + 'mapbox-gl': 'mapboxgl', + }, + }, + external: [ + 'mapbox-gl', + ], + treeshake: true, + plugins: [ + alias( + { + resolve: ['.tsx', '.ts'], + entries: [ + { + find: /^@l7\/(.*)/, + replacement: resolveFile('packages/$1/src'), + }, + ] + }, + ), + resolve({ + browser: true, + preferBuiltins: false, + extensions: ['.js', '.ts'], + }), + glsl( + ['**/*.glsl'], + true, + ), + json(), + // @see https://github.com/rollup/rollup-plugin-node-resolve#using-with-rollup-plugin-commonjs + commonjs({ + namedExports: { + eventemitter3: [ 'EventEmitter' ], + // @see https://github.com/rollup/rollup-plugin-commonjs/issues/266 + lodash: [ + 'isNil', + 'uniq', + 'clamp', + 'isObject', + 'isFunction', + 'cloneDeep', + 'isString', + 'isNumber', + ], + } + }), + babel({ + extensions: ['.js', '.ts'], + }), + terser(), + analyze({ + summaryOnly: true, + limit: 20, + }), + ], + }, +]; diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000000..dc0adae16c --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,5 @@ +module.exports = { + extends: [ + '@commitlint/config-conventional' + ] +}; diff --git a/demos/raster/basic/data/ndviundefined.be75.tif b/demos/raster/basic/data/ndviundefined.be75.tif new file mode 100755 index 0000000000..b4205d18e4 Binary files /dev/null and b/demos/raster/basic/data/ndviundefined.be75.tif differ diff --git a/demos/raster/basic/demo/image.js b/demos/raster/basic/demo/image.js new file mode 100644 index 0000000000..ade1323c73 --- /dev/null +++ b/demos/raster/basic/demo/image.js @@ -0,0 +1,25 @@ +import { Scene } from '@l7/scene'; +import { ImageLayer } from '@l7/layers' +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'light', + center: [121.2680, 30.3628], + zoom: 13, +}); + +const layer = new ImageLayer({}); +layer.source( + 'https://gw.alipayobjects.com/zos/rmsportal/FnHFeFklTzKDdUESRNDv.jpg', + { + parser: { + type: 'image', + extent: [121.168, 30.2828, 121.384, 30.4219], + }, + }, +); +scene.on('loaded',()=>{ + scene.addLayer(layer); +}) + diff --git a/demos/raster/basic/demo/meta.json b/demos/raster/basic/demo/meta.json new file mode 100644 index 0000000000..25b9c47b9e --- /dev/null +++ b/demos/raster/basic/demo/meta.json @@ -0,0 +1,21 @@ +{ + "title": { + "zh": "栅格图层", + "en": "Gallery" + }, + "demos": [ + { + "filename": "image.js", + "title": "图片", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*ZrCaR53185IAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "raster.js", + "title": "地形" + }, + { + "filename": "light.js", + "title": "夜光图" + } + ] +} diff --git a/demos/raster/basic/demo/raster.js b/demos/raster/basic/demo/raster.js new file mode 100644 index 0000000000..c63bcaa948 --- /dev/null +++ b/demos/raster/basic/demo/raster.js @@ -0,0 +1,61 @@ +import { Scene } from '@l7/scene'; +import { RasterLayer } from '@l7/layers' +import * as GeoTIFF from 'geotiff'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'light', + center: [121.2680, 30.3628], + zoom: 3, +}); + async function getTiffData() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/rmsportal/XKgkjjGaAzRyKupCBiYW.dat', + ); + const arrayBuffer = await response.arrayBuffer(); + const tiff = await GeoTIFF.fromArrayBuffer(arrayBuffer); + const image = await tiff.getImage(); + const width = image.getWidth(); + const height = image.getHeight(); + const values = await image.readRasters(); + return { + data: values[0], + width, + height, + min: 0, + max: 8000, + }; +} + +async function addLayer() { + const tiffdata = await getTiffData(); + + const layer = new RasterLayer({}); + layer + .source(tiffdata.data, { + parser: { + type: 'raster', + width: tiffdata.width, + height: tiffdata.height, + min: 0, + max: 8000, + extent: [73.482190241, 3.82501784112, 135.106618732, 57.6300459963], + }, + }) + .style({ + heightRatio:100, + opacity: 0.8, + rampColors: { + colors: [ '#FF4818', '#F7B74A', '#FFF598', '#91EABC', '#2EA9A1', '#206C7C' ].reverse(), + positions: [0, 0.2, 0.4, 0.6, 0.8, 1.0] + }, + }); + return layer; +} +scene.on('loaded', async () =>{ + const layer = await addLayer(); + scene.addLayer(layer); + scene.render(); +}) + diff --git a/demos/raster/basic/index.en.md b/demos/raster/basic/index.en.md new file mode 100644 index 0000000000..39ed3aaf30 --- /dev/null +++ b/demos/raster/basic/index.en.md @@ -0,0 +1,4 @@ +--- +title: Raster Map +order: 0 +--- diff --git a/demos/raster/basic/index.zh.md b/demos/raster/basic/index.zh.md new file mode 100644 index 0000000000..6147459f75 --- /dev/null +++ b/demos/raster/basic/index.zh.md @@ -0,0 +1,4 @@ +--- +title: 栅格图层 +order: 0 +--- diff --git a/demos/tutorial/control/demo/amap.js b/demos/tutorial/control/demo/amap.js new file mode 100644 index 0000000000..957781139c --- /dev/null +++ b/demos/tutorial/control/demo/amap.js @@ -0,0 +1,58 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers' +import { Scale, Zoom, Layers } from '@l7/component'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'dark', + center: [121.40, 31.258134], + zoom: 14, +}); + +fetch('https://gw.alipayobjects.com/os/basement_prod/893d1d5f-11d9-45f3-8322-ee9140d288ae.json') + .then((res) => res.json()) + .then((data) => { + const pointLayer = + new PointLayer({ + }) + .source(data, { + parser: { + type: 'json', + x: 'longitude', + y: 'latitude' + } + }).shape('circle') + .size('unit_price', [5, 25]) + .color('name',['#49B5AD', "#5B8FF9"]) + .style({ + opacity: 0.3, + strokeWidth: 1, + }) + + scene.addLayer(pointLayer); + var overlayers = { + "围栏填充": pointLayer, + }; + var baseLayers = { + "基础地图": pointLayer, + }; + const layersControl = new Layers({ + overlayers: overlayers, + }); + + scene.addControl(layersControl); + + }); + + + + + const zoomControl = new Zoom(); + const scaleControl = new Scale({ + position:"bottomright" + }); + + scene.addControl(zoomControl); + scene.addControl(scaleControl); + diff --git a/demos/tutorial/control/demo/mapbox.js b/demos/tutorial/control/demo/mapbox.js new file mode 100644 index 0000000000..4f7eb86e7d --- /dev/null +++ b/demos/tutorial/control/demo/mapbox.js @@ -0,0 +1,19 @@ +import { Scene } from '@l7/scene'; +import { Scale, Zoom } from '@l7/component'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'light', + center: [-97.119140625, 38.75408327579141], + zoom: 2, +}); + +const zoomControl = new Zoom(); +const scaleControl = new Scale({ + position:'rightbottom', +}); +scene.addControl(zoomControl); +scene.addControl(scaleControl); + + diff --git a/demos/tutorial/control/demo/meta.json b/demos/tutorial/control/demo/meta.json new file mode 100644 index 0000000000..d921629ac5 --- /dev/null +++ b/demos/tutorial/control/demo/meta.json @@ -0,0 +1,16 @@ +{ + "title": { + "zh": "地图", + "en": "Category" + }, + "demos": [ + { + "filename": "amap.js", + "title": "高德底图组件", + }, + { + "filename": "mapbox.js", + "title": "MapBox底图组件" + } + ] +} diff --git a/demos/tutorial/control/demo/popup.js b/demos/tutorial/control/demo/popup.js new file mode 100644 index 0000000000..36f094242b --- /dev/null +++ b/demos/tutorial/control/demo/popup.js @@ -0,0 +1,57 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers' +import { Scale, Zoom, Layers } from '@l7/component'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'dark', + center: [121.40, 31.258134], + zoom: 5, +}); + +fetch('https://gw.alipayobjects.com/os/basement_prod/893d1d5f-11d9-45f3-8322-ee9140d288ae.json') + .then((res) => res.json()) + .then((data) => { + const pointLayer = + new PointLayer({ + }) + .source(data, { + parser: { + type: 'json', + x: 'longitude', + y: 'latitude' + } + }).shape('circle') + .size('unit_price', [5, 25]) + .color('name',['#49B5AD', "#5B8FF9"]) + .style({ + opacity: 0.3, + strokeWidth: 1, + }) + + scene.addLayer(pointLayer); + var overlayers = { + "围栏填充": pointLayer, + }; + var baseLayers = { + "基础地图": pointLayer, + }; + const layersControl = new Layers({ + overlayers: overlayers, + baseLayers, + }); + + scene.addControl(layersControl); + + }); + + + + + const zoomControl = new Zoom(); + const scaleControl = new Scale(); + + scene.addControl(zoomControl); + scene.addControl(scaleControl); + diff --git a/demos/tutorial/control/index.en.md b/demos/tutorial/control/index.en.md new file mode 100644 index 0000000000..9dbd64200a --- /dev/null +++ b/demos/tutorial/control/index.en.md @@ -0,0 +1,4 @@ +--- +title: control +order: 2 +--- diff --git a/demos/tutorial/control/index.zh.md b/demos/tutorial/control/index.zh.md new file mode 100644 index 0000000000..53dd2eef6b --- /dev/null +++ b/demos/tutorial/control/index.zh.md @@ -0,0 +1,6 @@ +--- +title: 组件 +order: 2 +--- + + diff --git a/demos/tutorial/data/demo/line.js b/demos/tutorial/data/demo/line.js new file mode 100644 index 0000000000..288f28b1dd --- /dev/null +++ b/demos/tutorial/data/demo/line.js @@ -0,0 +1,39 @@ +import { Scene } from '@l7/scene'; +import { LineLayer } from '@l7/layers' +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'light', + center: [102.602992, 23.107329], + zoom: 13, +}); + +fetch('https://gw.alipayobjects.com/os/rmsportal/ZVfOvhVCzwBkISNsuKCc.json') + .then((res) => res.json()) + .then((data) => { + const layer = + new LineLayer({ + }) + .source(data) + .size(1) + .shape('line') + .color( + 'ELEV', + [ + '#E8FCFF', + '#CFF6FF', + '#A1E9ff', + '#65CEF7', + '#3CB1F0', + '#2894E0', + '#1772c2', + '#105CB3', + '#0D408C', + '#002466', + ].reverse(), + ) + scene.addLayer(layer); + console.log(layer); + + }); diff --git a/demos/tutorial/data/demo/meta.json b/demos/tutorial/data/demo/meta.json new file mode 100644 index 0000000000..42812b23e6 --- /dev/null +++ b/demos/tutorial/data/demo/meta.json @@ -0,0 +1,13 @@ +{ + "title": { + "zh": "图库", + "en": "Gallery" + }, + "demos": [ + { + "filename": "line.js", + "title": "线图层", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*KCyXTJrePiYAAAAAAAAAAABkARQnAQ" + } + ] +} diff --git a/demos/tutorial/data/index.en.md b/demos/tutorial/data/index.en.md new file mode 100644 index 0000000000..64087c814e --- /dev/null +++ b/demos/tutorial/data/index.en.md @@ -0,0 +1,4 @@ +--- +title: Data +order: 1 +--- diff --git a/demos/tutorial/data/index.zh.md b/demos/tutorial/data/index.zh.md new file mode 100644 index 0000000000..4ed5924b03 --- /dev/null +++ b/demos/tutorial/data/index.zh.md @@ -0,0 +1,4 @@ +--- +title: 数据 +order: 1 +--- diff --git a/demos/tutorial/map/demo/amap.js b/demos/tutorial/map/demo/amap.js new file mode 100644 index 0000000000..fd49089062 --- /dev/null +++ b/demos/tutorial/map/demo/amap.js @@ -0,0 +1,9 @@ +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'dark', + center: [121.40, 31.258134], + zoom: 5, +}); diff --git a/demos/tutorial/map/demo/mapbox.js b/demos/tutorial/map/demo/mapbox.js new file mode 100644 index 0000000000..ec57775e93 --- /dev/null +++ b/demos/tutorial/map/demo/mapbox.js @@ -0,0 +1,10 @@ +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'light', + center: [ -97.119140625, 38.75408327579141], + zoom: 2, +}); + diff --git a/demos/tutorial/map/demo/meta.json b/demos/tutorial/map/demo/meta.json new file mode 100644 index 0000000000..31bfd25527 --- /dev/null +++ b/demos/tutorial/map/demo/meta.json @@ -0,0 +1,18 @@ +{ + "title": { + "zh": "地图", + "en": "Category" + }, + "demos": [ + { + "filename": "amap.js", + "title": "高德底图", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*KCyXTJrePiYAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "mapbox.js", + "title": "MapBox底图", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*KCyXTJrePiYAAAAAAAAAAABkARQnAQ" + } + ] +} diff --git a/demos/tutorial/map/index.en.md b/demos/tutorial/map/index.en.md new file mode 100644 index 0000000000..860c4ca494 --- /dev/null +++ b/demos/tutorial/map/index.en.md @@ -0,0 +1,6 @@ +--- +title: map +order: 0 +--- +初始 L7 地图实例 + diff --git a/demos/tutorial/map/index.zh.md b/demos/tutorial/map/index.zh.md new file mode 100644 index 0000000000..4fc3d4f1a5 --- /dev/null +++ b/demos/tutorial/map/index.zh.md @@ -0,0 +1,9 @@ +--- +title: 地图 +order: 0 +redirect_from: + - /zh/tutorial +--- +初始 L7 地图实例 + + diff --git a/dev-docs/ConfigSchemaValidation.md b/dev-docs/ConfigSchemaValidation.md new file mode 100644 index 0000000000..e8736469b8 --- /dev/null +++ b/dev-docs/ConfigSchemaValidation.md @@ -0,0 +1,68 @@ +# ConfigSchemaValidation 设计 + +用户在使用 L7 的 Scene/Layer API 时,由于参数配置项众多难免会误传。需要在运行时通过校验提前发现并给出友好的提示。 +另外由于 L7 允许用户自定义 Layer 与 LayerPlugin,规范化参数配置项也能提升易用性和质量。 + +这方面 Webpack 做的很好,使用 [schema-utils](https://github.com/webpack/schema-utils) 基于 JSON Schema 对 Plugin 和 Loader 进行校验。如果传入了错误的配置项,会给出友好的提示: +``` +Invalid configuration object. MyPlugin has been initialised using a configuration object that does not match the API schema. + - configuration.optionName should be a integer. +``` + +和 Webpack 一样,我们也选择 [ajv](https://github.com/epoberezkin/ajv) 作为 JSON Schema 校验器。 +目前我们只在 Layer 初始阶段进行校验,一旦校验失败会中断后续初始化插件的处理,并在控制台给出校验失败信息。后续需要在属性更新时同样进行校验。 + +## Layer 基类配置项 Schema + +目前在基类中我们声明了如下属性及其对应的校验规则: + +```javascript +export default { + properties: { + // 开启拾取 + enablePicking: { + type: 'boolean', + }, + // 开启高亮 + enableHighlight: { + type: 'boolean', + }, + // 高亮颜色:例如 [0, 0, 1, 1] 或者 '#ffffff' + highlightColor: { + oneOf: [ + { + type: 'array', + items: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + { + type: 'string', + }, + ], + }, + }, +}; +``` + +如果传入了错误的配置项则会在控制台给出提示。 + +## Layer 子类配置项 Schema + +Layer 子类可以通过重载 `getConfigSchema()` 方法定义自身的特有属性。例如 `PolygonLayer` 需要定义透明度: + +```javascript +protected getConfigSchema() { + return { + properties: { + opacity: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + }; +} +``` diff --git a/dev-docs/MultiPassRenderer.md b/dev-docs/MultiPassRenderer.md new file mode 100644 index 0000000000..533f3a0fd0 --- /dev/null +++ b/dev-docs/MultiPassRenderer.md @@ -0,0 +1,167 @@ +# MultiPassRenderer 实现 + +每个 Layer 渲染时都需要经历多个流程,从最简单的清屏、拾取到各种各样的后处理。我们希望把复杂渲染流程中每个步骤都抽象出来,让 L7 内部以及用户能够方便的扩展,进行渲染流程的自定义。其中的每一个步骤称作 Pass,负责串联调用各个 Pass 的渲染器称作 MultiPassRenderer。 + +![](./screenshots/blurpass.png) + +## 接口设计 + +目前我们将 Pass 分成两类: + 1. 渲染相关。例如 ClearPass、RenderPass、PickingPass、ShadowPass + 2. 后处理相关。例如 CopyPass、BlurPass + +```typescript +export enum PassType { + Normal = 'normal', + PostProcessing = 'post-processing', +} +``` + +每个 Pass 定义两个生命周期节点,初始化和渲染,并将当前 Layer 作为参数传入。因此 Pass 中可以访问 Layer 上的属性及方法: +```typescript +export interface IPass { + getType(): PassType; + init(layer: ILayer): void; + render(layer: ILayer): void; +} +``` + +其中后处理相关的 Pass 比较特殊,例如最后一个 PostProcessingPass 需要自动切换 renderTarget 为屏幕: +```typescript +export interface IPostProcessingPass extends IPass { + setRenderToScreen(renderToScreen: boolean): void; + isEnabled(): boolean; + setEnabled(enabled: boolean): void; +} +``` + +具体实现依赖 `@l7/renderer` 实现,目前使用 regl 实现 IFramebuffer 等接口。 + +## 内置 Pass + +目前我们仅对外开放 PostProcessing 后处理相关 Pass 的配置。在 L7 内部我们使用如下流程: +``` +ClearPass -> RenderPass -> [ ...其他后处理 Pass ] -> CopyPass +``` + +目前各内置 Pass 说明如下: + +| Pass 名称 | 类型 | 参数 | 说明 | +| -------- | --- | ------------- | --------- | +| ClearPass | normal | 无 | 清除 framebuffer,clearColor 为 [0, 0, 0, 0] | +| RenderPass | normal | 无 | 渲染到 framebuffer,作为后续后处理的输入 | +| PickingPass | normal | 无 | 负责拾取,[详见](./PixelPickingEngine.md) | +| TAAPass | normal | 无 | [详见](./TAA.md) | +| CopyPass | post-processing | 无 | 作为后处理最后一个 Pass,负责拷贝 framebuffer 到屏幕输出 | + +剩余后处理效果见最后一节。 +后续待实现 Pass 如下: + +- [ ] ShadowPass 负责生成 shadowMap,供 PCF、CSM 等实时阴影技术使用 + +## 使用方法 + +在每个 Layer 中,通过 `enableMultiPassRenderer` 开启之后,可以配置各个 Pass 的参数。配置方法类似 babel 插件: +```typescript +const layer = new PolygonLayer({ + enableMultiPassRenderer: true, + passes: [ + 'blurH', // 使用 BlurHPass + [ + 'blurV', // 使用 BlurVPass + { + blurRadius: 20, // 设置模糊半径 + }, + ], + ], +}); +``` + +## 内置后处理效果 + +参考了 [glfx](https://github.com/evanw/glfx.js) 中的一些常用图像处理效果。可以按照名称引用,顺序决定了各个效果的应用次序。例如我们想依次应用噪声和模糊效果: + +```typescript +const layer = new PolygonLayer({ + passes: [ + [ + 'noise', // 使用 NoisePass + { + amount: 0.5, + }, + ] + 'blurH', // 使用 BlurHPass + 'blurV', // 使用 BlurVPass + ], +}); +``` + +下面详细介绍各个后处理效果及其参数,在 DEMO 中也可以通过 GUI 任意调节参数。 + +### 高斯模糊 + +采用 [高斯模糊 blur9](https://github.com/Jam3/glsl-fast-gaussian-blur/blob/master/9.glsl)。 + +名称:`blurH/blurV` + +参数: +* `blurRadius` 水平/垂直方向模糊半径,默认值为 `8.0` + +效果如下: + +![](./screenshots/blurpass.png) + +### ColorHalftone + +CMYK halftone 效果 + +名称:`colorHalftone` + +参数: +* `angle` pattern 旋转角度,默认值为 0 +* `size` pattern 大小,默认值为 8 +* `center` `[x, y]` pattern 的中心,默认值为 `[0, 0]` + +效果如下: + +![](./screenshots/halftone.png) + +### 噪声 + +噪声效果。 + +名称:`noise` + +参数: +* `amount` 噪声程度,范围 `[0, 1]`,默认值为 `0.5` + +效果如下: + +![](./screenshots/noise.png) + +### 六边形像素化处理 + +六边形像素化处理。 + +名称:`hexagonalPixelate` + +参数: +* `scale` 六边形大小,默认值为 `10` +* `center` `[x, y]` pattern 的中心,默认值为 `[0.5, 0.5]` + +效果如下: + +![](./screenshots/hexagonalPixelate.png) + +### Sepia + +Sepia 颜色映射。 + +名称:`sepia` + +参数: +* `amount` 程度,范围 `[0, 1]`,默认值为 `0.5` + +效果如下: + +![](./screenshots/sepia.png) \ No newline at end of file diff --git a/dev-docs/PixelPickingEngine.md b/dev-docs/PixelPickingEngine.md new file mode 100644 index 0000000000..7a99ec6433 --- /dev/null +++ b/dev-docs/PixelPickingEngine.md @@ -0,0 +1,151 @@ +# PixelPickingEngine 设计 + +在地图交互中,除了地图底图本身提供的平移、旋转、缩放、flyTo 等相机动作,最常用的就是信息要素的拾取以及后续的高亮了。 + +3D 引擎常用的拾取技术通常有两种:RayPicking 和 PixelPicking。前者从鼠标点击处沿着投影方向发射一根射线,通过包围盒碰撞检测获取到接触到的第一个对象,后续就可以进行选中对象的高亮甚至是跟随移动了,以上运算均在 CPU 侧完成。 +但是在 L7 的场景中,海量数据在同一个 Geometry 中,无法计算每个要素的包围盒,因此在 GPU 侧完成的 PixelPicking 更加适合。 + +作为拾取引擎 PixelPickingEngine,除了实现内置基本的拾取 Pass,最重要的是提供友好易用的 API,覆盖以下常见场景: +* 基本的拾取场景,用户只需要开启 Layer 拾取功能并设置高亮颜色即可。 +* 拾取后展示特定 UI 组件的场景,用户需要监听事件,在回调中使用上述拾取对象完成组件展示。 +* 更灵活的联动场景,用户可以不依赖 L7 内置的事件监听机制,直接拾取并高亮指定点/区域包含的要素。 + +本文会依次介绍: +* PixelPicking 原理 +* 使用方法 + * 拾取对象结构 + * 拾取 API 的使用方法 + * 开启/关闭拾取 + * 设置高亮颜色 + * 展示自定义 UI 组件 + * 在自定义 Layer 中使用 + +## PixelPicking 原理 + +在执行时机方面,基于 [MultiPassRenderer](./MultiPassRenderer.md) 的设计,拾取发生在实际渲染之前: +``` +ClearPass -> PixelPickingPass -> RenderPass -> [ ...其他后处理 Pass ] -> CopyPass +``` + +PixelPickingPass 分解步骤如下: +1. `ENCODE` 阶段。逐要素编码(idx -> color),传入 attributes 渲染 Layer 到纹理。 +2. 获取鼠标在视口中的位置。由于目前 L7 与地图结合的方案为双 Canvas 而非共享 WebGL Context,事件监听注册在地图底图上。 +3. 读取纹理在指定位置的颜色,进行解码(color -> idx),查找对应要素,作为 Layer `onHover/onClick` 回调参数传入。 +4. `HIGHLIGHT` 阶段(可选)。将待高亮要素对应的颜色传入 Vertex Shader 用于每个 Vertex 判断自身是否被选中,如果被选中,在 Fragment Shader 中将高亮颜色与计算颜色混合。 + +## 使用方法 + +### 拾取对象结构定义 + +拾取对象结构定义如下: + +| 参数名 | 类型 | 说明 | +| -------- | --- | ------------- | +| x | `number` | 鼠标位置在视口空间 x 坐标,取值范围 `[0, viewportWidth]` | +| y | `number` | 鼠标位置在视口空间 y 坐标,取值范围 `[0, viewportHeight]` | +| lnglat | `{ lng: number; lat: number; }` | 鼠标位置经纬度坐标 | +| feature | `object` | GeoJSON feature 属性 | + +### API + +对于基本的拾取场景,用户只需要开启 Layer 拾取功能并设置高亮颜色即可。 +而对于拾取后展示特定 UI 组件的场景,用户需要监听事件,在回调中使用上述拾取对象完成组件展示。 +最后,对于更灵活的联动场景,用户可以不依赖 L7 内置的事件监听机制,直接拾取并高亮指定点/区域包含的要素。 + +#### 禁用/开启拾取 + +并不是所有 Layer 都需要拾取(例如文本渲染 Layer),通过 `enablePicking` 关闭可以跳过该阶段,减少不必要的渲染开销: +```typescript +const layer = new PolygonLayer({ + enablePicking: false, // 关闭拾取 +}); +``` + +⚠️L7 默认开启拾取。 + +#### 设置高亮颜色 + +如果一个 Layer 开启了拾取,我们可以通过 `highlightColor` 设置高亮颜色: +```typescript +const layer = new PolygonLayer({ + enablePicking: true, // 开启拾取 + enableHighlight: true, // 开启高亮 + highlightColor: [0, 0, 1, 1], // 设置高亮颜色为蓝色 +}); +``` + +#### 展示自定义 UI 组件 + +监听 Layer 上的 `hover/mousemove` 事件就可以得到拾取对象,然后通过对象中包含的位置以及原始数据信息,就可以使用 L7 内置或者自定义 UI 组件展示: +```typescript +layer.on('hover', ({ x, y, lnglat, feature }) => { + // 展示 UI 组件 +}); +layer.on('mousemove', ({ x, y, lnglat, feature }) => { + // 同上 +}); +``` + +除了基于事件监听,还可以通过 Layer 的构造函数传入 `onHover` 回调,在后续 Layer 对应的 react 组件中也可以以这种方式使用: +```typescript +const layer = new PolygonLayer({ + enablePicking: true, + onHover: ({ x, y, lnglat, feature }) => { + // 展示 UI 组件 + }, +}); +``` + +#### 直接调用拾取引擎方法 + +除了默认在地图上交互完成拾取,在与其他系统进行联动时,脱离了地图交互,仍需要具备拾取指定点/区域内包含要素的能力。 +```typescript +anotherSystem.on('hover', ({ x, y }) => { + layer.pick({ + x, + y, + }); +}); +``` + +⚠️目前只支持拾取视口中一个点所在的要素,未来可以实现拾取指定区域内的全部要素。 + +### 自定义 Layer 中的拾取 + +用户实现自定义 Layer 时,必然需要实现 Vertex/Fragment Shader。如果也想使用拾取功能,就需要在 Shader 中引入拾取模块,方法如下。 + +在 Vertex Shader 中引入 `picking` 模块。关于 L7 Shader 的模块化设计,[详见]()。 +```glsl +// mylayer.vert.glsl + +#pragma include "picking" + +void main() { + setPickingColor(customPickingColors); +} +``` + +在 Fragment Shader 中 +```glsl +// mylayer.frag.glsl + +#pragma include "picking" + +void main() { + // 必须在末尾,保证后续不会再对 gl_FragColor 进行修改 + gl_FragColor = filterPickingColor(gl_FragColor); +} +``` + +其中涉及 `picking` 模块方法说明如下: + +| 方法名 | 应用 shader | 说明 | +| -------- | --- | ------------- | +| `setPickingColor` | `vertex` | 比较自身颜色编码与高亮颜色,判断是否被选中,传递结果给 fragment | +| `filterPickingColor` | `fragment` | 当前 fragment 被选中则使用高亮颜色混合,否则直接输出原始计算结果 | + +## 参考资料 + +* [Deck.gl 交互文档](https://deck.gl/#/documentation/developer-guide/adding-interactivity) +* [Deck.gl Picking 实现](https://deck.gl/#/documentation/developer-guide/writing-custom-layers/picking) +* 「Interactive.Computer.Graphics.Top.Down.Approach - 3.9 Picking」 \ No newline at end of file diff --git a/dev-docs/TAA.md b/dev-docs/TAA.md new file mode 100644 index 0000000000..d0ceb98bd5 --- /dev/null +++ b/dev-docs/TAA.md @@ -0,0 +1,118 @@ +# 在地理场景中应用 TAA + +## 问题背景 + +关于走样产生的原因以及常用的反走样手段,可以参考「知乎 - 反走样技术(一):几何反走样」[🔗](https://zhuanlan.zhihu.com/p/28800047)。 +我之前也简单总结了下 SSAA、MLAA/SMAA、FXAA 等反走样技术的实现细节。 + +其中 MSAA 作为浏览器内置实现,开发者使用起来很简单: + +> 相对于着色走样,人眼对几何走样更敏感。MSAA 的原理很简单,它仍然把一个像素划分为若干个子采样点,但是相较于 SSAA,每个子采样点的颜色值完全依赖于对应像素的颜色值进行简单的复制(该子采样点位于当前像素光栅化结果的覆盖范围内),不进行单独计算。此外它的做法和 SSAA 相同。由于 MSAA 拥有硬件支持,相对开销比较小,又能很好地解决几何走样问题,在游戏中应用非常广泛(我们在游戏画质选项中常看到的 4x/8x/16x 抗锯齿一般说的就是 MSAA 的子采样点数量分别为4/8/16个)。 + +下图为 4x MSAA 采样点示意: + +![](./screenshots/MSAA.png) + +在 Mapbox 中左图未开启 MSAA 而右图选择开启,观察立方体边缘可以发现明显的几何走样:相关 [ISSUE](https://github.com/mapbox/mapbox-gl-js/pull/8474)。 +![](./screenshots/mapbox-MSAA.png) + +但是 MSAA 存在一些限制: +* WebGL1 不支持对 FBO 进行,因此开启 post-processing 后处理时 MSAA 就失效了。当然 WebGL2 支持 🔗。 +* 即使开启,浏览器在某些情况下也不保证应用 🔗。 + +因此在需要后处理的场景中(例如 L7 的热力图需要 blur pass、PBR 中的 SSAO 环境光遮蔽),只能采用其他反走样手段。 + +## TAA(Temporal Anti-Aliasing) 原理 + +来自「知乎 - Experimentalize TAA with no code」🔗: + +> 严格来说 TAA 并不能算一个具体的算法,而是更像一个统一的算法框架。和 SSAA 一样,TAA 也能够同时减轻几何走样和着色走样的问题。 + +关于 TAA 的原理,「GDC - Temporal Reprojection +Anti-Aliasing in INSIDE」[🔗](http://twvideo01.ubm-us.net/o1/vault/gdc2016/Presentations/Pedersen_LasseJonFuglsang_TemporalReprojectionAntiAliasing.pdf) 讲的十分清晰。如果相机和物体的相对位置在当前帧之前发生过变化,那么当前帧就可以以若干前序帧进行修正。 + +![](./screenshots/taa-1.png) + +但如果在前序帧中相机和物体都没有发生过变化,那对于当前帧就无从修正了。因此可以对视锥进行抖动,在渲染每一帧之前,使用抖动矩阵对投影矩阵进行偏移,最终实现视锥的偏移: + +![](./screenshots/taa-step1.png) + +然后在 FS 中,最关键的就是 reproject 这一步: + +![](./screenshots/taa-step2.png) + +对于静止场景,「Three.js - TAA example」[🔗](https://threejs.org/examples/#webgl_postprocessing_taa)、「ECharts.GL - temporalSuperSampling」[🔗](https://echarts.apache.org/zh/option-gl.html#globe.temporalSuperSampling) 都采用了这种方法。 + +## 实现方法 + +由于需要对投影矩阵进行抖动,我们需要选取低差异序列。 +来自「知乎 - 低差异序列(一)- 常见序列的定义及性质」🔗,右图明显比左图纯随机生成覆盖面广: + +![](./screenshots/halton.png) + +参考 Echarts.GL,我们选择 `Halton(2,3)` 低差异序列: +```typescript +const offset = this.haltonSequence[this.frame % this.haltonSequence.length]; +this.cameraService.jitterProjectionMatrix( + ((offset[0] * 2.0 - 1.0) / width) * jitterScale, + ((offset[1] * 2.0 - 1.0) / height) * jitterScale, +); +``` + +在每一帧都会尝试进行累加。如果在连续运动过程中,TAA 的累加过程必然来不及完成,此时只需要输出当前帧原始结果即可,随后尝试继续轮询累加是否完成。因此在累加完成之前,都会输出当前帧未经 TAA 的结果。 + +最后我们需要进行加权平均,历史帧的权重应当越来越小: + +![](./screenshots/taa-step3.png) + +这里我们选择当前帧权重为 0.9,历史帧为 0.1: + +```typescript +useFramebuffer(this.outputRenderTarget, () => { + this.blendModel.draw({ + uniforms: { + u_opacity: layerStyleOptions.opacity || 1, + u_MixRatio: this.frame === 0 ? 1 : 0.9, + u_Diffuse1: this.sampleRenderTarget, + u_Diffuse2: + this.frame === 0 + ? layer.multiPassRenderer.getPostProcessor().getReadFBO() + : this.prevRenderTarget, + }, + }); +}); +``` + +最后我们将最终的混合结果“拷贝”给后处理模块,实现渐进增强的效果: + +```typescript +useFramebuffer( + layer.multiPassRenderer.getPostProcessor().getReadFBO(), + () => { + this.copyModel.draw({ + uniforms: { + u_Texture: this.copyRenderTarget, + }, + }); + }, +); +// 调用后处理模块应用后续效果 +layer.multiPassRenderer.getPostProcessor().render(layer); +``` + +## 最终效果 + +为了更直观地看到效果,在 DEMO 中我们可以调节相机抖动范围: + +![](./screenshots/taa-result.gif) + +## 参考资料 + +* 「知乎 - 反走样技术(一):几何反走样」[🔗](https://zhuanlan.zhihu.com/p/28800047) +* 「知乎 - Experimentalize TAA with no code」[🔗](https://zhuanlan.zhihu.com/p/41642855) +* 「ECharts.GL - temporalSuperSampling」[🔗](https://echarts.apache.org/zh/option-gl.html#globe.temporalSuperSampling) +* 「Mapbox - set custom layers and extrusion examples to use antialias: true」[🔗](https://github.com/mapbox/mapbox-gl-js/pull/8474) +* 「Three.js - TAA example」[🔗](https://threejs.org/examples/#webgl_postprocessing_taa) +* 「Paper - Amortized Supersampling」[🔗](http://hhoppe.com/supersample.pdf) +* 「GDC - Temporal Reprojection Anti-Aliasing in INSIDE」[🔗](http://twvideo01.ubm-us.net/o1/vault/gdc2016/Presentations/Pedersen_LasseJonFuglsang_TemporalReprojectionAntiAliasing.pdf) +* 「知乎 - 低差异序列(一)- 常见序列的定义及性质」[🔗](https://zhuanlan.zhihu.com/p/20197323) diff --git a/dev-docs/screenshots/MSAA.png b/dev-docs/screenshots/MSAA.png new file mode 100644 index 0000000000..205a8f2f61 Binary files /dev/null and b/dev-docs/screenshots/MSAA.png differ diff --git a/dev-docs/screenshots/blurpass.png b/dev-docs/screenshots/blurpass.png new file mode 100644 index 0000000000..931b96457e Binary files /dev/null and b/dev-docs/screenshots/blurpass.png differ diff --git a/dev-docs/screenshots/halftone.png b/dev-docs/screenshots/halftone.png new file mode 100644 index 0000000000..0b981617a6 Binary files /dev/null and b/dev-docs/screenshots/halftone.png differ diff --git a/dev-docs/screenshots/halton.png b/dev-docs/screenshots/halton.png new file mode 100644 index 0000000000..7f8ff63842 Binary files /dev/null and b/dev-docs/screenshots/halton.png differ diff --git a/dev-docs/screenshots/hexagonalPixelate.png b/dev-docs/screenshots/hexagonalPixelate.png new file mode 100644 index 0000000000..7a8fd1ce44 Binary files /dev/null and b/dev-docs/screenshots/hexagonalPixelate.png differ diff --git a/dev-docs/screenshots/jest.png b/dev-docs/screenshots/jest.png new file mode 100644 index 0000000000..247e12fb69 Binary files /dev/null and b/dev-docs/screenshots/jest.png differ diff --git a/dev-docs/screenshots/mapbox-MSAA.png b/dev-docs/screenshots/mapbox-MSAA.png new file mode 100644 index 0000000000..8e79cc088b Binary files /dev/null and b/dev-docs/screenshots/mapbox-MSAA.png differ diff --git a/dev-docs/screenshots/monorep.png b/dev-docs/screenshots/monorep.png new file mode 100644 index 0000000000..99b56ba339 Binary files /dev/null and b/dev-docs/screenshots/monorep.png differ diff --git a/dev-docs/screenshots/noise.png b/dev-docs/screenshots/noise.png new file mode 100644 index 0000000000..fb2145ca1e Binary files /dev/null and b/dev-docs/screenshots/noise.png differ diff --git a/dev-docs/screenshots/sepia.png b/dev-docs/screenshots/sepia.png new file mode 100644 index 0000000000..8a3fc791a4 Binary files /dev/null and b/dev-docs/screenshots/sepia.png differ diff --git a/dev-docs/screenshots/taa-1.png b/dev-docs/screenshots/taa-1.png new file mode 100644 index 0000000000..4ce4460bc9 Binary files /dev/null and b/dev-docs/screenshots/taa-1.png differ diff --git a/dev-docs/screenshots/taa-result.gif b/dev-docs/screenshots/taa-result.gif new file mode 100644 index 0000000000..5beff2810b Binary files /dev/null and b/dev-docs/screenshots/taa-result.gif differ diff --git a/dev-docs/screenshots/taa-step1.png b/dev-docs/screenshots/taa-step1.png new file mode 100644 index 0000000000..0ae395bc6b Binary files /dev/null and b/dev-docs/screenshots/taa-step1.png differ diff --git a/dev-docs/screenshots/taa-step2.png b/dev-docs/screenshots/taa-step2.png new file mode 100644 index 0000000000..00d585ac91 Binary files /dev/null and b/dev-docs/screenshots/taa-step2.png differ diff --git a/dev-docs/screenshots/taa-step3.png b/dev-docs/screenshots/taa-step3.png new file mode 100644 index 0000000000..781a7f0164 Binary files /dev/null and b/dev-docs/screenshots/taa-step3.png differ diff --git "a/dev-docs/\344\275\277\347\224\250\346\226\271\346\263\225.md" "b/dev-docs/\344\275\277\347\224\250\346\226\271\346\263\225.md" new file mode 100644 index 0000000000..912ac3639b --- /dev/null +++ "b/dev-docs/\344\275\277\347\224\250\346\226\271\346\263\225.md" @@ -0,0 +1,230 @@ +# 使用方法 + +L7 提供三种使用方式:CDN、Submodule 以及 React 组件。 + +## 通过 CDN 使用 + +首先在 `` 中引入 L7 CDN 版本的 JS 和 CSS 文件: +```html + + + + +``` + +如果使用 Mapbox,还需要额外引入 Mapbox 的 JS 和 CSS 文件,这一步可以参考 [Mapbox 文档](https://docs.mapbox.com/mapbox-gl-js/overview/#quickstart): +```html + + + + + +``` +⚠️高德采用异步加载,因此不需要引入任何额外静态文件。 + +然后在 `` 中定义一个容器并设置一个 `id`。通过全局 `L7` 这个命名空间可以获取场景 `L7.Scene` 和图层 `L7.PolygonLayer`: +```html + +
+ + +``` + +⚠️需要获取高德或者 Mapbox 的使用 token 并传入 `L7.Scene` 的构造函数,获取方式如下: +* 高德地图开发者 Key [申请方法](https://lbs.amap.com/dev/key/) +* [Mapbox Access Tokens](https://docs.mapbox.com/help/how-mapbox-works/access-tokens/#creating-and-managing-access-tokens) + +## 通过 Submodule 使用 + +首先通过 `npm/yarn` 安装 `@l7/scene` 和 `@l7/layers`: +```bash +npm install --save @l7/scene @l7/layers +// or +yarn add @l7/scene @l7/layers +``` + +然后就可以使用其中包含的场景和各类图层: +```typescript +import { Scene } from '@l7/scene'; +import { PolygonLayer } from '@l7/layers'; + +(async function() { + // 获取数据 + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const data = await response.json(); + + // 创建场景 + const scene = new Scene({ + center: [110.19382669582967, 50.258134], + id: 'map', + pitch: 0, + style: 'dark', + type: 'amap', + zoom: 3, + token: 'pg.xxx', // 高德或者 Mapbox 的 token + }); + + // 创建图层 + const layer = new PolygonLayer({}); + layer + .source(data) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + + // 添加图层到场景中 + scene.addLayer(layer); + + // 渲染场景 + scene.render(); +})(); +``` + +最后在 `` 中引入 L7 CDN 版本的 CSS 文件: +```html + + + +``` + +L7 目前的文档都通过这种方式使用,可以参考项目中的 stories: +* [高德地图](https://github.com/antvis/L7/blob/next/stories/MapAdaptor/components/AMap.tsx) +* [Mapbox](https://github.com/antvis/L7/blob/next/stories/MapAdaptor/components/Mapbox.tsx) + + +## [WIP] React + +React 组件待开发,目前可以暂时以 Submodule 方式使用: +```tsx +import { Scene } from '@l7/scene'; +import { PolygonLayer } from '@l7/layers'; +import * as React from 'react'; + +export default class AMap extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + center: [110.19382669582967, 50.258134], + id: 'map', + pitch: 0, + style: 'dark', + type: 'amap', + zoom: 3, + token: 'pg.xxx', // 高德或者 Mapbox 的 token + }); + const layer = new PolygonLayer({}); + + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + scene.addLayer(layer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} +``` + +⚠️组件 Unmount 时需要通过 `scene.destroy()` 手动销毁场景。 diff --git "a/dev-docs/\346\236\204\345\273\272\346\226\271\346\241\210.md" "b/dev-docs/\346\236\204\345\273\272\346\226\271\346\241\210.md" new file mode 100644 index 0000000000..6de98446e3 --- /dev/null +++ "b/dev-docs/\346\236\204\345\273\272\346\226\271\346\241\210.md" @@ -0,0 +1,326 @@ +# 构建方案 + +考虑到 L7 提供的三种[使用方法](./使用方法.md):CDN、Submodule 和 React 组件,我们需要提供对应的构建方案。 + +由于 React 组件待开发,下面我们将从方案技术细节、优化手段两方面介绍 CDN 和 Submodule 的构建方案。 + +## CDN + +考虑到后续将引入 WebWorker 特性,目前 Webpack4 暂时还不支持多种 target(web + webworker)混合的输出模式,相关 [ISSUE](https://github.com/webpack/webpack/issues/6525)。 +如果后续支持,配合 SplitChunksPlugin 应该能解决在 Worker 和不同 entry 之间共享代码的问题。 + +因此目前和 Mapbox 做法一样,我们使用 Rollup 构建 CDN Bundler。 + +打包命令如下,会在 `dist/` 下输出产物: +```bash +yarn bundle +``` + +### UMD + +以 L7 为命名空间,让用户可以通过类似 `L7.Scene` 的方式使用。同时以 UMD 为构建目标: +```javascript +{ + input: resolveFile('build/bundle.ts'), + output: { + file: resolveFile('dist/bundle.js'), + format: 'umd', + name: 'L7', + }, +} +``` + +目前只需要暴露场景以及图层相关的 API,因此 Bundler 非常简单: +```typescript +// build/bundle.ts +export * from '@l7/scene'; +export * from '@l7/layers'; +``` + +### Alias + +为了帮助 resolver 定位 lerna packages,需要重命名类似 `@l7/scene` 这样的依赖路径: +```javascript +import alias from '@rollup/plugin-alias'; + +plugins: [ + alias( + { + resolve: ['.tsx', '.ts'], + entries: [ + { + find: /^@l7\/(.*)/, + replacement: resolveFile('packages/$1/src'), + }, + ] + }, + ), +] +``` + +配合 [`terser`](https://github.com/TrySound/rollup-plugin-terser) 压缩后,我们就能得到可运行的 CDN 版本了,但从减少构建产物大小出发还有很多优化可以做。 + +### 减少包大小 + +除了 Rollup 提供的 TreeShaking,我们主要从三个方面考虑: +* 减少第三方依赖大小尤其是 Lodash +* external Mapbox 依赖 +* 压缩 GLSL 代码 + * 去除多余空格、换行符和注释 + * 内联 WebGL 常量 + * 预计算 define 变量 + +#### Lodash 按需引用 + +通过 analysis 插件可以看到第三方依赖大小占比: +``` +/node_modules/lodash/lodash.js +███████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 23.79 % (540.328 KB) +/node_modules/regl/dist/regl.js +██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 12.21 % (277.403 KB) +/node_modules/hammerjs/hammer.js +█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 3.25 % (73.847 KB) +/node_modules/uri-js/dist/es5/uri.all.js +█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 2.28 % (51.721 KB) +``` + +仔细查看 Lodash 的引用情况: +``` +███████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ +file: /node_modules/lodash/lodash.js +bundle space: 23.79 % +rendered size: 540.328 KB +original size: 540.51 KB +code reduction: 0.03 % +dependents: 13 + - /packages/core/src/services/layer/StyleAttribute.ts + - /packages/core/src/services/shader/ShaderModuleService.ts + - /packages/core/src/services/renderer/passes/post-processing/BlurHPass.ts +``` + +按需引用 Lodash 常见的做法有几种: +* [loash-es](https://github.com/lodash/lodash/tree/es) +* babel-plugin-lodash +* lodash-webpack-plugin + +由于我们使用 Rollup 以及 `rollup-plugin-babel`,[babel-plugin-lodash](https://github.com/lodash/babel-plugin-lodash) 可以很好地解决这个问题。该插件的[原理](https://github.com/rollup/rollup/issues/610#issuecomment-270801483)其实也是引用 `lodash-es`: +```javascript +// this... +import { template } from 'lodash-es'; + +// ...basically becomes this: +import template from 'lodash-es/template.js'; +``` + +最终的效果还是很明显的: +``` +/node_modules/regl/dist/regl.js +████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 16.55 % (277.403 KB) +/node_modules/hammerjs/hammer.js +██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 4.41 % (73.847 KB) +/node_modules/uri-js/dist/es5/uri.all.js +█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 3.09 % (51.721 KB) +/node_modules/lodash.mergewith/index.js +█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 3.06 % (51.256 KB) +``` + +#### 剔除 Mapbox + +不同于高德异步加载的方式,Mapbox 用户需要手动引入 Mapbox 的 JS 和 CSS,因此 L7 CDN 版本就需要剔除了。通过 `globals` 假定用户负责引入 Mapbox 的 CDN 版本: +```javascript +{ + output: { + globals: { + 'mapbox-gl': 'mapboxgl', + }, + }, + external: [ + 'mapbox-gl', + ], +} +``` + +这样 L7 Bundler 中就不包含 Mapbox 的 Module Bundler(mapbox-gl) 了。 + +#### 内联 WebGL 常量 + +在构建阶段可以将 WebGL 常量替换成对应的值,可以减少字符长度: +```javascript +// from +const max = gl.MAX_VERTEX_ATTRIBS; +// to +const max = 34921; +``` + +luma.gl 和 deck.gl 都使用了 [babel-plugin-inline-webgl-constants](https://www.npmjs.com/package/babel-plugin-inline-webgl-constants)。 + +来看一下实际效果,在压缩前就能减少字符长度: +```javascript +// 内联前 +const usageMap = { + [gl.STATIC_DRAW]: 'static', + [gl.DYNAMIC_DRAW]: 'dynamic', + [gl.STREAM_DRAW]: 'stream' +}; +// 内联后 +const usageMap = { + [35044]: 'static', + [35048]: 'dynamic', + [35040]: 'stream' +}; +``` + +#### 压缩 GLSL 代码 + +在开发编写 Shader 时,我们是不需要对 GLSL 代码进行压缩的,因为在 Shader 编译失败时能根据错误信息定位到具体行列。 + +但是在生产环境下,我们就需要把 GLSL 源代码中包含的**多余**的换行、空格以及注释去掉,减少最终引入字符串的大小。 + +这里需要注意的是并不是所有换行都可以简单去除,例如 `define` 语句末尾的换行一定要保留。 + +luma.gl 和 deck.gl 使用了 [babel-plugin-remove-glsl-comments](https://github.com/uber/luma.gl/tree/master/dev-modules/babel-plugin-remove-glsl-comments) 简单地移除注释,但很明显,多余的空格和换行符依然存在。 + +因此我们需要写一个简单的 Rollup 插件: +```javascript +export default function glsl(include, minify) { + const filter = createFilter(include); + return { + name: 'glsl', + transform(code, id) { + if (!filter(id)) return; + + if (minify) { + code = code + .trim() // strip whitespace at the start/end + .replace(/\n+/g, '\n') // collapse multi line breaks + // remove comments + .replace(INLINE_COMMENT_REGEX, '\n') + .replace(BLOCK_COMMENT_REGEX, '') + .replace(/\n\s+/g, '\n') // strip identation + } + + return { + code: `export default ${JSON.stringify(code)};`, + map: { mappings: '' } + }; + } + }; +} +``` + +#### GLSL minifier + +以上针对 GLSL 的压缩仅限于字符替换,更彻底的优化必然需要生成 GLSL 对应的 AST,从而进行变量重命名、死代码消除等等更高级的优化手段。[glsl-minifier](https://github.com/TimvanScherpenzeel/glsl-minifier) 就是这样一个 CLI 工具。 + +其中的预计算特性有点类似 [Prepack](https://github.com/facebook/prepack),在构建阶段就计算出 `define` 变量的值: +```glsl +#define SPREAD 8.00 +#define MAX_DIR_LIGHTS 0 +#define MAX_POINT_LIGHTS 0 +#define MAX_SPOT_LIGHTS 0 +#define MAX_HEMI_LIGHTS 0 +#define MAX_SHADOWS 0 +#define GAMMA_FACTOR 2 + +uniform mat4 viewMatrix; +uniform vec3 cameraPosition; + +uniform vec2 resolution; +uniform float time; +uniform sampler2D texture; + +void main() { + vec2 uv = gl_FragCoord.xy / resolution.xy; + + float v = texture2D( texture, uv ).x; + + if (v == 1000.) discard; + v = sqrt(v); + + gl_FragColor = vec4( vec3( 1. - v / SPREAD ), 1.0 ); +} +``` + +上述代码压缩结果如下,`define` 统统不见了,变量名也进行了改写: +```glsl +uniform highp vec2 resolution;uniform sampler2D texture;void main(){highp vec2 a;a=(gl_FragCoord.xy/resolution);lowp vec4 b;b=texture2D(texture,a);if((b.x==1000.0)){discard;}lowp vec4 c;c.w=1.0;c.xyz=vec3((1.0-(sqrt(b.x)/8.0)));gl_FragColor=c;} +``` + +当然 glsl-minifier 做的远不止这些,还会应用变量名改写、死代码消除等等优化手段: +> Optimisations include function inlining, dead code removal, copy propagation, constant folding, constant propagation, arithmetic optimizations and so on. Minifications includes variable rewriting and whitespace trimming. + +显然这种手段要求我们的 Shader 代码在构建时是稳定的,然而 L7 使用的 GLSL 模块化方案需要在运行时进行模块拼接,如果在构建时代码片段中包含的变量发生了改写,势必影响运行时的拼接结果。另外 minifier 会校验代码的正确性,不理解我们自定义的模块引入语句 `pragma include 'module'` 是一定会报错的。 + +以这样的 Shader 为例: +```glsl +#pragma include "project" + +void main() { + // 从 project 模块引入方法 + project(position); +} +``` + +执行压缩时会报错: +```bash +$ node_modules/.bin/glsl-minifier -i ./build/example.frag -o ./build/example.min.frag +Error: +(28,2): error: no function with name 'project' + +Exiting glsl-minifier! +``` + +因此要想使用这个终极压缩方案,需要修改 L7 目前的 GLSL 模块化方案,代码拼接不能在运行时而需要在构建时完成。但这样就很难兼顾扩展性,毕竟用户自定义图层的 Shader 代码肯定只有运行时才能拿到。 + +所以一个折中的办法是在构建时先对 L7 内置图层的 Shader 代码进行模块化处理,得到最终的 GLSL 文本,然后再 minify。同时保留运行时模块化拼接的能力,应对用户自定义图层。 + +## Submodule + +npm 和 yarn 只提供了例如 `npm link` 以及 `yarn link` 这样的功能,而 yarn workspaces 只提供了 monorep 需要的底层 link 功能。相比之下 lerna 提供了更高级的功能例如 publish 和 version。因此 yarn workspaces 和 lerna 完全可以组合使用,这也是例如 Jest 等大型项目的使用方式。 + +![](./screenshots/monorep.png) + +构建命令如下,会在各个 package 下生成 `/lib` 和 `/es` 两个文件夹分别包含 ES2015 和 ESModule 产物: +```bash +yarn build +``` + +### 编译 TS + +使用 TS 有两种构建方式: +* native TypeScript with tsc +* [@babel/preset-typescript](https://babeljs.io/docs/en/babel-preset-typescript) + +由于我们的项目中需要使用到一些 babel plugin(装饰器、引入 GLSL 等),因此后者显然是更好的选择。这里我们使用 babel 7 的项目全局配置 configFile。 + +为了合并 ES2015 与 ESModule,我们参考 [redux](https://babeljs.io/blog/2018/06/26/on-consuming-and-publishing-es2015+-packages#conflating-javascript-modules-and-es2015): +```json +// redux package.json +{ + "main": "lib/redux.js", // ES5 + Common JS + "module": "es/redux.js", // ES5 + JS Modules +} +``` + +开发模式加上 `--watch` 即可。 +* `--root-mode upward` 使用 root 下的 babel 配置文件 +* `--out-dir dist` 输出到 /dist 文件夹下 +* `--delete-dir-on-start` 每次构建前清空,因此不需要 `rimraf` +```json +"scripts": { + "build": "run-p build:*", + "build:cjs": "BABEL_ENV=cjs babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "build:esm": "BABEL_ENV=esm babel src --root-mode upward --out-dir es --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments" +}, +``` + +### [WIP] 生成 TS 声明文件 + +和构建前类型检查不同,此时我们需要 tsc 输出类型声明文件了,当然不需要包含 story 和测试用例。 + +### [WIP] 异步加载 Mapbox + +以 L7 Bundler 方式使用时,由于需要在运行时根据用户配置项选择地图底图,会导致构建时需要将全部地图依赖引入,无法进行 TreeShaking。 +目前高德地图使用运行时异步加载方式引入,不会导致该问题,但 Mapbox 同样使用 Bundler,对于高德用户就多余了。 + +一个可能的方案是对于 Mapbox 使用 CodeSplitting。在容器首次获取 Mapbox 地图服务时异步加载并缓存。 \ No newline at end of file diff --git "a/dev-docs/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\241\210.md" "b/dev-docs/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\241\210.md" new file mode 100644 index 0000000000..58fd2b55ab --- /dev/null +++ "b/dev-docs/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\241\210.md" @@ -0,0 +1,142 @@ +# 自动化测试方案 + +如何测试一个 WebGL 应用渲染结果是否正确呢?常用的做法是进行像素比对,当然这也只能用于一些简单的判断例如渲染是否成功,整体的 Snapshot 比对开销很大。 + +但不管怎么说,这都意味着我们必须使用 WebGL API 进行真实的渲染。 + +以上过程在测试用例中描述如下: +```javascript +// 1. 绘制 +// 2. 读取像素 +const pixels = new Uint8Array(width * height * 4); +gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); +// 3. 判断某个像素点是否符合预期 +``` + +在与测试框架结合时,常用的方案有: +* Electron 除了 WebGL API,DOM API 等其他浏览器实现对于 WebGL 测试都是多余的,在 CI 时需要安装的依赖过大,所需的启动时间也很长。 +* [node-webgl](https://github.com/mikeseven/node-webgl) 不同于 WebGL,可以直接调用 OpenGL 驱动,但同样包含了很多 WebGL 之外的特性。 + +这里我们选择 [headless-gl](https://github.com/stackgl/headless-gl),一个纯粹的 WebGL 1 规范的实现。并且能够很容易集成进现有的 [CI 流程](https://github.com/stackgl/headless-gl#how-can-i-use-headless-gl-with-a-continuous-integration-service)中,例如 [TravisCI](https://travis-ci.org/) 和 [AppVeyor](http://www.appveyor.com/)。 + +## 测试框架 + +在配置测试框架前,我们必须解决一个 WebGL 项目中常见的问题。 + +### 引入 GLSL 文件 + +如何在测试时正确引入 GLSL 文件是一个问题。目前各个 3D 引擎常用的做法有两种: + +* 以字符串形式直接写在 `.js` 文件中。`luma.gl/deck.gl` 使用[这种方式](https://github.com/uber/deck.gl/blob/7.1-release/modules/layers/src/arc-layer/arc-layer-fragment.glsl.js)。 +* 使用 `.glsl` 编写,测试前使用构建脚本自动生成对应的 `.js` 文件。`Three.js`、`clay.gl` 使用[这种方式](https://github.com/pissang/claygl/blob/master/build/glsl2js.js)。 + +前者的好处是测试流程无需做过多修改,坏处则是无法享受编辑器对于 GLSL 的语法高亮,影响开发体验。而后者又需要编写额外的 `glsl2js` 的转换脚本。 + +我们显然希望如后者一样直接写 GLSL,但最好能让测试框架帮助我们完成自动转换的工作。 + +之前我们选择 `@babel/preset-typescript` 而非官方 `tsc` 的一大原因就是可以使用 `babel` 丰富的插件,`babel-plugin-inline-import` 就能完成类似 webpack 中 `raw-loader` 的功能,直接以字符串形式引入 GLSL 代码: + +```javascript +// 以字符串形式引入 GLSL 代码 +import circleFrag from '../../shaders/circle_frag.glsl'; +``` + +这样测试框架只需要使用同一套 babel 项目全局配置就行了。我们使用 Jest: +```javascript +// jest.config.js +module.exports = { + transform: { + '^.+\\.(ts|tsx)$': 'babel-jest', + }, +} +``` + +下面就可以编写测试用例了。 + +## 测试用例编写 + +我们将测试用例分成三类: +* 内部服务的单元测试 +* 渲染服务结果的 Snapshot 快照测试 +* React 组件测试 + +将测试用例放在任意路径的 `__tests__` 文件夹下并以 `xxx.spec.ts` 命名就可以帮助框架发现并执行了。 + +使用 `yarn test` 运行所有测试用例: + +![](./screenshots/jest.png) + +### 单元测试 + +这类测试直接使用 Jest API 就好了,我们以 `@l7/core` 模块的 `ShaderModuleService` 为例,编写一个简单的测试用例: + +```typescript +// services/shader/__test__/shader.spec.ts +import 'reflect-metadata'; +import IShaderModuleService from '../IShaderModuleService'; +import ShaderModuleService from '../ShaderModuleService'; + +describe('ShaderService', () => { + let shaderService: IShaderModuleService; + + beforeEach(() => { + shaderService = new ShaderModuleService(); + }); + + it('should register common module correctly and generate fragment/vertex shader code', () => { + const rawShaderCode = ` + #define PI 3.14 + `; + + const commonModule = { + fs: rawShaderCode, + vs: rawShaderCode, + }; + shaderService.registerModule('common', commonModule); + + const { vs, fs } = shaderService.getModule('common'); + + expect(vs).toMatch(/3\.14/); + expect(fs).toMatch(/3\.14/); + }); +}); +``` + +### 渲染结果测试 + +得益于 L7 使用的基于 Inversify 的依赖注入方案,我们能够很轻易地将渲染服务替换为基于 headless-gl 的渲染服务。 + +具体到我们目前的渲染服务实现 `regl`,它能轻易做到这一点。事实上 regl 的[测试用例](https://github.com/regl-project/regl/blob/gh-pages/test/util/create-context.js#L28)也是这样使用的。 + + +### [WIP] React 组件测试 + +### Coverage Report + +我们使用 Coveralls.io: +```json +// package.json +"coveralls": "jest --coverage && cat ./tests/coverage/lcov.info | coveralls", +``` + +运行 `yarn coveralls` 可以查看代码覆盖率,我们为分支、行覆盖率等指标设置了阈值: + +```javascript +// jest.config.js +module.exports = { + coverageThreshold: { + global: { + branches: 80, + functions: 80, + lines: 80, + statements: 80, + }, + }, +}; +``` + +## TravisCI + +TravisCI 检测到 `yarn.lock` 就会默认安装 `yarn` 并使用它安装依赖,所以不需要[额外的配置](https://yarnpkg.com/en/docs/install-ci#travis-tab)。 + +TravisCI 配合之前的 Coveralls.io。 diff --git a/docs/api/component/control.en.md b/docs/api/component/control.en.md new file mode 100644 index 0000000000..7e1e7c0cf8 --- /dev/null +++ b/docs/api/component/control.en.md @@ -0,0 +1,138 @@ +--- +title: Control +order: 1 +--- +# control + +地图组件 用于控制地图的状态如果平移,缩放,或者展示地图一些的辅助信息如图例,比例尺 + + +## 构造函数 + +```javascript +const baseControl = new L7.Control.Base(option); +``` + + +#### option + + position: `string` 控件位置支持是个方位 `bottomright, topright, bottomleft, topleft` + + +#### scene 内置地图组件 +zoom 地图放大缩小  默认添加
Scale 地图比例尺   默认添加
attribution 地图数据属性  默认添加
layer 图层列表 + +**scene配置项设置控件添加状态** + +```javascript +scene = new L7.scene({ + zoomControl: true, + scaleControl: true, + attributionControl: true +}) +``` + +#### + +#### Zoom +放大缩小组件 默认 左上角 + +```javascript + new L7.Control.Zoom({ + position: 'topleft' + }).addTo(scene); +``` + + +#### Scale +比例尺组件默认左下角 + +```javascript + new L7.Control.Scale({ + position: 'bottomleft' + }).addTo(scene); +``` + + +#### attribution +默认右下角 + +```javascript +new L7.Control.Attribution({ + position: 'bottomleft' + }).addTo(scene); +``` + + +#### layer +图层列表目前只支持可视化overlayers 图层控制 + +```javascript + var overlayers = { + "围栏填充": layer, + "围栏边界": layer2 + }; +new L7.Control.Layers({ + overlayers: overlayers +}).addTo(scene); +``` + + +## 方法 + +#### onAdd +组件添加到地图Scene时调用,自定义组件时需要实现此方法 + + +#### addTo +添加到地图scene + +```javascript +control.addTo(scene); +``` + + +#### setPosition +设置组件位置 + +```javascript +control.setPosition('bottomright'); +``` + + +#### remove +移除地图组件 + +```javascript +control.remove(); +``` + + + +## 示例代码 + + +#### 自定义图例控件 +[源码](https://antv.alipay.com/zh-cn/l7/1.x/demo/component/extendControl.html) + +```javascript +var legend = new L7.Control.Base({ + position: 'bottomright' + }); + legend.onAdd = function() { + var el = document.createElement('div'); + el.className = 'infolegend legend'; + var grades = [0, 8, 15, 30, 65, 120]; + for (var i = 0; i < grades.length; i++) { + el.innerHTML += ' ' + grades[i] + (grades[i + 1] ? '–' + grades[i + 1] + '
' : '+'); + } + return el; + }; + legend.addTo(scene); + +``` + +## + +## FAQ + diff --git a/docs/api/component/control.zh.md b/docs/api/component/control.zh.md new file mode 100644 index 0000000000..16d9950e31 --- /dev/null +++ b/docs/api/component/control.zh.md @@ -0,0 +1,137 @@ +--- +title: Control +order: 3 +--- +# control + +地图组件 用于控制地图的状态如果平移,缩放,或者展示地图一些的辅助信息如图例,比例尺 + + +## 构造函数 + +```javascript +const baseControl = new L7.Control.Base(option); +``` + + +#### option + position: `string` 控件位置支持是个方位 `bottomright, topright, bottomleft, topleft` + + +#### scene 内置地图组件 +zoom 地图放大缩小  默认添加
Scale 地图比例尺   默认添加
attribution 地图数据属性  默认添加
layer 图层列表 + +**scene配置项设置控件添加状态** + +```javascript +scene = new L7.scene({ + zoomControl: true, + scaleControl: true, + attributionControl: true +}) +``` + +#### + +#### Zoom +放大缩小组件 默认 左上角 + +```javascript + new L7.Control.Zoom({ + position: 'topleft' + }).addTo(scene); +``` + + +#### Scale +比例尺组件默认左下角 + +```javascript + new L7.Control.Scale({ + position: 'bottomleft' + }).addTo(scene); +``` + + +#### attribution +默认右下角 + +```javascript +new L7.Control.Attribution({ + position: 'bottomleft' + }).addTo(scene); +``` + + +#### layer +图层列表目前只支持可视化overlayers 图层控制 + +```javascript + var overlayers = { + "围栏填充": layer, + "围栏边界": layer2 + }; +new L7.Control.Layers({ + overlayers: overlayers +}).addTo(scene); +``` + + +## 方法 + +#### onAdd +组件添加到地图Scene时调用,自定义组件时需要实现此方法 + + +#### addTo +添加到地图scene + +```javascript +control.addTo(scene); +``` + + +#### setPosition +设置组件位置 + +```javascript +control.setPosition('bottomright'); +``` + + +#### remove +移除地图组件 + +```javascript +control.remove(); +``` + + + +## 示例代码 + + +#### 自定义图例控件 +[源码](https://antv.alipay.com/zh-cn/l7/1.x/demo/component/extendControl.html) + +```javascript +var legend = new L7.Control.Base({ + position: 'bottomright' + }); + legend.onAdd = function() { + var el = document.createElement('div'); + el.className = 'infolegend legend'; + var grades = [0, 8, 15, 30, 65, 120]; + for (var i = 0; i < grades.length; i++) { + el.innerHTML += ' ' + grades[i] + (grades[i + 1] ? '–' + grades[i + 1] + '
' : '+'); + } + return el; + }; + legend.addTo(scene); + +``` + +## + +## FAQ + diff --git a/docs/api/component/marker.en.md b/docs/api/component/marker.en.md new file mode 100644 index 0000000000..5adbea840f --- /dev/null +++ b/docs/api/component/marker.en.md @@ -0,0 +1,83 @@ +--- +title: Marker +order: 3 +--- + +Marker 地图标注 目前只支持2D dom标注 + + +## 构造函数 +Marker
`const Marker = new L7.Marker(option)` + + +#### option + +- color        `string `   ![map-marker.png](https://cdn.nlark.com/yuque/0/2019/png/104251/1566814628445-4f3152c8-71d1-4908-a651-246c17e507b5.png#align=left&display=inline&height=32&name=map-marker.png&originHeight=32&originWidth=32&size=635&status=done&width=32) 设置默认marker的颜色 +- element    `Dom|string`    自定义marker Dom节点,可以是dom实例,也可以是dom id +- anchor     `string`  锚点位置  支持 center, top, top-left, top-right, bottom, bottom-left,bottom-                        right,left, right +- offset    `Array`  偏移量 [ 0, 0 ] 分别表示 X, Y 的偏移量 + + +## 方法 + +#### setLnglat +设置marker经纬度位置 + +#### addTo +将marker添加到地图Scene + +#### remove +移除marker + +#### getElement +获取marker dom Element + +#### getLngLat +获取marker经纬度坐标 + +#### togglePopup +开启或者关闭marker弹出框 + +#### setPopup +为marker设置popup + +#### getPopup +获取marker弹出框 + + +## 示例代码 + +#### 默认Marker +**
` const marker = new L7.Marker({color:'blue'})` + + +#### 自定义Marker + +```javascript +var el = document.createElement('label'); + el.className = 'lableclass'; + el.textContent = data[i].v; + el.style.background = getColor(data[i].v); + new L7.Marker({ + element: el + }) + .setLnglat([data[i].x * 1, data[i].y]) + .addTo(scene); +``` + + +#### 设置 popup + +```javascript + var popup = new L7.Popup({ + anchor: 'left' + }).setText(item.name); + +new L7.Marker({ + element: el +}).setLnglat(item.coordinates) + .setPopup(popup) + .addTo(scene); +``` + + diff --git a/docs/api/component/marker.zh.md b/docs/api/component/marker.zh.md new file mode 100644 index 0000000000..5adbea840f --- /dev/null +++ b/docs/api/component/marker.zh.md @@ -0,0 +1,83 @@ +--- +title: Marker +order: 3 +--- + +Marker 地图标注 目前只支持2D dom标注 + + +## 构造函数 +Marker
`const Marker = new L7.Marker(option)` + + +#### option + +- color        `string `   ![map-marker.png](https://cdn.nlark.com/yuque/0/2019/png/104251/1566814628445-4f3152c8-71d1-4908-a651-246c17e507b5.png#align=left&display=inline&height=32&name=map-marker.png&originHeight=32&originWidth=32&size=635&status=done&width=32) 设置默认marker的颜色 +- element    `Dom|string`    自定义marker Dom节点,可以是dom实例,也可以是dom id +- anchor     `string`  锚点位置  支持 center, top, top-left, top-right, bottom, bottom-left,bottom-                        right,left, right +- offset    `Array`  偏移量 [ 0, 0 ] 分别表示 X, Y 的偏移量 + + +## 方法 + +#### setLnglat +设置marker经纬度位置 + +#### addTo +将marker添加到地图Scene + +#### remove +移除marker + +#### getElement +获取marker dom Element + +#### getLngLat +获取marker经纬度坐标 + +#### togglePopup +开启或者关闭marker弹出框 + +#### setPopup +为marker设置popup + +#### getPopup +获取marker弹出框 + + +## 示例代码 + +#### 默认Marker +**
` const marker = new L7.Marker({color:'blue'})` + + +#### 自定义Marker + +```javascript +var el = document.createElement('label'); + el.className = 'lableclass'; + el.textContent = data[i].v; + el.style.background = getColor(data[i].v); + new L7.Marker({ + element: el + }) + .setLnglat([data[i].x * 1, data[i].y]) + .addTo(scene); +``` + + +#### 设置 popup + +```javascript + var popup = new L7.Popup({ + anchor: 'left' + }).setText(item.name); + +new L7.Marker({ + element: el +}).setLnglat(item.coordinates) + .setPopup(popup) + .addTo(scene); +``` + + diff --git a/docs/api/component/popup.en.md b/docs/api/component/popup.en.md new file mode 100644 index 0000000000..fca06aefdd --- /dev/null +++ b/docs/api/component/popup.en.md @@ -0,0 +1,92 @@ +--- +title: Popup +order: 4 +--- +# popup + +地图标注信息窗口,用于展示地图要素的属性信息 + + +## 构造函数 +Popup + +```javascript +const popup = new L7.Popup(option) +``` + + +#### option + +- closeButton +- closeOnClick +- maxWidth +- anchor + + +## 方法 + +#### setLnglat +设置popup的经纬度位置
**参数**:lnglat 经纬度数组 [112,32] + +```javascript +popup.setLnglat([112, 32]); +``` + + +#### addTo +**参数**:scene 地图scene实例 + +将popup添加到地图scene显示 + +```javascript +popup.addTo(scene); +``` + + +#### setHtml +**参数**:html 字符串 + +设置popup html 内容 + +```javascript +var html = '

\u7701\u4EFD\uFF1A' + feature.s + '

\n

\u5730\u533A\uFF1A' + feature.m + '

\n

\u6E29\u5EA6\uFF1A' + feature.t + '

\n '; +popup.setHtml(html); + +``` + + +#### setText +设置 popup 显示文本内容 + +```javascript +popup.setText('hello world'); +``` + + +#### remove +移除popup + +```javascript +popup.remove() +``` + + +## 事件 + +#### close + +```javascript +popup.on('close',()=>{}) +``` + + +## 示例代码 + +#### 添加popup + +``` + var html = '

'+feature.m+'

'; + const new L7.Popup().setLnglat([112, 32]).setHTML(html).addTo(scene); +``` + +### FAQ diff --git a/docs/api/component/popup.zh.md b/docs/api/component/popup.zh.md new file mode 100644 index 0000000000..e3fa32bfbe --- /dev/null +++ b/docs/api/component/popup.zh.md @@ -0,0 +1,92 @@ +--- +title: popup +order: 0 +--- +# popup + +地图标注信息窗口,用于展示地图要素的属性信息 + + +## 构造函数 +Popup + +```javascript +const popup = new L7.Popup(option) +``` + + +#### option + +- closeButton +- closeOnClick +- maxWidth +- anchor + + +## 方法 + +#### setLnglat +设置popup的经纬度位置
**参数**:lnglat 经纬度数组 [112,32] + +```javascript +popup.setLnglat([112, 32]); +``` + + +#### addTo +**参数**:scene 地图scene实例 + +将popup添加到地图scene显示 + +```javascript +popup.addTo(scene); +``` + + +#### setHtml +**参数**:html 字符串 + +设置popup html 内容 + +```javascript +var html = '

\u7701\u4EFD\uFF1A' + feature.s + '

\n

\u5730\u533A\uFF1A' + feature.m + '

\n

\u6E29\u5EA6\uFF1A' + feature.t + '

\n '; +popup.setHtml(html); + +``` + + +#### setText +设置 popup 显示文本内容 + +```javascript +popup.setText('hello world'); +``` + + +#### remove +移除popup + +```javascript +popup.remove() +``` + + +## 事件 + +#### close + +```javascript +popup.on('close',()=>{}) +``` + + +## 示例代码 + +#### 添加popup + +``` + var html = '

'+feature.m+'

'; + const new L7.Popup().setLnglat([112, 32]).setHTML(html).addTo(scene); +``` + +### FAQ diff --git a/docs/api/l7.en.md b/docs/api/l7.en.md new file mode 100644 index 0000000000..c26a8f7e2e --- /dev/null +++ b/docs/api/l7.en.md @@ -0,0 +1,75 @@ +--- +title: Introduction +order: 0 +redirect_from: + - /en/docs/api +--- +#### An open source large-scale geospatial data visualization analysis development framework powered by WebGL + +L7 是由蚂蚁金服 AntV 数据可视化团队推出的基于 WebGL 的开源大规模地理空间数据可视分析开发框架。L7 中的 L 代表 Location,7 代表世界七大洲,寓意能为全球位置数据提供可视分析的能力。L7 以图形符号学为理论基础,将抽象复杂的空间数据转化成 2D、3D 符号,通过颜色、大小、体积、纹理等视觉变量实现丰富的可视化表达。 + + + +## 核心特性 + + +🌏 数据驱动可视化展示 + +数据驱动,从数到形,支持丰富的地图可视化类型,更好洞察数据。 + +🌏 2D,3D 一体化的海量数据高性能渲染 + +百万级空间数据实时,动态渲染。 + +🌏 简单灵活的数据接入 + +支持CSV,JSON,geojson等数据格式接入,可以根据需求自定义数据格式,无需复杂的空间数据转换。 + + 🌏 多地图底图支持,支持离线内网部署 + +高德地图国内合法合规的地理底图,Mapbox 满足国际化业务需求。 + +## 支持丰富的图表类型 + +### 点图层 + + - 气泡图 + - 散点图 + - 符号地图 + - 3D柱状地图 + - 聚合地图 + - 复合图表地图 + - 自定义Marker + +### 线图层 + +- 路径地图 +- 弧线,支持2D弧线、3D弧线以及大圆航线 +- 等值线 + +### 面图层 + +- 填充图 +- 3D填充图 + +### 热力图 + +- 经典热力图 +- 蜂窝热力图 +- 网格热力图 + +### 栅格地图 +- 图片 +- Raster + +## L7 2.0 Roadmap + +![L7 Road Map](https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*3j9HTLTQT2MAAAAAAAAAAABkARQnAQ) + + +更多技术细节,详细进展,请关注 [GitHub](https://github.com/antvis/L7),欢迎大家来给点点 Star,让更多人看到这个开源的项目。 \ No newline at end of file diff --git a/docs/api/l7.zh.md b/docs/api/l7.zh.md new file mode 100644 index 0000000000..99742bd0c3 --- /dev/null +++ b/docs/api/l7.zh.md @@ -0,0 +1,76 @@ +--- +title: 简介 +order: 0 +redirect_from: + - /zh/docs/api +--- + +# L7 地理空间数据可视分析引擎 + +L7 是由蚂蚁金服 AntV 数据可视化团队推出的基于 WebGL 的开源大规模地理空间数据可视分析开发框架。L7 中的 L 代表 Location,7 代表世界七大洲,寓意能为全球位置数据提供可视分析的能力。L7 以图形符号学为理论基础,将抽象复杂的空间数据转化成 2D、3D 符号,通过颜色、大小、体积、纹理等视觉变量实现丰富的可视化表达。 + + + +## 核心特性 + + +🌏 数据驱动可视化展示 + +数据驱动,从数到形,支持丰富的地图可视化类型,更好洞察数据。 + +🌏 2D,3D 一体化的海量数据高性能渲染 + +百万级空间数据实时,动态渲染。 + +🌏 简单灵活的数据接入 + +支持CSV,JSON,geojson等数据格式接入,可以根据需求自定义数据格式,无需复杂的空间数据转换。 + + 🌏 多地图底图支持,支持离线内网部署 + +高德地图国内合法合规的地理底图,Mapbox 满足国际化业务需求。 + +## 支持丰富的图表类型 + +### 点图层 + + - 气泡图 + - 散点图 + - 符号地图 + - 3D柱状地图 + - 聚合地图 + - 复合图表地图 + - 自定义Marker + +### 线图层 + +- 路径地图 +- 弧线,支持2D弧线、3D弧线以及大圆航线 +- 等值线 + +### 面图层 + +- 填充图 +- 3D填充图 + +### 热力图 + +- 经典热力图 +- 蜂窝热力图 +- 网格热力图 + +### 栅格地图 +- 图片 +- Raster + +## L7 2.0 Roadmap + +![L7 Road Map](https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*3j9HTLTQT2MAAAAAAAAAAABkARQnAQ) + + +更多技术细节,详细进展,请关注 [GitHub](https://github.com/antvis/L7),欢迎大家来给点点 Star,让更多人看到这个开源的项目。 \ No newline at end of file diff --git a/docs/api/layer/heatmap.en.md b/docs/api/layer/heatmap.en.md new file mode 100644 index 0000000000..2bf68b6740 --- /dev/null +++ b/docs/api/layer/heatmap.en.md @@ -0,0 +1,205 @@ +--- +title: HeatmapLayer +order: 5 +--- + +# heatmapLayer + + +### 简介 + +热力图图层,包含三种类型的, +- 方格热力图 + +将一组点数据按照等大小的正方形网格进行聚合,一个正方形网格代表网格内所有点的统计值。方格热力图特点以方格网布局。 + +- 六边形热力图 + +将一组点数据按照等大小的六边形网格进行聚合,一个六边形网格代表网格内所有点的统计值。蜂窝热力图特点以六边形热力图网格布局 + +- 经典热力图 + + + +⚠️ 网格热力图和蜂窝热力图需要对数据聚合处理,使用之前需要在source方法设置数据聚合方法 + +### source + +热力图只支持点数据作为数据源 + +布局方法 通过source的 tansforms属性配置 + +- type  数据聚合类型 grid、hexagon +- size  网格半径 单位 米 +- field  聚合字段 +- method 聚合方法  count,max,min,sum,mean5个统计维度 + +```javascript + +layer.source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms:[ + { + type: 'grid', + size: 15000, + field:'v', + method:'sum' + } + ], + } +``` + +### shape + +不同类型热力图shape支持 + +| | 2D | 3d | +| --- | --- | --- | +| 网格格热力图 | circle,triangle,square,heaxgon | cylinder,triangleColumn,hexagonColum,squareColumn | +| 蜂窝热力图 | circle,triangle,square,heaxgon | circle,triangle,square,heaxgon | +| 普通热力图 | heatmap | heatmap | + + +热力图布局下只shape方法只支持常量的可视化。 + +```javascript +HeatmapLayer.shape('square'); +HeatmapLayer.shape('hexagon'); +// 默认类型可以不设置 +``` + +### size +当前版本 shape 为grid,hexagon不需要设置 size 映射 + +default 类型需要设置size映射 详细参数见[Size](https://www.yuque.com/antv/l7/layer#size) + +**size(field,values) ** + +- field: 热力图权重字段 +- values: 数据映射区间 热力图显示 [0, 1] 效果最佳 + +```javascript +HeatmapLayer.size ('field', [0, 1]) +``` + + +### color +default heatMap 类型不需设置 color映射 + +color 配置项同 [**color**](https://www.yuque.com/antv/l7/layer#color) + + + +### style + +grid hexagon 可以通过style 设置透明度 + +default热力图需要通过style配置参数热力图参数 + +- intensity   全局热力权重   推荐权重范围 1-5 +- radius  热力半径,单位像素 +- rampColors 色带参数 + - colors  颜色数组 + - positions 数据区间 + +```javascript + HeatmapLayer.style({ + intensity: 3, + radius: 20, + rampColors: { + colors: [ 'rgba(33,102,172,0.0)', 'rgb(103,169,207)', 'rgb(209,229,240)', 'rgb(253,219,199)', 'rgb(239,138,98)', 'rgb(178,24,43,1.0)' ], + positions: [ 0, 0.2, 0.4, 0.6, 0.8, 1.0 ] + } + }) +``` + + +### 完整代码示例 + +#### 普通热力图 + +```javascript +// 测试数据 url https://gw.alipayobjects.com/os/basement_prod/08c6ea00-dc5f-4bb0-b0b5-52bde5edf0a3.json + + HeatmapLayer({ + zIndex: 2 + }) + .source(data) + .size('mag', [ 0, 1 ]) // weight映射通道 + .style({ + intensity: 3, + radius: 20, + rampColors: { + colors: [ 'rgba(33,102,172,0.0)', 'rgb(103,169,207)', 'rgb(209,229,240)', 'rgb(253,219,199)', 'rgb(239,138,98)', 'rgb(178,24,43,1.0)' ], + positions: [ 0, 0.2, 0.4, 0.6, 0.8, 1.0 ] + } + }) +``` + + + +#### 网格热力图 + +```javascript +var layer = scene.HeatmapLayer({ + zIndex: 2 + }) + .source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms:[ + + { + type: 'grid', + size: 15000, + field:'v', + method:'sum' + } + ] + }) + .shape('grid') + .style({ + coverage: 0.8 + }) + .color('count', + ["#002466","#105CB3","#2894E0","#CFF6FF","#FFF5B8","#FFAB5C","#F27049","#730D1C"]) + +``` + + +#### 六边形热力图 + +```javascript + var layer = scene.HeatmapLayer({ + zIndex: 2 + }). + souce(data,{ + parser:{ + type:'csv', + x:lng, + y:lat, + }, + transforms:[ + { + type:'hexgon', + size:1500, + field:'count', + operation: 'sum', + } + ] + }) + .shape('hexgon') + .size(1000) + .color('sum') + .style({ + coverage:0.8 + }) +render() +``` \ No newline at end of file diff --git a/docs/api/layer/heatmap.zh.md b/docs/api/layer/heatmap.zh.md new file mode 100644 index 0000000000..2431fc5cb7 --- /dev/null +++ b/docs/api/layer/heatmap.zh.md @@ -0,0 +1,204 @@ +--- +title: HeatmapLayer +order: 5 +--- +# heatmapLayer + + +### 简介 + +热力图图层,包含三种类型的, +- 方格热力图 + +将一组点数据按照等大小的正方形网格进行聚合,一个正方形网格代表网格内所有点的统计值。方格热力图特点以方格网布局。 + +- 六边形热力图 + +将一组点数据按照等大小的六边形网格进行聚合,一个六边形网格代表网格内所有点的统计值。蜂窝热力图特点以六边形热力图网格布局 + +- 经典热力图 + + + +⚠️ 网格热力图和蜂窝热力图需要对数据聚合处理,使用之前需要在source方法设置数据聚合方法 + +### source + +热力图只支持点数据作为数据源 + +布局方法 通过source的 tansforms属性配置 + +- type  数据聚合类型 grid、hexagon +- size  网格半径 单位 米 +- field  聚合字段 +- method 聚合方法  count,max,min,sum,mean5个统计维度 + +```javascript + +layer.source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms:[ + { + type: 'grid', + size: 15000, + field:'v', + method:'sum' + } + ], + } +``` + +### shape + +不同类型热力图shape支持 + +| | 2D | 3d | +| --- | --- | --- | +| 网格格热力图 | circle,triangle,square,heaxgon | cylinder,triangleColumn,hexagonColum,squareColumn | +| 蜂窝热力图 | circle,triangle,square,heaxgon | circle,triangle,square,heaxgon | +| 普通热力图 | heatmap | heatmap | + + +热力图布局下只shape方法只支持常量的可视化。 + +```javascript +HeatmapLayer.shape('square'); +HeatmapLayer.shape('hexagon'); +// 默认类型可以不设置 +``` + +### size +当前版本 shape 为grid,hexagon不需要设置 size 映射 + +default 类型需要设置size映射 详细参数见[Size](https://www.yuque.com/antv/l7/layer#size) + +**size(field,values) ** + +- field: 热力图权重字段 +- values: 数据映射区间 热力图显示 [0, 1] 效果最佳 + +```javascript +HeatmapLayer.size ('field', [0, 1]) +``` + + +### color +default heatMap 类型不需设置 color映射 + +color 配置项同 [**color**](https://www.yuque.com/antv/l7/layer#color) + + + +### style + +grid hexagon 可以通过style 设置透明度 + +default热力图需要通过style配置参数热力图参数 + +- intensity   全局热力权重   推荐权重范围 1-5 +- radius  热力半径,单位像素 +- rampColors 色带参数 + - colors  颜色数组 + - positions 数据区间 + +```javascript + HeatmapLayer.style({ + intensity: 3, + radius: 20, + rampColors: { + colors: [ 'rgba(33,102,172,0.0)', 'rgb(103,169,207)', 'rgb(209,229,240)', 'rgb(253,219,199)', 'rgb(239,138,98)', 'rgb(178,24,43,1.0)' ], + positions: [ 0, 0.2, 0.4, 0.6, 0.8, 1.0 ] + } + }) +``` + + +### 完整代码示例 + +#### 普通热力图 + +```javascript +// 测试数据 url https://gw.alipayobjects.com/os/basement_prod/08c6ea00-dc5f-4bb0-b0b5-52bde5edf0a3.json + + HeatmapLayer({ + zIndex: 2 + }) + .source(data) + .size('mag', [ 0, 1 ]) // weight映射通道 + .style({ + intensity: 3, + radius: 20, + rampColors: { + colors: [ 'rgba(33,102,172,0.0)', 'rgb(103,169,207)', 'rgb(209,229,240)', 'rgb(253,219,199)', 'rgb(239,138,98)', 'rgb(178,24,43,1.0)' ], + positions: [ 0, 0.2, 0.4, 0.6, 0.8, 1.0 ] + } + }) +``` + + + +#### 网格热力图 + +```javascript +var layer = scene.HeatmapLayer({ + zIndex: 2 + }) + .source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms:[ + + { + type: 'grid', + size: 15000, + field:'v', + method:'sum' + } + ] + }) + .shape('grid') + .style({ + coverage: 0.8 + }) + .color('count', + ["#002466","#105CB3","#2894E0","#CFF6FF","#FFF5B8","#FFAB5C","#F27049","#730D1C"]) + +``` + + +#### 六边形热力图 + +```javascript + var layer = scene.HeatmapLayer({ + zIndex: 2 + }). + souce(data,{ + parser:{ + type:'csv', + x:lng, + y:lat, + }, + transforms:[ + { + type:'hexgon', + size:1500, + field:'count', + operation: 'sum', + }, + ], + }) + .shape('hexgon') + .size(1000) + .color('sum') + .style({ + coverage:0.8 + }) +render() +``` \ No newline at end of file diff --git a/docs/api/layer/imagelayer.en.md b/docs/api/layer/imagelayer.en.md new file mode 100644 index 0000000000..4d0c122617 --- /dev/null +++ b/docs/api/layer/imagelayer.en.md @@ -0,0 +1,23 @@ +--- +title: ImageLayer +order: 5 +--- +# ImageLayer + +## 简介 +将图片添加到地图上,需要指定图片的经纬度范围 + +### 代码示例 + +```javascript +const layer = new ImageLayer({}); +layer.source( + 'https://gw.alipayobjects.com/zos/rmsportal/FnHFeFklTzKDdUESRNDv.jpg', + { + parser: { + type: 'image', + extent: [ 121.168, 30.2828, 121.384, 30.4219 ] + } + } +); +``` diff --git a/docs/api/layer/imagelayer.zh.md b/docs/api/layer/imagelayer.zh.md new file mode 100644 index 0000000000..4d0c122617 --- /dev/null +++ b/docs/api/layer/imagelayer.zh.md @@ -0,0 +1,23 @@ +--- +title: ImageLayer +order: 5 +--- +# ImageLayer + +## 简介 +将图片添加到地图上,需要指定图片的经纬度范围 + +### 代码示例 + +```javascript +const layer = new ImageLayer({}); +layer.source( + 'https://gw.alipayobjects.com/zos/rmsportal/FnHFeFklTzKDdUESRNDv.jpg', + { + parser: { + type: 'image', + extent: [ 121.168, 30.2828, 121.384, 30.4219 ] + } + } +); +``` diff --git a/docs/api/layer/layer.en.md b/docs/api/layer/layer.en.md new file mode 100644 index 0000000000..21ccab7477 --- /dev/null +++ b/docs/api/layer/layer.en.md @@ -0,0 +1,322 @@ +--- +title: Map Layer +order: 0 +--- +# Layer + + +## 简介 +L7 Layer 接口设计遵循图形语法,在可视表达上 + +语法示例 + +```javascript +new Layer(option) +.source() +.color() +.size() +.shape() +.style() + +``` + + +## 构造函数 + + +## 配置项 + +### visable +图层是否可见   {bool } default true + +### zIndex + 图层绘制顺序,数值越小优先绘制,可以控制图层绘制的上下层级 {int}   default 0 +### minZoom +图层显示最小缩放等级,(0-18)   {number}  default 0 + +### maxZoom + 图层显示最大缩放等级 (0-18)   {number}  default 18 + + +## 鼠标事件 + +beta版当前不支持,正式版会支持 + +```javascript +layer.on('click', (ev)=>{}); // 鼠标左键点击图层事件 +layer.on('dblclick', (ev)=>{}); // 鼠标左键双击图层事件 +layer.on('mousemove', (ev)=>{}); // 鼠标在图层上移动时触发 +layer.on('mouseover', (ev)=>{}); // 鼠标移入图层要素内时触发 +layer.on('mouseout', (ev)=>{}); // 鼠标移出图层要素时触发 +layer.on('mouseup', (ev)=>{}); // 鼠标在图层上单击抬起时触发 +layer.on('mousedown', (ev)=>{}); // 鼠标在图层上单击按下时触发 +layer.on('mouseleave', (ev)=>{}); // 鼠标离开图层要素 +layer.on('rightclick', (ev)=>{}); // 鼠标右键图层要素 + +``` + + +## 方法 + +### source +数据源为layer设置数据 source(data,config) + +- data {geojson|json|csv} + + +      源数据 + +- config  可选 数据源配置项 + - parser 数据解析,默认是解析层geojson + - transforms [transform,transform ]  数据处理转换 可设置多个 + + parser和 transforms [见source文档](https://www.yuque.com/antv/l7/source) + +```javascript +layer.source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms:[ + { + type: 'map', + callback:function(item){ + const [x, y] = item.coordinates; + item.lat = item.lat*1; + item.lng = item.lng*1; + item.v = item.v *1; + item.coordinates = [x*1,y*1]; + return item; + } + + }, + { + type: 'hexagon', + size: 6000, + field:'v', + method:'sum' + } + ] + }) +``` + +### + +### scale + + +cscle('field', scaleConfig) + +(field: string, scaleConfig: object) + +为指定的数据字段进行列定义,返回 layer 实例。 + + + +- `field` 字段名。 + +- `scaleConfig` 列定义配置,对象类型,可配置的属性如下: + +```javascript +{ + type: "linear" // 指定数据类型,可声明的类型为:identity、linear、cat、time、timeCat、log、pow, quantile,quantize +} + +``` + +### size + +将数据值映射到图形的大小上的方法。 + +**注意:**  + +不同图层的 size 的含义有所差别: + +- point 图形的 size 影响点的半径大小和高度; + +- line, arc, path 中的 size 影响线的粗细,和高度; + +- polygon size 影响的是高度 + + + +```javascript +pointLayer.size(10); // 常量 +pointLayer.size('type'); // 使用字段映射到大小 +pointLayer.size('type', [ 0, 10 ]); // 使用字段映射到大小,并指定最大值和最小值 +pointLayer.size('type', (type) => { // 回调函数 + if(type === 'a') { + return 10; + } + return 5; +}); +``` + + +#### size(value) + +传入数字常量,如 `pointLayer.size(20)` + +#### size(field) +根据 field 字段的值映射大小,使用默认的`最大值 max:10` 和`最小值 min: 1`。 + +#### size(field, callback) +使用回调函数控制图形大小。 + +- `callback`: function 回调函数。 + +```javascript +pointLayer.size('age', (value) => { + if(value === 1) { + return 5; + } + return 10; +}); +``` + +### color + +将数据值映射到图形的颜色上的方法。 + +```javascript +layer.color('red'); // 常量颜色 +layer.color('type'); // 对 type 字段进行映射,使用内置的颜色 +layer.color('type', [ 'red', 'blue' ]) // 指定颜色 +layer.color('type', (type) => { // 通过回调函数 + if (type === 'a') { + return 'red'; + } + return 'blue'; +}); +layer.color('type*value', (type, value) => { //多个参数,通过回调函数 + if (type === 'a' && value > 100) { + return 'red'; + } + return 'blue'; +}); +``` + + +#### color(value) + + +参数:`value` :string +只支持接收一个参数,value 可以是: + +- 映射至颜色属性的数据源字段名,如果数据源中不存在这个字段名的话,则按照常量进行解析,这个时候会使用 L7 默认提供的颜色。 + +- 也可以直接指定某一个具体的颜色值 color,如 '#fff', 'white','rgba(255,0,0,0.5)' ,rgb(255,0,1) 等。 + + +示例 +```javascript +layer.color('name') // 映射数据字段 +layer.color('white') // 指定颜色 +``` + + +#### color(field, colors) + +参数: + +- `field`: stringfield 为映射至颜色属性的数据源字段名,也支持指定多个参数。 + +-  `colors`: string | array | function + + +colors 的参数有以下情况: 如果为空,即未指定颜色的数组,那么使用内置的全局的颜色;如果需要指定颜色,则需要以数组格式传入,那么分类的颜色按照数组中的颜色确定。对于颜色的分配顺序。 + +```javascript +layer.color('name'); // 使用默认的颜色 +layer.color('name', [ 'red', 'blue' ]); // 使用传入的指定颜色 +``` + +- colors 如果是回调函数,则该回调函数的参数为对应字段的数值,具体使用如下,当 color 映射为多个字段时,参数按照字段声明的顺序传入: + + + +```javascript +layer.color('gender', (value) => { + if(value === 1) { + return 'red' + } + return 'blue'; +}); +layer.color('gender*age', (gender, age) => { + if(age === 20 && gender ==' 男' ) { + return 'red' + } + return 'blue'; +}); +``` + +### shape +将数据值映射到图形的形状上的方法。 + +**shape(shape)** + +参数`shape` string + +只支持接收一个参数,指定几何图像对象绘制的形状。下表列出了不同的 图层 几何图形对象支持的 shape 形状 + +| layer类型 | shape类型 | 备注 | +| --- | --- | --- | +| point | 2d:point,circle, square, triangle,hexagon,image,text 3d:circle,triangle,hexagon,square | | +| line | line,arc, arc3d, greatcircle | | +| polygon | fill,line, extrude | | + + +**shape(field, shapes)** + +**shape(field, callback)** + + +### style + +用于配置几何体显示图像属性目前支持以下属性,其他属性会逐步开放 + +- fill + +- opacity  设置透明度 + +- stroke 线填充颜色 + +- strokeWidth 线的宽度 + + +```javascript +layer.style({ + fill:'red', + opacity:0.8, + stroke:'white' +}) +``` + + +### show +图层显示 + +```javascript +layer.show(); +``` + + +### hide + +图层隐藏 + +```javascript +layer.hide(); +``` + + +### fitBounds + +缩放到图层范围 + +```javascript +layer.fitBounds() + +``` \ No newline at end of file diff --git a/docs/api/layer/layer.zh.md b/docs/api/layer/layer.zh.md new file mode 100644 index 0000000000..dfefab69a6 --- /dev/null +++ b/docs/api/layer/layer.zh.md @@ -0,0 +1,322 @@ +--- +title: Layer +order: 0 +--- +# Layer + + +## 简介 +L7 Layer 接口设计遵循图形语法,在可视表达上 + +语法示例 + +```javascript +new Layer(option) +.source() +.color() +.size() +.shape() +.style() + +``` + + +## 构造函数 + + +## 配置项 + +### visable +图层是否可见   {bool } default true + +### zIndex + 图层绘制顺序,数值越小优先绘制,可以控制图层绘制的上下层级 {int}   default 0 +### minZoom +图层显示最小缩放等级,(0-18)   {number}  default 0 + +### maxZoom + 图层显示最大缩放等级 (0-18)   {number}  default 18 + + +## 鼠标事件 + +beta版当前不支持,正式版会支持 + +```javascript +layer.on('click', (ev)=>{}); // 鼠标左键点击图层事件 +layer.on('dblclick', (ev)=>{}); // 鼠标左键双击图层事件 +layer.on('mousemove', (ev)=>{}); // 鼠标在图层上移动时触发 +layer.on('mouseover', (ev)=>{}); // 鼠标移入图层要素内时触发 +layer.on('mouseout', (ev)=>{}); // 鼠标移出图层要素时触发 +layer.on('mouseup', (ev)=>{}); // 鼠标在图层上单击抬起时触发 +layer.on('mousedown', (ev)=>{}); // 鼠标在图层上单击按下时触发 +layer.on('mouseleave', (ev)=>{}); // 鼠标离开图层要素 +layer.on('rightclick', (ev)=>{}); // 鼠标右键图层要素 + +``` + + +## 方法 + +### source +数据源为layer设置数据 source(data,config) + +- data {geojson|json|csv} + + +      源数据 + +- config  可选 数据源配置项 + - parser 数据解析,默认是解析层geojson + - transforms [transform,transform ]  数据处理转换 可设置多个 + + parser和 transforms [见source文档](https://www.yuque.com/antv/l7/source) + +```javascript +layer.source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms:[ + { + type: 'map', + callback:function(item){ + const [x, y] = item.coordinates; + item.lat = item.lat*1; + item.lng = item.lng*1; + item.v = item.v *1; + item.coordinates = [x*1,y*1]; + return item; + } + + }, + { + type: 'hexagon', + size: 6000, + field:'v', + method:'sum' + } + ] + }) +``` + +### + +### scale + + +cscle('field', scaleConfig) + +(field: string, scaleConfig: object) + +为指定的数据字段进行列定义,返回 layer 实例。 + + + +- `field` 字段名。 + +- `scaleConfig` 列定义配置,对象类型,可配置的属性如下: + +```javascript +{ + type: "linear" // 指定数据类型,可声明的类型为:identity、linear、cat、time、timeCat、log、pow, quantile,quantize +} + +``` + +### size + +将数据值映射到图形的大小上的方法。 + +**注意:**  + +不同图层的 size 的含义有所差别: + +- point 图形的 size 影响点的半径大小和高度; + +- line, arc, path 中的 size 影响线的粗细,和高度; + +- polygon size 影响的是高度 + + + +```javascript +pointLayer.size(10); // 常量 +pointLayer.size('type'); // 使用字段映射到大小 +pointLayer.size('type', [ 0, 10 ]); // 使用字段映射到大小,并指定最大值和最小值 +pointLayer.size('type', (type) => { // 回调函数 + if(type === 'a') { + return 10; + } + return 5; +}); +``` + + +#### size(value) + +传入数字常量,如 `pointLayer.size(20)` + +#### size(field) +根据 field 字段的值映射大小,使用默认的`最大值 max:10` 和`最小值 min: 1`。 + +#### size(field, callback) +使用回调函数控制图形大小。 + +- `callback`: function 回调函数。 + +```javascript +pointLayer.size('age', (value) => { + if(value === 1) { + return 5; + } + return 10; +}); +``` + +### color + +将数据值映射到图形的颜色上的方法。 + +```javascript +layer.color('red'); // 常量颜色 +layer.color('type'); // 对 type 字段进行映射,使用内置的颜色 +layer.color('type', [ 'red', 'blue' ]) // 指定颜色 +layer.color('type', (type) => { // 通过回调函数 + if (type === 'a') { + return 'red'; + } + return 'blue'; +}); +layer.color('type*value', (type, value) => { //多个参数,通过回调函数 + if (type === 'a' && value > 100) { + return 'red'; + } + return 'blue'; +}); +``` + + +#### color(value) + + +参数:`value` :string +只支持接收一个参数,value 可以是: + +- 映射至颜色属性的数据源字段名,如果数据源中不存在这个字段名的话,则按照常量进行解析,这个时候会使用 L7 默认提供的颜色。 + +- 也可以直接指定某一个具体的颜色值 color,如 '#fff', 'white','rgba(255,0,0,0.5)' ,rgb(255,0,1) 等。 + + +示例 +```javascript +layer.color('name') // 映射数据字段 +layer.color('white') // 指定颜色 +``` + + +#### color(field, colors) + +参数: + +- `field`: stringfield 为映射至颜色属性的数据源字段名,也支持指定多个参数。 + +-  `colors`: string | array | function + + +colors 的参数有以下情况: 如果为空,即未指定颜色的数组,那么使用内置的全局的颜色;如果需要指定颜色,则需要以数组格式传入,那么分类的颜色按照数组中的颜色确定。对于颜色的分配顺序。 + +```javascript +layer.color('name'); // 使用默认的颜色 +layer.color('name', [ 'red', 'blue' ]); // 使用传入的指定颜色 +``` + +- colors 如果是回调函数,则该回调函数的参数为对应字段的数值,具体使用如下,当 color 映射为多个字段时,参数按照字段声明的顺序传入: + + + +```javascript +layer.color('gender', (value) => { + if(value === 1) { + return 'red' + } + return 'blue'; +}); +layer.color('gender*age', (gender, age) => { + if(age === 20 && gender ==' 男' ) { + return 'red' + } + return 'blue'; +}); +``` + +### shape +将数据值映射到图形的形状上的方法。 + +**shape(shape)** + +参数`shape` string + +只支持接收一个参数,指定几何图像对象绘制的形状。下表列出了不同的 图层 几何图形对象支持的 shape 形状 + +| layer类型 | shape类型 | 备注 | +| --- | --- | --- | +| point | 2d:point,circle, square, triangle,hexagon,image,text 3d:circle,triangle,hexagon,square | | +| line | line,arc, arc3d, greatcircle | | +| polygon | fill,line, extrude | | + + +**shape(field, shapes)** + +**shape(field, callback)** + + +### style + +用于配置几何体显示图像属性目前支持以下属性,其他属性会逐步开放 + +- fill + +- opacity  设置透明度 + +- stroke 线填充颜色 + +- strokeWidth 线的宽度 + + +```javascript +layer.style({ + fill:'red', + opacity:0.8, + stroke:'white' +}) +``` + + +### show +图层显示 + +```javascript +layer.show(); +``` + + +### hide + +图层隐藏 + +```javascript +layer.hide(); +``` + + +### fitBounds + +缩放到图层范围 + +```javascript +layer.fitBounds() + +``` \ No newline at end of file diff --git a/docs/api/layer/linelayer.en.md b/docs/api/layer/linelayer.en.md new file mode 100644 index 0000000000..90d7b56a43 --- /dev/null +++ b/docs/api/layer/linelayer.en.md @@ -0,0 +1,72 @@ +--- +title: LineLayer +order: 2 +--- +## 线图层 + +### shape + +线图层支持4种 shape + +- line 绘制路径图, +- arc 绘制弧线 通过贝塞尔曲线算法技术弧线 +- greatcircle 大圆航线,地图两个点的最近距离不是两个点连线,而是大圆航线 +- arc3d 3d弧线地图 3D视角 + +⚠️ 弧线只需要设置起始点坐标即可 + +``` + new LineLayer() + .source(data, { + parser: { + type: 'csv', + x: 'lng1', + y: 'lat1', + x1: 'lng2', + y1: 'lat2', + }, + }) +``` + +如果geojson 数据绘制弧线图 coordinates 第一对坐标为起点,第二对为终点 +``` +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 106.5234375, + 57.51582286553883 + ], + [ + 136.40625, + 61.77312286453146 + ] + ] + } + } + ] +} + +``` + +### size + +线图层 可以设置高度 + +- size 类型为number 则表示 line的宽度 +- size 类型为 [number , number] 分别表示宽度和高度 + +```javascript + +lineLayer.size(1); // 线的宽度为 1 +lineLayer.size([1,2]); // 宽度为1,高度2 + +``` + + diff --git a/docs/api/layer/linelayer.zh.md b/docs/api/layer/linelayer.zh.md new file mode 100644 index 0000000000..90d7b56a43 --- /dev/null +++ b/docs/api/layer/linelayer.zh.md @@ -0,0 +1,72 @@ +--- +title: LineLayer +order: 2 +--- +## 线图层 + +### shape + +线图层支持4种 shape + +- line 绘制路径图, +- arc 绘制弧线 通过贝塞尔曲线算法技术弧线 +- greatcircle 大圆航线,地图两个点的最近距离不是两个点连线,而是大圆航线 +- arc3d 3d弧线地图 3D视角 + +⚠️ 弧线只需要设置起始点坐标即可 + +``` + new LineLayer() + .source(data, { + parser: { + type: 'csv', + x: 'lng1', + y: 'lat1', + x1: 'lng2', + y1: 'lat2', + }, + }) +``` + +如果geojson 数据绘制弧线图 coordinates 第一对坐标为起点,第二对为终点 +``` +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 106.5234375, + 57.51582286553883 + ], + [ + 136.40625, + 61.77312286453146 + ] + ] + } + } + ] +} + +``` + +### size + +线图层 可以设置高度 + +- size 类型为number 则表示 line的宽度 +- size 类型为 [number , number] 分别表示宽度和高度 + +```javascript + +lineLayer.size(1); // 线的宽度为 1 +lineLayer.size([1,2]); // 宽度为1,高度2 + +``` + + diff --git a/docs/api/layer/pointlayer.en.md b/docs/api/layer/pointlayer.en.md new file mode 100644 index 0000000000..340d0d39d3 --- /dev/null +++ b/docs/api/layer/pointlayer.en.md @@ -0,0 +1,77 @@ +--- +title: PointLayer +order: 1 +--- +# PointLayer + + +## 简介 +点数据的展示,数据源支持JSON,GeoJSON,CSV 三种数据格式。 + +shape 支持 + +**3D类型 柱图** + +``` +'cylinder', 'triangleColumn', 'hexagonColumn', 'squareColumn' + +``` + +**2D 符号图** + +``` +'circle', 'square', 'hexagon', 'triangle', 'pentagon', 'octogon', 'hexagram','rhombus', 'vesica', + +``` + +**图片标注** + +通过 ```Scene.addImage()``` 可以添加图片资源, + + +### 代码示例 + + +#### 基本图形显示示例 + +```javascript +import { PointLayer } from "@antv/l7" + +const layer = PointLayer({ + zIndex: 2 + }) + .source(data.list, { + type: 'array', + x: 'j', + y: 'w', + }) + .shape('cylinder') + .size('t',(level)=> { + return [4,4,(level+40)]; + }) + .color('t', ["#002466","#105CB3","#2894E0","#CFF6FF","#FFF5B8","#FFAB5C","#F27049","#730D1C"]) + +``` + + +#### 符号图 + +使用图片添加地图标注 + +```javascript + +scene.addImage('local', 'https://gw.alipayobjects.com/zos/rmsportal/xZXhTxbglnuTmZEwqQrE.png'); + + +const layer = new PointLayer({ + zIndex: 4 + }) + .source(city) + .size(20.0) + .shape('local') + .color('#0D408C') + +``` + + + diff --git a/docs/api/layer/pointlayer.zh.md b/docs/api/layer/pointlayer.zh.md new file mode 100644 index 0000000000..1381b60128 --- /dev/null +++ b/docs/api/layer/pointlayer.zh.md @@ -0,0 +1,78 @@ +--- +title: PointLayer +order: 1 +--- + +# PointLayer + + +## 简介 +点数据的展示,数据源支持JSON,GeoJSON,CSV 三种数据格式。 + +shape 支持 + +**3D类型 柱图** + +``` +'cylinder', 'triangleColumn', 'hexagonColumn', 'squareColumn' + +``` + +**2D 符号图** + +``` +'circle', 'square', 'hexagon', 'triangle', 'pentagon', 'octogon', 'hexagram','rhombus', 'vesica', + +``` + +**图片标注** + +通过 ```Scene.addImage()``` 可以添加图片资源, + + +### 代码示例 + + +#### 基本图形显示示例 + +```javascript +import { PointLayer } from "@antv/l7" + +const layer = PointLayer({ + zIndex: 2 + }) + .source(data.list, { + type: 'array', + x: 'j', + y: 'w', + }) + .shape('cylinder') + .size('t',(level)=> { + return [4,4,(level+40)]; + }) + .color('t', ["#002466","#105CB3","#2894E0","#CFF6FF","#FFF5B8","#FFAB5C","#F27049","#730D1C"]) + +``` + + +#### 符号图 + +使用图片添加地图标注 + +```javascript + +scene.addImage('local', 'https://gw.alipayobjects.com/zos/rmsportal/xZXhTxbglnuTmZEwqQrE.png'); + + +const layer = new PointLayer({ + zIndex: 4 + }) + .source(city) + .size(20.0) + .shape('local') + .color('#0D408C') + +``` + + + diff --git a/docs/api/layer/polygonlayer.en.md b/docs/api/layer/polygonlayer.en.md new file mode 100644 index 0000000000..bbfe14d1a3 --- /dev/null +++ b/docs/api/layer/polygonlayer.en.md @@ -0,0 +1,26 @@ +--- +title: PolygonLayer +order: 3 +--- +# 填充图 + +绘制 2D 多边形以及沿 Z 轴拉伸后的 3D 图形。 + +### shape + +填充图支持3种shape + +- fill 绘制填充面 不支持数据映射 +- line 绘制填充图描边 不支持数据映射 +- extrude 对填充图3D拉伸 不支持数据映射 + +``` javascript + PolyonLayer.shape('fill'); + PolyonLayer.shape('line').size(1); // size 表示线宽度 + PolyonLayer.shape('extrude'); // size 表示高度 + +``` + +其他方法,事件,同基类 [Layer](/zh/docs/api/layer/layer) + + diff --git a/docs/api/layer/polygonlayer.zh.md b/docs/api/layer/polygonlayer.zh.md new file mode 100644 index 0000000000..bbfe14d1a3 --- /dev/null +++ b/docs/api/layer/polygonlayer.zh.md @@ -0,0 +1,26 @@ +--- +title: PolygonLayer +order: 3 +--- +# 填充图 + +绘制 2D 多边形以及沿 Z 轴拉伸后的 3D 图形。 + +### shape + +填充图支持3种shape + +- fill 绘制填充面 不支持数据映射 +- line 绘制填充图描边 不支持数据映射 +- extrude 对填充图3D拉伸 不支持数据映射 + +``` javascript + PolyonLayer.shape('fill'); + PolyonLayer.shape('line').size(1); // size 表示线宽度 + PolyonLayer.shape('extrude'); // size 表示高度 + +``` + +其他方法,事件,同基类 [Layer](/zh/docs/api/layer/layer) + + diff --git a/docs/api/quickstart.en.md b/docs/api/quickstart.en.md new file mode 100644 index 0000000000..91a02644b5 --- /dev/null +++ b/docs/api/quickstart.en.md @@ -0,0 +1,174 @@ +--- +title: quickStart +order: 0 +redirect_from: + - /en/docs/tutorial +--- +# 使用方法 + +L7 提供三种使用方式:CDN、Submodule 以及 React 组件。 + +## 通过 CDN 使用 + +首先在 `` 中引入 L7 CDN 版本的 JS 和 CSS 文件: +```html + + + + +``` + +如果使用 Mapbox,还需要额外引入 Mapbox 的 JS 和 CSS 文件,这一步可以参考 [Mapbox 文档](https://docs.mapbox.com/mapbox-gl-js/overview/#quickstart): +```html + + + + + +``` +⚠️高德采用异步加载,因此不需要引入任何额外静态文件。 + +然后在 `` 中定义一个容器并设置一个 `id`。通过全局 `L7` 这个命名空间可以获取场景 `L7.Scene` 和图层 `L7.PolygonLayer`: +⚠️需要获取高德或者 Mapbox 的使用 token 并传入 `L7.Scene` 的构造函数,获取方式如下: +* 高德地图开发者 Key [申请方法](https://lbs.amap.com/dev/key/) +* [Mapbox Access Tokens](https://docs.mapbox.com/help/how-mapbox-works/access-tokens/#creating-and-managing-access-tokens) + +## 通过 Submodule 使用 + +首先通过 `npm/yarn` 安装 `@l7/scene` 和 `@l7/layers`: +```bash +npm install --save @l7/scene @l7/layers +// or +yarn add @l7/scene @l7/layers +``` + +然后就可以使用其中包含的场景和各类图层: +```typescript +import { Scene } from '@l7/scene'; +import { PolygonLayer } from '@l7/layers'; + +(async function() { + // 获取数据 + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const data = await response.json(); + + // 创建场景 + const scene = new Scene({ + center: [110.19382669582967, 50.258134], + id: 'map', + pitch: 0, + style: 'dark', + type: 'amap', + zoom: 3, + token: 'pg.xxx', // 高德或者 Mapbox 的 token + }); + + // 创建图层 + const layer = new PolygonLayer({}); + layer + .source(data) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + + // 添加图层到场景中 + scene.addLayer(layer); + + // 渲染场景 + scene.render(); +})(); +``` + +最后在 `` 中引入 L7 CDN 版本的 CSS 文件: +```html + + + +``` + +L7 目前的文档都通过这种方式使用,可以参考项目中的 stories: +* [高德地图](https://github.com/antvis/L7/blob/next/stories/MapAdaptor/components/AMap.tsx) +* [Mapbox](https://github.com/antvis/L7/blob/next/stories/MapAdaptor/components/Mapbox.tsx) + + +## [WIP] React + +React 组件待开发,目前可以暂时以 Submodule 方式使用: +```tsx +import { Scene } from '@l7/scene'; +import { PolygonLayer } from '@l7/layers'; +import * as React from 'react'; + +export default class AMap extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + center: [110.19382669582967, 50.258134], + id: 'map', + pitch: 0, + style: 'dark', + type: 'amap', + zoom: 3, + token: 'pg.xxx', // 高德或者 Mapbox 的 token + }); + const layer = new PolygonLayer({}); + + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + scene.addLayer(layer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} +``` + +⚠️组件 Unmount 时需要通过 `scene.destroy()` 手动销毁场景。 + diff --git a/docs/api/quickstart.zh.md b/docs/api/quickstart.zh.md new file mode 100644 index 0000000000..447a6baadc --- /dev/null +++ b/docs/api/quickstart.zh.md @@ -0,0 +1,174 @@ +--- +title: 快速上手 +order: 0 +redirect_from: + - /zh/docs/tutorial +--- +# 使用方法 + +L7 提供三种使用方式:CDN、Submodule 以及 React 组件。 + +## 通过 CDN 使用 + +首先在 `` 中引入 L7 CDN 版本的 JS 和 CSS 文件: +```html + + + + +``` + +如果使用 Mapbox,还需要额外引入 Mapbox 的 JS 和 CSS 文件,这一步可以参考 [Mapbox 文档](https://docs.mapbox.com/mapbox-gl-js/overview/#quickstart): +```html + + + + + +``` +⚠️高德采用异步加载,因此不需要引入任何额外静态文件。 + +然后在 `` 中定义一个容器并设置一个 `id`。通过全局 `L7` 这个命名空间可以获取场景 `L7.Scene` 和图层 `L7.PolygonLayer`: +⚠️需要获取高德或者 Mapbox 的使用 token 并传入 `L7.Scene` 的构造函数,获取方式如下: +* 高德地图开发者 Key [申请方法](https://lbs.amap.com/dev/key/) +* [Mapbox Access Tokens](https://docs.mapbox.com/help/how-mapbox-works/access-tokens/#creating-and-managing-access-tokens) + +## 通过 Submodule 使用 + +首先通过 `npm/yarn` 安装 `@l7/scene` 和 `@l7/layers`: +```bash +npm install --save @l7/scene @l7/layers +// or +yarn add @l7/scene @l7/layers +``` + +然后就可以使用其中包含的场景和各类图层: +```typescript +import { Scene } from '@l7/scene'; +import { PolygonLayer } from '@l7/layers'; + +(async function() { + // 获取数据 + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const data = await response.json(); + + // 创建场景 + const scene = new Scene({ + center: [110.19382669582967, 50.258134], + id: 'map', + pitch: 0, + style: 'dark', + type: 'amap', + zoom: 3, + token: 'pg.xxx', // 高德或者 Mapbox 的 token + }); + + // 创建图层 + const layer = new PolygonLayer({}); + layer + .source(data) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + + // 添加图层到场景中 + scene.addLayer(layer); + + // 渲染场景 + scene.render(); +})(); +``` + +最后在 `` 中引入 L7 CDN 版本的 CSS 文件: +```html + + + +``` + +L7 目前的文档都通过这种方式使用,可以参考项目中的 stories: +* [高德地图](https://github.com/antvis/L7/blob/next/stories/MapAdaptor/components/AMap.tsx) +* [Mapbox](https://github.com/antvis/L7/blob/next/stories/MapAdaptor/components/Mapbox.tsx) + + +## [WIP] React + +React 组件待开发,目前可以暂时以 Submodule 方式使用: +```tsx +import { Scene } from '@l7/scene'; +import { PolygonLayer } from '@l7/layers'; +import * as React from 'react'; + +export default class AMap extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + center: [110.19382669582967, 50.258134], + id: 'map', + pitch: 0, + style: 'dark', + type: 'amap', + zoom: 3, + token: 'pg.xxx', // 高德或者 Mapbox 的 token + }); + const layer = new PolygonLayer({}); + + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + scene.addLayer(layer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} +``` + +⚠️组件 Unmount 时需要通过 `scene.destroy()` 手动销毁场景。 + diff --git a/docs/api/scene.en.md b/docs/api/scene.en.md new file mode 100644 index 0000000000..345f9e5dc7 --- /dev/null +++ b/docs/api/scene.en.md @@ -0,0 +1,321 @@ +--- +title: Scene +order: 1 +--- + +## 简介 +`Scene `基础的地图类,提供地图创建,图层创建,管理等功能 + +示例代码 + +```javascript +import {Scene} from '@l7/scene'; +const scene =new L7.Scene({ + id:'map', + mapStyle:'dark', + center:[ 110.770672, 34.159869 ], + pitch:45 +}) +``` + + +### 构造函数 + +**Scene**
支持两种实例化方式 + +- 独立实例化 内部根据id自动穿件地图实例 +- 传入地图实例 + + + + + +#### 独立实例化 Scene + +```javascript +const scene = new L7.Scene({ + id: 'map', + mapStyle: 'dark', + center: [ 120.19382669582967, 30.258134 ], + pitch: 0, + zoom: 12, + maxZoom:20, + minZoom:0, +}); +``` + + +#### 根据map 实例创建Sence + +_L7 基于高德地图3D模式开发的,因此传入Map实例 __viewModes需要设置成3d_
_ +```javascript +var mapinstance = new AMap.Map('map',{ + center: [ 120.19382669582967, 30.258134 ], + viewMode: '3D', + pitch: 0, + zoom: 12, + maxZoom:20, + minZoom:0, + }); + +const scene = new L7.Scene({ + mapStyle: 'dark', + map:mapinstance +}); +``` + + +## map +L7 在scene 下保留了高德地图实例,可以通过scene.map 调用高德地图的map方法。
map 实例方法见[高德地图文档](https://lbs.amap.com/api/javascript-api/reference/map) + +```javascript +scene.map +``` + + +## 构造类 + +### PointLayer +新建点图层 + +### PolylineLayer +新建线图层 + +### PolygonLayer +新建面图层 + +### ImageLayer +新建图片图层 + + +## 配置项 + +### id +需传入 dom 容器或者容器 id  {domObject || string} [必选] + + +### zoom +地图初始显示级别 {number} (0-22) + +### center +地图初始中心经纬度 {Lnglat} + +### pitch +地图初始俯仰角度 {number}  default 0 + +### mapSyle +地图样式 {style} 目前仅支持高德地图。 default 'dark'
L7 内置三种种默认地图样式 dark | light|blank 空地图 + +设置地图的显示样式,目前支持两种地图样式:
第一种:自定义地图样式,如`"amap://styles/d6bf8c1d69cea9f5c696185ad4ac4c86"`
可前往[地图自定义平台](https://lbs.amap.com/dev/mapstyle/index)定制自己的个性地图样式;
第二种:官方样式模版,如`"amap://styles/grey"`。
其他模版样式及自定义地图的使用说明见[开发指南](https://lbs.amap.com/api/javascript-api/guide/create-map/mapstye/) + + +### minZoom +地图最小缩放等级 {number}  default 0 (0-22) + +### maxZoom +地图最大缩放等级 {number}  default 22 (0-22) + +### rotateEnable +地图是否可旋转 {Boolean} default true + + + + +## 方法 + +### getZoom +获取当前缩放等级 + +```javascript +scene.getZoom(); +``` + +return {float}  当前缩放等级 + +### getLayers() +获取所有的地图图层 +```javascript +scene.getLayers(); +``` + +return 图层数组 {Array} + + +### getCenter() +获取地图中心点 +```javascript +scene.getCenter() +``` + +return {Lnglat} :地图中心点 + +### getSize() +获取地图容器大小 +```javascript +scene.getSize() +``` +return { Object } 地图容器的 width,height + +### getPitch() +获取地图俯仰角 +```javascript +scene.getPitch(); +``` + +return {number} pitch + +### setCenter() +设置地图中心点坐标 + +```javascript +scene.setCenter([lng,lat]) +``` + +参数:`center` {LngLat} 地图中心点 + + +### setZoomAndCenter +设置地图等级和中心 +```javascript +scene.setZoomAndCenter(zoom,center) +``` + +参数:zoom {number}
center {LngLat} + + +### setRotation +设置地图顺时针旋转角度,旋转原点为地图容器中心点,取值范围 [0-360] +```javascript +scene.setRotation(rotation) +``` + +参数: `rotation` {number} + +### zoomIn +地图放大一级 +```javascript +scene.zoomIn() +``` + +### zoomOut +地图缩小一级 +```javascript +scene.ZoomOUt() +``` + +### panTo +地图平移到指定的位置 +```javascript +scene.panTo(LngLat) +``` + +参数:`center` LngLat 中心位置坐标 + +### panBy +以像素为单位沿X方向和Y方向移动地图 +```javascript +scene.panBy(x,y) +``` +参数:
`x` {number} 水平方向移动像素 向右为正方向
      `y` {number} 垂直方向移动像素 向下为正方向 + + +### setPitch +设置地图仰俯角度 +```javascript +scene.setPitch(pitch) +``` + +参数 :
   `pitch` {number} + +### + +### setStatus +设置当前地图显示状态,包括是否可鼠标拖拽移动地图、地图是否可缩放、地图是否可旋转(rotateEnable)、是否可双击放大地图、是否可以通过键盘控制地图旋转(keyboardEnable)等    + +```javascript + scene.setStatus({ + dragEnable: true, + keyboardEnable: true, + doubleClickZoom: true, + zoomEnable: true, + rotateEnable: true + }); +``` + + +### fitBounds +地图缩放到某个范围内
参数 :
  `extent` { array} 经纬度范围 [minlng,minlat,maxlng,maxlat] + +```javascript +scene.fitBounds([112,32,114,35]); +``` + + + +### removeLayer +移除layer + +```javascript +scene.removeLayer(layer) +``` + +参数
`layer` {Layer} + +### getLayers + 获取所有的layer + +```javascript +scene.getLayers() +``` + +return layers  {array} + +## 事件 + + +### on +事件监听 + +#### 参数 +`eventName` {string} 事件名
`hander` {function } 事件回调函数 + + +### off +移除事件监听
`eventName` {string} 事件名
`hander` {function } 事件回调函数 + + +### 地图事件 +```javascript +scene.on('loaded',()=>{})  //地图加载完成触发 +scene.on('mapmove',()=>{}) // 地图平移时触发事件 +scene.on('movestart',()=>{}) // 地图平移开始时触发 +scene.on('moveend',()=>{}) // 地图移动结束后触发,包括平移,以及中心点变化的缩放。如地图有拖拽缓动效果,则在缓动结束后触发 +scene.on('zoomchange',()=>{}) // 地图缩放级别更改后触发 +scene.on('zoomstart',()=>{}) // 缩放开始时触发 +scene.on('zoomend',()=>{}) // 缩放停止时触发 +``` + + +### 鼠标事件 + +```javascript +scene.on('click', (ev)=>{}); // 鼠标左键点击事件 +scene.on('dblclick', (ev)=>{}); // 鼠标左键双击事件 +scene.on('mousemove', (ev)=>{}); // 鼠标在地图上移动时触发 +scene.on('mousewheel', (ev)=>{}); // 鼠标滚轮开始缩放地图时触发 +scene.on('mouseover', (ev)=>{}); // 鼠标移入地图容器内时触发 +scene.on('mouseout', (ev)=>{}); // 鼠标移出地图容器时触发 +scene.on('mouseup', (ev)=>{}); // 鼠标在地图上单击抬起时触发 +scene.on('mousedown', (ev)=>{}); // 鼠标在地图上单击按下时触发 +scene.on('rightclick', (ev)=>{}); // 鼠标右键单击事件 +scene.on('dragstart', (ev)=>{}); //开始拖拽地图时触发 +scene.on('dragging', (ev)=>{}); // 拖拽地图过程中触发 +scene.on('dragend', (ev)=>{}); //停止拖拽地图时触发。如地图有拖拽缓动效果,则在拽停止,缓动开始前触发 +``` + +### 其它事件 +```javascript +scene.on('resize',()=>{}) // 地图容器大小改变事件 +``` + + diff --git a/docs/api/scene.zh.md b/docs/api/scene.zh.md new file mode 100644 index 0000000000..a0eb5cc2eb --- /dev/null +++ b/docs/api/scene.zh.md @@ -0,0 +1,292 @@ +--- +title: 场景 Scene +order: 1 +--- + +# 简介 + +## Scene + +L7 地理可视化 地图,图层,组件,以及可视化所需要的资源,如图片,字体通过Scene统一管理 + + +## Map + + L7 地理可视化侧重于地理数据的可视化表达,地图层需要依赖第三方地图,第三方地图通过Scene 统一创建,创建管理 + 只需要通过Scene传入地图配置项即可。 + +目前L7 支持两种地图底图 + +- 高德地图 国内业务场景 合规中国地图 +- MapBox 国际业务,或者内网离线部署场景 + + + +示例代码 + +```javascript +import {Scene} from '@l7/scene'; +const scene =new L7.Scene({ + id:'map', + mapStyle:'dark', + center:[ 110.770672, 34.159869 ], + pitch:45 +}) +``` + + +### 构造函数 + +**Scene** + + + + + + +## map +L7 在scene 下保留了高德地图实例,可以通过scene.map 调用高德地图的map方法。
map 实例方法见[高德地图文档](https://lbs.amap.com/api/javascript-api/reference/map) + +```javascript +scene.map +``` + +## 配置项 + +### 地图配置项 + +### id +需传入 dom 容器或者容器 id  {domObject || string} [必选] + + +### zoom +地图初始显示级别 {number} (0-22) + +### center +地图初始中心经纬度 {Lnglat} + +### pitch +地图初始俯仰角度 {number}  default 0 + +### mapSyle + +简化地图样式设置,L7 内置了三种主题默认样式 +- dark +- light +- normal + +地图样式 {style} 目前仅支持高德地图。 default 'dark'
L7 内置三种种默认地图样式 dark | light|blank 空地图 + +设置地图的显示样式,目前支持两种地图样式:
第一种:自定义地图样式,如`"amap://styles/d6bf8c1d69cea9f5c696185ad4ac4c86"`
可前往[地图自定义平台](https://lbs.amap.com/dev/mapstyle/index)定制自己的个性地图样式;
第二种:官方样式模版,如`"amap://styles/grey"`。
其他模版样式及自定义地图的使用说明见[开发指南](https://lbs.amap.com/api/javascript-api/guide/create-map/mapstye/) + + +### minZoom +地图最小缩放等级 {number}  default 0 (0-22) + +### maxZoom +地图最大缩放等级 {number}  default 22 (0-22) + +### rotateEnable +地图是否可旋转 {Boolean} default true + + + + +## 方法 + +### getZoom +获取当前缩放等级 + +```javascript +scene.getZoom(); +``` + +return {float}  当前缩放等级 + +### getLayers() +获取所有的地图图层 +```javascript +scene.getLayers(); +``` + +return 图层数组 {Array} + + +### getCenter() +获取地图中心点 +```javascript +scene.getCenter() +``` + +return {Lnglat} :地图中心点 + +### getSize() +获取地图容器大小 +```javascript +scene.getSize() +``` +return { Object } 地图容器的 width,height + +### getPitch() +获取地图俯仰角 +```javascript +scene.getPitch(); +``` + +return {number} pitch + +### setCenter() +设置地图中心点坐标 + +```javascript +scene.setCenter([lng,lat]) +``` + +参数:`center` {LngLat} 地图中心点 + + +### setZoomAndCenter +设置地图等级和中心 +```javascript +scene.setZoomAndCenter(zoom,center) +``` + +参数:zoom {number}
center {LngLat} + + +### setRotation +设置地图顺时针旋转角度,旋转原点为地图容器中心点,取值范围 [0-360] +```javascript +scene.setRotation(rotation) +``` + +参数: `rotation` {number} + +### zoomIn +地图放大一级 +```javascript +scene.zoomIn() +``` + +### zoomOut +地图缩小一级 +```javascript +scene.ZoomOUt() +``` + +### panTo +地图平移到指定的位置 +```javascript +scene.panTo(LngLat) +``` + +参数:`center` LngLat 中心位置坐标 + +### panBy +以像素为单位沿X方向和Y方向移动地图 +```javascript +scene.panBy(x,y) +``` +参数:
`x` {number} 水平方向移动像素 向右为正方向
      `y` {number} 垂直方向移动像素 向下为正方向 + + +### setPitch +设置地图仰俯角度 +```javascript +scene.setPitch(pitch) +``` + +参数 :
   `pitch` {number} + +### + +### setStatus +设置当前地图显示状态,包括是否可鼠标拖拽移动地图、地图是否可缩放、地图是否可旋转(rotateEnable)、是否可双击放大地图、是否可以通过键盘控制地图旋转(keyboardEnable)等    + +```javascript + scene.setStatus({ + dragEnable: true, + keyboardEnable: true, + doubleClickZoom: true, + zoomEnable: true, + rotateEnable: true + }); +``` + + +### fitBounds +地图缩放到某个范围内
参数 :
  `extent` { array} 经纬度范围 [minlng,minlat,maxlng,maxlat] + +```javascript +scene.fitBounds([112,32,114,35]); +``` + + + +### removeLayer +移除layer + +```javascript +scene.removeLayer(layer) +``` + +参数
`layer` {Layer} + +### getLayers + 获取所有的layer + +```javascript +scene.getLayers() +``` + +return layers  {array} + +## 事件 + + +### on +事件监听 + +#### 参数 +`eventName` {string} 事件名
`hander` {function } 事件回调函数 + + +### off +移除事件监听
`eventName` {string} 事件名
`hander` {function } 事件回调函数 + + +### 地图事件 +```javascript +scene.on('loaded',()=>{})  //地图加载完成触发 +scene.on('mapmove',()=>{}) // 地图平移时触发事件 +scene.on('movestart',()=>{}) // 地图平移开始时触发 +scene.on('moveend',()=>{}) // 地图移动结束后触发,包括平移,以及中心点变化的缩放。如地图有拖拽缓动效果,则在缓动结束后触发 +scene.on('zoomchange',()=>{}) // 地图缩放级别更改后触发 +scene.on('zoomstart',()=>{}) // 缩放开始时触发 +scene.on('zoomend',()=>{}) // 缩放停止时触发 +``` + + +### 鼠标事件 + +```javascript +scene.on('click', (ev)=>{}); // 鼠标左键点击事件 +scene.on('dblclick', (ev)=>{}); // 鼠标左键双击事件 +scene.on('mousemove', (ev)=>{}); // 鼠标在地图上移动时触发 +scene.on('mousewheel', (ev)=>{}); // 鼠标滚轮开始缩放地图时触发 +scene.on('mouseover', (ev)=>{}); // 鼠标移入地图容器内时触发 +scene.on('mouseout', (ev)=>{}); // 鼠标移出地图容器时触发 +scene.on('mouseup', (ev)=>{}); // 鼠标在地图上单击抬起时触发 +scene.on('mousedown', (ev)=>{}); // 鼠标在地图上单击按下时触发 +scene.on('rightclick', (ev)=>{}); // 鼠标右键单击事件 +scene.on('dragstart', (ev)=>{}); //开始拖拽地图时触发 +scene.on('dragging', (ev)=>{}); // 拖拽地图过程中触发 +scene.on('dragend', (ev)=>{}); //停止拖拽地图时触发。如地图有拖拽缓动效果,则在拽停止,缓动开始前触发 +``` + +### 其它事件 +```javascript +scene.on('resize',()=>{}) // 地图容器大小改变事件 +``` + + diff --git a/docs/api/source/geojson.en.md b/docs/api/source/geojson.en.md new file mode 100644 index 0000000000..d6949d2fc5 --- /dev/null +++ b/docs/api/source/geojson.en.md @@ -0,0 +1,27 @@ +--- +title: geojson +order: 1 +--- + + +# geojson 数据介绍 + + +## 简介 + +GeoJSON是一种对各种地理数据结构进行编码的格式。GeoJSON对象可以表示几何、特征或者特征集合。GeoJSON支持下面几何类型:点、线、面、多点、多线、多面和几何集合。GeoJSON里的特征包含一个几何对象和其他属性,特征集合表示一系列特征。 + +[geojson详细文档]() + +## Geojson相关的JS库 + +### 地理统计分析工具 + +[turfjs](http://turfjs.org/):  地理数据计算,处理,统计,分析的Javascript 库 + + +### 在线工具: + +[http://geojson.io/](http://geojson.io/)    可以在线查看,绘制,修改GeoJSON数据 + +[https://mapshaper.org/](https://mapshaper.org/) 可以查看较大的geojson,还能够简化GeoJSON数据 diff --git a/docs/api/source/geojson.zh.md b/docs/api/source/geojson.zh.md new file mode 100644 index 0000000000..d6949d2fc5 --- /dev/null +++ b/docs/api/source/geojson.zh.md @@ -0,0 +1,27 @@ +--- +title: geojson +order: 1 +--- + + +# geojson 数据介绍 + + +## 简介 + +GeoJSON是一种对各种地理数据结构进行编码的格式。GeoJSON对象可以表示几何、特征或者特征集合。GeoJSON支持下面几何类型:点、线、面、多点、多线、多面和几何集合。GeoJSON里的特征包含一个几何对象和其他属性,特征集合表示一系列特征。 + +[geojson详细文档]() + +## Geojson相关的JS库 + +### 地理统计分析工具 + +[turfjs](http://turfjs.org/):  地理数据计算,处理,统计,分析的Javascript 库 + + +### 在线工具: + +[http://geojson.io/](http://geojson.io/)    可以在线查看,绘制,修改GeoJSON数据 + +[https://mapshaper.org/](https://mapshaper.org/) 可以查看较大的geojson,还能够简化GeoJSON数据 diff --git a/docs/api/source/source.en.md b/docs/api/source/source.en.md new file mode 100644 index 0000000000..5487b1d723 --- /dev/null +++ b/docs/api/source/source.en.md @@ -0,0 +1,298 @@ +--- +title: Source +order: 0 +--- + + +# Source + + +### 概述 + +source 地理数据处理模块,主要包含数据解析(parser),和数据处理(transform); + +**parser:** + +不同数据类型处理成统一数据格式。矢量数据包括 GeoJON, CSV,Json等不同数据格式,栅格数据,包括Raster,Image数据。将来还会支持瓦片格式数据。 + +**transform** + +数据转换,数据统计,网格布局,数据聚合等数据操作。 + + +## API + +### parser + +空间数据分矢量数据和栅格数据两大类 + +- 矢量数据 支持 csv,geojson,json 三种数据类型 + +- 栅格数据 支持 image,Raster + + + +#### geojson + +[geojson](https://www.yuque.com/antv/l7/dm2zll) 数据为默认数据格式,可以 + +不需要设置parser 参数 + +```javascript +layer.source(data) +``` + + +#### json + +json 不是标准的地理数据结构,因此需要设置对应的经纬度字段 + +**点数据** + +x: 经度字段 + +y: 纬度字段 + +```javascript + +const data = [{ + lng:112.345, + lat:30.455, + value: 10 + },{ +  lng:114.345, + lat:31.455, + value: 10 +  } +] + +layer.source( + data, + { + parser: { + type:'json', + x:'lng', + y:'lat', + } +}) +``` + +**线段数据** + + type: json + +这里的直线表示有两个点组成的线段,主要绘制弧线的时候比较常用,只需指定线段的起始点坐标 + + x:经度字段 起点经度 + y:纬度字段 起点纬度 + x1:经度字段 终点经度 + y1:纬度字段 终点纬度 + +```javascript +const data = [{ + lng1:112.345, + lat1:30.455, +   lng2:112.345, + lat2:30.455, + value: 10 + },{ +  lng1:114.345, + lat1:31.455, +   lng2:112.345, + lat2:30.455, + value: 10 +  } +]; + +layer.source( + data, + { + parser:{ + type:'json', + x:'lng1', + y:'lat1' , +     x1:'lng1', + y1:'lat2' , + } + } +}) +``` + +**面数据** + +需要指定coordinates 字段, coordinates据格式 + +**注意面数据 coord  是三层数据结构** + +```javascript + +[ { + type: "Polygon", + 'geometryCoord': [ + [ + [ + 115.1806640625, + 30.637912028341123 + ], + [ + 114.9609375, + 29.152161283318915 + ], + [ + 117.79541015625001, + 27.430289738862594 + ], + [ + 118.740234375, + 29.420460341013133 + ], + [ + 117.46582031249999, + 31.50362930577303 + ], + [ + 115.1806640625, + 30.637912028341123 + ] + ] + ] + } + ] + + layer.source(data,{ + parser:{ + type:'json', + coordinates:'geometryCoord' + } + }) +``` + + + + +#### csv +点,线数据配置项同json数据类型 + +```javascript +layer.source( + data, + { + parser:{ + type:'csv', + x:'lng1', + y:'lat1' , +     x1:'lng1', + y1:'lat2' , + } +}) +``` + +**栅格数据类型**** + +#### image + 根据图片的经纬度范围,将图片添加到地图上。 配置项 + +-  type: image +-  extent: 图像的经纬度范围 [] + +```javascript +layer.source('https://gw.alipayobjects.com/zos/rmsportal/FnHFeFklTzKDdUESRNDv.jpg',{ + parser:{ + type:'image', + extent: [ 121.1680, 30.2828, 121.3840, 30.4219 ] + } + + }) +``` +  + +#### raster +栅格数据类型,主要表示遥感数据类型data 栅格数据的二维矩阵数据parser 配置项 + +- type  raster +- width  数据宽度二维矩阵 columns  +- height 数据高度 +- min 数据最大值 +- max 数据最小值 +- extent 经纬度范围 + +```javascript + source(values, { + parser: { + type: 'raster', + width: n, + height: m, + min: 0, + max: 8000, + extent: [ 73.482190241, 3.82501784112, 135.106618732, 57.6300459963 ] + } + }) +``` + + +### transforms +目前支持三种数据处理方法 map,grid,hexagon transform配置项 + +- type 数据处理类型 +-  tansform cfg  数据处理配置项 + + +#### map +数据处理,支持自定义callback函数 + +- callback:function 回调函数 + +```javascript + layer.source(data, { + transforms:[ + { + type: 'map', + callback:function(item){ + const [x, y] = item.coordinates; + item.lat = item.lat*1; + item.lng = item.lng*1; + item.v = item.v *1; + item.coordinates = [x*1,y*1]; + return item; + } + + }, +``` + + +#### grid + +生成方格网布局,根据数据字段统计,主要在网格热力图中使用 + +-  type: 'grid', +-  size: 网格半径 +-  field: 数据统计字段 +-  method:聚合方法  count,max,min,sum,mean5个统计维度 + +```javascript + layer.source(data, { + transforms:[ + { + type: 'grid', + size: 15000, + field:'v', + method:'sum' + } + ] + } +``` + + +#### hexagon +生成六边形网格布局,根据数据字段统计 + +-  type: 'hexagon', +-  size: 网格半径 +-  field: 数据统计字段 +-  method:聚合方法  count,max,min,sum,mean5个统计维度 + + +``` + + + diff --git a/docs/api/source/source.zh.md b/docs/api/source/source.zh.md new file mode 100644 index 0000000000..e094d1f6a9 --- /dev/null +++ b/docs/api/source/source.zh.md @@ -0,0 +1,298 @@ +--- +title: Source +order: 0 +--- + + +# Source + + +### 概述 + +source 地理数据处理模块,主要包含数据解析(parser),和数据处理(transform); + +**parser:** + +不同数据类型处理成统一数据格式。矢量数据包括 GeoJON, CSV,Json等不同数据格式,栅格数据,包括Raster,Image数据。将来还会支持瓦片格式数据。 + +**transform:** + +数据转换,数据统计,网格布局,数据聚合等数据操作。 + + +## API + +### parser + +空间数据分矢量数据和栅格数据两大类 + +- 矢量数据 支持 csv,geojson,json 三种数据类型 + +- 栅格数据 支持 image,Raster + + + +#### geojson + +[geojson](https://www.yuque.com/antv/l7/dm2zll) 数据为默认数据格式,可以 + +不需要设置parser 参数 + +```javascript +layer.source(data); +``` + + +#### json + +json 不是标准的地理数据结构,因此需要设置对应的经纬度字段 + +**点数据** + +x: 经度字段 + +y: 纬度字段 + +```javascript + +const data = [{ + lng:112.345, + lat:30.455, + value: 10 + },{ +  lng:114.345, + lat:31.455, + value: 10 +  } +] + +layer.source( + data, + { + parser: { + type:'json', + x:'lng', + y:'lat', + } +}) +``` + +**线段数据** + + type: json + +这里的直线表示有两个点组成的线段,主要绘制弧线的时候比较常用,只需指定线段的起始点坐标 + + x:经度字段 起点经度 + y:纬度字段 起点纬度 + x1:经度字段 终点经度 + y1:纬度字段 终点纬度 + +```javascript +const data = [{ + lng1:112.345, + lat1:30.455, +   lng2:112.345, + lat2:30.455, + value: 10 + },{ +  lng1:114.345, + lat1:31.455, +   lng2:112.345, + lat2:30.455, + value: 10 +  } +]; + +layer.source( + data, + { + parser:{ + type:'json', + x:'lng1', + y:'lat1' , +     x1:'lng1', + y1:'lat2' , + } + } +}) +``` + +**面数据** + +需要指定coordinates 字段, coordinates据格式 + +**注意面数据 coord  是三层数据结构** + +```javascript + +[ { + type: "Polygon", + 'geometryCoord': [ + [ + [ + 115.1806640625, + 30.637912028341123 + ], + [ + 114.9609375, + 29.152161283318915 + ], + [ + 117.79541015625001, + 27.430289738862594 + ], + [ + 118.740234375, + 29.420460341013133 + ], + [ + 117.46582031249999, + 31.50362930577303 + ], + [ + 115.1806640625, + 30.637912028341123 + ] + ] + ] + } + ]; + + layer.source(data,{ + parser:{ + type:'json', + coordinates:'geometryCoord' + } + }); +``` + + + + +#### csv +点,线数据配置项同json数据类型 + +```javascript +layer.source( + data, + { + parser:{ + type:'csv', + x:'lng1', + y:'lat1' , +     x1:'lng1', + y1:'lat2' , + } +}) +``` + +**栅格数据类型**** + +#### image + 根据图片的经纬度范围,将图片添加到地图上。 配置项 + +-  type: image +-  extent: 图像的经纬度范围 [] + +```javascript +layer.source('https://gw.alipayobjects.com/zos/rmsportal/FnHFeFklTzKDdUESRNDv.jpg',{ + parser:{ + type:'image', + extent: [ 121.1680, 30.2828, 121.3840, 30.4219 ] + } + }); +``` +  + +#### raster +栅格数据类型,主要表示遥感数据类型data 栅格数据的二维矩阵数据parser 配置项 + +- type  raster +- width  数据宽度二维矩阵 columns  +- height 数据高度 +- min 数据最大值 +- max 数据最小值 +- extent 经纬度范围 + +```javascript + source(values, { + parser: { + type: 'raster', + width: n, + height: m, + min: 0, + max: 8000, + extent: [ 73.482190241, 3.82501784112, 135.106618732, 57.6300459963 ] + } + }); +``` + + +### transforms + +目前支持三种数据处理方法 map,grid,hexagon transform配置项 + +- type 数据处理类型 +-  tansform cfg  数据处理配置项 + + +#### map +数据处理,支持自定义callback函数 + +- callback:function 回调函数 + +```javascript + layer.source(data, { + transforms:[ + { + type: 'map', + callback:function(item){ + const [x, y] = item.coordinates; + item.lat = item.lat*1; + item.lng = item.lng*1; + item.v = item.v *1; + item.coordinates = [x*1,y*1]; + return item; + } + } + ] + }); +``` + + +#### grid + +生成方格网布局,根据数据字段统计,主要在网格热力图中使用 + +-  type: 'grid', +-  size: 网格半径 +-  field: 数据统计字段 +-  method:聚合方法  count,max,min,sum,mean5个统计维度 + +```javascript + layer.source(data, { + transforms:[ + { + type: 'grid', + size: 15000, + field:'v', + method:'sum' + } + ], + }) +``` + + +#### hexagon +生成六边形网格布局,根据数据字段统计 + +-  type: 'hexagon', +-  size: 网格半径 +-  field: 数据统计字段 +-  method:聚合方法  count,max,min,sum,mean5个统计维度 + +``` + + + diff --git a/docs/manual/tutorial/data.en.md b/docs/manual/tutorial/data.en.md new file mode 100644 index 0000000000..f6ddefc5df --- /dev/null +++ b/docs/manual/tutorial/data.en.md @@ -0,0 +1,65 @@ +--- +title: data +order: 1 +--- + +## 数据 + +目前L7支持的数据格式有GeoJson,CSV,JSon Image + +GeoJSON 支持点、线、面,等所有的空间数据格式。
CSV 支持,点,线段,弧线的支持。
JSON 支持简单的点、线,面,不支持多点,多线的,多面数据格式。 + + +## GeoJSON + +> GeoJSON是一种对各种地理数据结构进行编码的格式。GeoJSON对象可以表示几何、特征或者特征集合。GeoJSON支持下面几何类型:点、线、面、多点、多线、多面和几何集合。GeoJSON里的特征包含一个几何对象和其他属性,特征集合表示一系列特征。 + + + +```json +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 110.478515625, + 32.76880048488168 + ], + [ + 117.68554687499999, + 32.76880048488168 + ], + [ + 117.68554687499999, + 37.64903402157866 + ], + [ + 110.478515625, + 37.64903402157866 + ], + [ + 110.478515625, + 32.76880048488168 + ] + ] + ] + } + } + ] +} +``` + +## 地理统计分析工具 +[turfjs](http://turfjs.org/):  地理数据计算,处理,统计,分析的Javascript 库 + +## 在线工具 + +[http://geojson.io/](http://geojson.io/)    可以在线查看,绘制,修改GeoJSON数据 + +[https://mapshaper.org/](https://mapshaper.org/)  可以查看较大的geojson,还能够简化GeoJSON数据 diff --git a/docs/manual/tutorial/data.zh.md b/docs/manual/tutorial/data.zh.md new file mode 100644 index 0000000000..781c763b24 --- /dev/null +++ b/docs/manual/tutorial/data.zh.md @@ -0,0 +1,74 @@ +--- +title: 数据 +order: 1 +--- + +## 数据 + +目前L7支持的数据格式有GeoJson,CSV,JSon Image + +GeoJSON 支持点、线、面,等所有的空间数据格式。
CSV 支持,点,线段,弧线的支持。
JSON 支持简单的点、线,面,不支持多点,多线的,多面数据格式。 + + +## GeoJSON + +> GeoJSON是一种对各种地理数据结构进行编码的格式。GeoJSON对象可以表示几何、特征或者特征集合。GeoJSON支持下面几何类型:点、线、面、多点、多线、多面和几何集合。GeoJSON里的特征包含一个几何对象和其他属性,特征集合表示一系列特征。 + + + +```json +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 110.478515625, + 32.76880048488168 + ], + [ + 117.68554687499999, + 32.76880048488168 + ], + [ + 117.68554687499999, + 37.64903402157866 + ], + [ + 110.478515625, + 37.64903402157866 + ], + [ + 110.478515625, + 32.76880048488168 + ] + ] + ] + } + } + ] +} +``` + +## 地理统计分析工具 +[turfjs](http://turfjs.org/):  地理数据计算,处理,统计,分析的Javascript 库 + +## 在线工具 + +[http://geojson.io/](http://geojson.io/)    可以在线查看,绘制,修改GeoJSON数据 + +[https://mapshaper.org/](https://mapshaper.org/)  可以查看较大的geojson,还能够简化GeoJSON数据 + +## 数据资源 + +#### 全国行政区划边界  +[支持 geojson, svg下载](http://datav.aliyun.com/tools/atlas/#&lat=33.50475906922609&lng=104.32617187499999&zoom=4) + +#### HighCharts 全球行政区划数据集 + +[https://img.hcharts.cn/mapdata/](https://img.hcharts.cn/mapdata/) diff --git a/examples/gallery/basic/demo/arcCircle.js b/examples/gallery/basic/demo/arcCircle.js new file mode 100644 index 0000000000..1e3c6cf053 --- /dev/null +++ b/examples/gallery/basic/demo/arcCircle.js @@ -0,0 +1,33 @@ +import { LineLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'dark', + center: [ 107.77791556935472, 35.443286920228644 ], + zoom: 2.9142882493605033 +}); +window.mapScene = scene; +fetch('https://gw.alipayobjects.com/os/rmsportal/UEXQMifxtkQlYfChpPwT.txt') + .then(res => res.text()) + .then(data => { + const layer = new LineLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'lng1', + y: 'lat1', + x1: 'lng2', + y1: 'lat2' + } + }) + .size(1) + .shape('arc') + .color('#8C1EB2') + .style({ + opacity: 0.8, + blur: 0.99 + }); + scene.addLayer(layer); + }); diff --git a/examples/gallery/basic/demo/bus_dark.js b/examples/gallery/basic/demo/bus_dark.js new file mode 100644 index 0000000000..bac741e028 --- /dev/null +++ b/examples/gallery/basic/demo/bus_dark.js @@ -0,0 +1,45 @@ +import { Scene } from '@l7/scene'; +import { LineLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + center: [ 103.83735604457024, 1.360253881403068 ], + pitch: 4.00000000000001, + zoom: 10.210275860702593, + rotation: 19.313180925794313, + type: 'mapbox', + style: 'dark' +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/ee07641d-5490-4768-9826-25862e8019e1.json' +) + .then(res => res.json()) + .then(data => { + const layer = new LineLayer({}) + .source(data, { + parser: { + coordinates: 'path', + type: 'json' + } + }) + .size('level', level => { + return [ 1.0, level * 1 ]; + }) + .shape('line') + .color( + 'level', + [ + '#312B60', + '#4A457E', + '#615C99', + '#816CAD', + '#A67FB5', + '#C997C7', + '#DEB8D4', + '#F5D4E6', + '#FAE4F1', + '#FFF3FC' + ].slice(0, 8) + ); + scene.addLayer(layer); + }); diff --git a/examples/gallery/basic/demo/column_dark.js b/examples/gallery/basic/demo/column_dark.js new file mode 100644 index 0000000000..42a1d405f8 --- /dev/null +++ b/examples/gallery/basic/demo/column_dark.js @@ -0,0 +1,44 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; + +const scene = new Scene({ + id: 'map', + pitch: 35.210526315789465, + type: 'amap', + style: 'dark', + center: [ 104.288144, 31.239692 ], + zoom: 4.4 +}); +window.mapScene = scene; +fetch('https://gw.alipayobjects.com/os/rmsportal/oVTMqfzuuRFKiDwhPSFL.json') + .then(res => res.json()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data.list, { + parser: { + type: 'json', + x: 'j', + y: 'w' + } + }) + .shape('cylinder') + .size('t', function(level) { + return [ 1, 2, level * 2 + 20 ]; + }) + .color('t', [ + '#094D4A', + '#146968', + '#1D7F7E', + '#289899', + '#34B6B7', + '#4AC5AF', + '#5FD3A6', + '#7BE39E', + '#A1EDB8', + '#CEF8D6' + ]) + .style({ + opacity: 1.0 + }); + scene.addLayer(pointLayer); + }); diff --git a/examples/gallery/basic/demo/light.js b/examples/gallery/basic/demo/light.js new file mode 100644 index 0000000000..b82b29bca7 --- /dev/null +++ b/examples/gallery/basic/demo/light.js @@ -0,0 +1,59 @@ +import { HeatmapLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + style: 'dark', + pitch: 43, + center: [ 120.13383079335335, 29.651873105004427 ], + zoom: 7.068989519212174, + type: 'mapbox' +}); + +window.mapScene = scene; + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/a1a8158d-6fe3-424b-8e50-694ccf61c4d7.csv' +) + .then(res => res.text()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms: [ + { + type: 'hexagon', + size: 2500, + field: 'v', + method: 'sum' + } + ] + }) + .size('sum', sum => { + return sum * 200; + }) + .shape('hexagonColumn') + .style({ + coverage: 0.8, + angle: 0, + opacity: 1.0 + }) + .color('sum', [ + '#094D4A', + '#146968', + '#1D7F7E', + '#289899', + '#34B6B7', + '#4AC5AF', + '#5FD3A6', + '#7BE39E', + '#A1EDB8', + '#C3F9CC', + '#DEFAC0', + '#ECFFB1' + ]); + scene.addLayer(layer); + }); diff --git a/examples/gallery/basic/demo/meta.json b/examples/gallery/basic/demo/meta.json new file mode 100644 index 0000000000..fd3ec679f1 --- /dev/null +++ b/examples/gallery/basic/demo/meta.json @@ -0,0 +1,39 @@ +{ + "title": { + "zh": "图库", + "en": "Gallery" + }, + "demos": [ + { + "filename": "column_dark.js", + "title": "", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*WkpEQqzuM-oAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "arcCircle.js", + "title": "", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*FTp1Roy34qgAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "bus_dark.js", + "title": "", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*c80NRaMfGLAAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "light.js", + "title": "", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*HxpoRIcBA80AAAAAAAAAAABkARQnAQ" + }, + { + "filename": "point.js", + "title": "", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*Xp7iRaORYuIAAAAAAAAAAABkARQnAQ" + } + , + { + "filename": "normal.js", + "title": "", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*Kva7R7AimzsAAAAAAAAAAABkARQnAQ" + } + ] +} diff --git a/examples/gallery/basic/demo/normal.js b/examples/gallery/basic/demo/normal.js new file mode 100644 index 0000000000..6111b8d699 --- /dev/null +++ b/examples/gallery/basic/demo/normal.js @@ -0,0 +1,30 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + type: 'amap', + style: 'dark', + center: [ 121.417463, 31.215175 ], + pitch: 0, + zoom: 11 +}); +window.mapScene = scene; +fetch('https://gw.alipayobjects.com/os/rmsportal/BElVQFEFvpAKzddxFZxJ.txt') + .then(res => res.text()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data, { + parser: { + type: 'csv', + y: 'lat', + x: 'lng' + } + }) + .size(0.5) + .color('#080298') + .style({ + opacity: 1 + }); + + scene.addLayer(pointLayer); + }); diff --git a/examples/gallery/basic/demo/point.js b/examples/gallery/basic/demo/point.js new file mode 100644 index 0000000000..d9a622c9db --- /dev/null +++ b/examples/gallery/basic/demo/point.js @@ -0,0 +1,37 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 64.88, + type: 'amap', + style: 'dark', + center: [ 114.060288, 22.53684 ], + zoom: 15.63 +}); +window.mapScene = scene; +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/513add53-dcb2-4295-8860-9e7aa5236699.json' +) + .then(res => res.json()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data) + .size(2) + .color('h8', [ + '#0A3663', + '#1558AC', + '#3771D9', + '#4D89E5', + '#64A5D3', + '#72BED6', + '#83CED6', + '#A6E1E0', + '#B8EFE2', + '#D7F9F0' + ]) + .style({ + opacity: 1 + }); + + scene.addLayer(pointLayer); + }); diff --git a/examples/gallery/basic/index.en.md b/examples/gallery/basic/index.en.md new file mode 100644 index 0000000000..c779938cb0 --- /dev/null +++ b/examples/gallery/basic/index.en.md @@ -0,0 +1,6 @@ +--- +title: Gallery +order: 0 +redirect_from: + - /en/examples +--- diff --git a/examples/gallery/basic/index.zh.md b/examples/gallery/basic/index.zh.md new file mode 100644 index 0000000000..71b6406985 --- /dev/null +++ b/examples/gallery/basic/index.zh.md @@ -0,0 +1,6 @@ +--- +title: Gallery +order: 0 +redirect_from: + - /zh/examples +--- diff --git a/examples/heatmap/grid/demo/china.js b/examples/heatmap/grid/demo/china.js new file mode 100644 index 0000000000..d4c8d255f6 --- /dev/null +++ b/examples/heatmap/grid/demo/china.js @@ -0,0 +1,62 @@ +import { HeatmapLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + style: 'light', + pitch: 0, + center: [ 107.054293, 35.246265 ], + zoom: 4.056, + type: 'amap' +}); +window.mapScene = scene; +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/7359a5e9-3c5e-453f-b207-bc892fb23b84.csv' +) + .then(res => res.text()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms: [ + { + type: 'grid', + size: 20000, + field: 'v', + method: 'sum' + } + ] + }) + .size('count', value => { + return value * 0; + }) + .shape('square') + .style({ + coverage: 1, + angle: 0 + }) + .color( + 'count', + [ + '#0B0030', + '#100243', + '#100243', + '#1B048B', + '#051FB7', + '#0350C1', + '#0350C1', + '#0072C4', + '#0796D3', + '#2BA9DF', + '#30C7C4', + '#6BD5A0', + '#A7ECB2', + '#D0F4CA' + ].reverse() + ); + + scene.addLayer(layer); + }); diff --git a/examples/heatmap/grid/demo/grid1.js b/examples/heatmap/grid/demo/grid1.js new file mode 100644 index 0000000000..6e84814be9 --- /dev/null +++ b/examples/heatmap/grid/demo/grid1.js @@ -0,0 +1,53 @@ +import { HeatmapLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + style: 'dark', + pitch: 0, + center: [ 110.097892, 33.853662 ], + zoom: 4.056, + type: 'amap' +}); +window.mapScene = scene; +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/7359a5e9-3c5e-453f-b207-bc892fb23b84.csv' +) + .then(res => res.text()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms: [ + { + type: 'grid', + size: 10000, + field: 'v', + method: 'sum' + } + ] + }) + .size('count', value => { + return value * 0; + }) + .shape('square') + .style({ + coverage: 1, + angle: 0 + }) + .color( + 'count', + [ + '#FF4818', + '#F7B74A', + '#FFF598', + '#FF40F3', + '#9415FF', + '#421EB2' + ].reverse() + ); + scene.addLayer(layer); + }); diff --git a/examples/heatmap/grid/demo/heatmap3.js b/examples/heatmap/grid/demo/heatmap3.js new file mode 100644 index 0000000000..7ba761b1b0 --- /dev/null +++ b/examples/heatmap/grid/demo/heatmap3.js @@ -0,0 +1,59 @@ +import { HeatmapLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + style: 'light', + pitch: 0, + center: [ 110.097892, 33.853662 ], + zoom: 4.056, + type: 'amap' +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/7359a5e9-3c5e-453f-b207-bc892fb23b84.csv' +) + .then(res => res.text()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms: [ + { + type: 'grid', + size: 20000, + field: 'v', + method: 'sum' + } + ] + }) + .size('count', value => { + return value * 0; + }) + .shape('circle') + .style({ + coverage: 0.9, + angle: 0 + }) + .color( + 'count', + [ + '#8C1EB2', + '#8C1EB2', + '#DA05AA', + '#F0051A', + '#FF2A3C', + '#FF4818', + '#FF4818', + '#FF8B18', + '#F77B00', + '#ED9909', + '#ECC357', + '#EDE59C' + ].reverse() + ); + scene.addLayer(layer); + }); diff --git a/examples/heatmap/grid/demo/meta.json b/examples/heatmap/grid/demo/meta.json new file mode 100644 index 0000000000..78fceffda3 --- /dev/null +++ b/examples/heatmap/grid/demo/meta.json @@ -0,0 +1,32 @@ +{ + "title": { + "zh": "网格热力图", + "en": "heatmap" + }, + "demos": [ + { + "filename": "china.js", + "title": "网格热力图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*anD-Q4u83R0AAAAAAAAAAABkARQnAQ" + }, + { + "filename": "grid1.js", + "title": "", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*tAGKS6EClQ4AAAAAAAAAAABkARQnAQ" + + }, + { + "filename": "heatmap3.js", + "title": "网格布局 圆形", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*6cA0R6us9osAAAAAAAAAAABkARQnAQ" + + }, + { + "filename": "world.js", + "title": "网格热力图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*6danQJDzkyoAAAAAAAAAAABkARQnAQ" + + } + + ] +} diff --git a/examples/heatmap/grid/demo/world.js b/examples/heatmap/grid/demo/world.js new file mode 100644 index 0000000000..3dbd9c88eb --- /dev/null +++ b/examples/heatmap/grid/demo/world.js @@ -0,0 +1,56 @@ +import { HeatmapLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + style: 'dark', + pitch: 0, + center: [ 110.097892, 33.853662 ], + zoom: 4.056, + type: 'amap' +}); + +window.mapScene = scene; +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/7359a5e9-3c5e-453f-b207-bc892fb23b84.csv' +) + .then(res => res.text()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms: [ + { + type: 'grid', + size: 10000, + field: 'v', + method: 'sum' + } + ] + }) + .size('count', value => { + return value * 0; + }) + .shape('square') + .style({ + coverage: 1, + angle: 0 + }) + .color( + 'count', + [ + '#FF3417', + '#FF7412', + '#FFB02A', + '#FFE754', + '#46F3FF', + '#02BEFF', + '#1A7AFF', + '#0A1FB2' + ].reverse() + ); + scene.addLayer(layer); + }); diff --git a/examples/heatmap/grid/index.en.md b/examples/heatmap/grid/index.en.md new file mode 100644 index 0000000000..c793d961b4 --- /dev/null +++ b/examples/heatmap/grid/index.en.md @@ -0,0 +1,6 @@ +--- +title: Grid Map +order: 1 +--- + + diff --git a/examples/heatmap/grid/index.zh.md b/examples/heatmap/grid/index.zh.md new file mode 100644 index 0000000000..f27fed7fa8 --- /dev/null +++ b/examples/heatmap/grid/index.zh.md @@ -0,0 +1,5 @@ +--- +title: 网格热力图 +order: 1 +--- +热力图的变体,网格布局呈现数据分级分布的聚合现象。 \ No newline at end of file diff --git a/examples/heatmap/heatmap/demo/heatmap.js b/examples/heatmap/heatmap/demo/heatmap.js new file mode 100644 index 0000000000..33371ea29d --- /dev/null +++ b/examples/heatmap/heatmap/demo/heatmap.js @@ -0,0 +1,38 @@ +import { Scene } from '@l7/scene'; +import { HeatmapLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + style: 'dark', + pitch: 0, + center: [ 127.5671666579043, 7.445038892195569 ], + type: 'mapbox', + zoom: 2.632456779444394 +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d3564b06-670f-46ea-8edb-842f7010a7c6.json' +) + .then(res => res.json()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data) + .shape('heatmap') + .size('mag', [ 0, 1.0 ]) // weight映射通道 + .style({ + intensity: 2, + radius: 20, + opacity: 1.0, + rampColors: { + colors: [ + '#FF4818', + '#F7B74A', + '#FFF598', + '#91EABC', + '#2EA9A1', + '#206C7C' + ].reverse(), + positions: [ 0, 0.2, 0.4, 0.6, 0.8, 1.0 ] + } + }); + scene.addLayer(layer); + }); diff --git a/examples/heatmap/heatmap/demo/heatmap3d.js b/examples/heatmap/heatmap/demo/heatmap3d.js new file mode 100644 index 0000000000..b6c687f80f --- /dev/null +++ b/examples/heatmap/heatmap/demo/heatmap3d.js @@ -0,0 +1,41 @@ +import { Scene } from '@l7/scene'; +import { HeatmapLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + style: 'dark', + pitch: 58.5, + center: [ 111.8759, 30.6942 ], + rotation: 0.519, + type: 'mapbox', + zoom: 3.6116 +}); +window.mapScene = scene; + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/337ddbb7-aa3f-4679-ab60-d64359241955.json' +) + .then(res => res.json()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data) + .size('capacity', [ 0, 1 ]) + .shape('heatmap3D') + // weight映射通道 + .style({ + intensity: 10, + radius: 5, + opacity: 1.0, + rampColors: { + colors: [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49' + ], + positions: [ 0, 0.2, 0.4, 0.6, 0.8, 1.0 ] + } + }); + scene.addLayer(layer); + }); diff --git a/examples/heatmap/heatmap/demo/heatmap_purple.js b/examples/heatmap/heatmap/demo/heatmap_purple.js new file mode 100644 index 0000000000..2c5214cb62 --- /dev/null +++ b/examples/heatmap/heatmap/demo/heatmap_purple.js @@ -0,0 +1,38 @@ +import { Scene } from '@l7/scene'; +import { HeatmapLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + style: 'dark', + pitch: 0, + center: [ 127.5671666579043, 7.445038892195569 ], + type: 'mapbox', + zoom: 2.632456779444394 +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d3564b06-670f-46ea-8edb-842f7010a7c6.json' +) + .then(res => res.json()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data) + .shape('heatmap') + .size('mag', [ 0, 1.0 ]) // weight映射通道 + .style({ + intensity: 2, + radius: 20, + opacity: 1.0, + rampColors: { + colors: [ + '#FF4818', + '#F7B74A', + '#FFF598', + '#F27DEB', + '#8C1EB2', + '#421EB2' + ].reverse(), + positions: [ 0, 0.2, 0.4, 0.6, 0.8, 1.0 ] + } + }); + scene.addLayer(layer); + }); diff --git a/examples/heatmap/heatmap/demo/meta.json b/examples/heatmap/heatmap/demo/meta.json new file mode 100644 index 0000000000..48f26cb957 --- /dev/null +++ b/examples/heatmap/heatmap/demo/meta.json @@ -0,0 +1,24 @@ +{ + "title": { + "zh": "经典热力图", + "en": "heatmap" + }, + "demos": [ + { + "filename": "heatmap.js", + "title": "经典热力图2D", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*9zUcSK07PHgAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "heatmap_purple.js", + "title": "经典热力图2D", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*DFwET7xJTA8AAAAAAAAAAABkARQnAQ" + }, + { + "filename": "heatmap3d.js", + "title": "经典热力图3D", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*K_nOTa1C7PoAAAAAAAAAAABkARQnAQ" + } + + ] +} diff --git a/examples/heatmap/heatmap/index.en.md b/examples/heatmap/heatmap/index.en.md new file mode 100644 index 0000000000..f71ebbe652 --- /dev/null +++ b/examples/heatmap/heatmap/index.en.md @@ -0,0 +1,4 @@ +--- +title: HeatMap +order: 0 +--- diff --git a/examples/heatmap/heatmap/index.zh.md b/examples/heatmap/heatmap/index.zh.md new file mode 100644 index 0000000000..2cb7ecb9c5 --- /dev/null +++ b/examples/heatmap/heatmap/index.zh.md @@ -0,0 +1,7 @@ +--- +title: 经典热力图 +order: 0 +redirect_from: + - /zh/examples/heatmap/ +--- +区域范围内数据具有的一定热度分级分布情况的聚合面状现象,常用于描述人群分布、密度和变化趋势等。 \ No newline at end of file diff --git a/examples/heatmap/hexagon/demo/china.js b/examples/heatmap/hexagon/demo/china.js new file mode 100644 index 0000000000..f6c7ee98ac --- /dev/null +++ b/examples/heatmap/hexagon/demo/china.js @@ -0,0 +1,54 @@ +import { HeatmapLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + style: 'dark', + pitch: 47.49999999999995, + center: [ 112.50447776627743, 30.830476390931125 ], + zoom: 3.9879693680088626, + type: 'mapbox' +}); +window.mapScene = scene; +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/7359a5e9-3c5e-453f-b207-bc892fb23b84.csv' +) + .then(res => res.text()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms: [ + { + type: 'hexagon', + size: 17000, + field: 'v', + method: 'sum' + } + ] + }) + .size('sum', value => { + return value * 20; + }) + .shape('hexagonColumn') + .color( + 'count', + [ + '#FF4818', + '#F7B74A', + '#FFF598', + '#FF40F3', + '#9415FF', + '#421EB2' + ].reverse() + ) + .style({ + coverage: 0.9, + angle: 0 + }); + + scene.addLayer(layer); + }); diff --git a/examples/heatmap/hexagon/demo/hexagon.js b/examples/heatmap/hexagon/demo/hexagon.js new file mode 100644 index 0000000000..22309c9f7e --- /dev/null +++ b/examples/heatmap/hexagon/demo/hexagon.js @@ -0,0 +1,52 @@ +import { HeatmapLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + style: 'light', + pitch: 56.499, + center: [ 114.07737552216226, 22.542656745583486 ], + rotation: 39.19, + zoom: 12.47985, + type: 'mapbox' +}); +window.mapScene = scene; +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/513add53-dcb2-4295-8860-9e7aa5236699.json' +) + .then(res => res.json()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data, { + transforms: [ + { + type: 'hexagon', + size: 100, + field: 'h12', + method: 'sum' + } + ] + }) + .size('sum', [ 0, 600 ]) + .shape('hexagonColumn') + .style({ + coverage: 0.8, + angle: 0, + opacity: 1.0 + }) + .color( + 'sum', + [ + '#094D4A', + '#146968', + '#1D7F7E', + '#289899', + '#34B6B7', + '#4AC5AF', + '#5FD3A6', + '#7BE39E', + '#A1EDB8', + '#CEF8D6' + ].reverse() + ); + scene.addLayer(layer); + }); diff --git a/examples/heatmap/hexagon/demo/light.js b/examples/heatmap/hexagon/demo/light.js new file mode 100644 index 0000000000..b82b29bca7 --- /dev/null +++ b/examples/heatmap/hexagon/demo/light.js @@ -0,0 +1,59 @@ +import { HeatmapLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + style: 'dark', + pitch: 43, + center: [ 120.13383079335335, 29.651873105004427 ], + zoom: 7.068989519212174, + type: 'mapbox' +}); + +window.mapScene = scene; + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/a1a8158d-6fe3-424b-8e50-694ccf61c4d7.csv' +) + .then(res => res.text()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'lng', + y: 'lat' + }, + transforms: [ + { + type: 'hexagon', + size: 2500, + field: 'v', + method: 'sum' + } + ] + }) + .size('sum', sum => { + return sum * 200; + }) + .shape('hexagonColumn') + .style({ + coverage: 0.8, + angle: 0, + opacity: 1.0 + }) + .color('sum', [ + '#094D4A', + '#146968', + '#1D7F7E', + '#289899', + '#34B6B7', + '#4AC5AF', + '#5FD3A6', + '#7BE39E', + '#A1EDB8', + '#C3F9CC', + '#DEFAC0', + '#ECFFB1' + ]); + scene.addLayer(layer); + }); diff --git a/examples/heatmap/hexagon/demo/meta.json b/examples/heatmap/hexagon/demo/meta.json new file mode 100644 index 0000000000..3671341cac --- /dev/null +++ b/examples/heatmap/hexagon/demo/meta.json @@ -0,0 +1,27 @@ +{ + "title": { + "zh": "蜂窝热力图", + "en": "heatmap" + }, + "demos": [ { + "filename": "china.js", + "title": "蜂窝热力图", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*bx-9TqimungAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "light.js", + "title": "蜂窝热力图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*HxpoRIcBA80AAAAAAAAAAABkARQnAQ" + }, + { + "filename": "hexagon.js", + "title": "蜂窝热力图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*rjkiQLCoZxUAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "world.js", + "title": "蜂窝热力图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*C3V7ToIoEvkAAAAAAAAAAABkARQnAQ" + } + ] +} diff --git a/examples/heatmap/hexagon/demo/world.js b/examples/heatmap/hexagon/demo/world.js new file mode 100644 index 0000000000..245eb6bc17 --- /dev/null +++ b/examples/heatmap/hexagon/demo/world.js @@ -0,0 +1,55 @@ +import { Scene } from '@l7/scene'; +import { HeatmapLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + style: 'light', + pitch: 0, + center: [ 104.995156, 31.450658 ], + type: 'amap', + zoom: 3.79 +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/337ddbb7-aa3f-4679-ab60-d64359241955.json' +) + .then(res => res.json()) + .then(data => { + const layer = new HeatmapLayer({}) + .source(data, { + transforms: [ + { + type: 'hexagon', + size: 90000, + field: 'capacity', + method: 'sum' + } + ] + }) + .size('sum', value => { + return value * 50; + }) + .shape('hexagon') + .style({ + coverage: 0.9, + angle: 0, + opacity: 1.0 + }) + .color( + 'sum', + [ + '#3F4BBA', + '#3F4BBA', + '#3F4BBA', + '#3F4BBA', + '#3C73DA', + '#3C73DA', + '#3C73DA', + '#0F62FF', + '#0F62FF', + '#30B2E9', + '#30B2E9', + '#40C4CE' + ].reverse() + ); + scene.addLayer(layer); + }); diff --git a/examples/heatmap/hexagon/index.en.md b/examples/heatmap/hexagon/index.en.md new file mode 100644 index 0000000000..b27d0e7208 --- /dev/null +++ b/examples/heatmap/hexagon/index.en.md @@ -0,0 +1,4 @@ +--- +title: Hexagon Map +order: 1 +--- diff --git a/examples/heatmap/hexagon/index.zh.md b/examples/heatmap/hexagon/index.zh.md new file mode 100644 index 0000000000..0a943ead55 --- /dev/null +++ b/examples/heatmap/hexagon/index.zh.md @@ -0,0 +1,5 @@ +--- +title: 蜂窝热力图 +order: 1 +--- +热力图的变体,蜂窝布局呈现数据分级分布的聚合现象。 \ No newline at end of file diff --git a/examples/line/arc/demo/arc.js b/examples/line/arc/demo/arc.js new file mode 100644 index 0000000000..7d9330816a --- /dev/null +++ b/examples/line/arc/demo/arc.js @@ -0,0 +1,38 @@ +import { LineLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'dark', + center: [ 0, 23.107329 ], + zoom: 0 +}); +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/b83699f9-a96d-49b8-b2ea-f99299faebaf.json' +) + .then(res => res.json()) + .then(data => { + function getAirportCoord(idx) { + return [ data.airports[idx][3], data.airports[idx][4] ]; + } + const routes = data.routes.map(function(airline) { + return { + coord: [ getAirportCoord(airline[1]), getAirportCoord(airline[2]) ] + }; + }); + const layer = new LineLayer({}) + .source(routes, { + parser: { + type: 'json', + coordinates: 'coord' + } + }) + .size(0.6) + .shape('arc') + .color('rgb(5, 5, 50)') + .style({ + opacity: 0.05 + }); + scene.addLayer(layer); + }); diff --git a/examples/line/arc/demo/arcCircle.js b/examples/line/arc/demo/arcCircle.js new file mode 100644 index 0000000000..346a044551 --- /dev/null +++ b/examples/line/arc/demo/arcCircle.js @@ -0,0 +1,32 @@ +import { LineLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'dark', + center: [ 107.77791556935472, 35.443286920228644 ], + zoom: 2.9142882493605033 +}); +fetch('https://gw.alipayobjects.com/os/rmsportal/UEXQMifxtkQlYfChpPwT.txt') + .then(res => res.text()) + .then(data => { + const layer = new LineLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'lng1', + y: 'lat1', + x1: 'lng2', + y1: 'lat2' + } + }) + .size(1) + .shape('greatcircle') + .color('#8C1EB2') + .style({ + opacity: 0.8, + blur: 0.99 + }); + scene.addLayer(layer); + }); diff --git a/examples/line/arc/demo/meta.json b/examples/line/arc/demo/meta.json new file mode 100644 index 0000000000..aad9b67e22 --- /dev/null +++ b/examples/line/arc/demo/meta.json @@ -0,0 +1,30 @@ +{ + "title": { + "zh": "弧线", + "en": "line" + }, + "demos": [ + { + "filename": "arcCircle.js", + "title": "大圆弧线", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*FTp1Roy34qgAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "arc.js", + "title": "弧线", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*gdcqTa6UCsYAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "trip_arc_dark.js", + "title": "3D 弧线", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*jXsbSYCqLu8AAAAAAAAAAABkARQnAQ" + + }, + { + "filename": "trip_arc.js", + "title": "3D 弧线", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*29BZTqIJkuEAAAAAAAAAAABkARQnAQ" + + } + ] +} diff --git a/examples/line/arc/demo/trip_arc.js b/examples/line/arc/demo/trip_arc.js new file mode 100644 index 0000000000..bfc2c62d81 --- /dev/null +++ b/examples/line/arc/demo/trip_arc.js @@ -0,0 +1,34 @@ +import { LineLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + pitch: 60, + type: 'mapbox', + style: 'light', + center: [ -74.06967, 40.720399 ], + zoom: 12.45977 +}); +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/bd33a685-a17e-4686-bc79-b0e6a89fd950.csv' +) + .then(res => res.text()) + .then(data => { + const layer = new LineLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'start station longitude', + y: 'start station latitude', + x1: 'end station longitude', + y1: 'end station latitude' + } + }) + .size(1) + .shape('arc3d') + .color('#0C47BF') + .style({ + opacity: 1, + blur: 0.9 + }); + scene.addLayer(layer); + }); diff --git a/examples/line/arc/demo/trip_arc_dark.js b/examples/line/arc/demo/trip_arc_dark.js new file mode 100644 index 0000000000..05114d0faa --- /dev/null +++ b/examples/line/arc/demo/trip_arc_dark.js @@ -0,0 +1,33 @@ +import { LineLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +const scene = new Scene({ + id: 'map', + pitch: 60, + type: 'mapbox', + style: 'dark', + center: [ 104.34278, 41.12554 ], + zoom: 2.94888, + rotation: 42.3999 +}); + +fetch('https://gw.alipayobjects.com/os/rmsportal/UEXQMifxtkQlYfChpPwT.txt') + .then(res => res.text()) + .then(data => { + const layer = new LineLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'lng1', + y: 'lat1', + x1: 'lng2', + y1: 'lat2' + } + }) + .size(1) + .shape('arc3d') + .color('#FF7C6A') + .style({ + opacity: 0.8 + }); + scene.addLayer(layer); + }); diff --git a/examples/line/arc/index.en.md b/examples/line/arc/index.en.md new file mode 100644 index 0000000000..f341a10f2b --- /dev/null +++ b/examples/line/arc/index.en.md @@ -0,0 +1,4 @@ +--- +title: Arc Line Map +order: 1 +--- diff --git a/examples/line/arc/index.zh.md b/examples/line/arc/index.zh.md new file mode 100644 index 0000000000..3d926174f7 --- /dev/null +++ b/examples/line/arc/index.zh.md @@ -0,0 +1,5 @@ +--- +title: 弧线地图 +order: 1 +--- +将两个点的连线绘制成弧形,绘制的弧线可以是贝塞尔曲线,大圆航线,通常用来表示两种地理事物关系和联系,或者人口迁移,物流起点目的地等。 \ No newline at end of file diff --git a/examples/line/isoline/demo/ele.js b/examples/line/isoline/demo/ele.js new file mode 100644 index 0000000000..acb143d941 --- /dev/null +++ b/examples/line/isoline/demo/ele.js @@ -0,0 +1,40 @@ +import { Scene } from '@l7/scene'; +import { LineLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 53.6305, + type: 'amap', + style: 'light', + center: [ 102.600579, 23.114887 ], + zoom: 14.66 +}); + +fetch('https://gw.alipayobjects.com/os/rmsportal/ZVfOvhVCzwBkISNsuKCc.json') + .then(res => res.json()) + .then(data => { + const layer = new LineLayer({}) + .source(data) + .size('ELEV', h => { + return [ h % 50 === 0 ? 1.0 : 0.5, (h - 1300) * 20 ]; + }) + .shape('line') + .scale('ELEV', { + type: 'quantize' + }) + .color( + 'ELEV', + [ + '#E4682F', + '#FF8752', + '#FFA783', + '#FFBEA8', + '#FFDCD6', + '#EEF3FF', + '#C8D7F5', + '#A5C1FC', + '#7FA7F9', + '#5F8AE5' + ].reverse() + ); + scene.addLayer(layer); + }); diff --git a/examples/line/isoline/demo/ele_dark.js b/examples/line/isoline/demo/ele_dark.js new file mode 100644 index 0000000000..a7e91d9ad4 --- /dev/null +++ b/examples/line/isoline/demo/ele_dark.js @@ -0,0 +1,37 @@ +import { Scene } from '@l7/scene'; +import { LineLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 26.842105263157915, + type: 'amap', + style: 'dark', + center: [ 102.599436, 23.116371 ], + zoom: 14.78 +}); + +fetch('https://gw.alipayobjects.com/os/rmsportal/ZVfOvhVCzwBkISNsuKCc.json') + .then(res => res.json()) + .then(data => { + const layer = new LineLayer({}) + .source(data) + .size('ELEV', h => { + return [ h % 50 === 0 ? 1.0 : 0.5, (h - 1300) * 20 ]; + }) + .shape('line') + .scale('ELEV', { + type: 'quantize' + }) + .color('ELEV', [ + '#094D4A', + '#146968', + '#1D7F7E', + '#289899', + '#34B6B7', + '#4AC5AF', + '#5FD3A6', + '#7BE39E', + '#A1EDB8', + '#CEF8D6' + ]); + scene.addLayer(layer); + }); diff --git a/examples/line/isoline/demo/isoline.js b/examples/line/isoline/demo/isoline.js new file mode 100644 index 0000000000..efda905fc8 --- /dev/null +++ b/examples/line/isoline/demo/isoline.js @@ -0,0 +1,40 @@ +import { Scene } from '@l7/scene'; +import { LineLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'light', + center: [ 104.117492, 36.492696 ], + zoom: 3.89 +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/9f6afbcd-3aec-4a26-bd4a-2276d3439e0d.json' +) + .then(res => res.json()) + .then(data => { + const layer = new LineLayer({}) + .source(data) + .scale('value', { + type: 'quantile' + }) + .size('value', [ 0.5, 1, 1.5, 2 ]) + .shape('line') + .color( + 'value', + [ + '#0A3663', + '#1558AC', + '#3771D9', + '#4D89E5', + '#64A5D3', + '#72BED6', + '#83CED6', + '#A6E1E0', + '#B8EFE2', + '#D7F9F0' + ].reverse() + ); + scene.addLayer(layer); + }); diff --git a/examples/line/isoline/demo/meta.json b/examples/line/isoline/demo/meta.json new file mode 100644 index 0000000000..6d731b96d8 --- /dev/null +++ b/examples/line/isoline/demo/meta.json @@ -0,0 +1,24 @@ +{ + "title": { + "zh": "线图层", + "en": "line" + }, + "demos": [ + { + "filename": "ele.js", + "title": "等高线", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*FGliTJ7eSBIAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "ele_dark.js", + "title": "等高线", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*X1LgSKQbrD0AAAAAAAAAAABkARQnAQ" + }, + { + "filename": "isoline.js", + "title": "等高线", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*YBNRRrk5IV4AAAAAAAAAAABkARQnAQ" + } + + ] +} diff --git a/examples/line/isoline/index.en.md b/examples/line/isoline/index.en.md new file mode 100644 index 0000000000..afbfabfb29 --- /dev/null +++ b/examples/line/isoline/index.en.md @@ -0,0 +1,4 @@ +--- +title: Isoline Map +order: 2 +--- diff --git a/examples/line/isoline/index.zh.md b/examples/line/isoline/index.zh.md new file mode 100644 index 0000000000..42af5d8f70 --- /dev/null +++ b/examples/line/isoline/index.zh.md @@ -0,0 +1,5 @@ +--- +title: 等值线地图 +order: 2 +--- +指需要用一连串首尾闭合相等数值点的连线的图层,表示连续分布且逐渐变化的数量特征的地图,常用于等高线图、等温线图等图。 \ No newline at end of file diff --git a/examples/line/line/demo/isoline.js b/examples/line/line/demo/isoline.js new file mode 100644 index 0000000000..aa9828a82d --- /dev/null +++ b/examples/line/line/demo/isoline.js @@ -0,0 +1,40 @@ +import { Scene } from './node_modules/@l7/scene'; +import { LineLayer } from './node_modules/@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'light', + center: [ 104.117492, 36.492696 ], + zoom: 3.89 +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/9f6afbcd-3aec-4a26-bd4a-2276d3439e0d.json' +) + .then(res => res.json()) + .then(data => { + const layer = new LineLayer({}) + .source(data) + .scale('value', { + type: 'quantile' + }) + .size('value', [ 0.5, 1, 1.5, 2 ]) + .shape('line') + .color( + 'value', + [ + '#0A3663', + '#1558AC', + '#3771D9', + '#4D89E5', + '#64A5D3', + '#72BED6', + '#83CED6', + '#A6E1E0', + '#B8EFE2', + '#D7F9F0' + ].reverse() + ); + scene.addLayer(layer); + }); diff --git a/examples/line/path/demo/bus_dark.js b/examples/line/path/demo/bus_dark.js new file mode 100644 index 0000000000..f1df3747d3 --- /dev/null +++ b/examples/line/path/demo/bus_dark.js @@ -0,0 +1,45 @@ +import { Scene } from '@l7/scene'; +import { LineLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + center: [ 103.83735604457024, 1.360253881403068 ], + pitch: 4.00000000000001, + zoom: 10.210275860702593, + rotation: 19.313180925794313, + type: 'mapbox', + style: 'dark' +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/ee07641d-5490-4768-9826-25862e8019e1.json' +) + .then(res => res.json()) + .then(data => { + const layer = new LineLayer({}) + .source(data, { + parser: { + type: 'json', + coordinates: 'path' + } + }) + .size('level', level => { + return [ 0.8, level * 1 ]; + }) + .shape('line') + .color( + 'level', + [ + '#312B60', + '#4A457E', + '#615C99', + '#816CAD', + '#A67FB5', + '#C997C7', + '#DEB8D4', + '#F5D4E6', + '#FAE4F1', + '#FFF3FC' + ].slice(0, 8) + ); + scene.addLayer(layer); + }); diff --git a/examples/line/path/demo/bus_light.js b/examples/line/path/demo/bus_light.js new file mode 100644 index 0000000000..5ed5a806c9 --- /dev/null +++ b/examples/line/path/demo/bus_light.js @@ -0,0 +1,47 @@ +import { Scene } from '@l7/scene'; +import { LineLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + center: [ 103.83735604457024, 1.360253881403068 ], + pitch: 4.00000000000001, + zoom: 10.210275860702593, + rotation: 19.313180925794313, + type: 'mapbox', + style: 'light' +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/ee07641d-5490-4768-9826-25862e8019e1.json' +) + .then(res => res.json()) + .then(data => { + const layer = new LineLayer({}) + .source(data, { + parser: { + type: 'json', + coordinates: 'path' + } + }) + .size('level', level => { + return [ 0.8, level * 1 ]; + }) + .shape('line') + .color( + 'level', + [ + '#0A3663', + '#1558AC', + '#3771D9', + '#4D89E5', + '#64A5D3', + '#72BED6', + '#83CED6', + '#A6E1E0', + '#B8EFE2', + '#D7F9F0' + ] + .reverse() + .slice(0, 8) + ); + scene.addLayer(layer); + }); diff --git a/examples/line/path/demo/meta.json b/examples/line/path/demo/meta.json new file mode 100644 index 0000000000..26b7c15314 --- /dev/null +++ b/examples/line/path/demo/meta.json @@ -0,0 +1,28 @@ +{ + "title": { + "zh": "线图层", + "en": "line" + }, + "demos": [ + { + "filename": "bus_light.js", + "title": "公交线路", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*fuSLRL8Ym4kAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "bus_dark.js", + "title": "公交线路", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*c80NRaMfGLAAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "road_light.js", + "title": "路径", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*1gddQ6x8Jq4AAAAAAAAAAABkARQnAQ" + }, + { + "filename": "road_dark.js", + "title": "路径", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*1FVsSLUncw4AAAAAAAAAAABkARQnAQ" + } + ] +} diff --git a/examples/line/path/demo/road_dark.js b/examples/line/path/demo/road_dark.js new file mode 100644 index 0000000000..9c867c292d --- /dev/null +++ b/examples/line/path/demo/road_dark.js @@ -0,0 +1,24 @@ +import { Scene } from '@l7/scene'; +import { LineLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + center: [ 116.3956, 39.9392 ], + pitch: 0, + zoom: 10, + rotation: 0, + type: 'mapbox', + style: 'dark' +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/0d2f0113-f48b-4db9-8adc-a3937243d5a3.json' +) + .then(res => res.json()) + .then(data => { + const layer = new LineLayer({}) + .source(data) + .size(1.5) + .shape('line') + .color('标准名称', [ '#5B8FF9', '#5CCEA1', '#F6BD16' ]); + scene.addLayer(layer); + }); diff --git a/examples/line/path/demo/road_light.js b/examples/line/path/demo/road_light.js new file mode 100644 index 0000000000..01407c55c2 --- /dev/null +++ b/examples/line/path/demo/road_light.js @@ -0,0 +1,24 @@ +import { Scene } from '@l7/scene'; +import { LineLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + center: [ 116.3956, 39.9392 ], + pitch: 0, + zoom: 10, + rotation: 0, + type: 'mapbox', + style: 'light' +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/0d2f0113-f48b-4db9-8adc-a3937243d5a3.json' +) + .then(res => res.json()) + .then(data => { + const layer = new LineLayer({}) + .source(data) + .size(1.5) + .shape('line') + .color('标准名称', [ '#5B8FF9', '#5CCEA1', '#5D7092' ]); + scene.addLayer(layer); + }); diff --git a/examples/line/path/index.en.md b/examples/line/path/index.en.md new file mode 100644 index 0000000000..d62b6f276a --- /dev/null +++ b/examples/line/path/index.en.md @@ -0,0 +1,5 @@ +--- +title: Path Map +order: 0 +--- + diff --git a/examples/line/path/index.zh.md b/examples/line/path/index.zh.md new file mode 100644 index 0000000000..d997c38a38 --- /dev/null +++ b/examples/line/path/index.zh.md @@ -0,0 +1,5 @@ +--- +title: 路径地图 +order: 0 +--- +指需要用一连串首尾不闭合的点坐标对来定位的线图层,通常用来表示轨迹,线路,道路等 \ No newline at end of file diff --git a/examples/point/bubble/demo/color.js b/examples/point/bubble/demo/color.js new file mode 100644 index 0000000000..bfd9450294 --- /dev/null +++ b/examples/point/bubble/demo/color.js @@ -0,0 +1,44 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'light', + center: [ 121.435159, 31.256971 ], + zoom: 14.89, + minZoom: 10 +}); +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/893d1d5f-11d9-45f3-8322-ee9140d288ae.json' +) + .then(res => res.json()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data, { + parser: { + type: 'json', + x: 'longitude', + y: 'latitude' + } + }) + .shape('name', [ + 'circle', + 'triangle', + 'square', + 'pentagon', + 'hexagon', + 'octogon', + 'hexagram', + 'rhombus', + 'vesica' + ]) + .size('unit_price', [ 10, 25 ]) + .color('name', [ '#5B8FF9', '#5CCEA1', '#5D7092', '#F6BD16', '#E86452' ]) + .style({ + opacity: 0.3, + strokeWidth: 2 + }); + + scene.addLayer(pointLayer); + }); diff --git a/examples/point/bubble/demo/meta.json b/examples/point/bubble/demo/meta.json new file mode 100644 index 0000000000..9c9bf0e4ca --- /dev/null +++ b/examples/point/bubble/demo/meta.json @@ -0,0 +1,31 @@ +{ + "title": { + "zh": "中文分类", + "en": "Category" + }, + "demos": [ + { + "filename": "point.js", + "title": "气泡图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*_9ETS5_1yCEAAAAAAAAAAABkARQnAQ" + + }, + { + "filename": "color.js", + "title": "形状映射", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*K8ACRr5TY7UAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "world.js", + "title": "气泡图", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*DMREQYwsCF4AAAAAAAAAAABkARQnAQ" + + }, { + "filename": "scatter.js", + "title": "定点图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*Jt3ZSb8VH98AAAAAAAAAAABkARQnAQ" + + } + + ] +} diff --git a/examples/point/bubble/demo/point.js b/examples/point/bubble/demo/point.js new file mode 100644 index 0000000000..e44d076368 --- /dev/null +++ b/examples/point/bubble/demo/point.js @@ -0,0 +1,31 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'light', + center: [ 140.067171, 36.26186 ], + zoom: 5.32, + maxZoom: 10 +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d3564b06-670f-46ea-8edb-842f7010a7c6.json' +) + .then(res => res.json()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data) + .shape('circle') + .size('mag', [ 1, 25 ]) + .color('mag', mag => { + return mag > 4.5 ? '#5B8FF9' : '#5CCEA1'; + }) + .style({ + opacity: 0.3, + strokeWidth: 1 + }); + + scene.addLayer(pointLayer); + }); diff --git a/examples/point/bubble/demo/scatter.js b/examples/point/bubble/demo/scatter.js new file mode 100644 index 0000000000..884dfedece --- /dev/null +++ b/examples/point/bubble/demo/scatter.js @@ -0,0 +1,45 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + type: 'amap', + style: 'light', + center: [ -121.24357, 37.58264 ], + pitch: 0, + zoom: 6.45 +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/6c4bb5f2-850b-419d-afc4-e46032fc9f94.csv' +) + .then(res => res.text()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data, { + parser: { + type: 'csv', + x: 'Longitude', + y: 'Latitude' + } + }) + .shape('circle') + .size(4) + .color('Magnitude', [ + '#0A3663', + '#1558AC', + '#3771D9', + '#4D89E5', + '#64A5D3', + '#72BED6', + '#83CED6', + '#A6E1E0', + '#B8EFE2', + '#D7F9F0' + ]) + .style({ + opacity: 0.5, + strokeWidth: 0 + }); + + scene.addLayer(pointLayer); + }); diff --git a/examples/point/bubble/demo/world.js b/examples/point/bubble/demo/world.js new file mode 100644 index 0000000000..b89cae4e45 --- /dev/null +++ b/examples/point/bubble/demo/world.js @@ -0,0 +1,38 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'dark', + center: [ 96.99215001469588, 29.281597225674773 ], + zoom: 2.194613775109773, + maxZoom: 10 +}); +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/337ddbb7-aa3f-4679-ab60-d64359241955.json' +) + .then(res => res.json()) + .then(data => { + data.features = data.features.filter(item => { + return item.properties.capacity > 800; + }); + const pointLayer = new PointLayer({}) + .source(data) + .shape('circle') + .size('capacity', [ 0, 16 ]) + .color('capacity', [ + '#34B6B7', + '#4AC5AF', + '#5FD3A6', + '#7BE39E', + '#A1EDB8', + '#CEF8D6' + ]) + .style({ + opacity: 0.5, + strokeWidth: 0 + }); + + scene.addLayer(pointLayer); + }); diff --git a/examples/point/bubble/index.en.md b/examples/point/bubble/index.en.md new file mode 100644 index 0000000000..d06551432b --- /dev/null +++ b/examples/point/bubble/index.en.md @@ -0,0 +1,4 @@ +--- +title: Bubble Map +order: 0 +--- diff --git a/examples/point/bubble/index.zh.md b/examples/point/bubble/index.zh.md new file mode 100644 index 0000000000..38a626dc3b --- /dev/null +++ b/examples/point/bubble/index.zh.md @@ -0,0 +1,5 @@ +--- +title: 气泡地图 +order: 0 +--- +指地图上可用一个形状相同、大小和与其代表的数值成固定比率的圆点符号来定位的点图层,用于表达离散现象分布特征的地图。 \ No newline at end of file diff --git a/examples/point/chart/demo/bar.js b/examples/point/chart/demo/bar.js new file mode 100644 index 0000000000..f0e43874db --- /dev/null +++ b/examples/point/chart/demo/bar.js @@ -0,0 +1,78 @@ +import { Scene } from '@l7/scene'; +import { Marker } from '@l7/component'; +import * as G2 from '@antv/g2'; +const scene = new Scene({ + id: 'map', + type: 'amap', + style: 'light', + center: [ 2.6125016864608597, 49.359131 ], + pitch: 0, + zoom: 4.19 +}); + +scene.on('loaded', () => { + addChart(); +}); +function addChart() { + fetch( + 'https://gw.alipayobjects.com/os/basement_prod/0b96cca4-7e83-449a-93d0-2a77053e74ab.json' + ) + .then(res => res.json()) + .then(data => { + data.nodes.forEach(function(item) { + const el = document.createElement('div'); + const total = + item.gdp.Agriculture + item.gdp.Industry + item.gdp.Service; + + const size = Math.min(parseInt(total / 30000, 10), 70); + if (size < 30) { + return; + } + const itemData = [ + { + item: 'Agriculture', + count: item.gdp.Agriculture, + percent: item.gdp.Agriculture / total + }, + { + item: 'Industry', + count: item.gdp.Industry, + percent: item.gdp.Industry / total + }, + { + item: 'Service', + count: item.gdp.Service, + percent: item.gdp.Service / total + } + ]; + + const chart = new G2.Chart({ + container: el, + width: size, + height: size, + render: 'svg', + padding: 0 + }); + chart.legend(false); + chart.source(itemData); + chart.tooltip(false); + chart.axis('count', { + grid: false + }); + chart + .interval() + .position('item*count') + .color('item', [ '#5CCEA1', '#5D7092', '#5B8FF9' ]) + .opacity(1); + chart.render(); + new Marker({ + element: el + }) + .setLnglat({ + lng: item.coordinates[0], + lat: item.coordinates[1] + }) + .addTo(scene); + }); + }); +} diff --git a/examples/point/chart/demo/chart.js b/examples/point/chart/demo/chart.js new file mode 100644 index 0000000000..bae4c58db9 --- /dev/null +++ b/examples/point/chart/demo/chart.js @@ -0,0 +1,101 @@ +import { Scene } from '@l7/scene'; +import { Marker } from '@l7/component'; +import * as G2 from '@antv/g2'; +const scene = new Scene({ + id: 'map', + type: 'amap', + style: 'light', + center: [ 2.6125016864608597, 49.359131 ], + pitch: 0, + zoom: 4.19 +}); + +scene.on('loaded', () => { + addChart(); +}); +window.mapScene = scene; +function addChart() { + fetch( + 'https://gw.alipayobjects.com/os/basement_prod/0b96cca4-7e83-449a-93d0-2a77053e74ab.json' + ) + .then(res => res.json()) + .then(data => { + data.nodes.forEach(function(item) { + const el = document.createElement('div'); + const total = + item.gdp.Agriculture + item.gdp.Industry + item.gdp.Service; + + const size = Math.min(parseInt(total / 30000, 10), 70); + if (size < 30) { + return; + } + const itemData = [ + { + item: 'Agriculture', + count: item.gdp.Agriculture, + percent: item.gdp.Agriculture / total + }, + { + item: 'Industry', + count: item.gdp.Industry, + percent: item.gdp.Industry / total + }, + { + item: 'Service', + count: item.gdp.Service, + percent: item.gdp.Service / total + } + ]; + + const sliceNumber = 0.02; + + // 自定义 other 的图形,增加两条线 + G2.Shape.registerShape('interval', 'sliceShape', { + draw: function draw(cfg, container) { + const points = cfg.points; + let path = []; + path.push([ 'M', points[0].x, points[0].y ]); + path.push([ 'L', points[1].x, points[1].y - sliceNumber ]); + path.push([ 'L', points[2].x, points[2].y - sliceNumber ]); + path.push([ 'L', points[3].x, points[3].y ]); + path.push('Z'); + path = this.parsePath(path); + return container.addShape('path', { + attrs: { + fill: cfg.color, + path + } + }); + } + }); + + const chart = new G2.Chart({ + container: el, + width: size, + height: size, + render: 'svg', + padding: 0 + }); + chart.legend(false); + chart.source(itemData); + chart.coord('theta', { + innerRadius: 0.6 + }); + chart.tooltip(false); + chart + .intervalStack() + .position('percent') + .color('item', [ '#5CCEA1', '#5D7092', '#5B8FF9' ]) + .shape('sliceShape'); + chart.render(); + new Marker({ + element: el + }) + .setLnglat({ + lng: item.coordinates[0], + lat: item.coordinates[1] + }) + .addTo(scene); + }); + }); +} diff --git a/examples/point/chart/demo/meta.json b/examples/point/chart/demo/meta.json new file mode 100644 index 0000000000..3a94fcf334 --- /dev/null +++ b/examples/point/chart/demo/meta.json @@ -0,0 +1,23 @@ +{ + "title": { + "zh": "中文分类", + "en": "Category" + }, + "demos": [ + { + "filename": "bar.js", + "title": "柱图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*-Tw3TLzyJ5wAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "chart.js", + "title": "环图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*Uq_RQqyMrbQAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "ring.js", + "title": "环图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*zUu0RYKaF28AAAAAAAAAAABkARQnAQ" + } + ] +} diff --git a/examples/point/chart/demo/ring.js b/examples/point/chart/demo/ring.js new file mode 100644 index 0000000000..4401242d9d --- /dev/null +++ b/examples/point/chart/demo/ring.js @@ -0,0 +1,111 @@ +import { Scene } from '@l7/scene'; +import { Marker } from '@l7/component'; +import * as G2 from '@antv/g2'; + +const CSS = `.l7-marker .g2-guide-html { + width: 50px; + height: 50px; + vertical-align: middle; + text-align: center; + line-height: 0.1 +} + +l7-marker .g2-guide-html .title { + font-size: 12px; + color: #8c8c8c; + font-weight: 300; +} + +l7-marker .g2-guide-html .value { + font-size: 18px; + color: #000; + font-weight: bold; +} +`; +function loadCssCode(code) { + const style = document.createElement('style'); + style.type = 'text/css'; + style.rel = 'stylesheet'; + // for Chrome Firefox Opera Safari + style.appendChild(document.createTextNode(code)); + // for IE + // style.styleSheet.cssText = code; + const head = document.getElementsByTagName('head')[0]; + head.appendChild(style); +} +loadCssCode(CSS); + +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'dark', + center: [ 52.21496184144132, 24.121126851768906 ], + zoom: 3.802 +}); +window.mapScene = scene; +scene.on('loaded', () => { + Promise.all([ + fetch( + 'https://gw.alipayobjects.com/os/basement_prod/5b772136-a1f4-4fc5-9a80-9f9974b4b182.json' + ).then(d => d.json()), + fetch( + 'https://gw.alipayobjects.com/os/basement_prod/f3c467a4-9ae0-4f08-bb5f-11f9c869b2cb.json' + ).then(d => d.json()) + ]).then(function onLoad([ center, population ]) { + const popobj = {}; + population.forEach(element => { + popobj[element.Code] = + element['Population, female (% of total) (% of total)']; + }); + // 数据绑定 + + center.features = center.features.map(fe => { + fe.properties.female = popobj[fe.properties.id] * 1 || 0; + return fe; + }); + center.features.forEach(point => { + const el = document.createElement('div'); + const coord = point.geometry.coordinates; + const v = point.properties.female * 1; + if (v < 1 || (v > 46 && v < 54)) { return; } + const size = 60; + const data = [ + { + type: '男性', + value: 100.0 - v.toFixed(2) + }, + { + type: '女性', + value: v.toFixed(2) * 1 + } + ]; + const chart = new G2.Chart({ + container: el, + width: size, + height: size, + render: 'svg', + padding: 0 + }); + chart.source(data); + chart.legend(false); + chart.tooltip(false); + chart.coord('theta', { + radius: 0.9, + innerRadius: 0.6 + }); + chart + .intervalStack() + .position('value') + .color('type', [ '#5CCEA1', '#5B8FF9' ]) + .opacity(1); + chart.render(); + new Marker({ element: el }) + .setLnglat({ + lng: coord[0], + lat: coord[1] + }) + .addTo(scene); + }); + }); +}); diff --git a/examples/point/chart/index.en.md b/examples/point/chart/index.en.md new file mode 100644 index 0000000000..683c5cf293 --- /dev/null +++ b/examples/point/chart/index.en.md @@ -0,0 +1,5 @@ +--- +title: Chart Map +order: 6 +--- + diff --git a/examples/point/chart/index.zh.md b/examples/point/chart/index.zh.md new file mode 100644 index 0000000000..0680f65140 --- /dev/null +++ b/examples/point/chart/index.zh.md @@ -0,0 +1,5 @@ +--- +title: 复合图表地图 +order: 6 +--- +使用二维统计图表代替点状符号的一种特殊复合形式,复合图表地图中常用扩展图形还有柱状图、曲线图、玫瑰图等 \ No newline at end of file diff --git a/examples/point/column/demo/clumn_shape.js b/examples/point/column/demo/clumn_shape.js new file mode 100644 index 0000000000..c1265e15c0 --- /dev/null +++ b/examples/point/column/demo/clumn_shape.js @@ -0,0 +1,42 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 66.02383, + type: 'amap', + style: 'dark', + center: [ 121.400257, 31.25287 ], + zoom: 14.55, + rotation: 134.9507 +}); +window.mapScene = scene; + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/893d1d5f-11d9-45f3-8322-ee9140d288ae.json' +) + .then(res => res.json()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data, { + parser: { + type: 'json', + x: 'longitude', + y: 'latitude' + } + }) + .shape('name', [ + 'cylinder', + 'triangleColumn', + 'hexagonColumn', + 'squareColumn' + ]) + .size('unit_price', h => { + return [ 6, 6, h / 500 ]; + }) + .color('name', [ '#739DFF', '#61FCBF', '#FFDE74', '#FF896F' ]) + .style({ + opacity: 1.0 + }); + + scene.addLayer(pointLayer); + }); diff --git a/examples/point/column/demo/clumn_shape_light.js b/examples/point/column/demo/clumn_shape_light.js new file mode 100644 index 0000000000..0cf8f527f0 --- /dev/null +++ b/examples/point/column/demo/clumn_shape_light.js @@ -0,0 +1,42 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 60, + type: 'mapbox', + style: 'light', + center: [ 121.412224, 31.26192438 ], + zoom: 13.13438, + rotation: 35.97133 +}); +window.mapScene = scene; + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/893d1d5f-11d9-45f3-8322-ee9140d288ae.json' +) + .then(res => res.json()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data, { + parser: { + type: 'json', + x: 'longitude', + y: 'latitude' + } + }) + .shape('name', [ + 'cylinder', + 'triangleColumn', + 'hexagonColumn', + 'squareColumn' + ]) + .size('unit_price', h => { + return [ 6, 6, h / 500 ]; + }) + .color('name', [ '#5B8FF9', '#70E3B5', '#FFD458', '#FF7C6A' ]) + .style({ + opacity: 1.0 + }); + + scene.addLayer(pointLayer); + }); diff --git a/examples/point/column/demo/column_dark.js b/examples/point/column/demo/column_dark.js new file mode 100644 index 0000000000..42a1d405f8 --- /dev/null +++ b/examples/point/column/demo/column_dark.js @@ -0,0 +1,44 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; + +const scene = new Scene({ + id: 'map', + pitch: 35.210526315789465, + type: 'amap', + style: 'dark', + center: [ 104.288144, 31.239692 ], + zoom: 4.4 +}); +window.mapScene = scene; +fetch('https://gw.alipayobjects.com/os/rmsportal/oVTMqfzuuRFKiDwhPSFL.json') + .then(res => res.json()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data.list, { + parser: { + type: 'json', + x: 'j', + y: 'w' + } + }) + .shape('cylinder') + .size('t', function(level) { + return [ 1, 2, level * 2 + 20 ]; + }) + .color('t', [ + '#094D4A', + '#146968', + '#1D7F7E', + '#289899', + '#34B6B7', + '#4AC5AF', + '#5FD3A6', + '#7BE39E', + '#A1EDB8', + '#CEF8D6' + ]) + .style({ + opacity: 1.0 + }); + scene.addLayer(pointLayer); + }); diff --git a/examples/point/column/demo/column_light.js b/examples/point/column/demo/column_light.js new file mode 100644 index 0000000000..685999cff5 --- /dev/null +++ b/examples/point/column/demo/column_light.js @@ -0,0 +1,33 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 48.62562, + type: 'amap', + style: 'light', + center: [ 104.026043, 31.847 ], + rotation: -0.76, + zoom: 4.48 +}); +window.mapScene = scene; +fetch('https://gw.alipayobjects.com/os/rmsportal/oVTMqfzuuRFKiDwhPSFL.json') + .then(res => res.json()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data.list, { + parser: { + type: 'json', + x: 'j', + y: 'w' + } + }) + .shape('cylinder') + .size('t', function(level) { + return [ 1, 2, level * 2 + 20 ]; + }) + .color('#006CFF') + .style({ + opacity: 1.0 + }); + scene.addLayer(pointLayer); + }); diff --git a/examples/point/column/demo/meta.json b/examples/point/column/demo/meta.json new file mode 100644 index 0000000000..fbe1c8c40c --- /dev/null +++ b/examples/point/column/demo/meta.json @@ -0,0 +1,31 @@ +{ + "title": { + "zh": "中文分类", + "en": "Category" + }, + "demos": [ + { + "filename": "column_light.js", + "title": "3D柱图_浅色底图", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*5WdiT7MmU_cAAAAAAAAAAABkARQnAQ" + + }, + { + "filename": "clumn_shape_light.js", + "title": "3D 浅色柱图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*pAKGQrCFSjAAAAAAAAAAAABkARQnAQ" + + }, + { + "filename": "column_dark.js", + "title": "3D柱图_深色底图", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*WkpEQqzuM-oAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "clumn_shape.js", + "title": "3D 深色柱图", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*HNbARpUVOdYAAAAAAAAAAABkARQnAQ" + + } + ] +} diff --git a/examples/point/column/index.en.md b/examples/point/column/index.en.md new file mode 100644 index 0000000000..eb926efa8c --- /dev/null +++ b/examples/point/column/index.en.md @@ -0,0 +1,4 @@ +--- +title: Column Map +order: 4 +--- diff --git a/examples/point/column/index.zh.md b/examples/point/column/index.zh.md new file mode 100644 index 0000000000..3c36daa306 --- /dev/null +++ b/examples/point/column/index.zh.md @@ -0,0 +1,5 @@ +--- +title: 3D 柱状地图 +order: 4 +--- +用形状大小相同的柱状体代替点状符号,高度与数值大小映射共同表达离散现象分布特征的地图 \ No newline at end of file diff --git a/examples/point/image/demo/image.js b/examples/point/image/demo/image.js new file mode 100644 index 0000000000..d9e6c56638 --- /dev/null +++ b/examples/point/image/demo/image.js @@ -0,0 +1,40 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'light', + center: [ 121.434765, 31.256735 ], + zoom: 14.83 +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/893d1d5f-11d9-45f3-8322-ee9140d288ae.json' +) + .then(res => res.json()) + .then(data => { + scene.addImage( + '00', + 'https://gw.alipayobjects.com/zos/basement_prod/604b5e7f-309e-40db-b95b-4fac746c5153.svg' + ); + scene.addImage( + '01', + 'https://gw.alipayobjects.com/zos/basement_prod/30580bc9-506f-4438-8c1a-744e082054ec.svg' + ); + scene.addImage( + '02', + 'https://gw.alipayobjects.com/zos/basement_prod/7aa1f460-9f9f-499f-afdf-13424aa26bbf.svg' + ); + const imageLayer = new PointLayer() + .source(data, { + parser: { + type: 'json', + x: 'longitude', + y: 'latitude' + } + }) + .shape('name', [ '00', '01', '02' ]) + .size(20); + scene.addLayer(imageLayer); + }); diff --git a/examples/point/image/demo/locate.js b/examples/point/image/demo/locate.js new file mode 100644 index 0000000000..a7443e4abd --- /dev/null +++ b/examples/point/image/demo/locate.js @@ -0,0 +1,26 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'light', + center: [ 116.276227, 35.256776 ], + zoom: 6 +}); + +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/e2fc6e0a-af2a-4320-96e5-d9f5a5fda442.json' +) + .then(res => res.json()) + .then(data => { + scene.addImage( + 'marker', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*BJ6cTpDcuLcAAAAAAAAAAABkARQnAQ' + ); + const imageLayer = new PointLayer() + .source(data) + .shape('marker') + .size(12); + scene.addLayer(imageLayer); + }); diff --git a/examples/point/image/demo/meta.json b/examples/point/image/demo/meta.json new file mode 100644 index 0000000000..c6fe6cae81 --- /dev/null +++ b/examples/point/image/demo/meta.json @@ -0,0 +1,23 @@ +{ + "title": { + "zh": "中文分类", + "en": "Category" + }, + "demos": [ + { + "filename": "image.js", + "title": "气泡图", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*c0IDRIg_n4MAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "locate.js", + "title": "顶点符号", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*jrFoQrZNL3wAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "weather.js", + "title": "天气", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*a_rnSI6p6RoAAAAAAAAAAABkARQnAQ" + } + ] +} diff --git a/examples/point/image/demo/weather.js b/examples/point/image/demo/weather.js new file mode 100644 index 0000000000..a8ab5e55ff --- /dev/null +++ b/examples/point/image/demo/weather.js @@ -0,0 +1,72 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + type: 'amap', + style: 'dark', + center: [ 120.5969, 29.7918 ], + pitch: 35, + zoom: 7, + rotation: 4.183582 +}); +scene.addImage( + '00', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*kzTMQqS2QdUAAAAAAAAAAABkARQnAQ' +); +scene.addImage( + '01', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*jH1XRb7F7hMAAAAAAAAAAABkARQnAQ' +); +scene.addImage( + '02', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*YaKSTr3L5i8AAAAAAAAAAABkARQnAQ' +); +scene.addImage( + '04', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*dmniQrDpCYwAAAAAAAAAAABkARQnAQ' +); +scene.addImage( + '11', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*YaKSTr3L5i8AAAAAAAAAAABkARQnAQ' +); +scene.addImage( + '15', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*YNlXQYCIzroAAAAAAAAAAABkARQnAQ' +); +scene.addImage( + '07', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*DccRTI6ZRLoAAAAAAAAAAABkARQnAQ' +); +scene.addImage( + '16', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*iQKoS6I-rO8AAAAAAAAAAABkARQnAQ' +); +scene.addImage( + '06', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*f-wyS7ad5p0AAAAAAAAAAABkARQnAQ' +); +scene.addImage( + '08', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*lHhzQrOW4AQAAAAAAAAAAABkARQnAQ' +); +scene.addImage( + '17', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*9Q0QS4GdaYcAAAAAAAAAAABkARQnAQ' +); +scene.addImage( + '05', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*LyuVRowl6nAAAAAAAAAAAABkARQnAQ' +); +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/c6042c6b-45fd-4e2e-adf8-fdbf060441e8.json' +) + .then(res => res.json()) + .then(data => { + const imageLayer = new PointLayer() + .source(data) + .shape('w', function(w) { + return w; + }) + .size(15); + scene.addLayer(imageLayer); + }); diff --git a/examples/point/image/index.en.md b/examples/point/image/index.en.md new file mode 100644 index 0000000000..0f0394e583 --- /dev/null +++ b/examples/point/image/index.en.md @@ -0,0 +1,4 @@ +--- +title: Symbol Map +order: 2 +--- diff --git a/examples/point/image/index.zh.md b/examples/point/image/index.zh.md new file mode 100644 index 0000000000..ec8ba9c381 --- /dev/null +++ b/examples/point/image/index.zh.md @@ -0,0 +1,5 @@ +--- +title: 符号地图 +order: 2 +--- +以形状变量中具象的图标映射的点图层,将真实地物具化为利于直观识别的图标,常用于突出信息的突出表达。 \ No newline at end of file diff --git a/examples/point/marker/demo/marker.js b/examples/point/marker/demo/marker.js new file mode 100644 index 0000000000..5c9c428122 --- /dev/null +++ b/examples/point/marker/demo/marker.js @@ -0,0 +1,54 @@ +import { Scene } from '@l7/scene'; +import { Marker } from '@l7/component'; +const scene = new Scene({ + id: 'map', + type: 'amap', + style: 'light', + center: [ 105.790327, 36.495636 ], + pitch: 0, + zoom: 4 +}); + +scene.on('loaded', () => { + addMarkers(); +}); + +function addMarkers() { + fetch( + 'https://gw.alipayobjects.com/os/basement_prod/67f47049-8787-45fc-acfe-e19924afe032.json' + ) + .then(res => res.json()) + .then(nodes => { + for (let i = 0; i < nodes.length; i++) { + if (nodes[i].g !== '1' || nodes[i].v === '') { continue; } + const el = document.createElement('label'); + el.className = 'lableclass'; + el.textContent = nodes[i].v + '℃'; + el.style.background = getColor(nodes[i].v); + el.style.borderColor = getColor(nodes[i].v); + new Marker({ + element: el + }) + .setLnglat({ lng: nodes[i].x * 1, lat: nodes[i].y }) + .addTo(scene); + } + }); +} + +function getColor(v) { + return v > 50 + ? '#800026' + : v > 40 + ? '#BD0026' + : v > 30 + ? '#E31A1C' + : v > 20 + ? '#FC4E2A' + : v > 10 + ? '#FD8D3C' + : v > 5 + ? '#FEB24C' + : v > 0 + ? '#FED976' + : '#FFEDA0'; +} diff --git a/examples/point/marker/demo/meta.json b/examples/point/marker/demo/meta.json new file mode 100644 index 0000000000..c09db23baa --- /dev/null +++ b/examples/point/marker/demo/meta.json @@ -0,0 +1,14 @@ +{ + "title": { + "zh": "中文分类", + "en": "Category" + }, + "demos": [ + { + "filename": "marker.js", + "title": "温度", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*oPofT5YBOksAAAAAAAAAAABkARQnAQ" + + } + ] +} diff --git a/examples/point/marker/index.en.md b/examples/point/marker/index.en.md new file mode 100644 index 0000000000..68e443a8c7 --- /dev/null +++ b/examples/point/marker/index.en.md @@ -0,0 +1,4 @@ +--- +title: Custom Marker +order: 7 +--- diff --git a/examples/point/marker/index.zh.md b/examples/point/marker/index.zh.md new file mode 100644 index 0000000000..7ebaa62a10 --- /dev/null +++ b/examples/point/marker/index.zh.md @@ -0,0 +1,5 @@ +--- +title: 自定义 Marker +order: 7 +--- +可自定义点符号,通过自定义dom实现地图标注,富文本、动态点状符号都可用于地图上信息的标记。 \ No newline at end of file diff --git a/examples/point/scatter/demo/meta.json b/examples/point/scatter/demo/meta.json new file mode 100644 index 0000000000..f592a11c51 --- /dev/null +++ b/examples/point/scatter/demo/meta.json @@ -0,0 +1,19 @@ +{ + "title": { + "zh": "中文分类", + "en": "Category" + }, + "demos": [ + { + "filename": "normal2.js", + "title": "城市亮度图", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*Xp7iRaORYuIAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "normal.js", + "title": "海量点", + "screenshot":"https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*Kva7R7AimzsAAAAAAAAAAABkARQnAQ" + } + + ] +} diff --git a/examples/point/scatter/demo/normal.js b/examples/point/scatter/demo/normal.js new file mode 100644 index 0000000000..6111b8d699 --- /dev/null +++ b/examples/point/scatter/demo/normal.js @@ -0,0 +1,30 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + type: 'amap', + style: 'dark', + center: [ 121.417463, 31.215175 ], + pitch: 0, + zoom: 11 +}); +window.mapScene = scene; +fetch('https://gw.alipayobjects.com/os/rmsportal/BElVQFEFvpAKzddxFZxJ.txt') + .then(res => res.text()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data, { + parser: { + type: 'csv', + y: 'lat', + x: 'lng' + } + }) + .size(0.5) + .color('#080298') + .style({ + opacity: 1 + }); + + scene.addLayer(pointLayer); + }); diff --git a/examples/point/scatter/demo/normal2.js b/examples/point/scatter/demo/normal2.js new file mode 100644 index 0000000000..d9a622c9db --- /dev/null +++ b/examples/point/scatter/demo/normal2.js @@ -0,0 +1,37 @@ +import { Scene } from '@l7/scene'; +import { PointLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 64.88, + type: 'amap', + style: 'dark', + center: [ 114.060288, 22.53684 ], + zoom: 15.63 +}); +window.mapScene = scene; +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/513add53-dcb2-4295-8860-9e7aa5236699.json' +) + .then(res => res.json()) + .then(data => { + const pointLayer = new PointLayer({}) + .source(data) + .size(2) + .color('h8', [ + '#0A3663', + '#1558AC', + '#3771D9', + '#4D89E5', + '#64A5D3', + '#72BED6', + '#83CED6', + '#A6E1E0', + '#B8EFE2', + '#D7F9F0' + ]) + .style({ + opacity: 1 + }); + + scene.addLayer(pointLayer); + }); diff --git a/examples/point/scatter/index.en.md b/examples/point/scatter/index.en.md new file mode 100644 index 0000000000..0db3c39e7c --- /dev/null +++ b/examples/point/scatter/index.en.md @@ -0,0 +1,4 @@ +--- +title: Scatter Map +order: 1 +--- diff --git a/examples/point/scatter/index.zh.md b/examples/point/scatter/index.zh.md new file mode 100644 index 0000000000..faf3bf0a17 --- /dev/null +++ b/examples/point/scatter/index.zh.md @@ -0,0 +1,5 @@ +--- +title: "散点地图" +order: 1 +--- +指地图上可用一个形状大小相同的点状符号来定位,用表达离散现象分布特征的地图,如人口、农作物、动植物等的分布。 \ No newline at end of file diff --git a/examples/polygon/3d/demo/meta.json b/examples/polygon/3d/demo/meta.json new file mode 100644 index 0000000000..9d69303a8c --- /dev/null +++ b/examples/polygon/3d/demo/meta.json @@ -0,0 +1,13 @@ +{ + "title": { + "zh": "中文分类", + "en": "Category" + }, + "demos": [ + { + "filename": "polygon.js", + "title": "3D 建筑面", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*JgXVSoV03n4AAAAAAAAAAABkARQnAQ" + } + ] +} diff --git a/examples/polygon/3d/demo/polygon.js b/examples/polygon/3d/demo/polygon.js new file mode 100644 index 0000000000..1edfcbda7c --- /dev/null +++ b/examples/polygon/3d/demo/polygon.js @@ -0,0 +1,35 @@ +import { Scene } from '@l7/scene'; +import { PolygonLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'dark', + center: [ 114.050008, 22.529272 ], + zoom: 14.1 +}); + +window.mapScene = scene; +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/972566c5-a2b9-4a7e-8da1-bae9d0eb0117.json' +) + .then(res => res.json()) + .then(data => { + const layer = new PolygonLayer({}) + .source(data) + .shape('extrude') + .size('h20', [ 100, 120, 160, 200, 260, 500 ]) + .color('h20', [ + '#816CAD', + '#A67FB5', + '#C997C7', + '#DEB8D4', + '#F5D4E6', + '#FAE4F1', + '#FFF3FC' + ]) + .style({ + opacity: 1.0 + }); + scene.addLayer(layer); + }); diff --git a/examples/polygon/3d/index.en.md b/examples/polygon/3d/index.en.md new file mode 100644 index 0000000000..bc3ca8ef68 --- /dev/null +++ b/examples/polygon/3d/index.en.md @@ -0,0 +1,4 @@ +--- +title: Extrude Map +order: 0 +--- diff --git a/examples/polygon/3d/index.zh.md b/examples/polygon/3d/index.zh.md new file mode 100644 index 0000000000..7a97e3407c --- /dev/null +++ b/examples/polygon/3d/index.zh.md @@ -0,0 +1,7 @@ +--- +title: 3D填充图 +order: 0 +redirect_from: + - /zh/examples/polygon/ +--- +填充地图的增强实现,通过三维视角中的高度体现数据差异。 \ No newline at end of file diff --git a/examples/polygon/fill/demo/fill.js b/examples/polygon/fill/demo/fill.js new file mode 100644 index 0000000000..9745bfb83c --- /dev/null +++ b/examples/polygon/fill/demo/fill.js @@ -0,0 +1,50 @@ +import { Scene } from '@l7/scene'; +import { PolygonLayer, LineLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'light', + center: [ 116.368652, 39.93866 ], + zoom: 10.07 +}); +window.mapScene = scene; +fetch( + 'https://gw.alipayobjects.com/os/basement_prod/1d27c363-af3a-469e-ab5b-7a7e1ce4f311.json' +) + .then(res => res.json()) + .then(data => { + const layer = new PolygonLayer({}) + .source(data) + .color( + 'unit_price', + [ + '#1A4397', + '#2555B7', + '#3165D1', + '#467BE8', + '#6296FE', + '#7EA6F9', + '#98B7F7', + '#BDD0F8', + '#DDE6F7', + '#F2F5FC' + ].reverse() + ) + .shape('fill') + .style({ + opacity: 1 + }); + const layer2 = new LineLayer({ + zIndex: 2 + }) + .source(data) + .color('#fff') + .size(0.3) + .style({ + opacity: 1 + }); + + scene.addLayer(layer); + scene.addLayer(layer2); + }); diff --git a/examples/polygon/fill/demo/meta.json b/examples/polygon/fill/demo/meta.json new file mode 100644 index 0000000000..2f3a2bb710 --- /dev/null +++ b/examples/polygon/fill/demo/meta.json @@ -0,0 +1,23 @@ +{ + "title": { + "zh": "中文分类", + "en": "Category" + }, + "demos": [ + { + "filename": "polygon.js", + "title": "全国地图行政区划", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*AoD6SZ4kz0wAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "fill.js", + "title": "连续填充图", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*g93EQYYz9HEAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "population.js", + "title": "世界地图 女性人口比例", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*j6OrT7kgAnAAAAAAAAAAAABkARQnAQ" + } + ] +} diff --git a/examples/polygon/fill/demo/polygon.js b/examples/polygon/fill/demo/polygon.js new file mode 100644 index 0000000000..5bda22aa84 --- /dev/null +++ b/examples/polygon/fill/demo/polygon.js @@ -0,0 +1,45 @@ +import { Scene } from '@l7/scene'; +import { PolygonLayer, LineLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'light', + center: [ 107.042225, 37.66565 ], + zoom: 3.87 +}); + +fetch('https://gw.alipayobjects.com/os/rmsportal/JToMOWvicvJOISZFCkEI.json') + .then(res => res.json()) + .then(data => { + const colors = [ + '#D7F9F0', + '#A6E1E0', + '#72BED6', + '#5B8FF9', + '#3474DB', + '#005CBE', + '#00419F', + '#00287E' + ]; + const layer = new PolygonLayer({}) + .source(data) + .color('name', colors) + .shape('fill') + .style({ + opacity: 0.9 + }); + + const layer2 = new LineLayer({ + zIndex: 2 + }) + .source(data) + .color('#fff') + .size(0.3) + .style({ + opacity: 1 + }); + + scene.addLayer(layer); + scene.addLayer(layer2); + }); diff --git a/examples/polygon/fill/demo/population.js b/examples/polygon/fill/demo/population.js new file mode 100644 index 0000000000..4dffd60a8a --- /dev/null +++ b/examples/polygon/fill/demo/population.js @@ -0,0 +1,64 @@ +import { Scene } from '@l7/scene'; +import { PolygonLayer, LineLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'light', + center: [ 3.438, 40.16797 ], + zoom: 0.51329 +}); +Promise.all([ + fetch( + 'https://gw.alipayobjects.com/os/antvdemo/assets/data/world.geo.json' + ).then(d => d.json()), + fetch( + 'https://gw.alipayobjects.com/os/basement_prod/f3c467a4-9ae0-4f08-bb5f-11f9c869b2cb.json' + ).then(d => d.json()) +]).then(function onLoad([ world, population ]) { + const popobj = {}; + population.forEach(element => { + popobj[element.Code] = + element['Population, female (% of total) (% of total)']; + }); + // 数据绑定 + world.features = world.features.map(fe => { + fe.properties.female = popobj[fe.id] * 1 || 0; + return fe; + }); + const colors = [ + '#0A3663', + '#1558AC', + '#3771D9', + '#4D89E5', + '#64A5D3', + '#72BED6', + '#83CED6', + '#A6E1E0', + '#B8EFE2', + '#D7F9F0' + ]; + const layer = new PolygonLayer({}) + .source(world) + .scale('female', { + type: 'quantile' + }) + .color('female', colors) + .shape('fill') + .style({ + opacity: 0.9 + }); + + const layer2 = new LineLayer({ + zIndex: 2 + }) + .source(world) + .color('#fff') + .size(0.3) + .style({ + opacity: 1 + }); + + scene.addLayer(layer); + scene.addLayer(layer2); +}); diff --git a/examples/polygon/fill/index.en.md b/examples/polygon/fill/index.en.md new file mode 100644 index 0000000000..c8e3fe60e2 --- /dev/null +++ b/examples/polygon/fill/index.en.md @@ -0,0 +1,4 @@ +--- +title: Choropleth Map +order: 0 +--- diff --git a/examples/polygon/fill/index.zh.md b/examples/polygon/fill/index.zh.md new file mode 100644 index 0000000000..800d015675 --- /dev/null +++ b/examples/polygon/fill/index.zh.md @@ -0,0 +1,5 @@ +--- +title: 填充地图 +order: 0 +--- +填充图,也叫分级统计图,指用一连串首尾闭合的点坐标对来表达的面图层,常用表达区域范围具有分类现象的面状分布。 \ No newline at end of file diff --git a/examples/raster/basic/data/ndviundefined.be75.tif b/examples/raster/basic/data/ndviundefined.be75.tif new file mode 100755 index 0000000000..b4205d18e4 Binary files /dev/null and b/examples/raster/basic/data/ndviundefined.be75.tif differ diff --git a/examples/raster/basic/demo/image.js b/examples/raster/basic/demo/image.js new file mode 100644 index 0000000000..49ab82e123 --- /dev/null +++ b/examples/raster/basic/demo/image.js @@ -0,0 +1,24 @@ +import { Scene } from '@l7/scene'; +import { ImageLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'light', + center: [ 121.268, 30.3628 ], + zoom: 13 +}); + +const layer = new ImageLayer({}); +layer.source( + 'https://gw.alipayobjects.com/zos/rmsportal/FnHFeFklTzKDdUESRNDv.jpg', + { + parser: { + type: 'image', + extent: [ 121.168, 30.2828, 121.384, 30.4219 ] + } + } +); +scene.on('loaded', () => { + scene.addLayer(layer); +}); diff --git a/examples/raster/basic/demo/meta.json b/examples/raster/basic/demo/meta.json new file mode 100644 index 0000000000..9a2b724e4a --- /dev/null +++ b/examples/raster/basic/demo/meta.json @@ -0,0 +1,22 @@ +{ + "title": { + "zh": "栅格图层", + "en": "Gallery" + }, + "demos": [ + { + "filename": "image.js", + "title": "图片", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*ZrCaR53185IAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "radar.js", + "title": "地形", + "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*ZiMnSZlmblIAAAAAAAAAAABkARQnAQ" + }, + { + "filename": "light.js", + "title": "夜光图" + } + ] +} diff --git a/examples/raster/basic/demo/radar.js b/examples/raster/basic/demo/radar.js new file mode 100644 index 0000000000..e5b1486ad7 --- /dev/null +++ b/examples/raster/basic/demo/radar.js @@ -0,0 +1,24 @@ +import { Scene } from '@l7/scene'; +import { ImageLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'dark', + center: [ 115.5268, 34.3628 ], + zoom: 7 +}); + +const layer = new ImageLayer({}); +layer.source( + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*8SUaRr7bxNsAAAAAAAAAAABkARQnAQ', + { + parser: { + type: 'image', + extent: [ 113.1277263548, 32.3464238863, 118.1365790452, 36.4786759137 ] + } + } +); +scene.on('loaded', () => { + scene.addLayer(layer); +}); diff --git a/examples/raster/basic/index.en.md b/examples/raster/basic/index.en.md new file mode 100644 index 0000000000..39ed3aaf30 --- /dev/null +++ b/examples/raster/basic/index.en.md @@ -0,0 +1,4 @@ +--- +title: Raster Map +order: 0 +--- diff --git a/examples/raster/basic/index.zh.md b/examples/raster/basic/index.zh.md new file mode 100644 index 0000000000..29cc71a8e1 --- /dev/null +++ b/examples/raster/basic/index.zh.md @@ -0,0 +1,6 @@ +--- +title: 栅格图层 +order: 0 +redirect_from: + - /zh/examples/raster/ +--- diff --git a/gatsby-browser.js b/gatsby-browser.js new file mode 100644 index 0000000000..d8b2a8344b --- /dev/null +++ b/gatsby-browser.js @@ -0,0 +1,9 @@ + +require('./site/css/demo.css'); +require('./packages/component/src/css/l7.css'); +window.geotiff = require('geotiff/dist/geotiff.bundle.min.js'); +window.scene = require('./packages/scene/src'); +window.layers = require('./packages/layers/src'); +window.component = require('./packages/component/src'); +window.g2 = require('@antv/g2'); +// diff --git a/gatsby-config.js b/gatsby-config.js new file mode 100644 index 0000000000..94405ca5e5 --- /dev/null +++ b/gatsby-config.js @@ -0,0 +1,147 @@ +module.exports = { + plugins: [ + { + resolve: '@antv/gatsby-theme-antv', + options: { + GATrackingId: 'UA-148148901-7', + pathPrefix: '/L7' + } + } + ], + siteMetadata: { + title: 'L7', + description: 'Large-scale WebGL-powered Geospatial data visualization analysis framework', + githubUrl: 'https://github.com/antvis/L7', + navs: [ + { + slug: 'docs/api', + title: { + zh: '文档', + en: 'Document' + }, + redirect: 'api/l7' + }, + { + slug: 'examples', + title: { + zh: '图表演示', + en: 'Examples' + }, + redirect: 'gallery/basic' + } + // target: '_blank', + ], + docs: [ + { + slug: 'api/l7', + title: { + zh: '简介 L7', + en: 'Introduction' + }, + order: 0 + }, + { + slug: 'api/quickstart', + title: { + zh: '快速入门', + en: 'quickstart' + }, + order: 0 + }, + { + slug: 'api/scene', + title: { + zh: '场景 Scene', + en: 'Scene' + }, + order: 1 + }, + { + slug: 'api/layer', + title: { + zh: '图层 Layer', + en: 'Layer' + }, + order: 2 + }, + { + slug: 'api/source', + title: { + zh: '数据 Source', + en: 'Source' + }, + order: 3 + }, + { + slug: 'api/component', + title: { + zh: '组件 Component', + en: 'Component' + }, + order: 4 + } + ], + examples: [ + { + slug: 'gallery', + icon: 'gallery', + title: { + zh: 'Gallery', + en: 'Gallery' + } + }, + { + slug: 'point', + icon: 'point', + title: { + zh: '点图层', + en: 'Point Layer' + } + }, + { + slug: 'line', + icon: 'line', + title: { + zh: '线图层', + en: 'Line Layer' + } + }, + { + slug: 'polygon', + icon: 'polygon', + title: { + zh: '面图层', + en: 'Polygon Layer' + } + }, + { + slug: 'heatmap', + icon: 'heatmap', + title: { + zh: '热力图', + en: 'HeatMap Layer' + }, + order: 5 + }, + { + slug: 'raster', + icon: 'raster', + title: { + zh: '栅格图层', + en: 'Raster Layer' + } + }, + { + slug: 'tutorial', + icon: 'map', + title: { + zh: '教程示例', + en: 'Tutorial demo' + } + } + ], + playground: { + container: '
' + } + } +}; diff --git a/gatsby-node.js b/gatsby-node.js new file mode 100644 index 0000000000..6c3b894361 --- /dev/null +++ b/gatsby-node.js @@ -0,0 +1,16 @@ +const path = require('path'); +exports.onCreateWebpackConfig = ({ getConfig }) => { + const config = getConfig(); + config.resolve.extensions.push('.glsl'); + config.resolve.alias = { + ...config.resolve.alias, + '@l7/core': path.resolve(__dirname, 'packages/core/src'), + '@l7/component': path.resolve(__dirname, 'packages/component/src'), + '@l7/layers': path.resolve(__dirname, 'packages/layers/src'), + '@l7/maps': path.resolve(__dirname, 'packages/maps/src'), + '@l7/renderer': path.resolve(__dirname, 'packages/renderer/src'), + '@l7/scene': path.resolve(__dirname, 'packages/scene/src'), + '@l7/source': path.resolve(__dirname, 'packages/source/src'), + '@l7/utils': path.resolve(__dirname, 'packages/utils/src') + }; +}; diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000000..5eb81a6ac9 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,42 @@ +module.exports = { + preset: 'ts-jest', + clearMocks: true, + collectCoverageFrom: [ + 'packages/**/*.{ts,tsx}', + '!**/node_modules/**', + '!**/__tests__/**', + '!**/*.d.ts' + ], + coverageDirectory: 'coverage', + coverageReporters: [ 'text', 'clover' ], + coverageThreshold: { + global: { + branches: 80, + functions: 80, + lines: 80, + statements: 80 + } + }, + // globals: { + // 'ts-jest': { + // // @see https://github.com/kulshekhar/ts-jest/issues/933#issuecomment-479821844 + // babelConfig: require('./babel.config.js'), + // }, + // }, + moduleFileExtensions: [ 'ts', 'tsx', 'js' ], + modulePathIgnorePatterns: [ 'dist' ], + moduleNameMapper: { + '@l7/(.+)$': 'packages/$1/src' + }, + notify: true, + notifyMode: 'always', + roots: [ 'packages' ], + testMatch: [ '**/__tests__/*.spec.+(ts|tsx|js)', '**/*.test.+(ts|tsx|js)', '**/__tests__/*/*.spec.+(ts|tsx|js)' ], + transform: { + // '^.+\\.(ts|tsx)$': 'ts-jest', + // @see https://github.com/kulshekhar/ts-jest/issues/1130 + '^.+\\.(ts|tsx)$': 'babel-jest' + }, + setupFilesAfterEnv: [ 'jest/setupTests.ts' ], + snapshotSerializers: [ 'enzyme-to-json/serializer' ] +}; diff --git a/jest/setupTests.ts b/jest/setupTests.ts new file mode 100644 index 0000000000..10bb359f03 --- /dev/null +++ b/jest/setupTests.ts @@ -0,0 +1,5 @@ +import Enzyme from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; +import 'jest-styled-components'; + +Enzyme.configure({ adapter: new Adapter() }); diff --git a/lerna.json b/lerna.json new file mode 100644 index 0000000000..9d523790c5 --- /dev/null +++ b/lerna.json @@ -0,0 +1,22 @@ +{ + "packages": [ + "packages/*" + ], + "command": { + "publish": { + "ignoreChanges": ["*.md"], + "allowBranch": [ + "master", + "develop", + "next" + ], + "message": "chore: publish" + } + }, + "version": "0.0.1", + "npmClient": "yarn", + "useWorkspaces": true, + "publishConfig": { + "access": "public" + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000000..0bfd8c2720 --- /dev/null +++ b/package.json @@ -0,0 +1,158 @@ +{ + "private": true, + "repository": { + "type": "git", + "url": "https://github.com/antvis/L7" + }, + "devDependencies": { + "@antv/g2": "^3.5.9", + "@antv/gatsby-theme-antv": "^0.9.52", + "@babel/cli": "^7.6.4", + "@babel/core": "^7.6.4", + "@babel/plugin-proposal-decorators": "^7.6.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.4.4", + "@babel/plugin-proposal-optional-chaining": "^7.6.0", + "@babel/preset-env": "^7.5.5", + "@babel/preset-react": "^7.0.0", + "@babel/preset-typescript": "^7.3.3", + "@commitlint/cli": "^8.1.0", + "@commitlint/config-conventional": "^8.1.0", + "@rollup/plugin-alias": "^2.2.0", + "@rollup/plugin-json": "^4.0.0", + "@storybook/addon-actions": "^5.1.9", + "@storybook/addon-console": "^1.2.1", + "@storybook/addon-info": "^5.1.9", + "@storybook/addon-knobs": "^5.1.9", + "@storybook/addon-notes": "^5.1.9", + "@storybook/addon-storysource": "^5.1.11", + "@storybook/react": "^5.1.9", + "@types/dat.gui": "^0.7.1", + "@types/enzyme": "^3.1.14", + "@types/enzyme-adapter-react-16": "^1.0.3", + "@types/gl": "^4.1.0", + "@types/jest": "^24.0.18", + "@types/node": "^12.7.3", + "@types/storybook__react": "^4.0.2", + "@types/supercluster": "^5.0.1", + "awesome-typescript-loader": "^5.2.1", + "babel-jest": "^24.9.0", + "babel-loader": "^8.0.6", + "babel-plugin-const-enum": "^0.0.2", + "babel-plugin-css-modules-transform": "^1.6.2", + "babel-plugin-inline-import": "^3.0.0", + "babel-plugin-inline-webgl-constants": "^1.0.1", + "babel-plugin-lodash": "^3.3.4", + "babel-plugin-transform-postcss": "^0.3.0", + "babel-preset-gatsby": "^0.2.20", + "clean-webpack-plugin": "^0.1.19", + "commitizen": "^4.0.3", + "copy-webpack-plugin": "^4.5.2", + "coveralls": "^3.0.7", + "css-loader": "^3.2.0", + "cz-conventional-changelog": "^3.0.2", + "dat.gui": "^0.7.2", + "enzyme": "^3.6.0", + "enzyme-adapter-react-16": "^1.5.0", + "enzyme-to-json": "^3.0.0-beta6", + "eslint-config-egg": "^7.5.1", + "eslint-plugin-html": "^6.0.0", + "gatsby": "^2.17.7", + "gatsby-plugin-google-analytics": "^2.1.27", + "gatsby-remark-prettier": "^1.0.0", + "geotiff": "^1.0.0-beta.6", + "gh-pages": "^2.1.1", + "gl": "^4.4.0", + "glsl-minifier": "^0.0.13", + "html-webpack-plugin": "^3.2.0", + "husky": "^3.0.9", + "jest": "^24.9.0", + "jest-styled-components": "^6.2.1", + "lerna": "^3.16.4", + "lint-staged": "^9.2.4", + "node-sass": "^4.12.0", + "npm-run-all": "^4.1.5", + "postcss": "^7.0.18", + "postcss-plugin": "^1.0.0", + "prettier": "^1.19.1", + "raw-loader": "^1.0.0", + "react": "^16.8.6", + "react-docgen-typescript-loader": "^3.1.0", + "react-dom": "^16.12.0", + "react-i18next": "^11.0.1", + "rimraf": "^2.6.2", + "rollup": "^1.27.0", + "rollup-plugin-analyzer": "^3.2.2", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-commonjs": "^10.1.0", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-terser": "^5.1.2", + "rollup-pluginutils": "^2.8.2", + "sass-loader": "^7.1.0", + "style-loader": "^1.0.0", + "styled-components": "^3.4.6", + "stylelint": "^9.5.0", + "stylelint-config-recommended": "^2.1.0", + "stylelint-config-standard": "^18.2.0", + "stylelint-config-styled-components": "^0.1.1", + "stylelint-processor-styled-components": "^1.3.2", + "ts-jest": "^24.0.2", + "tslint": "^5.11.0", + "tslint-config-prettier": "^1.15.0", + "tslint-plugin-prettier": "^1.3.0", + "tslint-react": "^3.6.0", + "typescript": "^3.7.0-beta", + "webpack": "^4.17.1", + "webpack-cli": "^3.1.0", + "webpack-dev-server": "^3.1.7", + "webpack-merge": "^4.1.4", + "worker-loader": "^2.0.0" + }, + "scripts": { + "start": "NODE_ENV=site npm run site:develop", + "build_site": "NODE_ENV=site npm run site:build", + "site:develop": "gatsby develop --open -H 0.0.0.0", + "site:build": "npm run site:clean && NODE_ENV=site gatsby build --prefix-paths", + "site:clean": "gatsby clean", + "site:deploy": "NODE_ENV=site npm run site:build && gh-pages -d public", + "site:publish": "gh-pages -d public", + "lint-fix:examples": "prettier --write examples/**/**/*.js", + "lint:site": "eslint examples/**/**/*.js --fix", + "prebuild": "run-p tsc lint", + "build": "yarn clean && lerna run build", + "todo:postbuild": "yarn build:declarations", + "fix": "run-p -c 'lint:ts-* --fix'", + "lint:css": "stylelint 'packages/**/*.js{,x}'", + "lint:ts-prod": "tslint --config tslint.prod.json 'packages/**/*.ts{,x}'", + "lint:ts-test": "tslint --config tslint.test.json 'packages/**/*.{spec,story}.ts{,x}'", + "lint:ts": "run-p -c lint:ts-*", + "lint": "run-p -c lint:*", + "commit": "git-cz", + "version": "lerna version --conventional-commits", + "prerelease": "yarn build", + "release": "lerna publish from-package --registry https://registry.npmjs.com/", + "storybook": "start-storybook -p 6006", + "test": "BABEL_ENV=test jest", + "coveralls": "jest --coverage && cat ./tests/coverage/lcov.info | coveralls", + "tsc": "tsc", + "build:declarations": "lerna exec --stream --no-bail 'tsc --project ./tsconfig.build.json'", + "watch": "yarn clean && lerna exec --parallel 'BABEL_ENV=cjs babel --watch src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments'", + "bundle": "BABEL_ENV=bundle node_modules/.bin/rollup -c ./build/rollup.config.js", + "glsl-minify": "node_modules/.bin/glsl-minifier -i ./build/example.frag -o ./build/example.min.frag", + "clean": "lerna run clean" + }, + "workspaces": [ + "packages/*", + "stories/*" + ], + "husky": { + "hooks": { + "pre-commit": "npm run lint", + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" + } + }, + "config": { + "commitizen": { + "path": "cz-conventional-changelog" + } + } +} diff --git a/packages/component/.gitignore b/packages/component/.gitignore new file mode 100644 index 0000000000..49c199b6ab --- /dev/null +++ b/packages/component/.gitignore @@ -0,0 +1,3 @@ +lib +es +dist diff --git a/packages/component/package.json b/packages/component/package.json new file mode 100644 index 0000000000..ad36ea2dc2 --- /dev/null +++ b/packages/component/package.json @@ -0,0 +1,39 @@ +{ + "name": "@l7/component", + "version": "0.0.1", + "description": "", + "main": "lib/index.js", + "module": "es/index.js", + "types": "es/index.d.ts", + "sideEffects": true, + "files": [ + "lib", + "es", + "README.md" + ], + "scripts": { + "tsc": "tsc --project tsconfig.build.json", + "clean": "rimraf dist; rimraf es; rimraf lib;", + "build": "run-p build:*", + "build:cjs": "BABEL_ENV=cjs babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "build:esm": "BABEL_ENV=esm babel src --root-mode upward --out-dir es --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "watch": "BABEL_ENV=cjs babel src --watch --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "lint:ts": "run-p -c lint:ts-*", + "test": "jest" + }, + "author": "lzxue", + "license": "ISC", + "dependencies": { + "@l7/core": "0.0.1", + "@l7/utils": "0.0.1", + "@turf/distance": "^6.0.1", + "eventemitter3": "^4.0.0", + "inversify": "^5.0.1", + "inversify-inject-decorators": "^3.1.0", + "inversify-logging": "^0.2.1" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/component/src/control/BaseControl.ts b/packages/component/src/control/BaseControl.ts new file mode 100644 index 0000000000..6911adb15a --- /dev/null +++ b/packages/component/src/control/BaseControl.ts @@ -0,0 +1,109 @@ +import { + IControlService, + ILayerService, + IMapService, + IRendererService, + lazyInject, + TYPES, +} from '@l7/core'; +import { DOM } from '@l7/utils'; +import { EventEmitter } from 'eventemitter3'; + +export enum PositionType { + 'TOPRIGHT' = 'topright', + 'TOPLEFT' = 'topleft', + 'BOTTOMRIGHT' = 'bottomright', + 'BOTTOMLEFT' = 'bottomleft', +} +export type PositionName = + | 'topright' + | 'topleft' + | 'bottomright' + | 'bottomleft'; +export interface IControlOption { + position: PositionName; + [key: string]: any; +} +export default class Control extends EventEmitter { + public controlOption: IControlOption; + protected mapsService: IMapService; + protected container: HTMLElement; + + @lazyInject(TYPES.IRendererService) + protected readonly renderService: IRendererService; + @lazyInject(TYPES.ILayerService) + protected readonly layerService: ILayerService; + @lazyInject(TYPES.IControlService) + private readonly controlService: IControlService; + + private isShow: boolean; + + constructor(cfg?: Partial) { + super(); + this.controlOption = { + ...this.getDefault(), + ...(cfg || {}), + }; + } + public getDefault() { + return { + position: PositionType.TOPRIGHT, + }; + } + public setPosition(position: PositionName) { + const controlService = this.controlService; + if (controlService) { + controlService.removeControl(this); + } + this.controlOption.position = position; + if (controlService) { + controlService.addControl(this, this.mapsService); + } + return this; + } + public addTo(mapService: IMapService) { + this.remove(); + this.isShow = true; + this.mapsService = mapService; + this.container = this.onAdd(mapService); + const container = this.container; + const pos = this.controlOption.position; + const corner = this.controlService.controlCorners[pos]; + DOM.addClass(container, 'l7-control'); + + if (pos.indexOf('bottom') !== -1) { + corner.insertBefore(container, corner.firstChild); + } else { + corner.appendChild(container); + } + return this; + } + public onAdd(Map: IMapService): HTMLElement { + throw new Error('Method not implemented.'); + } + public hide() { + const container = this.container; + DOM.addClass(container, 'l7-control-hide'); + this.isShow = false; + } + public show() { + const container = this.container; + DOM.removeClass(container, 'l7-control-hide'); + this.isShow = true; + } + public remove() { + if (!this.mapsService) { + return this; + } + DOM.remove(this.container); + } + public _refocusOnMap(e: MouseEvent) { + // if map exists and event is not a keyboard event + if (this.mapsService && e && e.screenX > 0 && e.screenY > 0) { + const container = this.mapsService.getContainer(); + if (container !== null) { + container.focus(); + } + } + } +} diff --git a/packages/component/src/control/layer.ts b/packages/component/src/control/layer.ts new file mode 100644 index 0000000000..05ae2c5b05 --- /dev/null +++ b/packages/component/src/control/layer.ts @@ -0,0 +1,312 @@ +import { IMapService } from '@l7/core'; +import { bindAll, DOM, lnglatDistance } from '@l7/utils'; +import Control, { + IControlOption, + PositionName, + PositionType, +} from './BaseControl'; +export interface ILayerControlOption extends IControlOption { + collapsed: boolean; + autoZIndex: boolean; + hideSingleBase: boolean; + sortLayers: boolean; + + sortFunction: (...args: any[]) => any; +} +interface IInputItem extends HTMLInputElement { + layerId: string; +} +export default class Layers extends Control { + private layerControlInputs: any[]; + private layers: any[]; + private lastZIndex: number; + private handlingClick: boolean; + private layersLink: HTMLElement; + private baseLayersList: HTMLElement; + private separator: HTMLElement; + private overlaysList: HTMLElement; + private form: HTMLElement; + + constructor(cfg: Partial) { + super(cfg); + this.layerControlInputs = []; + this.layers = []; + this.lastZIndex = 0; + this.handlingClick = false; + const { baseLayers = {}, overlayers = {} } = this.controlOption; + + Object.keys(baseLayers).forEach((name: string, index: number) => { + this.addLayer(baseLayers[name], name, false); + }); + Object.keys(overlayers).forEach((name: any, index: number) => { + this.addLayer(overlayers[name], name, true); + }); + bindAll( + [ + 'checkDisabledLayers', + 'onLayerChange', + 'collapse', + 'extend', + 'expand', + 'onInputClick', + ], + this, + ); + } + + public getDefault() { + return { + collapsed: true, + position: PositionType.TOPRIGHT, + autoZIndex: true, + hideSingleBase: false, + sortLayers: false, + }; + } + public onAdd(MapService: IMapService) { + this.initLayout(); + this.update(); + this.mapsService.on('zoomend', this.checkDisabledLayers); + this.layers.forEach((layerItem) => { + layerItem.layer.on('remove', this.onLayerChange); + layerItem.layer.on('add', this.onLayerChange); + }); + return this.container; + } + + public addVisualLayer(layer: any, name: string | number) { + this.addLayer(layer, name, true); + return this.mapsService ? this.update() : this; + } + public expand() { + const { height } = this.renderService.getViewportSize(); + DOM.addClass(this.container, 'l7-control-layers-expanded'); + this.form.style.height = 'null'; + const acceptableHeight = height - (this.container.offsetTop + 50); + if (acceptableHeight < this.form.clientHeight) { + DOM.addClass(this.form, 'l7-control-layers-scrollbar'); + this.form.style.height = acceptableHeight + 'px'; + } else { + DOM.removeClass(this.form, 'l7-control-layers-scrollbar'); + } + this.checkDisabledLayers(); + return this; + } + + public collapse() { + DOM.removeClass(this.container, 'l7-control-layers-expanded'); + return this; + } + + private initLayout() { + const className = 'l7-control-layers'; + const container = (this.container = DOM.create('div', className)); + const { collapsed } = this.controlOption; + + // makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released + container.setAttribute('aria-haspopup', 'true'); + + const form = (this.form = DOM.create( + 'form', + className + '-list', + ) as HTMLElement); + + // if (collapsed) { + // this.mapsService.on('click', this.collapse); + // container.addEventListener('mouseenter', this.expand); + // container.addEventListener('mouseleave', this.collapse); + // } + + this.layersLink = DOM.create('a', className + '-toggle', container); + const link = this.layersLink; + // link.href = '#'; + link.title = 'Layers'; + if (!collapsed) { + this.expand(); + } + this.expand(); + + this.baseLayersList = DOM.create('div', className + '-base', form); + this.separator = DOM.create('div', className + '-separator', form); + this.overlaysList = DOM.create('div', className + '-overlays', form); + container.appendChild(form); + } + + private update() { + if (!this.container) { + return this; + } + + DOM.empty(this.baseLayersList); + DOM.empty(this.overlaysList); + + this.layerControlInputs = []; + let baseLayersPresent; + let overlaysPresent; + let i; + let obj; + let baseLayersCount = 0; + + for (i = 0; i < this.layers.length; i++) { + obj = this.layers[i]; + this.addItem(obj); + overlaysPresent = overlaysPresent || obj.overlay; + baseLayersPresent = baseLayersPresent || !obj.overlay; + baseLayersCount += !obj.overlay ? 1 : 0; + } + + // Hide base layers section if there's only one layer. + if (this.controlOption.hideSingleBase) { + baseLayersPresent = baseLayersPresent && baseLayersCount > 1; + this.baseLayersList.style.display = baseLayersPresent ? '' : 'none'; + } + + this.separator.style.display = + overlaysPresent && baseLayersPresent ? '' : 'none'; + + return this; + } + + private checkDisabledLayers() { + const inputs = this.layerControlInputs; + let input: IInputItem; + let layer; + const zoom = this.mapsService.getZoom(); + + for (let i = inputs.length - 1; i >= 0; i--) { + input = inputs[i]; + layer = this.layerService.getLayer(input.layerId); + if (layer) { + input.disabled = layer.visible && !layer.isVisible(); + } + } + } + + private addLayer(layer: any, name: string | number, overlay: boolean) { + if (this.mapsService) { + layer.on('add', this.onLayerChange); + layer.on('remove', this.onLayerChange); + } + this.layers.push({ + layer, + name, + overlay, + }); + const { sortLayers, sortFunction, autoZIndex } = this.controlOption; + if (sortLayers) { + this.layers.sort((a, b) => { + return sortFunction(a.layer, b.layer, a.name, b.name); + }); + } + + if (autoZIndex && layer.setZIndex) { + this.lastZIndex++; + layer.setZIndex(this.lastZIndex); + } + + this.expandIfNotCollapsed(); + } + + private expandIfNotCollapsed() { + if (this.mapsService && !this.controlOption.collapsed) { + this.expand(); + } + return this; + } + + private onLayerChange(e: any) { + if (!this.handlingClick) { + this.update(); + } + + const obj = this.layerService.getLayer(e.target.layerId); + + // @ts-ignore + const type = obj?.overlay + ? e.type === 'add' + ? 'overlayadd' + : 'overlayremove' + : e.type === 'add' + ? 'baselayerchange' + : null; + + if (type) { + this.emit(type, obj); // TODO:图 + } + } + + private createRadioElement(name: string, checked: boolean): ChildNode { + const radioHtml = + ''; + + const radioFragment = document.createElement('div'); + radioFragment.innerHTML = radioHtml; + + return radioFragment.firstChild as ChildNode; + } + + private addItem(obj: any) { + const label = document.createElement('label'); + const checked = + this.layerService.getLayer(obj.layer.id) && obj.layer.isVisible(); + let input: IInputItem; + + if (obj.overlay) { + input = document.createElement('input') as IInputItem; + input.type = 'checkbox'; + input.className = 'l7-control-layers-selector'; + input.defaultChecked = checked; + } else { + input = this.createRadioElement('l7-base-layers', checked) as IInputItem; + } + this.layerControlInputs.push(input); + input.layerId = obj.layer.id; + input.addEventListener('click', this.onInputClick); + + const name = document.createElement('span'); + name.innerHTML = ' ' + obj.name; + + const holder = document.createElement('div'); + + label.appendChild(holder); + holder.appendChild(input); + holder.appendChild(name); + + const container = obj.overlay ? this.overlaysList : this.baseLayersList; + container.appendChild(label); + + this.checkDisabledLayers(); + return label; + } + + private onInputClick() { + const inputs = this.layerControlInputs; + let input; + let layer; + const addedLayers = []; + const removedLayers = []; + this.handlingClick = true; + for (let i = inputs.length - 1; i >= 0; i--) { + input = inputs[i]; + layer = this.layerService.getLayer(input.layerId); + + if (input.checked) { + addedLayers.push(layer); + } else if (!input.checked) { + removedLayers.push(layer); + } + } + removedLayers.forEach((l: any) => { + l.hide(); + }); + addedLayers.forEach((l: any) => { + l.show(); + }); + + this.handlingClick = false; + } +} diff --git a/packages/component/src/control/logo.ts b/packages/component/src/control/logo.ts new file mode 100644 index 0000000000..75b07eda59 --- /dev/null +++ b/packages/component/src/control/logo.ts @@ -0,0 +1,25 @@ +import { IMapService } from '@l7/core'; +import { bindAll, DOM } from '@l7/utils'; +import Control, { IControlOption, PositionType } from './BaseControl'; +export default class Logo extends Control { + public getDefault() { + return { + position: PositionType.BOTTOMLEFT, + }; + } + public onAdd(MapService: IMapService) { + const className = 'l7-control-logo'; + const container = DOM.create('div', className); + const anchor: HTMLLinkElement = DOM.create( + 'a', + 'l7-ctrl-logo', + ) as HTMLLinkElement; + anchor.target = '_blank'; + anchor.rel = 'noopener nofollow'; + anchor.href = 'https://antv.alipay.com/l7'; + anchor.setAttribute('aria-label', 'AntV logo'); + anchor.setAttribute('rel', 'noopener nofollow'); + container.appendChild(anchor); + return container; + } +} diff --git a/packages/component/src/control/scale.ts b/packages/component/src/control/scale.ts new file mode 100644 index 0000000000..345f1ae220 --- /dev/null +++ b/packages/component/src/control/scale.ts @@ -0,0 +1,104 @@ +import { IMapService } from '@l7/core'; +import { bindAll, DOM, lnglatDistance } from '@l7/utils'; +import Control, { IControlOption, PositionType } from './BaseControl'; +export interface IScaleControlOption extends IControlOption { + maxWidth: number; + metric: boolean; + updateWhenIdle: boolean; + imperial: boolean; +} +export default class Scale extends Control { + private mScale: HTMLElement; + private iScale: HTMLElement; + constructor(cfg?: Partial) { + super(cfg); + bindAll(['update'], this); + } + + public getDefault() { + return { + position: PositionType.BOTTOMLEFT, + maxWidth: 100, + metric: true, + updateWhenIdle: false, + imperial: false, + }; + } + + public onAdd(MapService: IMapService) { + const className = 'l7-control-scale'; + const container = DOM.create('div', className); + this.addScales(className + '-line', container); + const { updateWhenIdle } = this.controlOption; + // TODO: 高德地图和MapBox地图事件不一致问题 + this.mapsService.on(updateWhenIdle ? 'moveend' : 'mapmove', this.update); + this.update(); + + return container; + } + public onRemove(MapService: IMapService) { + const { updateWhenIdle } = this.controlOption; + this.mapsService.off(updateWhenIdle ? 'moveend' : 'mapmove', this.update); + } + public update() { + const mapsService = this.mapsService; + const { maxWidth } = this.controlOption; + const y = mapsService.getSize()[1] / 2; + + const p1 = mapsService.containerToLngLat([0, y]); + const p2 = mapsService.containerToLngLat([maxWidth, y]); + const maxMeters = lnglatDistance([p1.lng, p1.lat], [p2.lng, p2.lat]); + this.updateScales(maxMeters); + } + public updateScales(maxMeters: number) { + const { metric, imperial } = this.controlOption; + if (metric && maxMeters) { + this.updateMetric(maxMeters); + } + if (imperial && maxMeters) { + this.updateImperial(maxMeters); + } + } + private updateMetric(maxMeters: number) { + const meters = this.getRoundNum(maxMeters); + const label = meters < 1000 ? meters + ' m' : meters / 1000 + ' km'; + this.updateScale(this.mScale, label, meters / maxMeters); + } + private updateImperial(maxMeters: number) { + const maxFeet = maxMeters * 3.2808399; + let maxMiles: number; + let miles: number; + let feet: number; + + if (maxFeet > 5280) { + maxMiles = maxFeet / 5280; + miles = this.getRoundNum(maxMiles); + this.updateScale(this.iScale, miles + ' mi', miles / maxMiles); + } else { + feet = this.getRoundNum(maxFeet); + this.updateScale(this.iScale, feet + ' ft', feet / maxFeet); + } + } + private updateScale(scale: HTMLElement, text: string, ratio: number) { + const { maxWidth } = this.controlOption; + scale.style.width = Math.round(maxWidth * ratio) + 'px'; + scale.innerHTML = text; + } + private getRoundNum(num: number) { + 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 : 1; + + return pow10 * d; + } + private addScales(className: string, container: HTMLElement) { + const { metric, imperial } = this.controlOption; + if (metric) { + this.mScale = DOM.create('div', className, container); + } + if (imperial) { + this.iScale = DOM.create('div', className, container); + } + } +} diff --git a/packages/component/src/control/zoom.ts b/packages/component/src/control/zoom.ts new file mode 100644 index 0000000000..d5b64c8136 --- /dev/null +++ b/packages/component/src/control/zoom.ts @@ -0,0 +1,111 @@ +import { IMapService } from '@l7/core'; +import { bindAll, DOM } from '@l7/utils'; +import Control, { IControlOption, PositionType } from './BaseControl'; +export interface IZoomControlOption extends IControlOption { + zoomInText: string; + zoomInTitle: string; + zoomOutText: string; + zoomOutTitle: string; +} +export default class Zoom extends Control { + private disabled: boolean; + private zoomInButton: HTMLElement; + private zoomOutButton: HTMLElement; + + constructor(cfg?: Partial) { + super(cfg); + bindAll(['updateDisabled', 'zoomIn', 'zoomOut'], this); + } + public getDefault() { + return { + position: PositionType.TOPLEFT, + zoomInText: '+', + zoomInTitle: 'Zoom in', + zoomOutText: '−', + zoomOutTitle: 'Zoom out', + }; + } + + public onAdd(MapService: IMapService) { + const zoomName = 'l7-control-zoom'; + const container = DOM.create('div', zoomName + ' l7-bar'); + + this.zoomInButton = this.createButton( + this.controlOption.zoomInText, + this.controlOption.zoomInTitle, + zoomName + '-in', + container, + this.zoomIn, + ); + this.zoomOutButton = this.createButton( + this.controlOption.zoomOutText, + this.controlOption.zoomOutTitle, + zoomName + '-out', + container, + this.zoomOut, + ); + this.mapsService.on('zoomend', this.updateDisabled); + this.mapsService.on('zoomchange', this.updateDisabled); + this.updateDisabled(); + return container; + } + + public onRemove() { + this.mapsService.off('zoomend', this.updateDisabled); + this.mapsService.off('zoomchange', this.updateDisabled); + } + + public disable() { + this.disabled = true; + this.updateDisabled(); + return this; + } + + public enable() { + this.disabled = false; + this.updateDisabled(); + return this; + } + + private zoomIn() { + if ( + !this.disabled && + this.mapsService.getZoom() < this.mapsService.getMaxZoom() + ) { + this.mapsService.zoomIn(); + } + } + private zoomOut() { + if ( + !this.disabled && + this.mapsService.getZoom() > this.mapsService.getMinZoom() + ) { + this.mapsService.zoomOut(); + } + } + private createButton( + html: string, + tile: string, + className: string, + container: HTMLElement, + fn: (...arg: any[]) => any, + ) { + const link = DOM.create('a', className, container) as HTMLLinkElement; + link.innerHTML = html; + link.href = '#'; + link.addEventListener('click', fn); + return link; + } + private updateDisabled() { + const mapsService = this.mapsService; + const className = 'l7-disabled'; + DOM.removeClass(this.zoomInButton, className); + DOM.removeClass(this.zoomOutButton, className); + if (this.disabled || mapsService.getZoom() <= mapsService.getMinZoom()) { + DOM.addClass(this.zoomOutButton, className); + } + if (this.disabled || mapsService.getZoom() >= mapsService.getMaxZoom()) { + DOM.addClass(this.zoomInButton, className); + } + } +} diff --git a/packages/component/src/css/l7.css b/packages/component/src/css/l7.css index 0c563176b0..026705a4a8 100644 --- a/packages/component/src/css/l7.css +++ b/packages/component/src/css/l7.css @@ -359,7 +359,11 @@ border-radius: 5px; } .l7-control-layers-toggle { +<<<<<<< HEAD background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAAGf7Ah0AAAABGdBTUEAALGPC/xhBQAABzdJREFUWAnVV3lslEUUn/l2F0tpwdAih1HEqCReDcphNCo1EkgFkXa5PNpuC0Fo2e7Wgko8KiaKWrvbK5672xYFpNtiRRuNiY0aURA14BGviBcVlaKltVa6+42/N9v5Mrtt05rwj/PHzjt+8743b+a9N8vYwKgMNlUQyemnMtAkaJajvb3dToQSGp8e6boopkr4VYgEMYwO0vhCTfMVzBcMf8bx086YyODcuM80zTqp9IWat+7evW8sMdIxIqqCLa6oiAaJpuEtcBqcc2HEWMZ0JclgZR/Nchf++ubrzKjJSguXS4tVjXvPjfb3/UAAacGTn/MOMb7QnjNpNqP/bKZ50Ai0tqYmCi0n4zbM+W+lBc7JBOa+QPhDwcTsxJXE2+32edKCL9h8hRDmRzpIOWydAylhrcMfDN+ugBRKSdP3KwPhsFJIPth02FISIYQwYsDYcVfWhy/Bon4JgumffMGmiGTwQ0B/sHml4q2ZFAD3WQIQVhx0IdFw8B189lolN+w8w5PnjPmlhJgtA8/vfn3iye7u3yGzDljDxZEG4097Cp3rSSjBtMHunp6vFR+HHoIxmbgTe1xHKssDHecLNFUjMzbqMs5ZlHF7ute17M84+TMHDzr+OvR9JwKdCms9yRkzJq6bPTsWXh05QOPUN+PUHyPWMPhm6UHd7vaUohWZPSRE8OqxpTyibQa/qcTlbEP0vwF7AWUAT3JM9dy69FfSNza+MU4awNE8iQtXSkJuGLleV852ov2h5jkwVof0mUs8aO4LhTuYYFOAjExId0wcFIPahpaLTkWiX9ECfHG/sLNi1i8+HODfgLFFRI96+INNi0cNTgTS1obKQh03aAuk9DeELzcj4pACYivvwvXrFK/PcQZiQWo+hmidpYMUjQC7EOB6xdNsGfAHwk/RDdOVw9Dm+NTUSWtWLDohDVQ37JkbiUT2DwMeVswZP+gtdM4x3HnLDhjcGM2XLWOISaenIGee9MCSgqgMht/H/q/SZYk0qviV3oKcj5XcioESyOoqIseFYDYloxnAGm/hcrcuk3JV2XBMl+pKqn6mENux11+w12m6jpqMMFn7rPPTHdwfCm8yTfG4tMaNu+GepPUFiqbM7T105ARSPQU+dY/LOC/N2gI65WEkyWUEtjmSppfkLvlRLaQ5VnZFDtGGzbheNRROKZmbu/AvUvh3tE4Wff2/0IUC+y2q+4VVoXBW1BSvkR7Rb8BW84lWJQBdlGozcs7GLy3Nd35OSqTxBqtfgkc1+sPjcqbDgEl6xK0dH5lv545LOCVL1/F+3CoY4eyY1+WcBiC2KYEHQBd5XDkyndE17xCm2Ug6BLcSwb3LigE1AlOYu6TS4HUwVEw0Df1osfBnLDwnpiFDCQPuvQ73Fkqxg8/hEVYLXt66MXbbzOK8bKre1hhkgDT0RDja3fEHytwZxCMLH0YWPkD0fxqjqUZDejDSV3z1LbexqPkEPJxKWLqtKOGbvPnZL460NlE/KgfkIZiRrfjShsQcG2QQDUwwXjcuZcID61Ys6ErUJ/LDOiCfLUzUjVQdEg0O4jn/ABEq0iuIjrEcwE0x/KGWNbjPj4BO00Gni0ZOoIPzLR5X9vMqqaQDqDzzENra4V5zp8sBZQcROYjsLvYUOPdbEVBKeiZ193QjCmwtZCM+ldS6EWYTH3wuNSV1i+pFCj/IAaWgGUfBq0N78qPM3DZcp9TxcTQeyzZm3ON2LatXpSlOP8BIB6qDLddHmHnFrBlpNZmZmdZbNXEB9XsRlZXFennqGHzoXW5DaId4iSoc/Q365EjnRjszPnYXZL9NDWUtGsqzCjAw7xprTypbn7fkaILcYqkInzzeX06C8emO8sKlS7stZQLxVMPes/+O9FVAvEpXob+utY6gZmfrtMjf/RUI+2odhF7wJbq+Gzf3zTj5CAwyaoEwozVoCzN1KKK00z7WUbZx9dIOklsO6CAZpu87i5gpHoJ8gtLh9vZixSO2KckV7qysf5Sc5uq2tjOix3rL0FW3IJuSNV0XM/iDs85LqxvqeKUD8n3LxUobt5WVuLJlS9IM4O9i09VRwWtxLWfpcix+hXjs8mZdjn19YuOiuKRgufzXqOuqQi2r8O+yAk/tl2Q/RMW7ETe8UdX1GJhHDM5qjDHJ5e7bs07qBp7ZsTe9t6/vUXykkLKEdLFbLgLJSUn3rrt1yXEdX/1C23jzVG+5Keg/B5r2wJD9g/NcaUAJq4MvXxxl/TWoATcoGc0Av4eUKnIXZlsvXpLHO0CS2KgOtGQgdeuwqWuUjGbUgrdszLHRXXDLF0oe54AS0kyPnc5Iz/2CmV7EeIzSwcjvsHQPXkUhld/kCP6Xu+DRNjg/SWHh+SnODF+aPeVh9XCydAPEsA4kAqsCzcuiTPiw7+maTj6SwGsVk/9gY9xbUpizR8MNS47aAd0C7s35CG8VdrxYyjl/FcdUgo73nY77X9D/Au9RDMh+aBoVAAAAAElFTkSuQmCC'); +======= + background-image: url(../images/layers.png); +>>>>>>> f40e44f... fix(fix): fix width: 36px; height: 36px; } @@ -719,7 +723,11 @@ display: block; background-repeat: no-repeat; cursor: pointer; +<<<<<<< HEAD background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALIAAAAgCAYAAAHBIxK2AAAABGdBTUEAALGPC/xhBQAAIJZJREFUeAHtfAl8Tkf3/9z7PNmDRFbZSawhQcRSaqva1xCqpataqrT2UkuUUiqlaKtafe1VS1pUiypB0dIgIkpKRPZIELI/2/zO98akN48nltL3838//84nNzNzzpkzc+eee+bMOXMfxijNaMJ7LOrGO/HdYfZ8fb12gD2JJINJdR8WNHVQnRtSn7hilpz0u2DMKaEcFhZmhdzLNbiPyNVlwPxcm4Qh93Fr0gO4Ol5hfqiz6Q14G+QzGpYzQ9nXrUl7X/fgbrXdG3skX7m26+bNW2fQqJ5XmCs6RQKd6EQwB0zgtKgsvCidGF+N8wV/SBLqSKnXzx2WKIHw1xNxq2xtrKsBXqgrbePt1rivJFmloa5OoD129NcVQwa9Phxwaflw3ifvHCus1YIVjW7fwEF66dIhdYO/XV7Qk+9HY/5F7RA+w0G5TdRxq7gw10FBPWwA+3r9jpkYGcoJ5/7YiFxMiYCjLspsekOeCiJ1AhJJNER+8rfTX/j4BNcUMNCLMmhF+wC3cE9RZmMd/0IQjeTtGdwJjURD5EajsRQN1EwEHjAkUVce2LLhnKf8xGId3ZhkX4uxmj7MMKqJz0ZmMr3MJNZBmphV8WDBOCCgo+2QiE7DF3005wvU75e8vMLs4+P3HwwN7do5MzOu2NcjpPHRX/csCqjt2wvtxEAy8xJ3o+7j3jjkcurpn2xtrT0EPiS0oQPKSOfi/ygqL9H/qNbls8EXuer4+65xUa149QnBvGYFgapAN21EZ+pnuH3rrrnKdNA/zCRmjoqGzu36RoL21q38BLAAjRgo6iir63g1QAOcOoU27DAgwKtpPzVMKU+qBWIuve3Jx0zw4j/eQ0CASeNnjUi5mrYH72ZxUfFV0emJ479/BvrM9KxDAgZZEjziTp1d8+pL415sEdJloIAhF7QCZmnQoCkuLkkXNPfkozU8b4wVb30P4i4ADNQ41P08mtSBogHc27Vx70CPEHeUgRNwgUOuTqBR8wwODraGSIkrKipKxqVuI300mntri1jz9OOs0IHeHUdvms2t0iG+vn5nxmnan5QeUff6GGWttpidSjvGbCSZJdAAGTMwtjWSH2G5XrOp3oEv9wuWxqdeUPchZkW8OGqcedmcdujgUcMOH/zltmgL2YW2Fu22fbMz6q2xM+IEvmvHiCGyRq7AK3QLe959+T6v46co0uVBisLk0/9SqIIhcnQiVBPqULJ4dPVd2ypLg6Dx8wxuhAGDHrCOHTtqUfZ2b6KsYYIOuUiXL1/dKW4SMJRxkbbpG9nv5ecVutlt+PSoNvw7VPg8V4X5wqf4YQVp9g+NDQZDITr2cm/8lNIGlbvp+edGD/946eqJqOKmoBJRhjyjrclk0qlZAqeumw8YOEwE6ILdgh0raN9pcHeWx9n3mViPh9IKnlmBVBWI4bfoePDAEcOGPz9WWUDBzMe1cUdft5CnUfb2DvFR8rsz2avrkOdmT18wJisz5zDaqthVWjwAtzRgtBF9VbSdVofXIPWmB2CCouYqUBUFH59QbwwEqg0XykAi96/VuCEetRrm59msEfA+nqEtAUeqNEt324JGJEsDxpMi26gnaCpUxqJk6bahkGFp3akrZO8IBurcVGponpGW+VOdQP++uIAznzE1/cBBvRRZTc+OP0miUBJ78OiyxNxE6uX+KSP3vDIZuEE/z9BgWZZtHHj1oxZbkS6uJFNqIn+SWSy1AubjFtLd171xoHrQooyFQJRB7+0eHBrk2cxNtBW5mgYwoYNFXg5r7CvoFXWxajQ3mjiTc84wVkB2kTWt5NYk3lZ02SCvzphDDVrNZOY2p3mdA0wrhQoGSm5ig6SRyTsqwSxUaMKk+t4tXJIy4/IsoP82yNu7pYusKwk2WdslZmScvGHOyNs1tJ5GNrjVaeT2W2xsLCnuv5J6woQq/QtbXoLCMJqYtbWj208pKbGK4aamgWJR19XlCvpFEdxn6SDOl0byAjXB/cp8rlM/PteZ83k1T92PTuAw0Ly8GychmosWLB/v7xFSW+AeJQ/0auyLiYFEBgQ0dYKdDRsJfFOvpe0V76fgCVrgkNQTao63hAONr2vjFtAFltoTTFLzB415Al7RFdNipHRviWlLbzCHhZ05HxfEy9e7T/zX8FV+XLk+96e8Tl0xOJZfOpjdKp4kzboZXgGrouDj1rTunHnTQl1caoZ/unLNlKnTx32sNxobR0ZGakQTDCY8tEtEkG+LfihDg+NC2ccjpBXoyMTqVaLjTaFLduxe219XqH+67HYGKU5D0pbN30X5+vl0a9m6mZOPTxvFUIayPRAbM1RpS1uztp0a/SD6e9hcYlKVqgi7QEg/DAyRsAUsKSlNLyvT56Bs8e2Ias4LZzfnfEowJyOOVocZDs9jt8YnMDvUZzblZ+jis1rwtqg/KMHgwEThCUOCUS64U/An6iiL9oIGcFjwqMOQQB0JdTyEXd/tfR/1rMzsWCrPBxwPCxJMfJMELVYq0KO+fNkXk6CHRV/qXPSLXA0XZejpqiRZ0IgcY7hzu+AS2TB3quInaNnU2vzSlNqcT/fhHSqAVJgawAunEXxCPU4W9MMlcRN0ryZMAl2XcOHm6YlnYgMAToIOuxks+YBBErGrAa0YtKDDDkeYAaBFErjSUl2uKOfm5v1GE9y1nOLe/4IO+b3YchfKw0wy3lZ6m2arxyr4KV4RURH54qtS/fGufEMZZ7Hja/Ko0ptsgYML0+kKGM+4wbTbmGQUtPfLMfBrWWc3gIZenX4aJmUp9OQdqunk4nv2QmzMus0rO730wtj0qu2DqnuQjCYbrOjYrINq5JuRe/CKQp3QtRMweivm0yur+FBQf9xk6WFQX99Tvw2GDO0390jssWXW1vKf6n4q7Dc1EOXledJwQxF7RV/EomQbptMXssJlNyT5YSe4dq1m/s907eik1WprNKjdur9sW/1AWt7535Ur6/zvN2/lpcds/37eM892mEgTXGHuHD1y4qLRYK0YvrJsMly5knKu0tg0csmObbvfC2/ZbETK9bOnW4TU7xtGEw0a2geZbKysz/Xu9txQvV6fX6VOrMTw/hVsdF8b/tbGgX1feqF1m7Bq5hda+/o+pVgXm9Ztmzk0ctTBlMyEi/fnaoZ9g3HH1xmv5GgwI/m3+oAZUOzkj4fx7rQBt7qdxnhJDiuj/YlBe9dG1pLNbF9D8c2dem2xVMA3NQhjBk6WMyVaelmZVaL0+vmcB/Tz/zVa+8lIPlWW2SLMQh559ZSNCE2sbCq/FBuLyrrbLJVHsYZMr/sdfpiKJOv1pOxtyISp0tQRtHXqhNWQZffSy5d/LBOwJ5H71mrcAnzSSA2Z84ObJPlCbiujSZubkRefZI5X61hL5pavbzMvY4kuTCuzm6nXE4+Ztwf/lBRmcW1zcSkwxsXF6bWmEnbQSPJsoqWMZumwUqYC7QCVi3Y6tMmnCZdYDItiJezj0v3MaLJmRmXX58w0zKJ3w3ww2IwE+fk7JSUll9b2Crl4NfPcJXOav1OH7fyfdSs6cS7zl18Y65GRd36Pmk/S+dwex0/tHTN54pxNJ0/I2tTsM5WccqDFQgn9rW4nyphg4J95ut9gZis7p6Ym3BI4L9eQ+sS/ntrbLXDIE8/fLKaHVP7goyN5whKyKKMHcsWboSasqsznORfSRYEaz3v29uZt4JiDxMC8QVJLjzntg+ow+dBe7BhRJ1MwQ/AVkRbwQbBj7OtTXgVu49qt79LDrW/OX4yrqjEJ/OIPVrwlfM2CB/rW6XQ3wd9SgjsM41SsC9pLt+H0AptK2fdRjFdYHHwdhY0QOsL1VZDimkIHfLLD8xThcmCF+p3SjOxc0WlV+Zervm2x68dN/QQ+MLC2DVSHqOOVw6ZFXDRgCXjUBQ1y7Py+3bO+HyQLO0bArGV2auRrkxRv1orPPgjXF6XVARxJz0vCPvz4vbkoT50899yTenvAD0ljLx0L8Gr2Et4C9XXnTkEiecNKv/xiU/q1nHNXlQmN2iYVlpWwL0qLmSR3ZNFgQCpCogXuLDMa45WrTH8AcCVpTL8Q7ChbVDhAgO6XmwwGj7AWoa9lZ+UcBt3ufZvn6Ar0bUSbP/+42cJQ7NhbNjj3ybpW2p0G3LtP966DUIYk0TbZDr4Kk9Ho7lXLw1+0g6qo6Wtz8+f9sfmARQzqPZNWiCCBJ/NLtrOz9SkoKPxDlmT1SiJIHiuH6oAeF5e1o9XRGjWqa6pXrxbcqlm3YY7Wtifu6WDeU1xHF59an1cDki9wm8nnU7h3AV0fergDNrsln0+BtKUoP0yizYJr/57DhuJ1wnY5/mziepTVr6e3R0hrsbPLyck7BrxIZO/eAi2uuwE4I3Aok5rIAtzPPbjtxQuXtgCOOtQTwkqrPvlqMmBd2vcfDGeSpfGCXrS7H96SujCnBy+oj6LComSoEoGvUA0A6EvZ8DLaO9nYsUOoSzNy57Oi4mJyBu2SpuRcj2rGvZievUsRgleBf5gk6cpabd62egFoaYtr6NFl8DaUoz96LzTAq0kDlNWppLhE2UTg9Tuf8MdG2sw4DRjQU9H7e3b/FE2vomLoU3nJjm92rYSEwoXZuX3EJvDZsWtdz/+sjGlqMJqCXx/90jzALlz4syQl5awi7aj/EwnxPfC1srJy7ti232Sb6jZHRT+VJvm909I3pjKWayxjYdODeLkO1hnC2OLC/mhQWsJO6UvInCtjHQWDB+XKK2tvF3Dq5JkvVR4t/tzwiHk6namuefunwruvEq9ft86RW4Ef9sqQcK2WXRkzYtKBgtsFGYCNHjHpt3enzd+cnpvwo8pHbKQd2Wg9M3qDhjz9tqd+O7tao2XZqP+TKf8Ga3vyzP630EdGRpY+OTnutuiv0iQDqDOxVgaaSDLpjqMuResukoXHpwTw7jT5XnQlfHBBOgPcgxIiEqu+jG4NuoYN63a4mHzio0vJvy7Blhcwa2srWW0NAFZVgh0uaTSKj0LQYFERZVmy+WP1Z2uno25vZyd/tX5FO5T79x72faoF+xm4J5m4geLOPl7PHPvl1CeyLF1T875nkpdckq7qdOwIqY4aEz35i+XEXCYJ30MXs7dnSghSzaSqMunN2n36dZsBfG7uzYt3r0vpaVm/AHbkxJ4xJYWpD80PbapK6bmnL8+dvURRJXsPbXu5W49OU6n/ItA/zEapKr4PA8fC7OVVS1EXgwe8sq9Nh4aJ6nYWdyrFmayLvQsrIwleF8n4Jk9ntlCvo00gZ6ujE6UHBujQAZw2ZY52Cv8fvj/wwahXJu6VGFdu2sh4rdTs+M6+fl7dSAI+kTS0yfkbCWEndbhJIzPdjRu3TgcGBijqbcHc6Km21iz+b7C22KTEaGxFi1slHDyLsrGgKHr5kvYCsW3btkpeynskGYSrmaQnvTufLubhyL6WDGwK0zH9ypvSKMHoQXmuoaztz0diJoHu9VfePp6el3BYeOGstVYJ0Ys/VSR81OjhPmQqKAvbg3hqZNOd9PTsZNAt/3Rhi+5dW/cmy6SzaGfv7HS817NDlUUWsFWfrU9LzkxMFfjHyadMe3MZ7HPzCwJjMnK/8JbNI6rib1GSQfxpoTT7TRs+mYzLSJJoWkTYsKqYWIIbTNzWuaZTA0iWOT4l+2zKxx99fpXCUKxXv+5hn6/akP7n5eRztbw9O5rToi7cnx5+0rWIvi/uSU4/M2BgZJ/ZAwb2KiO9HynaXLp0rIAkTZeff/tc7MFju2Qm0T7r8RPcnJa43MjL1+PtocUif8SrE2ZkpWWX0Tmbex4q5q/KNFLLO8mcHSTXRc7nRsmzSkILCOzWsJkAypLjBXE4U+mdtmSCGclC+AEbC8US0Wh+u5Jz7jraIWREYfRGuJG064n7AAvxCHHIMxorpLcac4q9lHesYjLRb06qrgtZMoVpuecqzCi0tZRg2wq4pXEiKCDwlnIRMMD9WFvrjGqrwhK9RRj5kp+bwLgS37NI8C/wgTOgSPLyV7ibxoa9Rp7kV8nrVo1E3qSjJSr/CuNlBUxHTswSZmLFkhWTtLSGUqSEjO7yXEN1DZW1FBuQrQllxzK5FVuTc5HtnnOIwlRf1X6Waa1GM24KoNGQT69SkpiGFtIyYwwrMK1jb1+9/U9bApV6/7fyxGYAwewzZ1IdiosNBvF2PzHmD8FIWfcoKPIV7ZZ7Q8rImmJGPWPpR0jqdMxEAs5IgEkWCUm6mf6YRITIOXIFUC6heCvIyguhPIR5s1PE9TYrMixlWkM9ZqRwC2jLkywKSm4tPc005KKeOxe+qb+oKhE9fAUOvLLi0ubYH6AVNpoaLU++lnWezs8/OLbw8D09GUp8HkB7wHCEEwVHjBkOxqvX7x906kgOzMvn89qZWLm7SbSXmXwnqLHLMdVmWKAq5eolSY2wtDyp8aIcFNSqekl+Uftjhy5IbduGV0tKulrCdMEGrcRupeYm/iLoLOXkMpJqe4fUN+hZHRM3keQ9Wip3IGiSEIupmLjooXwByeoUA2daCrSw4nx2Kucye86qhJUq7MUKSznt+SqSHcq0KAqY1okZxqySrlcQUIEvJ7e+RDocW2JdmR3T8K0UT2lOwk1viKQnh2oUuaIqrFt120ct4ySGwaALHDPuVb8ZM9+OxjlFOh95oGXzrsvpxk2e/jb7ERB6VL6PQw9hS79427lUqzOOGBGZj5i64IcPYUp1paHDXxzs+UH07NUCvnrVumlzZ334h0ajuZqWc+68gKtz+Bq//CSmq4kbrRL/PDbPyalGKPDJySm7n27V+wtJywozshMPqduYl4Ugw/oHDm455A8ryDjEhp3CkV+/HxEYGKC0/XDRyreXLVmVbKeyE8HTPOE0DNmONhS3Gu0f4NPTHP+gOj7JGRwx4icYzRU7kUlfSzMW9+PJJMTLS03MztqahXs1YuuK8tmAqFgp70FM74eXxpeHTvhkR3eKY2wic6K5YmRoWBE51UdI825tuV/7h8Uh1qQzFAf26vusy8zZE1eKdt6+Xl1ooovbt+795fVUXRuC03rzzyecisZBYwoCsvETRgbcupFfunrl1mwSHtIW7EpqduKF5My4VBIG9w3rt7L+g3qtggsRI3t91IvzNq7d/sKVK1drk8bOtaSZ16zc3pw0sdV332/sLYSYzofd7tdj+H/Aw1O2/S0DhX8wlWvFv7eI0jpJqs1gs33brv09ej6TT7wqFKulIbt7utalw5RKxJwO4+yCEGMDFdjILbFCkNFw6k7py0XP8qu0Fm8nl4UTcW1nY81ORHXjPaL2SZcFcxq2xNbUXsSstB0oiCbA5TkWCCMvYQbda9KotCuVkCbTQGYyNCFb3ESh72wmayOlRbePV6L5m5UAOh+sK8wNh4tzxaeLF99lY6KjunGuri7h0BZf/GfZBfhQfDyaNEnPSUgw70o5bm8yuZrDUcdSTXftYL4EaiT5tobZJqXknsq+p52e+wB28vT+cfQyPYtyxOA+nw/oPXwPyiKl5ibE+Xs06UJb9x/OJB4OdXd3aUMmkPX2XWsnNAvu8EGZJDWhZfi62izyouPDRh2v9cabr/iGt2o6UvCa9c7CqfQFo0Gy0ZyJyyg/uiZw/0SuNocelX9qbvwv8F5+suxzv6VLPo211J6EvRZWnCXL5jUb+sKAoaDBh5SYKzyT1JxzRzAvlQQZRNN+kn6Oepq3JXn8gar+JKZBRPQbffnSJ+qEpAgdCTjnt/UbGCt7jkq+lbZwVmQqGPlcaVJWhRBHPcXd6ciG29xDbOecNtIGCm3VkKJLnqiy0JfcbIvxxx7fOc7Gxkpx6G3ZEDNn1rsLEy5cOb6GIkIuPXt3eef5FwaO3LxpByNteTM9Pb7yGO7az7+fPTBR+Km2bIyZPWPa/Pi1m1b0b0FONnt7Oz/0g0Su6oLLSVd+GP/G9G9154uLtZL2lsnGPo6XFjyDB0wx33JCC/8NBoavKQKBogB8noskH89jxs5dOw78MC7h5/VkUjiSQD+1fvPKDi8+/+ZhX0/lawzl5bv70jZ1dHTQTJ0xfr5gv+/HQ4vXr/smC/GC9Ixz6QL+T+aPo5ExrvT0E/BwX7I0RoR9TSajFebgmWc7TgINjk6OG/POKVnLctKzE06SECtNK2+67nKLOipdIEEOp7jI73QKg+lKWE3aDB56N5wPuUvCpInpCazEEM7yS86wQloh7tBVXFLEbpa8REL8fjkdl2Y158NItDOp/XnZimXM/ZW3lJY+WSH2dwttRt5o+6+3r+6C4A/6Tkq6EjNp4uz44pIS05wZi94V4164ZNYSN1cXKyz54hyowFnK+0X0GJGccXpneKuwQRcvJB3YvXPfAgSX6CPVeBK2avUb1huy79COLecuHp1Dx5fgU+wCId70zapnhNdZaGPwb9mq2SgBRx45uK87p1Xgjh3NjrV0FmHm92YtnirGggfYp09XV5PRFIBNIeDGohstke/9edtrCNmifC0l/YdXXxz3Cxy76dfPVz4DC4L/sYQvkhFh+HT1h62EEP+45+dFEGJ8xp6enXhSfUsWBRkEM45KubIDe5qE+DsE9XSlNM2lbMv0YP4OxaJIzsm+ePd6DivMb8vu6GKYviyJFRq7Se/d+hq4KMa104PZLBLgDXRiRkPhbU5h7s03PNgx4J9UCvBsGqDnBh/YoO07PDUefEtLyzK7tI9Yh80dQtTr1m7JPHL4+HLg6GxB9f2Hy0M1CNtg5wx4VUnWaO1bNn12YJBfizf69hr+5Zujpqx5PnLUp43rtZvVtFHHCBFAdHFxDlu28v1w8JEljf6FIaN/FseJ8DGe4I9wvYAj37Z113XZVnsaZxUyM8+nkYJJw5Gjn386/JFos3Tl+3NQ1nMpDB/aGbmpxkfL329Wu46fcqiD7je7U9u+n0M72jr5nhDt/ldzH7fgIJOJ+0+aNjaw34AeihI6ezph7YiX3zpGk3sjI/fsWfN7q1KQQUibvNIF51kECfMysmuNlFPUjy2sHchWvhzAyXNM9aWshDTsQOmD0vrShwWKkI704vZFddkXRDuXhJgsELKYS9n7CxKkF1b8KNFr8WQS3Gw6g74JztRNeefNDwXXyeNnzSIBI88gl40GpkRyhg4aeeD69RvKQ8aSHbNrfS+Exvy8yn9OQ7Q1z2kCd+D8BDZnGdcTTqTmJCTjRKgky3nQntezc0+JNl7etRT7WqM1XcOuX9ZoKnlvBB1yrdb6CmhwqU2cjNzEs/A2vPj82Nj0tMz9oLWzt/Pfd3DbYNjntJmr06x5Ywf6ZEIRbuBHvz5lWplOp7jrnvRxZPD/byZ8IE0u3IZ16wbaTpw8Zgn6pjBiQq9uQ2Po6/SyjJwEiy/qfQW5/AYkvviyNIEEcgIFqstweou07GgXA4sZ6cxrlNP89X9MDe7sILM9JK4v60CrYyUlejZy0Z/SrL+oHr8EB7w4q7hr78ZZcLMJritXL16jXr5FGZsoQdOqTfNRM2ZNrGvU81pVfXUGWnoZlN2seqOl8PgH/dFWtm4noF07te33KX0GmIv+GjdpOIzs4SCUN2xZ9Q5lyrPbuuW7uT/tPXjLykq6bMmzAfr/pVQs3WmG8W785rMRlCkr//w50eWrKWPx9zyHuzenvZs/MItOl1a85cGvajjbpJNYdYpd97C3YkfH2fGeK0qkdDCg3x4JoI3fXknH6hMNRnFLx9igZTnSwQd28IgExw9fpO9PTVbQVOR6CkFzslvP0pI/+36scLwRp+9A88a4Vxbt2bV3WHz8hUb0uzm3yn9i4H6tVbgHmCQqykcuptBX2/6uYXFk37d4+413pn62Jvo/YPLm+Nfmt+/QZouzs5PiL066dHnrhHEz4xB8QLDnkTv6hxuQtyWAPESKXV9VV5JReyM193QWBNTXlT4Y4boaeGF9fL26og3cbF9vjsmRtdqcq9nxVX6R9NCCDKYf50jfv+3EO5gYHYbjzItATZg1OzVG5t3IFrWmjeGPpL9cCQ8HXYpGw3rQB38XUX2SCd8ilOmMrouXzAmBpgJvsnUNg/u/shBlnMC2dD7Wzy24HTaAzVuFxtSrFxhBk6fd+u1X8+rXaT2Jlcmt6ZzVHQMYPKEk0SecYEVnd/WCpZNzjZoKjII28FrgvK9tDftjly//dkfQIL+WF5dF9nDyrl37WLeYZ+b3j+g5kzaX9s2aN3kV+OLC4iud2vXfiMMqdYJdfk2NBfT/jfTc0P49unXrVKXQiVEWFhUXvT12xgHaK+jpxf3doNH7IUjWf0DPZwXNvh8OHkFZMsiKshRw8/yRBBmNl+VLZ0fb8ZayzH4krdyEnpQnudbiKRxMAbry9Y5gJwnfOzpfUpZF804fp46dOwlxvY5dnnZ64aVIRbOC39ovN8/GAW9ZsrpoSYhBU82dnczPkbpiI5iUcrK1ra2Nl2M1x7oHf/lueOd2/TeYmEnxAID2iSSDdQbZVp6ff7J214IPZ3YnnnLdunUiyNSJuMvfSC/fi8eOnepAp6EOnss5Rydc/kp0EDORfuXOZeyoqSeDmzSIQVtg8Q3K4IGvzkSZW9vd87sdgP+3Ejw05n3hFxroMgffU6f7KBs4uM8fy5euTjFKRkf6ks4FRJ61PJojL7hTePH99z5Kwsuael3R2gBbTPcMwiKVBeBkxh0KtGw7mQ/dhbeUynihvrU2sKEr2JPb1Km7h238a+ylp4zc6IRNXsdObV3JTswqKCw0kUeCNmLxiWp68zLOBpTeLm5LGydt377dXJycnazhewUd/K/YLZPmk8aOf80/LSW96Ntvf8jFRGodXA5iyRf88Es5xQZda0GbkZZVtGP77ntocaKXlRW3wQOv5ugot+vUyqluUGB18CGT5hZ+jwuOfRx0FbzVOcLQaz7Z0Q6eCsDRHzayiodCI58URwXVbR6l/Lghavw6hYGZsDr/rYSNLSKQcfS7AwiOSGWF4eJewRAmRVAD59MPOjPytwUZncAN5yyzhVacDSFlbDJIbO1qkzQXuP9Gql+/bTXj7WLbUq1t4V3H+kN3q5zWOnq5Jn05Jdm6GvMTExPJnC9PCDgYC2/X1Mp6o38j1xv3m0Q1LT5wu985DghlzGcxdqUaKzvSRpLJXtaFhdUpND8mLsZhKQcPuhSTxRL+UWFCkM3bPexZC/N2/9b/nYF/Z+AxZuD/AA8zEhkTLyOGAAAAAElFTkSuQmCC'); +======= + background-image: url('../images/logo.png'); +>>>>>>> f40e44f... fix(fix): fix } @@ -731,12 +739,20 @@ border-radius: 2px; } .l7-control-layers-toggle { +<<<<<<< HEAD background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAAGf7Ah0AAAABGdBTUEAALGPC/xhBQAABzdJREFUWAnVV3lslEUUn/l2F0tpwdAih1HEqCReDcphNCo1EkgFkXa5PNpuC0Fo2e7Wgko8KiaKWrvbK5672xYFpNtiRRuNiY0aURA14BGviBcVlaKltVa6+42/N9v5Mrtt05rwj/PHzjt+8743b+a9N8vYwKgMNlUQyemnMtAkaJajvb3dToQSGp8e6boopkr4VYgEMYwO0vhCTfMVzBcMf8bx086YyODcuM80zTqp9IWat+7evW8sMdIxIqqCLa6oiAaJpuEtcBqcc2HEWMZ0JclgZR/Nchf++ubrzKjJSguXS4tVjXvPjfb3/UAAacGTn/MOMb7QnjNpNqP/bKZ50Ai0tqYmCi0n4zbM+W+lBc7JBOa+QPhDwcTsxJXE2+32edKCL9h8hRDmRzpIOWydAylhrcMfDN+ugBRKSdP3KwPhsFJIPth02FISIYQwYsDYcVfWhy/Bon4JgumffMGmiGTwQ0B/sHml4q2ZFAD3WQIQVhx0IdFw8B189lolN+w8w5PnjPmlhJgtA8/vfn3iye7u3yGzDljDxZEG4097Cp3rSSjBtMHunp6vFR+HHoIxmbgTe1xHKssDHecLNFUjMzbqMs5ZlHF7ute17M84+TMHDzr+OvR9JwKdCms9yRkzJq6bPTsWXh05QOPUN+PUHyPWMPhm6UHd7vaUohWZPSRE8OqxpTyibQa/qcTlbEP0vwF7AWUAT3JM9dy69FfSNza+MU4awNE8iQtXSkJuGLleV852ov2h5jkwVof0mUs8aO4LhTuYYFOAjExId0wcFIPahpaLTkWiX9ECfHG/sLNi1i8+HODfgLFFRI96+INNi0cNTgTS1obKQh03aAuk9DeELzcj4pACYivvwvXrFK/PcQZiQWo+hmidpYMUjQC7EOB6xdNsGfAHwk/RDdOVw9Dm+NTUSWtWLDohDVQ37JkbiUT2DwMeVswZP+gtdM4x3HnLDhjcGM2XLWOISaenIGee9MCSgqgMht/H/q/SZYk0qviV3oKcj5XcioESyOoqIseFYDYloxnAGm/hcrcuk3JV2XBMl+pKqn6mENux11+w12m6jpqMMFn7rPPTHdwfCm8yTfG4tMaNu+GepPUFiqbM7T105ARSPQU+dY/LOC/N2gI65WEkyWUEtjmSppfkLvlRLaQ5VnZFDtGGzbheNRROKZmbu/AvUvh3tE4Wff2/0IUC+y2q+4VVoXBW1BSvkR7Rb8BW84lWJQBdlGozcs7GLy3Nd35OSqTxBqtfgkc1+sPjcqbDgEl6xK0dH5lv545LOCVL1/F+3CoY4eyY1+WcBiC2KYEHQBd5XDkyndE17xCm2Ug6BLcSwb3LigE1AlOYu6TS4HUwVEw0Df1osfBnLDwnpiFDCQPuvQ73Fkqxg8/hEVYLXt66MXbbzOK8bKre1hhkgDT0RDja3fEHytwZxCMLH0YWPkD0fxqjqUZDejDSV3z1LbexqPkEPJxKWLqtKOGbvPnZL460NlE/KgfkIZiRrfjShsQcG2QQDUwwXjcuZcID61Ys6ErUJ/LDOiCfLUzUjVQdEg0O4jn/ABEq0iuIjrEcwE0x/KGWNbjPj4BO00Gni0ZOoIPzLR5X9vMqqaQDqDzzENra4V5zp8sBZQcROYjsLvYUOPdbEVBKeiZ193QjCmwtZCM+ldS6EWYTH3wuNSV1i+pFCj/IAaWgGUfBq0N78qPM3DZcp9TxcTQeyzZm3ON2LatXpSlOP8BIB6qDLddHmHnFrBlpNZmZmdZbNXEB9XsRlZXFennqGHzoXW5DaId4iSoc/Q365EjnRjszPnYXZL9NDWUtGsqzCjAw7xprTypbn7fkaILcYqkInzzeX06C8emO8sKlS7stZQLxVMPes/+O9FVAvEpXob+utY6gZmfrtMjf/RUI+2odhF7wJbq+Gzf3zTj5CAwyaoEwozVoCzN1KKK00z7WUbZx9dIOklsO6CAZpu87i5gpHoJ8gtLh9vZixSO2KckV7qysf5Sc5uq2tjOix3rL0FW3IJuSNV0XM/iDs85LqxvqeKUD8n3LxUobt5WVuLJlS9IM4O9i09VRwWtxLWfpcix+hXjs8mZdjn19YuOiuKRgufzXqOuqQi2r8O+yAk/tl2Q/RMW7ETe8UdX1GJhHDM5qjDHJ5e7bs07qBp7ZsTe9t6/vUXykkLKEdLFbLgLJSUn3rrt1yXEdX/1C23jzVG+5Keg/B5r2wJD9g/NcaUAJq4MvXxxl/TWoATcoGc0Av4eUKnIXZlsvXpLHO0CS2KgOtGQgdeuwqWuUjGbUgrdszLHRXXDLF0oe54AS0kyPnc5Iz/2CmV7EeIzSwcjvsHQPXkUhld/kCP6Xu+DRNjg/SWHh+SnODF+aPeVh9XCydAPEsA4kAqsCzcuiTPiw7+maTj6SwGsVk/9gY9xbUpizR8MNS47aAd0C7s35CG8VdrxYyjl/FcdUgo73nY77X9D/Au9RDMh+aBoVAAAAAElFTkSuQmCC'); +======= + background-image: url(../images/layers.svg); +>>>>>>> f40e44f... fix(fix): fix width: 36px; height: 36px; } .l7-retina .l7-control-layers-toggle { +<<<<<<< HEAD background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAAGf7Ah0AAAABGdBTUEAALGPC/xhBQAABzdJREFUWAnVV3lslEUUn/l2F0tpwdAih1HEqCReDcphNCo1EkgFkXa5PNpuC0Fo2e7Wgko8KiaKWrvbK5672xYFpNtiRRuNiY0aURA14BGviBcVlaKltVa6+42/N9v5Mrtt05rwj/PHzjt+8743b+a9N8vYwKgMNlUQyemnMtAkaJajvb3dToQSGp8e6boopkr4VYgEMYwO0vhCTfMVzBcMf8bx086YyODcuM80zTqp9IWat+7evW8sMdIxIqqCLa6oiAaJpuEtcBqcc2HEWMZ0JclgZR/Nchf++ubrzKjJSguXS4tVjXvPjfb3/UAAacGTn/MOMb7QnjNpNqP/bKZ50Ai0tqYmCi0n4zbM+W+lBc7JBOa+QPhDwcTsxJXE2+32edKCL9h8hRDmRzpIOWydAylhrcMfDN+ugBRKSdP3KwPhsFJIPth02FISIYQwYsDYcVfWhy/Bon4JgumffMGmiGTwQ0B/sHml4q2ZFAD3WQIQVhx0IdFw8B189lolN+w8w5PnjPmlhJgtA8/vfn3iye7u3yGzDljDxZEG4097Cp3rSSjBtMHunp6vFR+HHoIxmbgTe1xHKssDHecLNFUjMzbqMs5ZlHF7ute17M84+TMHDzr+OvR9JwKdCms9yRkzJq6bPTsWXh05QOPUN+PUHyPWMPhm6UHd7vaUohWZPSRE8OqxpTyibQa/qcTlbEP0vwF7AWUAT3JM9dy69FfSNza+MU4awNE8iQtXSkJuGLleV852ov2h5jkwVof0mUs8aO4LhTuYYFOAjExId0wcFIPahpaLTkWiX9ECfHG/sLNi1i8+HODfgLFFRI96+INNi0cNTgTS1obKQh03aAuk9DeELzcj4pACYivvwvXrFK/PcQZiQWo+hmidpYMUjQC7EOB6xdNsGfAHwk/RDdOVw9Dm+NTUSWtWLDohDVQ37JkbiUT2DwMeVswZP+gtdM4x3HnLDhjcGM2XLWOISaenIGee9MCSgqgMht/H/q/SZYk0qviV3oKcj5XcioESyOoqIseFYDYloxnAGm/hcrcuk3JV2XBMl+pKqn6mENux11+w12m6jpqMMFn7rPPTHdwfCm8yTfG4tMaNu+GepPUFiqbM7T105ARSPQU+dY/LOC/N2gI65WEkyWUEtjmSppfkLvlRLaQ5VnZFDtGGzbheNRROKZmbu/AvUvh3tE4Wff2/0IUC+y2q+4VVoXBW1BSvkR7Rb8BW84lWJQBdlGozcs7GLy3Nd35OSqTxBqtfgkc1+sPjcqbDgEl6xK0dH5lv545LOCVL1/F+3CoY4eyY1+WcBiC2KYEHQBd5XDkyndE17xCm2Ug6BLcSwb3LigE1AlOYu6TS4HUwVEw0Df1osfBnLDwnpiFDCQPuvQ73Fkqxg8/hEVYLXt66MXbbzOK8bKre1hhkgDT0RDja3fEHytwZxCMLH0YWPkD0fxqjqUZDejDSV3z1LbexqPkEPJxKWLqtKOGbvPnZL460NlE/KgfkIZiRrfjShsQcG2QQDUwwXjcuZcID61Ys6ErUJ/LDOiCfLUzUjVQdEg0O4jn/ABEq0iuIjrEcwE0x/KGWNbjPj4BO00Gni0ZOoIPzLR5X9vMqqaQDqDzzENra4V5zp8sBZQcROYjsLvYUOPdbEVBKeiZ193QjCmwtZCM+ldS6EWYTH3wuNSV1i+pFCj/IAaWgGUfBq0N78qPM3DZcp9TxcTQeyzZm3ON2LatXpSlOP8BIB6qDLddHmHnFrBlpNZmZmdZbNXEB9XsRlZXFennqGHzoXW5DaId4iSoc/Q365EjnRjszPnYXZL9NDWUtGsqzCjAw7xprTypbn7fkaILcYqkInzzeX06C8emO8sKlS7stZQLxVMPes/+O9FVAvEpXob+utY6gZmfrtMjf/RUI+2odhF7wJbq+Gzf3zTj5CAwyaoEwozVoCzN1KKK00z7WUbZx9dIOklsO6CAZpu87i5gpHoJ8gtLh9vZixSO2KckV7qysf5Sc5uq2tjOix3rL0FW3IJuSNV0XM/iDs85LqxvqeKUD8n3LxUobt5WVuLJlS9IM4O9i09VRwWtxLWfpcix+hXjs8mZdjn19YuOiuKRgufzXqOuqQi2r8O+yAk/tl2Q/RMW7ETe8UdX1GJhHDM5qjDHJ5e7bs07qBp7ZsTe9t6/vUXykkLKEdLFbLgLJSUn3rrt1yXEdX/1C23jzVG+5Keg/B5r2wJD9g/NcaUAJq4MvXxxl/TWoATcoGc0Av4eUKnIXZlsvXpLHO0CS2KgOtGQgdeuwqWuUjGbUgrdszLHRXXDLF0oe54AS0kyPnc5Iz/2CmV7EeIzSwcjvsHQPXkUhld/kCP6Xu+DRNjg/SWHh+SnODF+aPeVh9XCydAPEsA4kAqsCzcuiTPiw7+maTj6SwGsVk/9gY9xbUpizR8MNS47aAd0C7s35CG8VdrxYyjl/FcdUgo73nY77X9D/Au9RDMh+aBoVAAAAAElFTkSuQmCC'); +======= + background-image: url(../images/layers.svg); +>>>>>>> f40e44f... fix(fix): fix background-size: 26px 26px; } .l7-touch .l7-control-layers-toggle { @@ -786,4 +802,9 @@ margin-top: 2px; position: relative; top: 1px; - } \ No newline at end of file +<<<<<<< HEAD + } +======= + } + +>>>>>>> f40e44f... fix(fix): fix diff --git a/packages/component/src/images/layers.png b/packages/component/src/images/layers.png new file mode 100644 index 0000000000..4e9f67b6d2 Binary files /dev/null and b/packages/component/src/images/layers.png differ diff --git a/packages/component/src/images/layers.svg b/packages/component/src/images/layers.svg new file mode 100644 index 0000000000..615f4172d7 --- /dev/null +++ b/packages/component/src/images/layers.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/component/src/images/logo.png b/packages/component/src/images/logo.png new file mode 100644 index 0000000000..7599f280a0 Binary files /dev/null and b/packages/component/src/images/logo.png differ diff --git a/packages/component/src/index.ts b/packages/component/src/index.ts new file mode 100644 index 0000000000..21eaa07aae --- /dev/null +++ b/packages/component/src/index.ts @@ -0,0 +1,9 @@ +import Control from './control/BaseControl'; +import Layers from './control/layer'; +import Logo from './control/logo'; +import Scale from './control/scale'; +import Zoom from './control/zoom'; +import Marker from './marker'; +import Popup from './popup'; + +export { Control, Logo, Scale, Zoom, Layers, Marker, Popup }; diff --git a/packages/component/src/marker.ts b/packages/component/src/marker.ts new file mode 100644 index 0000000000..083471e94d --- /dev/null +++ b/packages/component/src/marker.ts @@ -0,0 +1,186 @@ +import { ILngLat, IMapService, IMarkerScene, IPopup } from '@l7/core'; +import { bindAll, DOM } from '@l7/utils'; +import { anchorTranslate, anchorType, applyAnchorClass } from './utils/anchor'; +// marker 支持 dragger 未完成 + +export interface IMarkerOption { + element: HTMLElement | undefined; + anchor: anchorType; + color: string; + offset: number[]; + draggable: boolean; +} +export default class Marker { + private markerOption: IMarkerOption; + private defaultMarker: boolean; + private popup: IPopup; // TODO: POPup + private mapservice: IMapService; + private lngLat: ILngLat; + private scene: IMarkerScene; + constructor(option?: Partial) { + this.markerOption = { + ...this.getDefault(), + ...option, + }; + bindAll(['update', 'onMove', 'onUp', 'addDragHandler', 'onMapClick'], this); + this.init(); + } + + public getDefault() { + return { + element: undefined, // DOM element + anchor: anchorType.BOTTOM, + offset: [0, 0], + color: '#5B8FF9', + draggable: false, + }; + } + + public addTo(scene: IMarkerScene) { + this.scene = scene; + const mapService = scene.getMapService(); + const { element, draggable } = this.markerOption; + this.remove(); + this.mapservice = mapService; + mapService.getMarkerContainer().appendChild(element as HTMLElement); + mapService.on('camerachange', this.update); + // this.setDraggable(draggable); + this.update(); + return this; + } + + public remove() { + if (this.mapservice) { + this.mapservice.off('click', this.onMapClick); + this.mapservice.off('move', this.update); + this.mapservice.off('moveend', this.update); + this.mapservice.off('mousedown', this.addDragHandler); + this.mapservice.off('touchstart', this.addDragHandler); + this.mapservice.off('mouseup', this.onUp); + this.mapservice.off('touchend', this.onUp); + delete this.mapservice; + } + const { element } = this.markerOption; + if (element) { + DOM.remove(element); + } + if (this.popup) { + this.popup.remove(); + } + return this; + } + + public setLnglat(lngLat: ILngLat) { + this.lngLat = lngLat; + if (this.popup) { + this.popup.setLnglat(this.lngLat); + } + return this; + } + + public getLnglat(): ILngLat { + return this.lngLat; + } + + public getElement(): HTMLElement { + return this.markerOption.element as HTMLElement; + } + + public togglePopup() { + const popup = this.popup; + if (!popup) { + return this; + } else if (popup.isOpen()) { + popup.remove(); + } else { + popup.addTo(this.scene); + } + return this; + } + + public getPopup() { + return this.popup; + } + + public getOffset(): number[] { + return this.markerOption.offset; + } + + public setDraggable(draggable: boolean) { + throw new Error('Method not implemented.'); + } + + public isDraggable() { + return this.markerOption.draggable; + } + + private update() { + if (!this.mapservice) { + return; + } + const { element, anchor } = this.markerOption; + this.updatePosition(); + DOM.setTransform(element as HTMLElement, `${anchorTranslate[anchor]}`); + } + + private onMapClick(e: MouseEvent) { + const { element } = this.markerOption; + if (this.popup && element) { + this.togglePopup(); + } + } + + private updatePosition() { + if (!this.mapservice) { + return; + } + const { element } = this.markerOption; + const { lng, lat } = this.lngLat; + const pos = this.mapservice.lngLatToContainer([lng, lat]); + if (element) { + element.style.left = pos.x + 'px'; + element.style.top = pos.y + 'px'; + } + } + + private init() { + let { element } = this.markerOption; + const { color, anchor } = this.markerOption; + if (!element) { + this.defaultMarker = true; + element = DOM.create('div'); + this.markerOption.element = element; + const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + svg.setAttributeNS(null, 'display', 'block'); + svg.setAttributeNS(null, 'height', '48px'); + svg.setAttributeNS(null, 'width', '48px'); + svg.setAttributeNS(null, 'viewBox', '0 0 1024 1024'); + + const path = document.createElementNS( + 'http://www.w3.org/2000/svg', + 'path', + ); + path.setAttributeNS( + null, + 'd', + 'M512 490.666667C453.12 490.666667 405.333333 442.88 405.333333 384 405.333333 325.12 453.12 277.333333 512 277.333333 570.88 277.333333 618.666667 325.12 618.666667 384 618.666667 442.88 570.88 490.666667 512 490.666667M512 85.333333C346.88 85.333333 213.333333 218.88 213.333333 384 213.333333 608 512 938.666667 512 938.666667 512 938.666667 810.666667 608 810.666667 384 810.666667 218.88 677.12 85.333333 512 85.333333Z', + ); + path.setAttributeNS(null, 'fill', color); + svg.appendChild(path); + element.appendChild(svg); + } + DOM.addClass(element, 'l7-marker'); + element.addEventListener('click', (e: MouseEvent) => { + this.onMapClick(e); + }); + applyAnchorClass(element, anchor, 'marker'); + } + + private addDragHandler(e: MouseEvent) { + throw new Error('Method not implemented.'); + } + + private onUp(e: MouseEvent) { + throw new Error('Method not implemented.'); + } +} diff --git a/packages/component/src/popup.ts b/packages/component/src/popup.ts new file mode 100644 index 0000000000..8e0dd2ed35 --- /dev/null +++ b/packages/component/src/popup.ts @@ -0,0 +1,210 @@ +import { ILngLat, IMapService, IMarkerScene, IPopup } from '@l7/core'; +import { bindAll, DOM } from '@l7/utils'; +import { EventEmitter } from 'eventemitter3'; +import { anchorTranslate, anchorType, applyAnchorClass } from './utils/anchor'; + +/** colse event */ + +export interface IPopupOption { + closeButton: boolean; + closeOnClick: boolean; + maxWidth: string; + anchor: anchorType; + className: string; + offsets: number[]; +} +export default class Popup extends EventEmitter implements IPopup { + private popupOption: IPopupOption; + private mapservice: IMapService; + private lngLat: ILngLat; + private content: HTMLElement; + private closeButton: HTMLElement; + private timeoutInstance: any; + private container: HTMLElement; + private tip: HTMLElement; + + constructor(cfg?: Partial) { + super(); + this.popupOption = { + ...this.getdefault(), + ...cfg, + }; + bindAll(['update', 'onClickClose', 'remove'], this); + } + + public addTo(scene: IMarkerScene) { + const mapService = scene.getMapService(); + this.mapservice = mapService; + this.mapservice.on('camerachange', this.update); + this.update(); + if (this.popupOption.closeOnClick) { + this.timeoutInstance = setTimeout(() => { + this.mapservice.on('click', this.onClickClose); + }, 30); + } + return this; + } + + public setHTML(html: string) { + const frag = window.document.createDocumentFragment(); + const temp = window.document.createElement('body'); + let child: ChildNode | null; + temp.innerHTML = html; + while (true) { + child = temp.firstChild; + if (!child) { + break; + } + frag.appendChild(child); + } + + return this.setDOMContent(frag); + } + + public setLnglat(lngLat: ILngLat): this { + this.lngLat = lngLat; + if (this.mapservice) { + this.mapservice.on('camerachange', this.update); + } + this.update(); + return this; + } + public getLnglat(): ILngLat { + return this.lngLat; + } + public setText(text: string) { + return this.setDOMContent(window.document.createTextNode(text)); + } + + public setMaxWidth(maxWidth: string): this { + this.popupOption.maxWidth = maxWidth; + this.update(); + return this; + } + + public setDOMContent(htmlNode: ChildNode | DocumentFragment) { + this.createContent(); + this.content.appendChild(htmlNode); + this.update(); + return this; + } + + // 移除popup + public remove() { + if (this.content) { + this.removeDom(this.content); + } + + if (this.container) { + this.removeDom(this.container); + delete this.container; + } + if (this.mapservice) { + // TODO: mapbox AMap 事件同步 + this.mapservice.off('camerachange', this.update); + this.mapservice.off('click', this.onClickClose); + delete this.mapservice; + } + clearTimeout(this.timeoutInstance); + this.emit('close'); + return this; + } + public isOpen() { + return !!this.mapservice; + } + + private createContent() { + if (this.content) { + DOM.remove(this.content); + } + this.content = DOM.create('div', 'l7-popup-content', this.container); + if (this.popupOption.closeButton) { + this.closeButton = DOM.create( + 'button', + 'l7-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); + } + } + + private creatDom(tagName: string, className: string, container: HTMLElement) { + const el = window.document.createElement(tagName); + if (className !== undefined) { + el.className = className; + } + if (container) { + container.appendChild(el); + } + return el; + } + + private removeDom(node: ChildNode) { + if (node.parentNode) { + node.parentNode.removeChild(node); + } + } + + private getdefault() { + return { + closeButton: true, + closeOnClick: true, + maxWidth: '240px', + offsets: [0, 0], + anchor: anchorType.BOTTOM, + className: '', + }; + } + + private onClickClose() { + this.remove(); + } + + private update() { + const hasPosition = this.lngLat; + const { className, maxWidth, anchor } = this.popupOption; + if (!this.mapservice || !hasPosition || !this.content) { + return; + } + const markerContainer = this.mapservice.getMarkerContainer(); + if (!this.container && markerContainer) { + this.container = this.creatDom( + 'div', + 'l7-popup', + markerContainer.parentNode as HTMLElement, + ); + + this.tip = this.creatDom('div', 'l7-popup-tip', this.container); + this.container.appendChild(this.content); + if (className) { + className + .split(' ') + .forEach((name) => this.container.classList.add(name)); + } + this.container.addEventListener('mousedown', (e) => { + e.stopPropagation(); + }); + } + if (maxWidth && this.container.style.maxWidth !== maxWidth) { + this.container.style.maxWidth = maxWidth; + } + + this.updatePosition(); + DOM.setTransform(this.container, `${anchorTranslate[anchor]}`); + applyAnchorClass(this.container, anchor, 'popup'); + } + + private updatePosition() { + if (!this.mapservice) { + return; + } + const { lng, lat } = this.lngLat; + const { offsets } = this.popupOption; + const pos = this.mapservice.lngLatToContainer([lng, lat]); + this.container.style.left = pos.x + offsets[0] + 'px'; + this.container.style.top = pos.y - offsets[1] + 'px'; + } +} diff --git a/packages/component/src/utils/anchor.ts b/packages/component/src/utils/anchor.ts new file mode 100644 index 0000000000..2b1e301c51 --- /dev/null +++ b/packages/component/src/utils/anchor.ts @@ -0,0 +1,36 @@ +export enum anchorType { + 'CENTER' = 'center', + 'TOP' = 'top', + 'TOP-LEFT' = 'top-left', + 'TOP-RIGHT' = 'top-right', + 'BOTTOM' = 'bottom', + 'BOTTOM-LEFT' = 'bottom-left', + 'LEFT' = 'left', + 'RIGHT' = 'right', +} + +export 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%)', +}; + +export function applyAnchorClass( + element: HTMLElement, + anchor: string, + prefix: string, +) { + const classList = element.classList; + for (const key in anchorTranslate) { + if (anchorTranslate.hasOwnProperty(key)) { + classList.remove(`l7-${prefix}-anchor-${key}`); + } + } + classList.add(`l7-${prefix}-anchor-${anchor}`); +} diff --git a/packages/component/tsconfig.build.json b/packages/component/tsconfig.build.json new file mode 100644 index 0000000000..99200a9677 --- /dev/null +++ b/packages/component/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "declarationDir": "./es", + "rootDir": "./src", + "baseUrl": "./" + }, + "include": ["./src"] +} diff --git a/packages/core/.gitignore b/packages/core/.gitignore new file mode 100644 index 0000000000..49c199b6ab --- /dev/null +++ b/packages/core/.gitignore @@ -0,0 +1,3 @@ +lib +es +dist diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 0000000000..eb97425d06 --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,51 @@ +{ + "name": "@l7/core", + "version": "0.0.1", + "description": "", + "main": "lib/index.js", + "module": "es/index.js", + "types": "es/index.d.ts", + "sideEffects": true, + "files": [ + "lib", + "es", + "README.md" + ], + "scripts": { + "tsc": "tsc --project tsconfig.build.json", + "clean": "rimraf dist; rimraf es; rimraf lib;", + "build": "run-p build:*", + "build:cjs": "BABEL_ENV=cjs babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "build:esm": "BABEL_ENV=esm babel src --root-mode upward --out-dir es --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "watch": "BABEL_ENV=cjs babel src --watch --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments" + }, + "author": "xiaoiver", + "license": "ISC", + "dependencies": { + "@l7/utils": "0.0.1", + "@mapbox/tiny-sdf": "^1.1.1", + "ajv": "^6.10.2", + "eventemitter3": "^4.0.0", + "gl-matrix": "^3.1.0", + "hammerjs": "^2.0.8", + "inversify": "^5.0.1", + "inversify-inject-decorators": "^3.1.0", + "lodash": "^4.17.15", + "mapbox-gl": "^1.2.1", + "merge-json-schemas": "^1.0.0", + "probe.gl": "^3.1.1", + "reflect-metadata": "^0.1.13", + "tapable": "^2.0.0-beta.8", + "viewport-mercator-project": "^6.2.1" + }, + "devDependencies": { + "@types/gl-matrix": "^2.4.5", + "@types/hammerjs": "^2.0.36", + "@types/lodash": "^4.14.138", + "@types/viewport-mercator-project": "^6.1.0" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 0000000000..4dacd4ef46 --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1,62 @@ +import container, { lazyInject, lazyMultiInject } from './inversify.config'; +import ClearPass from './services/renderer/passes/ClearPass'; +import MultiPassRenderer from './services/renderer/passes/MultiPassRenderer'; +import PixelPickingPass from './services/renderer/passes/PixelPickingPass'; +import RenderPass from './services/renderer/passes/RenderPass'; +import TAAPass from './services/renderer/passes/TAAPass'; +import { TYPES } from './types'; +import { packCircleVertex } from './utils/vertex-compression'; + +export { + /** + * IoC 容器 + */ + container, + /** + * lazy inject,供各个 Layer 使用 + */ + lazyInject, + lazyMultiInject, + /** + * 各个 Service 接口标识符 + */ + TYPES, + packCircleVertex, + /** pass */ + MultiPassRenderer, + ClearPass, + RenderPass, + PixelPickingPass, + TAAPass, +}; + +/** 暴露服务接口供其他 packages 实现 */ +export * from './services/layer/ILayerService'; +export * from './services/layer/IStyleAttributeService'; +export * from './services/source/ISourceService'; +export * from './services/map/IMapService'; +export * from './services/coordinate/ICoordinateSystemService'; +export * from './services/renderer/IRendererService'; +export * from './services/camera/ICameraService'; +export * from './services/config/IConfigService'; +export * from './services/scene/ISceneService'; +export * from './services/shader/IShaderModuleService'; +export * from './services/asset/IIconService'; +export * from './services/asset/IFontService'; +export * from './services/component/IControlService'; +export * from './services/component/IMarkerService'; +export * from './services/component/IPopUpService'; +export * from './services/log/ILogService'; +export * from './services/interaction/IInteractionService'; + +/** 全部渲染服务接口 */ +export * from './services/renderer/IAttribute'; +export * from './services/renderer/IBuffer'; +export * from './services/renderer/IElements'; +export * from './services/renderer/IFramebuffer'; +export * from './services/renderer/IModel'; +export * from './services/renderer/IMultiPassRenderer'; +export * from './services/renderer/IRenderbuffer'; +export * from './services/renderer/ITexture2D'; +export * from './services/renderer/IUniform'; +export * from './services/renderer/gl'; diff --git a/packages/core/src/inversify.config.ts b/packages/core/src/inversify.config.ts new file mode 100644 index 0000000000..6249fa31f5 --- /dev/null +++ b/packages/core/src/inversify.config.ts @@ -0,0 +1,205 @@ +import 'reflect-metadata'; + +import { EventEmitter } from 'eventemitter3'; +import { Container, decorate, injectable, interfaces } from 'inversify'; +import getDecorators from 'inversify-inject-decorators'; +import { TYPES } from './types'; + +/** Service interfaces */ +import { IFontService } from './services/asset/IFontService'; +import { IIconService } from './services/asset/IIconService'; +import { ICameraService } from './services/camera/ICameraService'; +import { IControlService } from './services/component/IControlService'; +import { IGlobalConfigService } from './services/config/IConfigService'; +import { ICoordinateSystemService } from './services/coordinate/ICoordinateSystemService'; +import { IInteractionService } from './services/interaction/IInteractionService'; +import { ILayerService } from './services/layer/ILayerService'; +import { IStyleAttributeService } from './services/layer/IStyleAttributeService'; +import { ILogService } from './services/log/ILogService'; +import { ISceneService } from './services/scene/ISceneService'; +import { IShaderModuleService } from './services/shader/IShaderModuleService'; + +/** Service implements */ +import FontService from './services/asset/FontService'; +import IconService from './services/asset/IconService'; +import CameraService from './services/camera/CameraService'; +import ControlService from './services/component/ControlService'; +import GlobalConfigService from './services/config/ConfigService'; +import CoordinateSystemService from './services/coordinate/CoordinateSystemService'; +import InteractionService from './services/interaction/InteractionService'; +import LayerService from './services/layer/LayerService'; +import StyleAttributeService from './services/layer/StyleAttributeService'; +import LogService from './services/log/LogService'; +import SceneService from './services/scene/SceneService'; +import ShaderModuleService from './services/shader/ShaderModuleService'; + +/** PostProcessing passes */ +import { IPostProcessingPass } from './services/renderer/IMultiPassRenderer'; +import BlurHPass from './services/renderer/passes/post-processing/BlurHPass'; +import BlurVPass from './services/renderer/passes/post-processing/BlurVPass'; +import ColorHalfTonePass from './services/renderer/passes/post-processing/ColorHalfTonePass'; +import CopyPass from './services/renderer/passes/post-processing/CopyPass'; +import HexagonalPixelatePass from './services/renderer/passes/post-processing/HexagonalPixelatePass'; +import InkPass from './services/renderer/passes/post-processing/InkPass'; +import NoisePass from './services/renderer/passes/post-processing/NoisePass'; +import SepiaPass from './services/renderer/passes/post-processing/SepiaPass'; + +// @see https://github.com/inversify/InversifyJS/blob/master/wiki/container_api.md#defaultscope +const container = new Container(); + +/** + * bind services + */ +container + .bind(TYPES.ISceneService) + .to(SceneService) + .inTransientScope(); +container + .bind(TYPES.IGlobalConfigService) + .to(GlobalConfigService) + .inSingletonScope(); +container + .bind(TYPES.ILayerService) + .to(LayerService) + .inSingletonScope(); +container + .bind(TYPES.IStyleAttributeService) + .to(StyleAttributeService) + .inRequestScope(); +container + .bind(TYPES.ICameraService) + .to(CameraService) + .inSingletonScope(); +container + .bind(TYPES.ICoordinateSystemService) + .to(CoordinateSystemService) + .inSingletonScope(); +container + .bind(TYPES.IIconService) + .to(IconService) + .inSingletonScope(); +container + .bind(TYPES.IShaderModuleService) + .to(ShaderModuleService) + .inSingletonScope(); +container + .bind(TYPES.ILogService) + .to(LogService) + .inSingletonScope(); +container + .bind(TYPES.IInteractionService) + .to(InteractionService) + .inSingletonScope(); +container + .bind(TYPES.IFontService) + .to(FontService) + .inSingletonScope(); +container + .bind(TYPES.IControlService) + .to(ControlService) + .inSingletonScope(); + +// @see https://github.com/inversify/InversifyJS/blob/master/wiki/inheritance.md#what-can-i-do-when-my-base-class-is-provided-by-a-third-party-module +decorate(injectable(), EventEmitter); +container.bind(TYPES.IEventEmitter).to(EventEmitter); +// 支持 L7 使用 new 而非容器实例化的场景,同时禁止 lazyInject cache +// @see https://github.com/inversify/inversify-inject-decorators#caching-vs-non-caching-behaviour +const DECORATORS = getDecorators(container, false); + +interface IBabelPropertyDescriptor extends PropertyDescriptor { + initializer(): any; +} +// Add babel legacy decorators support +// @see https://github.com/inversify/InversifyJS/issues/1050 +// @see https://github.com/inversify/InversifyJS/issues/1026#issuecomment-504936034 +export const lazyInject = ( + serviceIdentifier: interfaces.ServiceIdentifier, +) => { + const original = DECORATORS.lazyInject(serviceIdentifier); + // the 'descriptor' parameter is actually always defined for class fields for Babel, but is considered undefined for TSC + // so we just hack it with ?/! combination to avoid "TS1240: Unable to resolve signature of property decorator when called as an expression" + return function( + this: any, + proto: any, + key: string, + descriptor?: IBabelPropertyDescriptor, + ): void { + // make it work as usual + original.call(this, proto, key); + // return link to proto, so own value wont be 'undefined' after component's creation + if (descriptor) { + descriptor.initializer = () => { + return proto[key]; + }; + } + }; +}; +export const lazyMultiInject = ( + serviceIdentifier: interfaces.ServiceIdentifier, +) => { + const original = DECORATORS.lazyMultiInject(serviceIdentifier); + // the 'descriptor' parameter is actually always defined for class fields for Babel, but is considered undefined for TSC + // so we just hack it with ?/! combination to avoid "TS1240: Unable to resolve signature of property decorator when called as an expression" + return function( + this: any, + proto: any, + key: string, + descriptor?: IBabelPropertyDescriptor, + ): void { + // make it work as usual + original.call(this, proto, key); + if (descriptor) { + // return link to proto, so own value wont be 'undefined' after component's creation + descriptor!.initializer = () => { + return proto[key]; + }; + } + }; +}; + +// 绑定 post processing passes +container + .bind>(TYPES.IPostProcessingPass) + .to(CopyPass) + .whenTargetNamed('copy'); +container + .bind>(TYPES.IPostProcessingPass) + .to(BlurHPass) + .whenTargetNamed('blurH'); +container + .bind>(TYPES.IPostProcessingPass) + .to(BlurVPass) + .whenTargetNamed('blurV'); +container + .bind>(TYPES.IPostProcessingPass) + .to(NoisePass) + .whenTargetNamed('noise'); +container + .bind>(TYPES.IPostProcessingPass) + .to(SepiaPass) + .whenTargetNamed('sepia'); +container + .bind>(TYPES.IPostProcessingPass) + .to(ColorHalfTonePass) + .whenTargetNamed('colorHalftone'); +container + .bind>(TYPES.IPostProcessingPass) + .to(HexagonalPixelatePass) + .whenTargetNamed('hexagonalPixelate'); +container + .bind>(TYPES.IPostProcessingPass) + .to(InkPass) + .whenTargetNamed('ink'); + +container + .bind>>( + TYPES.IFactoryPostProcessingPass, + ) + .toFactory>((context) => (named: string) => + context.container.getNamed>( + TYPES.IPostProcessingPass, + named, + ), + ); + +export default container; diff --git a/packages/core/src/services/asset/FontService.ts b/packages/core/src/services/asset/FontService.ts new file mode 100644 index 0000000000..656fffc5e2 --- /dev/null +++ b/packages/core/src/services/asset/FontService.ts @@ -0,0 +1,244 @@ +import { LRUCache } from '@l7/utils'; +// @ts-ignore +import TinySDF from '@mapbox/tiny-sdf'; +import { inject, injectable } from 'inversify'; +import { buildMapping } from '../../utils/font_util'; +import { + IFontAtlas, + IFontMapping, + IFontMappingItem, + IFontOptions, + IFontService, +} from './IFontService'; +export const DEFAULT_CHAR_SET = getDefaultCharacterSet(); +export const DEFAULT_FONT_FAMILY = 'sans-serif'; +export const DEFAULT_FONT_WEIGHT = 'normal'; +export const DEFAULT_FONT_SIZE = 24; +export const DEFAULT_BUFFER = 3; +export const DEFAULT_CUTOFF = 0.25; +export const DEFAULT_RADIUS = 8; +const MAX_CANVAS_WIDTH = 1024; +const BASELINE_SCALE = 1.0; +const HEIGHT_SCALE = 1.0; +const CACHE_LIMIT = 3; +const VALID_PROPS = [ + 'fontFamily', + 'fontWeight', + 'characterSet', + 'fontSize', + 'sdf', + 'buffer', + 'cutoff', + 'radius', +]; +function getDefaultCharacterSet() { + const charSet = []; + for (let i = 32; i < 128; i++) { + charSet.push(String.fromCharCode(i)); + } + return charSet; +} + +function setTextStyle( + ctx: CanvasRenderingContext2D, + fontFamily: string, + fontSize: number, + fontWeight: string, +) { + ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`; + ctx.fillStyle = 'black'; + ctx.textBaseline = 'middle'; + // ctx.textAlign = 'left'; +} +function populateAlphaChannel(alphaChannel: number[], imageData: ImageData) { + // populate distance value from tinySDF to image alpha channel + for (let i = 0; i < alphaChannel.length; i++) { + imageData.data[4 * i + 3] = alphaChannel[i]; + } +} + +@injectable() +export default class FontService implements IFontService { + public fontAtlas: IFontAtlas; + private fontOptions: IFontOptions; + private key: string; + private cache: LRUCache = new LRUCache(CACHE_LIMIT); + public init() { + this.cache.clear(); + this.fontOptions = { + fontFamily: DEFAULT_FONT_FAMILY, + fontWeight: DEFAULT_FONT_WEIGHT, + characterSet: DEFAULT_CHAR_SET, + fontSize: DEFAULT_FONT_SIZE, + buffer: DEFAULT_BUFFER, + sdf: true, + cutoff: DEFAULT_CUTOFF, + radius: DEFAULT_RADIUS, + }; + this.key = ''; + } + + public get scale() { + return HEIGHT_SCALE; + } + + public get canvas(): HTMLCanvasElement { + const data = this.cache.get(this.key); + return data && data.data; + } + + public get mapping(): IFontMapping { + const data = this.cache.get(this.key); + return data && data.mapping; + } + + public setFontOptions(option: Partial) { + this.fontOptions = { + ...this.fontOptions, + ...option, + }; + + // const oldKey = this.key; + this.key = this.getKey(); + + const charSet = this.getNewChars(this.key, this.fontOptions.characterSet); + const cachedFontAtlas = this.cache.get(this.key); + + if (cachedFontAtlas && charSet.length === 0) { + // update texture with cached fontAtlas + return; + } + // update fontAtlas with new settings + const fontAtlas = this.generateFontAtlas( + this.key, + charSet, + cachedFontAtlas, + ); + this.fontAtlas = fontAtlas; + + // update cache + this.cache.set(this.key, fontAtlas); + } + + public destroy(): void { + this.cache.clear(); + } + + private generateFontAtlas( + key: string, + characterSet: string[], + cachedFontAtlas: IFontAtlas, + ): IFontAtlas { + const { + fontFamily, + fontWeight, + fontSize, + buffer, + sdf, + radius, + cutoff, + } = this.fontOptions; + let canvas = cachedFontAtlas && cachedFontAtlas.data; + if (!canvas) { + canvas = document.createElement('canvas'); + canvas.width = MAX_CANVAS_WIDTH; + } + const ctx = canvas.getContext('2d') as CanvasRenderingContext2D; + setTextStyle(ctx, fontFamily, fontSize, fontWeight); + + // 1. build mapping + const { mapping, canvasHeight, xOffset, yOffset } = buildMapping({ + getFontWidth: (char) => ctx.measureText(char).width, + fontHeight: fontSize * HEIGHT_SCALE, + buffer, + characterSet, + maxCanvasWidth: MAX_CANVAS_WIDTH, + ...(cachedFontAtlas && { + mapping: cachedFontAtlas.mapping, + xOffset: cachedFontAtlas.xOffset, + yOffset: cachedFontAtlas.yOffset, + }), + }); + + // 2. update canvas + // copy old canvas data to new canvas only when height changed + if (canvas.height !== canvasHeight) { + const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + canvas.height = canvasHeight; + ctx.putImageData(imageData, 0, 0); + } + setTextStyle(ctx, fontFamily, fontSize, fontWeight); + + // 3. layout characters + if (sdf) { + const tinySDF = new TinySDF( + fontSize, + buffer, + radius, + cutoff, + fontFamily, + fontWeight, + ); + // used to store distance values from tinySDF + // tinySDF.size equals `fontSize + buffer * 2` + const imageData = ctx.getImageData(0, 0, tinySDF.size, tinySDF.size); + + for (const char of characterSet) { + populateAlphaChannel(tinySDF.draw(char), imageData); + // 考虑到描边,需要保留 sdf 的 buffer,不能像 deck.gl 一样直接减去 + ctx.putImageData(imageData, mapping[char].x, mapping[char].y); + } + } else { + for (const char of characterSet) { + ctx.fillText( + char, + mapping[char].x, + mapping[char].y + fontSize * BASELINE_SCALE, + ); + } + } + return { + xOffset, + yOffset, + mapping, + data: canvas, + width: canvas.width, + height: canvas.height, + }; + } + + private getKey() { + const { + fontFamily, + fontWeight, + fontSize, + buffer, + sdf, + radius, + cutoff, + } = this.fontOptions; + if (sdf) { + return `${fontFamily} ${fontWeight} ${fontSize} ${buffer} ${radius} ${cutoff}`; + } + return `${fontFamily} ${fontWeight} ${fontSize} ${buffer}`; + } + + private getNewChars(key: string, characterSet: string[]): string[] { + const cachedFontAtlas = this.cache.get(key); + if (!cachedFontAtlas) { + return characterSet; + } + + const newChars: string[] = []; + const cachedMapping = cachedFontAtlas.mapping; + const cachedCharSet = new Set(Object.keys(cachedMapping)); + const charSet = new Set(characterSet); + charSet.forEach((char: string) => { + if (!cachedCharSet.has(char)) { + newChars.push(char); + } + }); + + return newChars; + } +} diff --git a/packages/core/src/services/asset/IFontService.ts b/packages/core/src/services/asset/IFontService.ts new file mode 100644 index 0000000000..208988c535 --- /dev/null +++ b/packages/core/src/services/asset/IFontService.ts @@ -0,0 +1,48 @@ +export interface IFontOptions { + fontFamily: string; + fontWeight: string; + characterSet: string[]; + fontSize: number; + buffer: number; + sdf: boolean; + cutoff: number; + radius: number; +} +export interface IFontMappingOption { + characterSet: string[]; + getFontWidth: (char: string, i: number) => number; + fontHeight: number; + buffer: number; + maxCanvasWidth: number; + mapping: IFontMapping; + xOffset: number; + yOffset: number; +} +export interface IFontMappingItem { + x: number; + y: number; + width: number; + height: number; + advance: number; +} +export interface IFontMapping { + [key: string]: IFontMappingItem; + [key: number]: IFontMappingItem; +} +export interface IFontAtlas { + xOffset: number; + yOffset: number; + mapping: IFontMapping; + data: HTMLCanvasElement; + width: number; + height: number; +} +export interface IFontService { + mapping: IFontMapping; + fontAtlas: IFontAtlas; + canvas: HTMLCanvasElement; + scale: number; + init(): void; + setFontOptions(option: Partial): void; + destroy(): void; +} diff --git a/packages/core/src/services/asset/IIconService.ts b/packages/core/src/services/asset/IIconService.ts new file mode 100644 index 0000000000..f71632015f --- /dev/null +++ b/packages/core/src/services/asset/IIconService.ts @@ -0,0 +1,30 @@ +import EventEmitter from 'eventemitter3'; +import { ITexture2D } from '../renderer/ITexture2D'; +export type IImage = HTMLImageElement | File | string; +export type Listener = (...args: any[]) => void; +export interface IIconValue { + x: number; + y: number; + image?: HTMLImageElement; +} +export interface IIcon { + id: string; + image?: HTMLImageElement; + height: number; + width: number; +} +export interface IICONMap { + [key: string]: IIconValue; +} +export interface IIconService { + canvasHeight: number; + on(event: string, fn: EventEmitter.ListenerFn, context?: any): this; + init(): void; + addImage(id: string, image: IImage): void; + hasImage(id: string): boolean; + removeImage(id: string): void; + getTexture(): ITexture2D; + getIconMap(): IICONMap; + getCanvas(): HTMLCanvasElement; + destroy(): void; +} diff --git a/packages/core/src/services/asset/IconService.ts b/packages/core/src/services/asset/IconService.ts new file mode 100644 index 0000000000..2b593388a8 --- /dev/null +++ b/packages/core/src/services/asset/IconService.ts @@ -0,0 +1,133 @@ +import { EventEmitter } from 'eventemitter3'; +import { inject, injectable } from 'inversify'; +import { TYPES } from '../../types'; +import { buildIconMaping } from '../../utils/font_util'; +import { ITexture2D } from '../renderer/ITexture2D'; +import { + IIcon, + IICONMap, + IIconService, + IIconValue, + IImage, +} from './IIconService'; +const BUFFER = 3; +const MAX_CANVAS_WIDTH = 1024; +const imageSize = 64; +@injectable() +export default class IconService extends EventEmitter implements IIconService { + public canvasHeight: number; + private textrure: ITexture2D; + private canvas: HTMLCanvasElement; + private iconData: IIcon[]; + private iconMap: IICONMap; + private ctx: CanvasRenderingContext2D; + public init() { + this.iconData = []; + this.iconMap = {}; + this.canvas = document.createElement('canvas'); + this.ctx = this.canvas.getContext('2d') as CanvasRenderingContext2D; + } + + public addImage(id: string, image: IImage) { + let imagedata = new Image(); + if (this.hasImage(id)) { + throw new Error('Image Id already exists'); + } + this.iconData.push({ + id, + width: imageSize, + height: imageSize, + }); + this.updateIconMap(); + this.loadImage(image).then((img) => { + imagedata = img as HTMLImageElement; + const iconImage = this.iconData.find((icon: IIcon) => { + return icon.id === id; + }); + if (iconImage) { + iconImage.image = imagedata; + } + // this.iconData.push({ + // id, + // image: imagedata, + // width: imageSize, + // height: imageSize, + // }); + this.update(); + }); + } + + public getTexture(): ITexture2D { + return this.textrure; + } + + public getIconMap() { + return this.iconMap; + } + + public getCanvas() { + return this.canvas; + } + + public hasImage(id: string): boolean { + return this.iconMap.hasOwnProperty(id); + } + + public removeImage(id: string): void { + if (this.hasImage(id)) { + this.iconData = this.iconData.filter((icon) => { + return icon.id !== id; + }); + delete this.iconMap[id]; + this.update(); + } + } + public destroy(): void { + this.iconData = []; + this.iconMap = {}; + } + private update() { + this.updateIconMap(); + this.updateIconAtlas(); + this.emit('imageUpdate'); + } + + private updateIconAtlas() { + this.canvas.width = MAX_CANVAS_WIDTH; + this.canvas.height = this.canvasHeight; + Object.keys(this.iconMap).forEach((item: string) => { + const { x, y, image } = this.iconMap[item]; + if (image) { + this.ctx.drawImage(image, x, y, imageSize, imageSize); + } + }); + } + + private updateIconMap() { + const { mapping, canvasHeight } = buildIconMaping( + this.iconData, + BUFFER, + MAX_CANVAS_WIDTH, + ); + this.iconMap = mapping; + this.canvasHeight = canvasHeight; + } + + private loadImage(url: IImage) { + return new Promise((resolve, reject) => { + if (url instanceof HTMLImageElement) { + resolve(url); + return; + } + const image = new Image(); + image.crossOrigin = 'anonymous'; + image.onload = () => { + resolve(image); + }; + image.onerror = () => { + reject(new Error('Could not load image at ' + url)); + }; + image.src = url instanceof File ? URL.createObjectURL(url) : url; + }); + } +} diff --git a/packages/core/src/services/camera/Camera.ts b/packages/core/src/services/camera/Camera.ts new file mode 100644 index 0000000000..baae21af70 --- /dev/null +++ b/packages/core/src/services/camera/Camera.ts @@ -0,0 +1,620 @@ +import { mat3, mat4, quat, vec3, vec4 } from 'gl-matrix'; +import { createVec3, getAngle } from '../../utils/math'; +// import Landmark from './Landmark'; + +export enum CAMERA_TYPE { + ORBITING = 'ORBITING', + EXPLORING = 'EXPLORING', + TRACKING = 'TRACKING', +} + +export enum CAMERA_TRACKING_MODE { + DEFAULT = 'DEFAULT', + ROTATIONAL = 'ROTATIONAL', + TRANSLATIONAL = 'TRANSLATIONAL', + CINEMATIC = 'CINEMATIC', +} + +const DEG_2_RAD = Math.PI / 180; +const RAD_2_DEG = 180 / Math.PI; + +/** + * 参考「WebGL Insights - 23.Designing Cameras for WebGL Applications」,基于 Responsible Camera 思路设计 + * 保存相机参数,定义相机动作: + * 1. dolly 沿 n 轴移动 + * 2. pan 沿 u v 轴移动 + * 3. rotate 以方位角旋转 + * 4. 移动到 Landmark,具有平滑的动画效果,其间禁止其他用户交互 + */ +export default class Camera { + /** + * 相机矩阵 + */ + public matrix = mat4.create(); + + /** + * u 轴 + * @see http://learnwebgl.brown37.net/07_cameras/camera_introduction.html#a-camera-definition + */ + public right = vec3.fromValues(1, 0, 0); + + /** + * v 轴 + */ + public up = vec3.fromValues(0, 1, 0); + + /** + * n 轴 + */ + public forward = vec3.fromValues(0, 0, 1); + + /** + * 相机位置 + */ + public position = vec3.fromValues(0, 0, 1); + + /** + * 视点位置 + */ + public focalPoint = vec3.fromValues(0, 0, 0); + + /** + * 相机位置到视点向量 + * focalPoint - position + */ + public distanceVector = vec3.fromValues(0, 0, 0); + + /** + * 相机位置到视点距离 + * length(focalPoint - position) + */ + public distance = 1; + + /** + * @see https://en.wikipedia.org/wiki/Azimuth + */ + public azimuth = 0; + public elevation = 0; + public roll = 0; + public relAzimuth = 0; + public relElevation = 0; + public relRoll = 0; + + /** + * 沿 n 轴移动时,保证移动速度从快到慢 + */ + public dollyingStep = 0; + + /** + * invert the horizontal coordinate system HCS + */ + public rotateWorld = false; + + /** + * 投影矩阵参数 + */ + + /** + * field of view [0-360] + * @see http://en.wikipedia.org/wiki/Angle_of_view + */ + private fov = 30; + private near = 0.1; + private far = 10000; + private aspect = 1; + + /** + * 投影矩阵 + */ + private perspective = mat4.create(); + + private following = undefined; + + private type = CAMERA_TYPE.EXPLORING; + private trackingMode = CAMERA_TRACKING_MODE.DEFAULT; + + constructor(type: CAMERA_TYPE) { + this.setType(type, undefined); + } + + public setType( + type: CAMERA_TYPE, + trackingMode: CAMERA_TRACKING_MODE | undefined, + ) { + this.type = type; + if (this.type === CAMERA_TYPE.EXPLORING) { + this.setWorldRotation(true); + } else { + this.setWorldRotation(false); + } + this._getAngles(); + + if (this.type === CAMERA_TYPE.TRACKING && trackingMode !== undefined) { + this.setTrackingMode(trackingMode); + } + } + + public setTrackingMode(trackingMode: CAMERA_TRACKING_MODE) { + if (this.type !== CAMERA_TYPE.TRACKING) { + throw new Error( + 'Impossible to set a tracking mode if the camera is not of tracking type', + ); + } + this.trackingMode = trackingMode; + } + + /** + * If flag is true, it reverses the azimuth and elevation angles. + * Subsequent calls to rotate, setAzimuth, setElevation, + * changeAzimuth or changeElevation will cause the inverted effect. + * setRoll or changeRoll is not affected by this method. + * + * This inversion is useful when one wants to simulate that the world + * is moving, instead of the camera. + * + * By default the camera angles are not reversed. + * @param {Boolean} flag the boolean flag to reverse the angles. + */ + public setWorldRotation(flag: boolean) { + this.rotateWorld = flag; + this._getAngles(); + } + + /** + * 计算 MV 矩阵,为相机矩阵的逆矩阵 + */ + public getViewTransform(): mat4 | null { + return mat4.invert(mat4.create(), this.matrix); + } + + /** + * 设置相机矩阵 + */ + public setMatrix(matrix: mat4) { + this.matrix = matrix; + this._update(); + } + + public setPerspective( + near: number, + far: number, + angle: number, + aspect: number, + ) { + this.fov = angle; + this.near = near; + this.far = far; + this.aspect = aspect; + this.updatePerspective(); + } + + public updatePerspective() { + mat4.perspective( + this.perspective, + this.fov * DEG_2_RAD, + this.aspect, + this.near, + this.far, + ); + } + + /** + * 设置相机位置 + */ + public setPosition(x: number, y: number, z: number) { + this._setPosition(x, y, z); + this.setFocalPoint(this.focalPoint); + return this; + } + + /** + * 设置视点位置 + */ + public setFocalPoint(x: number | vec3, y?: number, z?: number) { + let up = vec3.fromValues(0, 1, 0); + this.focalPoint = createVec3(x, y, z); + + if (this.trackingMode === CAMERA_TRACKING_MODE.CINEMATIC) { + const d = vec3.subtract(vec3.create(), this.focalPoint, this.position); + x = d[0]; + y = d[1] as number; + z = d[2] as number; + const r = vec3.length(d); + const el = Math.asin(y / r) * RAD_2_DEG; + const az = 90 + Math.atan2(z, x) * RAD_2_DEG; + const m = mat4.create(); + mat4.rotateY(m, m, az * DEG_2_RAD); + mat4.rotateX(m, m, el * DEG_2_RAD); + up = vec3.transformMat4(vec3.create(), [0, 1, 0], m); + } + + mat4.invert( + this.matrix, + mat4.lookAt(mat4.create(), this.position, this.focalPoint, up), + ); + + this._getAxes(); + this._getDistance(); + this._getAngles(); + return this; + } + + /** + * 固定当前视点,按指定距离放置相机 + */ + public setDistance(d: number) { + if (this.distance === d || d < 0) { + return; + } + + this.distance = d; + this.dollyingStep = this.distance / 100; + + const pos = vec3.create(); + const n = this.forward; + const f = this.focalPoint; + + pos[0] = d * n[0] + f[0]; + pos[1] = d * n[1] + f[1]; + pos[2] = d * n[2] + f[2]; + + this._setPosition(pos); + return this; + } + + /** + * Changes the initial azimuth of the camera + */ + public changeAzimuth(az: number) { + this.setAzimuth(this.azimuth + az); + return this; + } + + /** + * Changes the initial elevation of the camera + */ + public changeElevation(el: number) { + this.setElevation(this.elevation + el); + return this; + } + + /** + * Changes the initial roll of the camera + */ + public changeRoll(rl: number) { + this.setRoll(this.roll + rl); + return this; + } + + /** + * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置 + * @param {Number} el the azimuth in degrees + */ + public setAzimuth(az: number) { + this.azimuth = getAngle(az); + this.computeMatrix(); + + this._getAxes(); + if ( + this.type === CAMERA_TYPE.ORBITING || + this.type === CAMERA_TYPE.EXPLORING + ) { + this._getPosition(); + } else if (this.type === CAMERA_TYPE.TRACKING) { + this._getFocalPoint(); + } + return this; + } + + public getAzimuth() { + return this.azimuth; + } + + /** + * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置 + * @param {Number} el the elevation in degrees + */ + public setElevation(el: number) { + this.elevation = getAngle(el); + this.computeMatrix(); + + this._getAxes(); + if ( + this.type === CAMERA_TYPE.ORBITING || + this.type === CAMERA_TYPE.EXPLORING + ) { + this._getPosition(); + } else if (this.type === CAMERA_TYPE.TRACKING) { + this._getFocalPoint(); + } + return this; + } + + /** + * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置 + * @param {Number} angle the roll angle + */ + public setRoll(angle: number) { + this.roll = getAngle(angle); + this.computeMatrix(); + + this._getAxes(); + if ( + this.type === CAMERA_TYPE.ORBITING || + this.type === CAMERA_TYPE.EXPLORING + ) { + this._getPosition(); + } else if (this.type === CAMERA_TYPE.TRACKING) { + this._getFocalPoint(); + } + return this; + } + + /** + * Changes the azimuth and elevation with respect to the current camera axes + * @param {Number} azimuth the relative azimuth + * @param {Number} elevation the relative elevation + * @param {Number} roll the relative roll + */ + public rotate(azimuth: number, elevation: number, roll: number) { + if (this.type === CAMERA_TYPE.EXPLORING) { + azimuth = getAngle(azimuth); + elevation = getAngle(elevation); + roll = getAngle(roll); + + const rotX = quat.setAxisAngle( + quat.create(), + [1, 0, 0], + (this.rotateWorld ? 1 : -1) * elevation * DEG_2_RAD, + ); + const rotY = quat.setAxisAngle( + quat.create(), + [0, 1, 0], + (this.rotateWorld ? 1 : -1) * azimuth * DEG_2_RAD, + ); + + const rotZ = quat.setAxisAngle( + quat.create(), + [0, 0, 1], + roll * DEG_2_RAD, + ); + let rotQ = quat.multiply(quat.create(), rotY, rotX); + rotQ = quat.multiply(quat.create(), rotQ, rotZ); + const rotMatrix = mat4.fromQuat(mat4.create(), rotQ); + mat4.translate(this.matrix, this.matrix, [0, 0, -this.distance]); + mat4.multiply(this.matrix, this.matrix, rotMatrix); + mat4.translate(this.matrix, this.matrix, [0, 0, this.distance]); + } else { + if (Math.abs(this.elevation + elevation) > 90) { + return; + } + this.relElevation = getAngle(elevation); + this.relAzimuth = getAngle(azimuth); + this.relRoll = getAngle(roll); + this.elevation += this.relElevation; + this.azimuth += this.relAzimuth; + this.roll += this.relRoll; + + this.computeMatrix(); + } + + this._getAxes(); + if ( + this.type === CAMERA_TYPE.ORBITING || + this.type === CAMERA_TYPE.EXPLORING + ) { + this._getPosition(); + } else if (this.type === CAMERA_TYPE.TRACKING) { + this._getFocalPoint(); + } + + this._update(); + return this; + } + + /** + * 沿水平(right) & 垂直(up)平移相机 + */ + public pan(tx: number, ty: number) { + const coords = createVec3(tx, ty, 0); + const pos = vec3.clone(this.position); + + vec3.add(pos, pos, vec3.scale(vec3.create(), this.right, coords[0])); + vec3.add(pos, pos, vec3.scale(vec3.create(), this.up, coords[1])); + + this._setPosition(pos); + + return this; + } + + /** + * 沿 n 轴移动,当距离视点远时移动速度较快,离视点越近速度越慢 + */ + public dolly(value: number) { + const n = this.forward; + const pos = vec3.clone(this.position); + const step = value * this.dollyingStep; + pos[0] += step * n[0]; + pos[1] += step * n[1]; + pos[2] += step * n[2]; + + this._setPosition(pos); + if ( + this.type === CAMERA_TYPE.ORBITING || + this.type === CAMERA_TYPE.EXPLORING + ) { + // 重新计算视点距离 + this._getDistance(); + } else if (this.type === CAMERA_TYPE.TRACKING) { + // 保持视距,移动视点位置 + vec3.add(this.focalPoint, pos, this.distanceVector); + } + return this; + } + + // public createLandmark(name: string): Landmark { + // return new Landmark(name, this); + // } + + /** + * 根据相机矩阵重新计算各种相机参数 + */ + private _update() { + this._getAxes(); + this._getPosition(); + this._getDistance(); + this._getAngles(); + } + + /** + * 计算相机矩阵 + */ + private computeMatrix() { + let rotX; + let rotY; + // 使用四元数描述 3D 旋转 + // @see https://xiaoiver.github.io/coding/2018/12/28/Camera-%E8%AE%BE%E8%AE%A1-%E4%B8%80.html + const rotZ = quat.setAxisAngle( + quat.create(), + [0, 0, 1], + this.roll * DEG_2_RAD, + ); + + mat4.identity(this.matrix); + + // only consider HCS for EXPLORING and ORBITING cameras + rotX = quat.setAxisAngle( + quat.create(), + [1, 0, 0], + (this.rotateWorld || this.type === CAMERA_TYPE.TRACKING ? 1 : -1) * + this.elevation * + DEG_2_RAD, + ); + rotY = quat.setAxisAngle( + quat.create(), + [0, 1, 0], + (this.rotateWorld ? 1 : -1) * this.azimuth * DEG_2_RAD, + ); + + let rotQ = quat.multiply(quat.create(), rotY, rotX); + rotQ = quat.multiply(quat.create(), rotQ, rotZ); + const rotMatrix = mat4.fromQuat(mat4.create(), rotQ); + + if ( + this.type === CAMERA_TYPE.ORBITING || + this.type === CAMERA_TYPE.EXPLORING + ) { + mat4.translate(this.matrix, this.matrix, this.focalPoint); + mat4.multiply(this.matrix, this.matrix, rotMatrix); + mat4.translate(this.matrix, this.matrix, [0, 0, this.distance]); + } else if (this.type === CAMERA_TYPE.TRACKING) { + mat4.translate(this.matrix, this.matrix, this.position); + mat4.multiply(this.matrix, this.matrix, rotMatrix); + } + } + + /** + * Sets the camera position in the camera matrix + */ + private _setPosition(x: number | vec3, y?: number, z?: number) { + this.position = createVec3(x, y, z); + const m = this.matrix; + m[12] = this.position[0]; + m[13] = this.position[1]; + m[14] = this.position[2]; + m[15] = 1; + } + + /** + * Recalculates axes based on the current matrix + */ + private _getAxes() { + vec3.copy( + this.right, + createVec3(vec4.transformMat4(vec4.create(), [1, 0, 0, 0], this.matrix)), + ); + vec3.copy( + this.up, + createVec3(vec4.transformMat4(vec4.create(), [0, 1, 0, 0], this.matrix)), + ); + vec3.copy( + this.forward, + createVec3(vec4.transformMat4(vec4.create(), [0, 0, 1, 0], this.matrix)), + ); + vec3.normalize(this.right, this.right); + vec3.normalize(this.up, this.up); + vec3.normalize(this.forward, this.forward); + } + + /** + * Recalculates euler angles based on the current state + */ + private _getAngles() { + // Recalculates angles + const x = this.distanceVector[0]; + const y = this.distanceVector[1]; + const z = this.distanceVector[2]; + const r = vec3.length(this.distanceVector); + + // FAST FAIL: If there is no distance we cannot compute angles + if (r === 0) { + this.elevation = 0; + this.azimuth = 0; + return; + } + + if (this.type === CAMERA_TYPE.TRACKING) { + this.elevation = Math.asin(y / r) * RAD_2_DEG; + this.azimuth = Math.atan2(-x, -z) * RAD_2_DEG; + } else { + if (this.rotateWorld) { + this.elevation = Math.asin(y / r) * RAD_2_DEG; + this.azimuth = Math.atan2(-x, -z) * RAD_2_DEG; + } else { + this.elevation = -Math.asin(y / r) * RAD_2_DEG; + this.azimuth = -Math.atan2(-x, -z) * RAD_2_DEG; + } + } + } + + /** + * 重新计算相机位置,只有 ORBITING 模式相机位置才会发生变化 + */ + private _getPosition() { + vec3.copy( + this.position, + createVec3(vec4.transformMat4(vec4.create(), [0, 0, 0, 1], this.matrix)), + ); + + // 相机位置变化,需要重新计算视距 + this._getDistance(); + } + + /** + * 重新计算视点,只有 TRACKING 模式视点才会发生变化 + */ + private _getFocalPoint() { + vec3.transformMat3( + this.distanceVector, + [0, 0, -this.distance], + mat3.fromMat4(mat3.create(), this.matrix), + ); + vec3.add(this.focalPoint, this.position, this.distanceVector); + + // 视点变化,需要重新计算视距 + this._getDistance(); + } + + /** + * 重新计算视距 + */ + private _getDistance() { + this.distanceVector = vec3.subtract( + vec3.create(), + this.focalPoint, + this.position, + ); + this.distance = vec3.length(this.distanceVector); + this.dollyingStep = this.distance / 100; + } +} diff --git a/packages/core/src/services/camera/CameraService.ts b/packages/core/src/services/camera/CameraService.ts new file mode 100644 index 0000000000..6c9febcb34 --- /dev/null +++ b/packages/core/src/services/camera/CameraService.ts @@ -0,0 +1,133 @@ +import { mat4 } from 'gl-matrix'; +import { inject, injectable } from 'inversify'; +import { ICameraService, IViewport } from './ICameraService'; + +@injectable() +export default class CameraService implements ICameraService { + private viewport: IViewport; + + /** + * 不使用 Viewport 计算的 VP 矩阵,例如偏移坐标系场景 + */ + private overridedViewProjectionMatrix: number[] | undefined; + + /** + * 抖动后的 VP 矩阵 + */ + private jitteredViewProjectionMatrix: number[] | undefined; + + /** + * 抖动后的 Projection 矩阵 + */ + private jitteredProjectionMatrix: number[] | undefined; + + /** + * ViewMatrix 逆矩阵,用于计算相机位置 + */ + private viewMatrixInverse: number[]; + + /** + * 相机位置 + */ + private cameraPosition: number[]; + + public init() { + // + } + + /** + * 同步根据相机参数创建的视口 + */ + public update(viewport: IViewport) { + this.viewport = viewport; + + // 计算逆矩阵 + this.viewMatrixInverse = (mat4.invert( + mat4.create(), + (this.getViewMatrix() as unknown) as mat4, + ) as unknown) as number[]; + + this.cameraPosition = [ + this.viewMatrixInverse[12], + this.viewMatrixInverse[13], + this.viewMatrixInverse[14], + ]; + } + + public getProjectionMatrix(): number[] { + // 优先返回抖动后的 ProjectionMatrix + return this.jitteredProjectionMatrix || this.viewport.getProjectionMatrix(); + } + + public getViewMatrix(): number[] { + return this.viewport.getViewMatrix(); + } + + public getViewMatrixUncentered(): number[] { + return this.viewport.getViewMatrixUncentered(); + } + + public getViewProjectionMatrix(): number[] { + return ( + this.overridedViewProjectionMatrix || + this.jitteredViewProjectionMatrix || + this.viewport.getViewProjectionMatrix() + ); + } + + public getZoom(): number { + return this.viewport.getZoom(); + } + + public getZoomScale(): number { + return this.viewport.getZoomScale(); + } + + public getCenter(): [number, number] { + const [lng, lat] = this.viewport.getCenter(); + return [lng, lat]; + } + + public getFocalDistance() { + return this.viewport.getFocalDistance(); + } + + public getCameraPosition() { + return this.cameraPosition; + } + + public projectFlat( + lngLat: [number, number], + scale?: number | undefined, + ): [number, number] { + return this.viewport.projectFlat(lngLat, scale); + } + + /** + * 支持外部计算 VP 矩阵的场景,例如:在偏移坐标系场景中,需要重新计算 VP 矩阵 + */ + public setViewProjectionMatrix(viewProjectionMatrix: number[] | undefined) { + this.overridedViewProjectionMatrix = viewProjectionMatrix; + } + + public jitterProjectionMatrix(x: number, y: number) { + const translation = mat4.fromTranslation(mat4.create(), [x, y, 0]); + + this.jitteredProjectionMatrix = (mat4.multiply( + mat4.create(), + translation, + (this.viewport.getProjectionMatrix() as unknown) as mat4, + ) as unknown) as number[]; + + this.jitteredViewProjectionMatrix = (mat4.multiply( + mat4.create(), + (this.jitteredProjectionMatrix as unknown) as mat4, + (this.viewport.getViewMatrix() as unknown) as mat4, + ) as unknown) as number[]; + } + + public clearJitterProjectionMatrix() { + this.jitteredProjectionMatrix = undefined; + this.jitteredViewProjectionMatrix = undefined; + } +} diff --git a/packages/core/src/services/camera/ICameraService.ts b/packages/core/src/services/camera/ICameraService.ts new file mode 100644 index 0000000000..fab7a35f30 --- /dev/null +++ b/packages/core/src/services/camera/ICameraService.ts @@ -0,0 +1,37 @@ +import { IMapCamera } from '../map/IMapService'; + +// 后续传入 Shader 的变量 +export const CameraUniform = { + ProjectionMatrix: 'u_ProjectionMatrix', + ViewMatrix: 'u_ViewMatrix', + ViewProjectionMatrix: 'u_ViewProjectionMatrix', + Zoom: 'u_Zoom', + ZoomScale: 'u_ZoomScale', + FocalDistance: 'u_FocalDistance', + CameraPosition: 'u_CameraPosition', +}; + +export interface IViewport { + syncWithMapCamera(mapCamera: Partial): void; + getProjectionMatrix(): number[]; + getViewMatrix(): number[]; + getViewMatrixUncentered(): number[]; + getViewProjectionMatrix(): number[]; + getZoom(): number; + getZoomScale(): number; + getFocalDistance(): number; + getCenter(): [number, number]; + projectFlat( + lngLat: [number, number], + scale?: number | undefined, + ): [number, number]; +} + +export interface ICameraService extends Omit { + init(): void; + update(viewport: IViewport): void; + getCameraPosition(): number[]; + setViewProjectionMatrix(viewProjectionMatrix: number[] | undefined): void; + jitterProjectionMatrix(x: number, y: number): void; + clearJitterProjectionMatrix(): void; +} diff --git a/packages/core/src/services/camera/Landmark.ts b/packages/core/src/services/camera/Landmark.ts new file mode 100644 index 0000000000..0279aa3a7e --- /dev/null +++ b/packages/core/src/services/camera/Landmark.ts @@ -0,0 +1,65 @@ +import { mat3, mat4, quat, vec3, vec4 } from 'gl-matrix'; +import Camera from './Camera'; + +/** + * 保存相机状态,便于后续在多个 Landmark 间移动 + */ +export default class Landmark { + public name: string; + + private matrix: mat4; + private right: vec3; + private up: vec3; + private forward: vec3; + private position: vec3; + private focalPoint: vec3; + private distanceVector: vec3; + private distance: number; + private dollyingStep: number; + private azimuth = 0; + private elevation = 0; + private roll = 0; + private relAzimuth = 0; + private relElevation = 0; + private relRoll = 0; + + constructor(name: string, c: Camera) { + this.name = name; + + this.matrix = mat4.clone(c.matrix); + this.right = vec3.clone(c.right); + this.up = vec3.clone(c.up); + this.forward = vec3.clone(c.forward); + this.position = vec3.clone(c.position); + this.focalPoint = vec3.clone(c.focalPoint); + this.distanceVector = vec3.clone(c.distanceVector); + + this.azimuth = c.azimuth; + this.elevation = c.elevation; + this.roll = c.roll; + this.relAzimuth = c.relAzimuth; + this.relElevation = c.relElevation; + this.relRoll = c.relRoll; + this.dollyingStep = c.dollyingStep; + this.distance = c.distance; + } + + public retrieve(c: Camera) { + c.matrix = mat4.copy(c.matrix, this.matrix); + c.right = vec3.copy(c.right, this.right); + c.up = vec3.copy(c.up, this.up); + c.forward = vec3.copy(c.forward, this.forward); + c.position = vec3.copy(c.position, this.position); + c.focalPoint = vec3.copy(c.focalPoint, this.focalPoint); + c.distanceVector = vec3.copy(c.distanceVector, this.distanceVector); + + c.azimuth = this.azimuth; + c.elevation = this.elevation; + c.roll = this.roll; + c.relAzimuth = this.relAzimuth; + c.relElevation = this.relElevation; + c.relRoll = this.relRoll; + c.dollyingStep = this.dollyingStep; + c.distance = this.distance; + } +} diff --git a/packages/core/src/services/component/ControlService.ts b/packages/core/src/services/component/ControlService.ts new file mode 100644 index 0000000000..f2024d4fe4 --- /dev/null +++ b/packages/core/src/services/component/ControlService.ts @@ -0,0 +1,77 @@ +import { DOM } from '@l7/utils'; +import { inject, injectable } from 'inversify'; +import { IMapService } from '../map/IMapService'; +import { + IControl, + IControlCorners, + IControlService, + IControlServiceCfg, +} from './IControlService'; + +@injectable() +export default class ControlService implements IControlService { + public container: HTMLElement; + public controlCorners: IControlCorners; + public controlContainer: HTMLElement; + private controls: IControl[] = []; + public init(cfg: IControlServiceCfg) { + this.destroy(); + this.container = cfg.container; + this.initControlPos(); + } + + public addControl(ctr: IControl, mapService: IMapService): void { + ctr.addTo(mapService); // scene对象 + this.controls.push(ctr); + } + public removeControl(ctr: IControl): this { + const index = this.controls.indexOf(ctr); + if (index > -1) { + this.controls.splice(index, 1); + } + ctr.remove(); + return this; + } + + public destroy(): void { + for (const ctr of this.controls) { + ctr.remove(); + } + this.controls = []; + this.clearControlPos(); + } + + private initControlPos() { + const corners: IControlCorners = (this.controlCorners = {}); + const l = 'l7-'; + const container = (this.controlContainer = DOM.create( + 'div', + l + 'control-container', + this.container, + )); + + function createCorner(vSide: string, hSide: string) { + const className = l + vSide + ' ' + l + hSide; + + corners[vSide + hSide] = DOM.create('div', className, container); + } + + createCorner('top', 'left'); + createCorner('top', 'right'); + createCorner('bottom', 'left'); + createCorner('bottom', 'right'); + } + + private clearControlPos() { + for (const i in this.controlCorners) { + if (this.controlCorners[i]) { + DOM.remove(this.controlCorners[i]); + } + } + if (this.controlContainer) { + DOM.remove(this.controlContainer); + } + delete this.controlCorners; + delete this.controlContainer; + } +} diff --git a/packages/core/src/services/component/IControlService.ts b/packages/core/src/services/component/IControlService.ts new file mode 100644 index 0000000000..2a86f66c41 --- /dev/null +++ b/packages/core/src/services/component/IControlService.ts @@ -0,0 +1,33 @@ +import { IMapService } from '../map/IMapService'; +export enum PositionType { + 'TOPRIGHT' = 'topright', + 'TOPLEFT' = 'topleft', + 'BOTTOMRIGHT' = 'bottomright', + 'BOTTOMLEFT' = 'bottomleft', +} +export interface IControlOption { + position: PositionType; +} +export interface IControlServiceCfg { + container: HTMLElement; +} +export interface IControlCorners { + [key: string]: HTMLElement; +} +export interface IControl { + setPosition(pos: PositionType): void; + addTo(map: IMapService): void; + onAdd(map: IMapService): HTMLElement; + hide(): void; + show(): void; + remove(): void; +} +export interface IControlService { + container: HTMLElement; + controlCorners: IControlCorners; + controlContainer: HTMLElement; + init(cfg: IControlServiceCfg): void; + addControl(ctr: IControl, map: IMapService): void; + removeControl(ctr: IControl): void; + destroy(): void; +} diff --git a/packages/core/src/services/component/IMarkerService.ts b/packages/core/src/services/component/IMarkerService.ts new file mode 100644 index 0000000000..a20a190a2e --- /dev/null +++ b/packages/core/src/services/component/IMarkerService.ts @@ -0,0 +1,13 @@ +import { ILngLat, IMapService } from '../map/IMapService'; +export interface IMarkerScene { + getMapService(): IMapService; + [key: string]: any; +} +export interface IMarker { + addTo(scene: IMarkerScene): void; + remove(): void; + setLnglat(lngLat: ILngLat): this; + getLnglat(): ILngLat; + getElement(): HTMLElement; + togglePopup(): this; +} diff --git a/packages/core/src/services/component/IPopUpService.ts b/packages/core/src/services/component/IPopUpService.ts new file mode 100644 index 0000000000..af4d3a1c36 --- /dev/null +++ b/packages/core/src/services/component/IPopUpService.ts @@ -0,0 +1,12 @@ +import { ILngLat, IMapService } from '../map/IMapService'; +import { IMarkerScene } from './IMarkerService'; +export interface IPopup { + addTo(scene: IMarkerScene): this; + remove(): void; + setLnglat(lngLat: ILngLat): this; + getLnglat(): ILngLat; + setHTML(html: string): this; + setText(text: string): this; + setMaxWidth(maxWidth: string): this; + isOpen(): boolean; +} diff --git a/packages/core/src/services/config/ConfigService.ts b/packages/core/src/services/config/ConfigService.ts new file mode 100644 index 0000000000..0cebe61a09 --- /dev/null +++ b/packages/core/src/services/config/ConfigService.ts @@ -0,0 +1,101 @@ +import Ajv from 'ajv'; +import { injectable } from 'inversify'; +import { IGlobalConfig, IGlobalConfigService } from './IConfigService'; + +const defaultGlobalConfig: Partial = { + type: 'amap', + zoom: 5, + center: [107.622, 39.266], + pitch: 0, + // minZoom: 3, + // maxZoom: 18, + colors: [ + 'rgb(103,0,31)', + 'rgb(178,24,43)', + 'rgb(214,96,77)', + 'rgb(244,165,130)', + 'rgb(253,219,199)', + 'rgb(247,247,247)', + 'rgb(209,229,240)', + 'rgb(146,197,222)', + 'rgb(67,147,195)', + 'rgb(33,102,172)', + 'rgb(5,48,97)', + ], + size: 10, + shape: 'circle', + scales: {}, + shape2d: [ + 'circle', + 'triangle', + 'square', + 'pentagon', + 'hexagon', + 'octogon', + 'hexagram', + 'rhombus', + 'vesica', + ], + shape3d: ['cylinder', 'triangleColumn', 'hexagonColumn', 'squareColumn'], +}; + +// @see https://github.com/epoberezkin/ajv#options +const ajv = new Ajv({ + allErrors: true, + verbose: true, +}); + +@injectable() +export default class GlobalConfigService implements IGlobalConfigService { + private config: Partial = defaultGlobalConfig; + + /** + * 保存每个 Layer 配置项的校验器 + */ + private layerConfigValidatorCache: { + [layerName: string]: Ajv.ValidateFunction; + } = {}; + + public getConfig() { + return this.config; + } + + public setAndCheckConfig(config: Partial) { + this.config = { + ...this.config, + ...config, + }; + // TODO: validate config with JSON schema + // @see https://github.com/webpack/schema-utils + return true; + } + + public reset() { + this.config = defaultGlobalConfig; + } + + public registerLayerConfigSchemaValidator(layerName: string, schema: object) { + if (!this.layerConfigValidatorCache[layerName]) { + this.layerConfigValidatorCache[layerName] = ajv.compile(schema); + } + } + + public validateLayerConfig(layerName: string, data: object) { + const validate = this.layerConfigValidatorCache[layerName]; + if (validate) { + const valid = validate(data); + if (!valid) { + return { + valid, + errors: validate.errors, + errorText: ajv.errorsText(validate.errors), + }; + } + } + return { + valid: true, + errors: null, + errorText: null, + }; + } +} diff --git a/packages/core/src/services/config/IConfigService.ts b/packages/core/src/services/config/IConfigService.ts new file mode 100644 index 0000000000..f0ac68d7bf --- /dev/null +++ b/packages/core/src/services/config/IConfigService.ts @@ -0,0 +1,21 @@ +import Ajv from 'ajv'; +import { ILayerGlobalConfig } from '../layer/ILayerService'; +import { IMapConfig } from '../map/IMapService'; +import { IRenderConfig } from '../renderer/IRendererService'; + +export type IGlobalConfig = IMapConfig & IRenderConfig & ILayerGlobalConfig; + +export interface IGlobalConfigService { + getConfig(): Partial; + setAndCheckConfig(config: Partial): boolean; + reset(): void; + registerLayerConfigSchemaValidator(layerName: string, schema: object): void; + validateLayerConfig( + layerName: string, + data: object, + ): { + valid: boolean; + errors: Ajv.ErrorObject[] | null | undefined; + errorText: string | null; + }; +} diff --git a/packages/core/src/services/config/__tests__/schema.spec.ts b/packages/core/src/services/config/__tests__/schema.spec.ts new file mode 100644 index 0000000000..565bad951b --- /dev/null +++ b/packages/core/src/services/config/__tests__/schema.spec.ts @@ -0,0 +1,57 @@ +import 'reflect-metadata'; +import ConfigService from '../ConfigService'; +import { IGlobalConfigService } from '../IConfigService'; + +describe('ConfigService', () => { + let configService: IGlobalConfigService; + + beforeEach(() => { + configService = new ConfigService(); + }); + + it("should validate layer's options according to JSON schema", () => { + configService.registerLayerConfigSchemaValidator('testLayer', { + properties: { + opacity: { + type: 'number', + minimum: 0, + maximum: 1, + }, + enablePicking: { + type: 'boolean', + }, + }, + }); + + const { valid, errorText } = configService.validateLayerConfig( + 'testLayer', + { opacity: 'invalid' }, + ); + expect(valid).toBeFalsy(); + expect(errorText).toMatch('opacity should be number'); + + expect( + configService.validateLayerConfig('testLayer', { + opacity: 1.5, + }).valid, + ).toBeFalsy(); + + expect( + configService.validateLayerConfig('testLayer', { + enablePicking: 1.5, + }).valid, + ).toBeFalsy(); + + expect( + configService.validateLayerConfig('testLayer', { + opacity: 1.0, + }).valid, + ).toBeTruthy(); + + expect( + configService.validateLayerConfig('testLayer', { + opacity: 0.0, + }).valid, + ).toBeTruthy(); + }); +}); diff --git a/packages/core/src/services/coordinate/CoordinateSystemService.ts b/packages/core/src/services/coordinate/CoordinateSystemService.ts new file mode 100644 index 0000000000..227aa8c7ad --- /dev/null +++ b/packages/core/src/services/coordinate/CoordinateSystemService.ts @@ -0,0 +1,186 @@ +import { mat4, vec4 } from 'gl-matrix'; +import { inject, injectable } from 'inversify'; +import { TYPES } from '../../types'; +import { getDistanceScales } from '../../utils/project'; +import { ICameraService } from '../camera/ICameraService'; +import { + CoordinateSystem, + ICoordinateSystemService, +} from './ICoordinateSystemService'; + +const VECTOR_TO_POINT_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]; + +@injectable() +export default class CoordinateSystemService + implements ICoordinateSystemService { + @inject(TYPES.ICameraService) + private readonly cameraService: ICameraService; + + /** + * 1. Web 墨卡托坐标系 + * 2. 偏移经纬度,用于解决高精度抖动问题 + * 3. 瓦片坐标,用于数据瓦片 + * 4. 常规世界坐标系,用于常规 2D/3D 可视化场景 + * 5. P20 坐标系,高德地图使用 + * @see https://yuque.antfin-inc.com/yuqi.pyq/fgetpa/doml91 + */ + private coordinateSystem: CoordinateSystem; + + /** + * 屏幕中心点 [lng, lat] + */ + private viewportCenter: [number, number]; + + /** + * 屏幕中心点的最终投影结果,在 CPU 侧计算后传入 Shader + * @see https://zhuanlan.zhihu.com/p/57469121 + */ + private viewportCenterProjection: [number, number, number, number]; + + /** + * 像素单位 -> 经纬度 [x, y, z] + */ + private pixelsPerDegree: [number, number, number]; + + /** + * 像素单位 -> 经纬度 [lng, lat] 使用泰勒级数展开 + * 通过墨卡托坐标系下的差值估计世界坐标系下的差值 + * @see https://zhuanlan.zhihu.com/p/57469121 + */ + private pixelsPerDegree2: [number, number, number]; + + /** + * 像素单位 -> 米 + */ + private pixelsPerMeter: [number, number, number]; + + /** + * 重新计算当前坐标系参数 + * TODO: 使用 memoize 缓存参数以及计算结果 + */ + public refresh(): void { + const zoom = this.cameraService.getZoom(); + const zoomScale = this.cameraService.getZoomScale(); + const center = this.cameraService.getCenter(); + + // 计算像素到米以及经纬度之间的转换 + const { pixelsPerMeter, pixelsPerDegree } = getDistanceScales({ + // longitude: center[0], + latitude: center[1], + zoom, + }); + this.viewportCenter = center; + this.viewportCenterProjection = [0, 0, 0, 0]; + this.pixelsPerMeter = pixelsPerMeter; + this.pixelsPerDegree = pixelsPerDegree; + this.pixelsPerDegree2 = [0, 0, 0]; + + if ( + this.coordinateSystem === CoordinateSystem.LNGLAT || + this.coordinateSystem === CoordinateSystem.P20 + ) { + // 继续使用相机服务计算的 VP 矩阵 + this.cameraService.setViewProjectionMatrix(undefined); + } else if (this.coordinateSystem === CoordinateSystem.LNGLAT_OFFSET) { + this.calculateLnglatOffset(center, zoom); + } else if (this.coordinateSystem === CoordinateSystem.P20_OFFSET) { + this.calculateLnglatOffset(center, zoom, zoomScale, true); + } + + // TODO: 判断是否应用瓦片 & 常规坐标系 + } + + public getCoordinateSystem(): CoordinateSystem { + return this.coordinateSystem; + } + + public setCoordinateSystem(coordinateSystem: CoordinateSystem) { + this.coordinateSystem = coordinateSystem; + } + + public getViewportCenter(): [number, number] { + return this.viewportCenter; + } + + public getViewportCenterProjection(): [number, number, number, number] { + return this.viewportCenterProjection; + } + + public getPixelsPerDegree(): [number, number, number] { + return this.pixelsPerDegree; + } + + public getPixelsPerDegree2(): [number, number, number] { + return this.pixelsPerDegree2; + } + + public getPixelsPerMeter(): [number, number, number] { + return this.pixelsPerMeter; + } + + private calculateLnglatOffset( + center: [number, number], + zoom: number, + scale?: number, + flipY?: boolean, + ) { + // http://uber-common.github.io/viewport-mercator-project/docs/api-reference/web-mercator-utils#code-classlanguage-textgetdistancescalesviewportcode + const { + pixelsPerMeter: ppm, + pixelsPerDegree: ppd, + pixelsPerDegree2, + } = getDistanceScales({ + // longitude: center[0], + latitude: center[1], + zoom, + scale, + flipY, + highPrecision: true, + }); + + let viewMatrix = this.cameraService.getViewMatrix(); + const projectionMatrix = this.cameraService.getProjectionMatrix(); + let viewProjectionMatrix = mat4.multiply( + ([] as unknown) as mat4, + (projectionMatrix as unknown) as mat4, + (viewMatrix as unknown) as mat4, + ); + + // 经纬度投影到 Web 墨卡托坐标系 + const positionPixels = this.cameraService.projectFlat( + [Math.fround(center[0]), Math.fround(center[1])], + Math.pow(2, zoom), + ); + + // Web 墨卡托坐标系通过 VP 矩阵变换到世界坐标系 + this.viewportCenterProjection = (vec4.transformMat4( + ([] as unknown) as vec4, + [positionPixels[0], positionPixels[1], 0.0, 1.0], + (viewProjectionMatrix as unknown) as mat4, + ) as unknown) as [number, number, number, number]; + + // Always apply uncentered projection matrix if available (shader adds center) + viewMatrix = this.cameraService.getViewMatrixUncentered() || viewMatrix; + + // Zero out 4th coordinate ("after" model matrix) - avoids further translations + viewProjectionMatrix = mat4.multiply( + ([] as unknown) as mat4, + (projectionMatrix as unknown) as mat4, + (viewMatrix as unknown) as mat4, + ); + viewProjectionMatrix = mat4.multiply( + ([] as unknown) as mat4, + viewProjectionMatrix, + (VECTOR_TO_POINT_MATRIX as unknown) as mat4, + ); + + // 重新计算相机 VP 矩阵 + this.cameraService.setViewProjectionMatrix( + (viewProjectionMatrix as unknown) as number[], + ); + + this.pixelsPerMeter = ppm; + this.pixelsPerDegree = ppd; + this.pixelsPerDegree2 = pixelsPerDegree2; + } +} diff --git a/packages/core/src/services/coordinate/ICoordinateSystemService.ts b/packages/core/src/services/coordinate/ICoordinateSystemService.ts new file mode 100644 index 0000000000..96b763777b --- /dev/null +++ b/packages/core/src/services/coordinate/ICoordinateSystemService.ts @@ -0,0 +1,41 @@ +/** + * 支持以下坐标系: + * 1. 经纬度 + * 2. 偏移经纬度,用于解决高精度抖动问题 + * 3. 瓦片坐标,用于数据瓦片 + * 4. 常规世界坐标系,用于常规 2D/3D 可视化场景 + * 5. P20 + * @see https://yuque.antfin-inc.com/yuqi.pyq/fgetpa/doml91 + */ + +// TODO:自动注入 Shader 中 +export enum CoordinateSystem { + LNGLAT = 1.0, + LNGLAT_OFFSET = 2.0, + VECTOR_TILE = 3.0, + IDENTITY = 4.0, + P20 = 5.0, + P20_OFFSET = 6.0, + METER_OFFSET = 7.0, +} + +// 后续传入 Shader 的变量 +export const CoordinateUniform = { + CoordinateSystem: 'u_CoordinateSystem', + ViewportCenter: 'u_ViewportCenter', + ViewportCenterProjection: 'u_ViewportCenterProjection', + PixelsPerDegree: 'u_PixelsPerDegree', + PixelsPerDegree2: 'u_PixelsPerDegree2', + PixelsPerMeter: 'u_PixelsPerMeter', +}; + +export interface ICoordinateSystemService { + refresh(): void; + getCoordinateSystem(): CoordinateSystem; + setCoordinateSystem(coordinateSystem: CoordinateSystem): void; + getViewportCenter(): [number, number]; + getViewportCenterProjection(): [number, number, number, number]; + getPixelsPerDegree(): [number, number, number]; + getPixelsPerDegree2(): [number, number, number]; + getPixelsPerMeter(): [number, number, number]; +} diff --git a/packages/core/src/services/interaction/IInteractionService.ts b/packages/core/src/services/interaction/IInteractionService.ts new file mode 100644 index 0000000000..df77a1d265 --- /dev/null +++ b/packages/core/src/services/interaction/IInteractionService.ts @@ -0,0 +1,14 @@ +export enum InteractionEvent { + Hover = 'hover', + Click = 'click', +} + +export interface IInteractionService { + init(): void; + destroy(): void; + on( + eventName: InteractionEvent, + callback: (params: { x: number; y: number }) => void, + ): void; + triggerHover({ x, y }: { x: number; y: number }): void; +} diff --git a/packages/core/src/services/interaction/InteractionService.ts b/packages/core/src/services/interaction/InteractionService.ts new file mode 100644 index 0000000000..b4a8d064b2 --- /dev/null +++ b/packages/core/src/services/interaction/InteractionService.ts @@ -0,0 +1,79 @@ +import EventEmitter from 'eventemitter3'; +import Hammer from 'hammerjs'; +import { inject, injectable } from 'inversify'; +import { TYPES } from '../../types'; +import { ILogService } from '../log/ILogService'; +import { IMapService } from '../map/IMapService'; +import { IInteractionService, InteractionEvent } from './IInteractionService'; + +/** + * 由于目前 L7 与地图结合的方案为双 canvas 而非共享 WebGL Context,事件监听注册在地图底图上。 + * 除此之外,后续如果支持非地图场景,事件监听就需要注册在 L7 canvas 上。 + */ +@injectable() +export default class InteractionService extends EventEmitter + implements IInteractionService { + @inject(TYPES.IMapService) + private readonly mapService: IMapService; + + @inject(TYPES.ILogService) + private readonly logger: ILogService; + + private hammertime: HammerManager; + + public init() { + // 注册事件在地图底图上 + this.clear(); + this.addEventListenerOnMap(); + } + + public destroy() { + if (this.hammertime) { + this.hammertime.destroy(); + } + this.removeEventListenerOnMap(); + this.off(InteractionEvent.Hover); + } + + public triggerHover({ x, y }: { x: number; y: number }) { + this.emit(InteractionEvent.Hover, { x, y }); + } + + private addEventListenerOnMap() { + const $containter = this.mapService.getMapContainer(); + if ($containter) { + const hammertime = new Hammer($containter); + hammertime.get('pan').set({ direction: Hammer.DIRECTION_ALL }); + hammertime.get('pinch').set({ enable: true }); + + // hammertime.on('panstart', this.onPanstart); + // hammertime.on('panmove', this.onPanmove); + // hammertime.on('panend', this.onPanend); + // hammertime.on('pinch', this.onPinch); + + $containter.addEventListener('mousemove', this.onHover); + this.hammertime = hammertime; + + // TODO: 根据场景注册事件到 L7 canvas 上 + this.logger.info('add event listeners on canvas'); + } + } + + private removeEventListenerOnMap() { + const $containter = this.mapService.getMapContainer(); + if ($containter) { + $containter.removeEventListener('mousemove', this.onHover); + } + } + + private onHover = ({ x, y }: MouseEvent) => { + this.emit(InteractionEvent.Hover, { x, y }); + }; + private clear() { + if (this.hammertime) { + this.hammertime.destroy(); + } + this.removeEventListenerOnMap(); + this.off(InteractionEvent.Hover); + } +} diff --git a/packages/core/src/services/layer/ILayerService.ts b/packages/core/src/services/layer/ILayerService.ts new file mode 100644 index 0000000000..16959dcdc3 --- /dev/null +++ b/packages/core/src/services/layer/ILayerService.ts @@ -0,0 +1,183 @@ +import { SyncBailHook, SyncHook } from 'tapable'; +import Clock from '../../utils/clock'; +import { IGlobalConfigService } from '../config/IConfigService'; +import { IModel, IModelInitializationOptions } from '../renderer/IModel'; +import { IMultiPassRenderer } from '../renderer/IMultiPassRenderer'; +import { IUniform } from '../renderer/IUniform'; +import { ISource, ISourceCFG } from '../source/ISourceService'; +import { + IAnimateOption, + IEncodeFeature, + IScale, + IScaleOptions, + IStyleAttributeService, + StyleAttrField, + StyleAttributeOption, + Triangulation, +} from './IStyleAttributeService'; + +export interface ILayerGlobalConfig { + colors: string[]; + size: number; + shape: string; + shape2d: string[]; + shape3d: string[]; + scales: { + [key: string]: IScale; + }; +} +export interface ILayerModelInitializationOptions { + moduleName: string; + vertexShader: string; + fragmentShader: string; + triangulation: Triangulation; +} +export interface ILayerModel { + render(): void; + getUninforms(): IModelUniform; + buildModels(): IModel[]; +} +export interface IModelUniform { + [key: string]: IUniform; +} + +export interface IPickedFeature { + x: number; + y: number; + lnglat?: { lng: number; lat: number }; + feature?: unknown; +} + +export interface ILayer { + id: string; // 一个场景中同一类型 Layer 可能存在多个 + name: string; // 代表 Layer 的类型 + visible: boolean; + zIndex: number; + minZoom: number; + maxZoom: number; + configService: IGlobalConfigService; + plugins: ILayerPlugin[]; + hooks: { + init: SyncBailHook; + beforeRender: SyncBailHook; + afterRender: SyncHook; + beforePickingEncode: SyncHook; + afterPickingEncode: SyncHook; + beforeHighlight: SyncHook<[number[]]>; + afterHighlight: SyncHook; + beforeDestroy: SyncHook; + afterDestroy: SyncHook; + }; + models: IModel[]; + sourceOption: { + data: any; + options?: ISourceCFG; + }; + multiPassRenderer: IMultiPassRenderer; + styleAttributeService: IStyleAttributeService; + buildLayerModel( + options: ILayerModelInitializationOptions & + Partial, + ): IModel; + init(): ILayer; + size(field: StyleAttrField, value?: StyleAttributeOption): ILayer; + color(field: StyleAttrField, value?: StyleAttributeOption): ILayer; + shape(field: StyleAttrField, value?: StyleAttributeOption): ILayer; + label(field: StyleAttrField, value?: StyleAttributeOption): ILayer; + animate(option: IAnimateOption): ILayer; + // pattern(field: string, value: StyleAttributeOption): ILayer; + // filter(field: string, value: StyleAttributeOption): ILayer; + // active(option: ActiveOption): ILayer; + style(options: unknown): ILayer; + hide(): ILayer; + show(): ILayer; + setIndex(index: number): ILayer; + isVisible(): boolean; + setMaxZoom(min: number): ILayer; + setMinZoom(max: number): ILayer; + // animate(field: string, option: any): ILayer; + render(): ILayer; + destroy(): void; + source(data: any, option?: ISourceCFG): ILayer; + addPlugin(plugin: ILayerPlugin): ILayer; + getSource(): ISource; + setSource(source: ISource): void; + setEncodedData(encodedData: IEncodeFeature[]): void; + getEncodedData(): IEncodeFeature[]; + getStyleOptions(): Partial; + getScaleOptions(): IScaleOptions; + /** + * 事件 + */ + on(type: string, hander: (...args: any[]) => void): void; + off(type: string, hander: (...args: any[]) => void): void; + once(type: string, hander: (...args: any[]) => void): void; + /** + * JSON Schema 用于校验配置项 + */ + getConfigSchemaForValidation(): object; + isDirty(): boolean; + /** + * 直接调用拾取方法,在非鼠标交互场景中使用 + */ + pick(query: { x: number; y: number }): void; +} + +/** + * Layer 插件 + */ +export interface ILayerPlugin { + apply(layer: ILayer): void; +} + +/** + * Layer 初始化参数 + */ +export interface ILayerInitializationOptions { + minZoom: number; + maxZoom: number; + visible: boolean; + zIndex: number; + enableMultiPassRenderer: boolean; + passes: Array; + + /** + * 开启拾取 + */ + enablePicking: boolean; + /** + * 开启高亮 + */ + enableHighlight: boolean; + /** + * 高亮颜色 + */ + highlightColor: string | number[]; + /** + * 开启 TAA + */ + enableTAA: boolean; + /** + * 相机抖动程度 + */ + jitterScale: number; + onHover(pickedFeature: IPickedFeature): void; + onClick(pickedFeature: IPickedFeature): void; +} + +/** + * 提供 Layer 管理服务 + */ +export interface ILayerService { + clock: Clock; + add(layer: ILayer): void; + initLayers(): void; + startAnimate(): void; + stopAnimate(): void; + getLayers(): ILayer[]; + getLayer(name: string): ILayer | undefined; + remove(layer: ILayer): void; + updateRenderOrder(): void; + renderLayers(): void; + destroy(): void; +} diff --git a/packages/core/src/services/layer/IStyleAttributeService.ts b/packages/core/src/services/layer/IStyleAttributeService.ts new file mode 100644 index 0000000000..c6584232b9 --- /dev/null +++ b/packages/core/src/services/layer/IStyleAttributeService.ts @@ -0,0 +1,192 @@ +import { + IAttribute, + IAttributeInitializationOptions, +} from '../renderer/IAttribute'; +import { IBufferInitializationOptions } from '../renderer/IBuffer'; +import { IElements } from '../renderer/IElements'; +import { IParseDataItem, IParserData } from '../source/ISourceService'; +import { ILayer } from './ILayerService'; + +/** + * 1. 提供各个 Layer 样式属性初始值的注册服务 + * 2. 当 Layer 通过 style() 改变某些样式属性时,需要感知并标记该属性已经失效, + * 随后当 Layer 重绘时通过 dirty 标记进行脏检查。重新传入 uniform 或者构建顶点数据(更新 Buffer 中的指定位置)。 + * @see https://yuque.antfin-inc.com/yuqi.pyq/fgetpa/qfuzg8 + */ + +export enum ScaleTypes { + LINEAR = 'linear', + POWER = 'power', + LOG = 'log', + IDENTITY = 'identity', + TIME = 'time', + QUANTILE = 'quantile', + QUANTIZE = 'quantize', + THRESHOLD = 'threshold', + CAT = 'cat', +} + +export interface IScale { + type: ScaleTypes; + ticks?: any[]; + nice?: boolean; + format?: () => any; + domain?: any[]; +} + +export enum StyleScaleType { + CONSTANT = 'constant', + VARIABLE = 'variable', +} +export interface IScaleOption { + field?: string; + type: ScaleTypes; + ticks?: any[]; + nice?: boolean; + format?: () => any; + domain?: any[]; +} +export interface IScaleOptions { + [key: string]: IScale; +} +export interface IStyleScale { + scale: any; + field: string; + type: StyleScaleType; + option: IScaleOption | undefined; +} +export enum AttributeType { + Attribute, + InstancedAttribute, + Uniform, +} + +export interface IAnimateOption { + enable: boolean; + interval?: number; + duration?: number; + trailLength?: number; +} + +export interface IEncodeFeature { + color?: Color; + size?: number | number[]; + shape?: string | number; + pattern?: string; + id?: number; + coordinates: Position | Position[] | Position[][]; + [key: string]: any; +} + +export interface IVertexAttributeDescriptor + extends Omit { + /** + * attribute name in vertex shader + */ + name: string; + /** + * 创建 buffer 的参数 + */ + buffer: IBufferInitializationOptions; + update?: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + normal: number[], + ) => number[]; +} + +type Position = number[]; +type Color = [number, number, number, number]; +type CallBack = (...args: any[]) => any; +export type StyleAttributeField = string | string[]; +export type StyleAttributeOption = string | number | boolean | any[] | CallBack; +export type StyleAttrField = string | string[] | number | number[]; + +export interface IStyleAttributeInitializationOptions { + name: string; + type: AttributeType; + scale?: { + field: StyleAttributeField; + values: unknown[]; + names: string[]; + type: StyleScaleType; + callback?: (...args: any[]) => []; + scalers?: Array<{ + field: string; + func: unknown; + }>; + }; + descriptor: IVertexAttributeDescriptor; +} + +export interface IFeatureRange { + startIndex: number; + endIndex: number; +} + +export interface IStyleAttribute extends IStyleAttributeInitializationOptions { + needRescale: boolean; + needRemapping: boolean; + needRegenerateVertices: boolean; + featureRange: IFeatureRange; + /** + * 保存渲染层 IAttribute 引用 + */ + vertexAttribute: IAttribute; + mapping?(...params: unknown[]): unknown[]; + setProps(props: Partial): void; +} + +export type Triangulation = ( + feature: IEncodeFeature, +) => { + vertices: number[]; + indices: number[]; + size: number; + normals?: number[]; +}; + +export interface IStyleAttributeUpdateOptions { + featureRange: IFeatureRange; +} + +export interface IStyleAttributeService { + // registerDefaultStyleOptions( + // layerName: string, + // options: ILayerStyleOptions, + // ): void; + registerStyleAttribute( + options: Partial, + ): IStyleAttribute; + updateStyleAttribute( + attributeName: string, + attributeOptions: Partial, + updateOptions: IStyleAttributeUpdateOptions, + ): void; + getLayerStyleAttributes(): IStyleAttribute[] | undefined; + getLayerStyleAttribute(attributeName: string): IStyleAttribute | undefined; + createAttributesAndIndices( + encodedFeatures: IEncodeFeature[], + triangulation: Triangulation, + ): { + attributes: { + [attributeName: string]: IAttribute; + }; + elements: IElements; + }; + /** + * 根据 feature range 更新指定属性 + */ + updateAttributeByFeatureRange( + attributeName: string, + features: IEncodeFeature[], + startFeatureIdx?: number, + endFeatureIdx?: number, + ): void; + /** + * 清除当前管理的所有属性 + */ + clearAllAttributes(): void; +} diff --git a/packages/core/src/services/layer/LayerService.ts b/packages/core/src/services/layer/LayerService.ts new file mode 100644 index 0000000000..9dafcc1356 --- /dev/null +++ b/packages/core/src/services/layer/LayerService.ts @@ -0,0 +1,118 @@ +import { inject, injectable } from 'inversify'; +import { container, ILayer } from '../..'; +import { TYPES } from '../../types'; +import Clock from '../../utils/clock'; +import { IGlobalConfigService } from '../config/IConfigService'; +import { IRendererService } from '../renderer/IRendererService'; +import { ILayerService } from './ILayerService'; + +@injectable() +export default class LayerService implements ILayerService { + public clock = new Clock(); + + private layers: ILayer[] = []; + + private layerRenderID: number; + + private animateInstanceCount: number = 0; + + @inject(TYPES.IRendererService) + private readonly renderService: IRendererService; + + @inject(TYPES.IGlobalConfigService) + private readonly configService: IGlobalConfigService; + + public add(layer: ILayer) { + this.layers.push(layer); + this.initPlugin(layer); + layer.init(); + } + + public initLayers() { + this.layers.forEach((layer) => { + // register plugins in every layer + for (const plugin of layer.plugins) { + plugin.apply(layer); + } + layer.init(); + }); + } + + public getLayers(): ILayer[] { + return this.layers; + } + + public getLayer(id: string): ILayer | undefined { + return this.layers.find((layer) => layer.id === id); + } + + public remove(layer: ILayer): void { + const layerIndex = this.layers.indexOf(layer); + if (layerIndex > -1) { + this.layers.splice(layerIndex, 1); + } + layer.destroy(); + this.renderLayers(); + } + + public renderLayers() { + // TODO:脏检查,只渲染发生改变的 Layer + // + this.clear(); + this.layers + .filter((layer) => layer.isVisible()) + .forEach((layer) => { + // trigger hooks + layer.hooks.beforeRender.call(); + layer.render(); + layer.hooks.afterRender.call(); + }); + } + + public updateRenderOrder() { + this.layers.sort((pre: ILayer, next: ILayer) => { + return pre.zIndex - next.zIndex; + }); + this.renderLayers(); + } + + public destroy() { + this.layers.forEach((layer) => layer.destroy()); + this.layers = []; + } + + public startAnimate() { + if (this.animateInstanceCount++ === 0) { + this.runRender(); + } + } + + public stopAnimate() { + if (--this.animateInstanceCount === 0) { + this.stopRender(); + } + } + + private initPlugin(layer: ILayer) { + for (const plugin of layer.plugins) { + plugin.apply(layer); + } + } + + private clear() { + this.renderService.clear({ + color: [0, 0, 0, 0], + depth: 1, + framebuffer: null, + }); + } + + private runRender() { + this.renderLayers(); + this.layerRenderID = requestAnimationFrame(this.renderLayers.bind(this)); + } + + private stopRender() { + cancelAnimationFrame(this.layerRenderID); + } +} diff --git a/packages/core/src/services/layer/StyleAttribute.ts b/packages/core/src/services/layer/StyleAttribute.ts new file mode 100644 index 0000000000..71b742d4da --- /dev/null +++ b/packages/core/src/services/layer/StyleAttribute.ts @@ -0,0 +1,83 @@ +import { isNil } from 'lodash'; +import { + IStyleAttribute, + StyleScaleType, +} from '../layer/IStyleAttributeService'; +import { IAttribute } from '../renderer/IAttribute'; +import { + AttributeType, + IEncodeFeature, + IFeatureRange, + IStyleAttributeInitializationOptions, + IStyleScale, + IVertexAttributeDescriptor, +} from './IStyleAttributeService'; + +export default class StyleAttribute implements IStyleAttribute { + public name: string; + public type: AttributeType; + public scale?: { + type: StyleScaleType.CONSTANT; + names: string[]; + field: string | string[]; + values: unknown[]; + callback?: (...args: any[]) => []; + scalers?: Array<{ + field: string; + func: unknown; + }>; + }; + public descriptor: IVertexAttributeDescriptor; + public featureBufferLayout: Array<{ + feature: IEncodeFeature; + featureIdx: number; + bufferOffset: number; + length: number; + }> = []; + + public needRescale: boolean = false; + public needRemapping: boolean = false; + public needRegenerateVertices: boolean = false; + public featureRange: IFeatureRange = { + startIndex: 0, + endIndex: Infinity, + }; + public vertexAttribute: IAttribute; + + constructor(options: Partial) { + this.setProps(options); + } + + public setProps(options: Partial) { + Object.assign(this, options); + } + + public mapping(params: unknown[]): unknown[] { + /** + * 当用户设置的 callback 返回 null 时, 应该返回默认 callback 中的值 + */ + if (this.scale?.callback) { + // 使用用户返回的值处理 + const ret = this.scale?.callback(params); + if (!isNil(ret)) { + return [ret]; + } + } + + // 没有 callback 或者用户 callback 返回值为空,则使用默认的逻辑处理 + return this.defaultCallback(params); + } + + private defaultCallback = (params: unknown[]): unknown[] => { + // 没有 params 的情况,是指没有指定 fields,直接返回配置的 values 常量 + if (params.length === 0) { + return this.scale?.values || []; + } + return params.map((param, idx) => { + const scaleFunc = this.scale?.scalers![idx].func; + // @ts-ignore + const value = scaleFunc(param); + return value; + }); + }; +} diff --git a/packages/core/src/services/layer/StyleAttributeService.ts b/packages/core/src/services/layer/StyleAttributeService.ts new file mode 100644 index 0000000000..94dbbe3ce4 --- /dev/null +++ b/packages/core/src/services/layer/StyleAttributeService.ts @@ -0,0 +1,292 @@ +import { inject, injectable } from 'inversify'; +import { TYPES } from '../../types'; +import { gl } from '../renderer/gl'; +import { IAttribute } from '../renderer/IAttribute'; +import { IElements } from '../renderer/IElements'; +import { IRendererService } from '../renderer/IRendererService'; +import { IParseDataItem } from '../source/ISourceService'; +import { ILayer } from './ILayerService'; +import { + IEncodeFeature, + IStyleAttribute, + IStyleAttributeInitializationOptions, + IStyleAttributeService, + IStyleAttributeUpdateOptions, + IVertexAttributeDescriptor, + Triangulation, +} from './IStyleAttributeService'; +import StyleAttribute from './StyleAttribute'; + +const bytesPerElementMap = { + [gl.FLOAT]: 4, + [gl.UNSIGNED_BYTE]: 1, + [gl.UNSIGNED_SHORT]: 2, +}; + +let counter = 0; + +/** + * 每个 Layer 都拥有一个,用于管理样式属性的注册和更新 + */ +@injectable() +export default class StyleAttributeService implements IStyleAttributeService { + @inject(TYPES.IRendererService) + private readonly rendererService: IRendererService; + + private attributes: IStyleAttribute[] = []; + + private c = counter++; + + private featureLayout: { + sizePerElement: number; + elements: Array<{ + featureIdx: number; + vertices: number[]; + normals: number[]; + offset: number; + }>; + } = { + sizePerElement: 0, + elements: [], + }; + + public registerStyleAttribute( + options: Partial, + ) { + let attributeToUpdate = this.getLayerStyleAttribute(options.name || ''); + if (attributeToUpdate) { + attributeToUpdate.setProps(options); + } else { + attributeToUpdate = new StyleAttribute(options); + this.attributes.push(attributeToUpdate); + } + return attributeToUpdate; + } + + public updateStyleAttribute( + attributeName: string, + options: Partial, + updateOptions?: Partial, + ) { + let attributeToUpdate = this.getLayerStyleAttribute(attributeName); + if (!attributeToUpdate) { + attributeToUpdate = this.registerStyleAttribute({ + ...options, + name: attributeName, + }); + } + const { scale } = options; + if (scale && attributeToUpdate) { + // TODO: 需要比较新旧值确定是否需要 rescale + // 需要重新 scale,肯定也需要重新进行数据映射 + attributeToUpdate.scale = scale; + attributeToUpdate.needRescale = true; + attributeToUpdate.needRemapping = true; + attributeToUpdate.needRegenerateVertices = true; + if (updateOptions && updateOptions.featureRange) { + attributeToUpdate.featureRange = updateOptions.featureRange; + } + } + } + + public getLayerStyleAttributes(): IStyleAttribute[] | undefined { + return this.attributes; + } + + public getLayerStyleAttribute( + attributeName: string, + ): IStyleAttribute | undefined { + return this.attributes.find( + (attribute) => attribute.name === attributeName, + ); + } + + public updateAttributeByFeatureRange( + attributeName: string, + features: IEncodeFeature[], + startFeatureIdx: number = 0, + endFeatureIdx?: number, + ) { + const attributeToUpdate = this.attributes.find( + (attribute) => attribute.name === attributeName, + ); + if (attributeToUpdate && attributeToUpdate.descriptor) { + const { descriptor } = attributeToUpdate; + const { update, buffer, size = 0 } = descriptor; + const bytesPerElement = bytesPerElementMap[buffer.type || gl.FLOAT]; + if (update) { + const { elements, sizePerElement } = this.featureLayout; + // 截取待更新的 feature 范围 + const featuresToUpdate = elements.slice(startFeatureIdx, endFeatureIdx); + + // [n, n] 中断更新 + if (!featuresToUpdate.length) { + return; + } + const { offset } = featuresToUpdate[0]; + // 以 byte 为单位计算 buffer 中的偏移 + const bufferOffsetInBytes = offset * size * bytesPerElement; + const updatedBufferData = featuresToUpdate + .map(({ featureIdx, vertices, normals }, attributeIdx) => { + const verticesNumForCurrentFeature = + vertices.length / sizePerElement; + const featureData: number[] = []; + for ( + let vertexIdx = 0; + vertexIdx < verticesNumForCurrentFeature; + vertexIdx++ + ) { + const normal = normals + ? normals!.slice(vertexIdx * 3, vertexIdx * 3 + 3) + : []; + featureData.push( + ...update( + features[featureIdx], + featureIdx, + vertices.slice( + vertexIdx * sizePerElement, + vertexIdx * sizePerElement + sizePerElement, + ), + attributeIdx, + normal, + ), + ); + } + return featureData; + }) + .reduce((prev, cur) => { + prev.push(...cur); + return prev; + }, []); + + // 更新底层 IAttribute 中包含的 IBuffer,使用 subdata + attributeToUpdate.vertexAttribute.updateBuffer({ + data: updatedBufferData, + offset: bufferOffsetInBytes, + }); + } + } + } + + public createAttributesAndIndices( + features: IEncodeFeature[], + triangulation: Triangulation, + ): { + attributes: { + [attributeName: string]: IAttribute; + }; + elements: IElements; + } { + const descriptors = this.attributes.map((attr) => attr.descriptor); + let verticesNum = 0; + const vertices: number[] = []; + const indices: number[] = []; + const normals: number[] = []; + let size = 3; + + features.forEach((feature, featureIdx) => { + // 逐 feature 进行三角化 + const { + indices: indicesForCurrentFeature, + vertices: verticesForCurrentFeature, + normals: normalsForCurrentFeature, + size: vertexSize, + } = triangulation(feature); + indices.push(...indicesForCurrentFeature.map((i) => i + verticesNum)); + vertices.push(...verticesForCurrentFeature); + if (normalsForCurrentFeature) { + normals.push(...normalsForCurrentFeature); + } + size = vertexSize; + const verticesNumForCurrentFeature = + verticesForCurrentFeature.length / vertexSize; + + // 记录三角化结果,用于后续精确更新指定 feature + this.featureLayout.sizePerElement = size; + this.featureLayout.elements.push({ + featureIdx, + vertices: verticesForCurrentFeature, + normals: normalsForCurrentFeature as number[], + offset: verticesNum, + }); + + verticesNum += verticesNumForCurrentFeature; + + // 根据 position 顶点生成其他顶点数据 + for ( + let vertexIdx = 0; + vertexIdx < verticesNumForCurrentFeature; + vertexIdx++ + ) { + descriptors.forEach((descriptor, attributeIdx) => { + if (descriptor && descriptor.update) { + const normal = + normalsForCurrentFeature?.slice( + vertexIdx * 3, + vertexIdx * 3 + 3, + ) || []; + (descriptor.buffer.data as number[]).push( + ...descriptor.update( + feature, + featureIdx, + verticesForCurrentFeature.slice( + vertexIdx * vertexSize, + vertexIdx * vertexSize + vertexSize, + ), + vertexIdx, // 当前顶点所在feature索引 + normal, + // TODO: 传入顶点索引 vertexIdx + ), + ); + } // end if + }); // end for each + } // end for + }); // end features for Each + const { + createAttribute, + createBuffer, + createElements, + } = this.rendererService; + + const attributes: { + [attributeName: string]: IAttribute; + } = {}; + descriptors.forEach((descriptor, attributeIdx) => { + if (descriptor) { + // IAttribute 参数透传 + const { buffer, update, name, ...rest } = descriptor; + + const vertexAttribute = createAttribute({ + // IBuffer 参数透传 + buffer: createBuffer(buffer), + ...rest, + }); + attributes[descriptor.name || ''] = vertexAttribute; + + // 在 StyleAttribute 上保存对 VertexAttribute 的引用 + this.attributes[attributeIdx].vertexAttribute = vertexAttribute; + } + }); + + const elements = createElements({ + data: indices, + type: gl.UNSIGNED_INT, + count: indices.length, + }); + + return { + attributes, + elements, + }; + } + + public clearAllAttributes() { + // 销毁关联的 vertex attribute buffer objects + this.attributes.forEach((attribute) => { + if (attribute.vertexAttribute) { + attribute.vertexAttribute.destroy(); + } + }); + this.attributes = []; + } +} diff --git a/packages/core/src/services/log/ILogService.ts b/packages/core/src/services/log/ILogService.ts new file mode 100644 index 0000000000..6532d5a8e1 --- /dev/null +++ b/packages/core/src/services/log/ILogService.ts @@ -0,0 +1,5 @@ +export interface ILogService { + error(message: string): void; + warn(message: string): void; + info(message: string): void; +} diff --git a/packages/core/src/services/log/LogService.ts b/packages/core/src/services/log/LogService.ts new file mode 100644 index 0000000000..92c739bc20 --- /dev/null +++ b/packages/core/src/services/log/LogService.ts @@ -0,0 +1,20 @@ +import { injectable } from 'inversify'; +import { Log } from 'probe.gl'; +import { ILogService } from './ILogService'; + +const Logger = new Log({ id: 'L7' }).enable(false); + +@injectable() +export default class LogService implements ILogService { + public error(message: string): void { + Logger.error(message)(); + } + + public warn(message: string): void { + Logger.warn(message)(); + } + + public info(message: string): void { + Logger.info(message)(); + } +} diff --git a/packages/core/src/services/map/IMapService.ts b/packages/core/src/services/map/IMapService.ts new file mode 100644 index 0000000000..2f97133edb --- /dev/null +++ b/packages/core/src/services/map/IMapService.ts @@ -0,0 +1,143 @@ +import { Map } from 'mapbox-gl'; +import { IViewport } from '../camera/ICameraService'; +export type Point = [number, number]; +export type Bounds = [[number, number], [number, number]]; +export interface ILngLat { + lng: number; + lat: number; +} +export interface IPoint { + x: number; + y: number; +} +export interface IMapService { + map: AMap.Map | Map; + init(config: Partial): void; + destroy(): void; + onCameraChanged(callback: (viewport: IViewport) => void): void; + // init map + addMarkerContainer(): void; + getMarkerContainer(): HTMLElement; + // MapEvent // 定义事件类型 + + on(type: string, handler: (...args: any[]) => void): void; + off(type: string, handler: (...args: any[]) => void): void; + once(type: string, handler: (...args: any[]) => void): void; + // get dom + getContainer(): HTMLElement | null; + getSize(): [number, number]; + // get map status method + getMinZoom(): number; + getMaxZoom(): number; + // get map params + getType(): MapType; + getZoom(): number; + getCenter(): ILngLat; + getPitch(): number; + getRotation(): number; + getBounds(): Bounds; + getMapContainer(): HTMLElement | null; + + // control with raw map + setRotation(rotation: number): void; + zoomIn(): void; + zoomOut(): void; + panTo(p: Point): void; + panBy(pixel: Point): void; + fitBounds(bound: Bounds): void; + setZoomAndCenter(zoom: number, center: Point): void; + setMapStyle(style: string): void; + + // coordinates methods + pixelToLngLat(pixel: Point): ILngLat; + lngLatToPixel(lnglat: Point): IPoint; + containerToLngLat(pixel: Point): ILngLat; + lngLatToContainer(lnglat: Point): IPoint; +} + +export enum MapType { + amap = 'amap', + mapbox = 'mapbox', +} + +export const MapServiceEvent = ['mapload']; + +/** + * 地图初始化配置项 + */ +export interface IMapConfig { + type: MapType | keyof typeof MapType; + + /** + * 容器 DOM id + */ + id: string; + + /** + * 地图 + */ + token?: string; + + /** + * 中心点 + */ + center?: [number, number]; + + /** + * 地图倾角 + */ + pitch?: number; + + /** + * 地图旋转角度 + */ + rotation?: number; + + /** + * 缩放等级 + */ + zoom?: number; + + /** + * 底图样式 + */ + style?: string; + /** + * 最小缩放等级 + */ + minZoom?: number; + + /** + * 最大缩放等级 + */ + maxZoom?: number; + + attributionControl?: boolean; +} + +/** + * 地图相机参数 + * @see + */ +export interface IMapCamera { + // Perspective 相机常规参数 + // @see https://threejs.org/docs/#api/en/cameras/PerspectiveCamera + aspect: number; + fov: number; + near: number; + far: number; + + viewportWidth: number; + viewportHeight: number; + + // 地图相机特有参数 + // @see https://docs.mapbox.com/mapbox-gl-js/api/#map + pitch: number; + bearing: number; + zoom: number; + center: [number, number]; + // 相机高度 + cameraHeight: number; + // 偏移原点,例如 P20 坐标系下 + offsetOrigin: [number, number]; +} diff --git a/packages/core/src/services/renderer/IAttribute.ts b/packages/core/src/services/renderer/IAttribute.ts new file mode 100644 index 0000000000..ac99d6ba09 --- /dev/null +++ b/packages/core/src/services/renderer/IAttribute.ts @@ -0,0 +1,36 @@ +import { IBuffer } from './IBuffer'; + +export interface IAttributeInitializationOptions { + buffer: IBuffer; + + /** + * vertexAttribPointer 单位为 byte,默认值均为 0 + */ + offset?: number; + stride?: number; + + /** + * 每个顶点数据块大小,取值范围为 [1..4] + */ + size?: number; + + /** + * 是否需要归一化 [-1,1] 或者 [0,1],默认值 false + */ + normalized?: boolean; + + /** + * gl.vertexAttribDivisorANGLE,自动开启 ANGLE_instanced_arrays 扩展 + */ + divisor?: number; +} + +export interface IAttribute { + updateBuffer(options: { + // 用于替换的数据 + data: number[] | number[][] | Uint8Array | Uint16Array | Uint32Array; + // 原 Buffer 替换位置,单位为 byte + offset: number; + }): void; + destroy(): void; +} diff --git a/packages/core/src/services/renderer/IBuffer.ts b/packages/core/src/services/renderer/IBuffer.ts new file mode 100644 index 0000000000..60d47352c4 --- /dev/null +++ b/packages/core/src/services/renderer/IBuffer.ts @@ -0,0 +1,39 @@ +import { gl } from './gl'; + +export interface IBufferInitializationOptions { + data: + | number[] + | number[][] + | Uint8Array + | Uint16Array + | Uint32Array + | Float32Array; + + /** + * gl.DRAW_STATIC | gl.DYNAMIC_DRAW | gl.STREAM_DRAW + */ + usage?: gl.STATIC_DRAW | gl.DYNAMIC_DRAW | gl.STREAM_DRAW; + + /** + * gl.Float | gl.UNSIGNED_BYTE | ... + */ + type?: gl.FLOAT | gl.UNSIGNED_BYTE; + length?: number; +} + +export interface IBuffer { + /** + * gl.bufferSubData + */ + subData(options: { + // 用于替换的数据 + data: number[] | number[][] | Uint8Array | Uint16Array | Uint32Array; + // 原 Buffer 替换位置,单位为 byte + offset: number; + }): void; + + /** + * gl.deleteBuffer + */ + destroy(): void; +} diff --git a/packages/core/src/services/renderer/IElements.ts b/packages/core/src/services/renderer/IElements.ts new file mode 100644 index 0000000000..a1b9402958 --- /dev/null +++ b/packages/core/src/services/renderer/IElements.ts @@ -0,0 +1,42 @@ +import { gl } from './gl'; + +export interface IElementsInitializationOptions { + data: number[] | number[][] | Uint8Array | Uint16Array | Uint32Array; + + /** + * gl.DRAW_STATIC | gl.DYNAMIC_DRAW | gl.STREAM_DRAW + */ + usage?: gl; + + /** + * gl.UNSIGNED_BYTE | gl.UNSIGNED_SHORT | gl.UNSIGNED_INT(开启 OES_element_index_uint 扩展) + */ + type?: gl.UNSIGNED_BYTE | gl.UNSIGNED_SHORT | gl.UNSIGNED_INT; + length?: number; + primitive?: + | gl.POINTS + | gl.LINES + | gl.LINE_STRIP + | gl.LINE_LOOP + | gl.TRIANGLES + | gl.TRIANGLE_STRIP + | gl.TRIANGLE_FAN; + count?: number; +} + +export interface IElements { + /** + * gl.bufferSubData + */ + subData(options: { + // 用于替换的数据 + data: number[] | number[][] | Uint8Array | Uint16Array | Uint32Array; + // 原 Buffer 替换位置,单位为 byte + offset: number; + }): void; + + /** + * gl.deleteBuffer + */ + destroy(): void; +} diff --git a/packages/core/src/services/renderer/IFramebuffer.ts b/packages/core/src/services/renderer/IFramebuffer.ts new file mode 100644 index 0000000000..ef6b043750 --- /dev/null +++ b/packages/core/src/services/renderer/IFramebuffer.ts @@ -0,0 +1,35 @@ +import { IRenderbuffer } from './IRenderbuffer'; +import { ITexture2D } from './ITexture2D'; + +export interface IFramebufferInitializationOptions { + width?: number; + height?: number; + + /** + * 布尔值用于开关 depth attachment, + * 同时也支持 attach 一个 Texture2D 或者 RenderBuffer + */ + depth?: boolean | ITexture2D | IRenderbuffer; + + /** + * 布尔值用于开关 color attachment, + * 同时也支持 attach 一个/一组 Texture2D 或者 RenderBuffer + */ + color?: boolean | ITexture2D | IRenderbuffer; + colors?: Array; + + /** + * 布尔值用于开关 depth attachment, + * 同时也支持 attach 一个 RenderBuffer + */ + stencil?: boolean | IRenderbuffer; +} + +export interface IFramebuffer { + resize(options: { width: number; height: number }): void; + + /** + * gl.deleteRenderbuffer + */ + destroy(): void; +} diff --git a/packages/core/src/services/renderer/IModel.ts b/packages/core/src/services/renderer/IModel.ts new file mode 100644 index 0000000000..280491fc2d --- /dev/null +++ b/packages/core/src/services/renderer/IModel.ts @@ -0,0 +1,199 @@ +import { gl } from './gl'; +import { IAttribute } from './IAttribute'; +import { IElements } from './IElements'; +import { IUniform } from './IUniform'; + +type stencilOp = + | gl.ZERO + | gl.KEEP + | gl.REPLACE + | gl.INVERT + | gl.INCR + | gl.DECR + | gl.INCR_WRAP + | gl.DECR_WRAP; + +export interface IModelInitializationOptions { + /** + * Shader 字符串,假设此时已经经过 ShaderLib 处理 + */ + vs: string; + fs: string; + + uniforms?: { + [key: string]: IUniform; + }; + + attributes: { + [key: string]: IAttribute; + }; + + /** + * gl.POINTS | gl.TRIANGLES | ... + * 默认值 gl.TRIANGLES + */ + primitive?: + | gl.POINTS + | gl.LINES + | gl.LINE_LOOP + | gl.LINE_STRIP + | gl.TRIANGLES + | gl.TRIANGLE_FAN + | gl.TRIANGLE_STRIP; + // 绘制的顶点数目 + count?: number; + // 默认值为 0 + offset?: number; + + /** + * gl.drawElements + */ + elements?: IElements; + /** + * 绘制实例数目 + */ + instances?: number; + + colorMask?: [boolean, boolean, boolean, boolean]; + + /** + * depth buffer + */ + depth?: Partial<{ + // gl.enable(gl.DEPTH_TEST) + enable: boolean; + // gl.depthMask + mask: boolean; + // gl.depthFunc + func: + | gl.NEVER + | gl.ALWAYS + | gl.LESS + | gl.LEQUAL + | gl.GREATER + | gl.GEQUAL + | gl.EQUAL + | gl.NOTEQUAL; + // gl.depthRange + range: [0, 1]; + }>; + + /** + * blending + */ + blend?: Partial<{ + // gl.enable(gl.BLEND) + enable: boolean; + // gl.blendFunc + func: Partial<{ + srcRGB: + | gl.ZERO + | gl.ONE + | gl.SRC_COLOR + | gl.ONE_MINUS_SRC_COLOR + | gl.SRC_ALPHA + | gl.ONE_MINUS_SRC_ALPHA + | gl.DST_COLOR + | gl.ONE_MINUS_DST_COLOR + | gl.DST_ALPHA + | gl.ONE_MINUS_DST_ALPHA + | gl.CONSTANT_COLOR + | gl.ONE_MINUS_CONSTANT_COLOR + | gl.CONSTANT_ALPHA + | gl.ONE_MINUS_CONSTANT_ALPHA + | gl.SRC_ALPHA_SATURATE; + srcAlpha: number; + dstRGB: + | gl.ZERO + | gl.ONE + | gl.SRC_COLOR + | gl.ONE_MINUS_SRC_COLOR + | gl.SRC_ALPHA + | gl.ONE_MINUS_SRC_ALPHA + | gl.DST_COLOR + | gl.ONE_MINUS_DST_COLOR + | gl.DST_ALPHA + | gl.ONE_MINUS_DST_ALPHA + | gl.CONSTANT_COLOR + | gl.ONE_MINUS_CONSTANT_COLOR + | gl.CONSTANT_ALPHA + | gl.ONE_MINUS_CONSTANT_ALPHA + | gl.SRC_ALPHA_SATURATE; + dstAlpha: number; + }>; + // gl.blendEquation + equation: { + // TODO: EXT_blend_minmax + rgb: gl.FUNC_ADD | gl.FUNC_SUBTRACT | gl.FUNC_REVERSE_SUBTRACT; + alpha: gl.FUNC_ADD | gl.FUNC_SUBTRACT | gl.FUNC_REVERSE_SUBTRACT; + }; + // gl.blendColor + color: [number, number, number, number]; + }>; + + /** + * stencil + */ + stencil?: { + // gl.enable(gl.STENCIL_TEST) + enable: boolean; + // gl.stencilMask + mask: number; + func: { + cmp: + | gl.NEVER + | gl.ALWAYS + | gl.LESS + | gl.LEQUAL + | gl.GREATER + | gl.GEQUAL + | gl.EQUAL + | gl.NOTEQUAL; + ref: number; + mask: number; + }; + opFront: { + fail: stencilOp; + zfail: stencilOp; + zpass: stencilOp; + }; + opBack: { + fail: stencilOp; + zfail: stencilOp; + zpass: stencilOp; + }; + }; + + /** + * cull + */ + cull?: { + // gl.enable(gl.CULL_FACE) + enable: boolean; + // gl.cullFace + face: gl.FRONT | gl.BACK; + }; +} + +export interface IModelDrawOptions { + uniforms?: { + [key: string]: IUniform; + }; + + attributes?: { + [key: string]: IAttribute; + }; +} + +/** + * 类似 THREE.Mesh,不同之处在于可以不依赖 THREE.Scene,单独执行封装的渲染命令。 + * 这些命令包括: + * * 执行 Shader Program + * * 开启/控制 WebGL 状态(gl.enable)例如 depth/stencil buffer、blending、cull 等 + * * 销毁资源,例如 buffer texture 等 + */ +export interface IModel { + addUniforms(uniforms: { [key: string]: IUniform }): void; + draw(options: IModelDrawOptions): void; + destroy(): void; +} diff --git a/packages/core/src/services/renderer/IMultiPassRenderer.ts b/packages/core/src/services/renderer/IMultiPassRenderer.ts new file mode 100644 index 0000000000..c934f0e717 --- /dev/null +++ b/packages/core/src/services/renderer/IMultiPassRenderer.ts @@ -0,0 +1,56 @@ +import { ILayer } from '../layer/ILayerService'; +import { IFramebuffer } from './IFramebuffer'; + +export enum PassType { + Normal = 'normal', + PostProcessing = 'post-processing', +} + +/** + * Pass 分两类: + * 1. 渲染相关 eg. ClearPass、RenderPass、PickingPass、ShadowPass + * 2. PostProcessing eg. CopyPass、BlurPass + * 另外考虑到 Pass 之间严格的执行顺序,render 方法必须是异步的 + */ +export interface IPass { + getName(): string; + getType(): PassType; + init(layer: ILayer, config?: Partial): void; + render(layer: ILayer): void; +} + +/** + * PostProcessing,自动切换 renderTarget + * 例如最后一个 PostProcessingPass 自动切换 renderTarget 为屏幕 + */ +export interface IPostProcessingPass + extends IPass { + setRenderToScreen(renderToScreen: boolean): void; + isEnabled(): boolean; + setEnabled(enabled: boolean): void; + updateOptions(config: Partial): void; +} + +export interface IPostProcessor { + getReadFBO(): IFramebuffer; + getWriteFBO(): IFramebuffer; + resize(viewportWidth: number, viewportHeight: number): void; + add( + pass: IPostProcessingPass, + layer: ILayer, + config?: Partial, + ): void; + render(layer: ILayer): Promise; + getPostProcessingPassByName( + name: string, + ): IPostProcessingPass | undefined; +} + +export interface IMultiPassRenderer { + getPostProcessor(): IPostProcessor; + resize(viewportWidth: number, viewportHeight: number): void; + add(pass: IPass): void; + render(): void; + getRenderFlag(): boolean; + setRenderFlag(enabled: boolean): void; +} diff --git a/packages/core/src/services/renderer/IRenderbuffer.ts b/packages/core/src/services/renderer/IRenderbuffer.ts new file mode 100644 index 0000000000..06cc32ff59 --- /dev/null +++ b/packages/core/src/services/renderer/IRenderbuffer.ts @@ -0,0 +1,26 @@ +import { gl } from './gl'; + +export interface IRenderbufferInitializationOptions { + width: number; + height: number; + + /** + * gl.RGBA4 | gl.DEPTH_COMPONENT16... + */ + format: + | gl.RGBA4 + | gl.RGB565 + | gl.RGB5_A1 + | gl.DEPTH_COMPONENT16 + | gl.STENCIL_INDEX8 + | gl.DEPTH_STENCIL; +} + +export interface IRenderbuffer { + resize(options: { width: number; height: number }): void; + + /** + * gl.deleteRenderbuffer + */ + destroy(): void; +} diff --git a/packages/core/src/services/renderer/IRendererService.ts b/packages/core/src/services/renderer/IRendererService.ts new file mode 100644 index 0000000000..d0f09b2d06 --- /dev/null +++ b/packages/core/src/services/renderer/IRendererService.ts @@ -0,0 +1,60 @@ +import { ILayer } from '../layer/ILayerService'; +import { IAttribute, IAttributeInitializationOptions } from './IAttribute'; +import { IBuffer, IBufferInitializationOptions } from './IBuffer'; +import { IElements, IElementsInitializationOptions } from './IElements'; +import { + IFramebuffer, + IFramebufferInitializationOptions, +} from './IFramebuffer'; +import { IModel, IModelInitializationOptions } from './IModel'; +import { IMultiPassRenderer, IPass } from './IMultiPassRenderer'; +import { ITexture2D, ITexture2DInitializationOptions } from './ITexture2D'; + +export interface IRenderConfig { + /** + * 是否开启 multi pass + */ + enableMultiPassRenderer?: boolean; + passes?: Array>; +} + +export interface IClearOptions { + // gl.clearColor + color?: [number, number, number, number]; + // gl.clearDepth 默认值为 1 + depth?: number; + // gl.clearStencil 默认值为 0 + stencil?: number; + // gl.bindFrameBuffer + framebuffer?: IFramebuffer | null; +} + +export interface IReadPixelsOptions { + x: number; + y: number; + width: number; + height: number; + // gl.bindFrameBuffer + framebuffer?: IFramebuffer; + data?: Uint8Array; +} + +export interface IRendererService { + init($container: HTMLDivElement): Promise; + clear(options: IClearOptions): void; + createModel(options: IModelInitializationOptions): IModel; + createAttribute(options: IAttributeInitializationOptions): IAttribute; + createBuffer(options: IBufferInitializationOptions): IBuffer; + createElements(options: IElementsInitializationOptions): IElements; + createTexture2D(options: ITexture2DInitializationOptions): ITexture2D; + createFramebuffer(options: IFramebufferInitializationOptions): IFramebuffer; + useFramebuffer( + framebuffer: IFramebuffer | null, + drawCommands: () => void, + ): void; + getViewportSize(): { width: number; height: number }; + getContainer(): HTMLElement | null; + viewport(size: { x: number; y: number; width: number; height: number }): void; + readPixels(options: IReadPixelsOptions): Uint8Array; + destroy(): void; +} diff --git a/packages/core/src/services/renderer/ITexture2D.ts b/packages/core/src/services/renderer/ITexture2D.ts new file mode 100644 index 0000000000..a10da7566c --- /dev/null +++ b/packages/core/src/services/renderer/ITexture2D.ts @@ -0,0 +1,103 @@ +import { gl } from './gl'; + +export interface ITexture2DInitializationOptions { + /** + * 纹理尺寸 + */ + width: number; + height: number; + + /** + * 纹理格式 + * @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texImage2D + */ + format?: + | gl.ALPHA + | gl.LUMINANCE + | gl.LUMINANCE_ALPHA + | gl.RGB + | gl.RGBA + | gl.RGBA4 + | gl.RGB5_A1 + | gl.RGB565 + | gl.DEPTH_COMPONENT + | gl.DEPTH_STENCIL; + + /** + * 纹理数据类型,可能需要引入扩展,例如 ext.HALF_FLOAT_OES + */ + type?: gl.UNSIGNED_BYTE | gl.UNSIGNED_SHORT | gl.UNSIGNED_INT | gl.FLOAT; + + /** + * 纹理 pixel source + */ + data?: + | undefined + | HTMLCanvasElement + | HTMLImageElement + | number[] + | number[][] + | Uint8Array + | Uint16Array + | Uint32Array + | Uint8ClampedArray; + + /** + * 纹理参数 + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/WebGLRenderingContext/texParameter + */ + /* Sets magnification filter. Default: 'nearest' */ + mag?: gl.NEAREST | gl.LINEAR; + /* Sets minification filter. Default: 'nearest' */ + min?: + | gl.NEAREST + | gl.LINEAR + | gl.LINEAR_MIPMAP_LINEAR + | gl.NEAREST_MIPMAP_LINEAR + | gl.LINEAR_MIPMAP_NEAREST + | gl.NEAREST_MIPMAP_NEAREST; + /* Sets wrap mode on S axis. Default: 'clamp' */ + wrapS?: gl.REPEAT | gl.CLAMP_TO_EDGE | gl.MIRRORED_REPEAT; + /* Sets wrap mode on T axis. Default: 'clamp' */ + wrapT?: gl.REPEAT | gl.CLAMP_TO_EDGE | gl.MIRRORED_REPEAT; + aniso?: number; + + /** + * 以下为 gl.pixelStorei 参数 + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/WebGLRenderingContext/pixelStorei + */ + /* Flips textures vertically when uploading. Default: false */ + flipY?: boolean; + /* Sets unpack alignment per row. 1, 2, 4, 8 Default: 1 */ + alignment?: 1 | 2 | 4 | 8; + /* Premultiply alpha when unpacking. Default: false */ + premultiplyAlpha?: boolean; + /* color space flag for pixel unpacking. gl.BROWSER_DEFAULT_WEBGL | gl.NONE */ + colorSpace?: gl.NONE | gl.BROWSER_DEFAULT_WEBGL; + + mipmap?: boolean | gl.DONT_CARE | gl.NICEST | gl.FASTEST; +} + +export interface ITexture2D { + resize(options: { width: number; height: number }): void; + + /** + * 写入 subimage + * gl.texSubImage2D gl.copyTexSubImage2D + */ + // subImageData(options: { + // pixels, + // x, + // y, + // width, + // height, + // level, + // type, + // format + // }); + + /** + * gl.deleteTexture + */ + destroy(): void; +} diff --git a/packages/core/src/services/renderer/IUniform.ts b/packages/core/src/services/renderer/IUniform.ts new file mode 100644 index 0000000000..965c740917 --- /dev/null +++ b/packages/core/src/services/renderer/IUniform.ts @@ -0,0 +1,4 @@ +import { IFramebuffer } from './IFramebuffer'; +import { ITexture2D } from './ITexture2D'; + +export type IUniform = number | number[] | boolean | IFramebuffer | ITexture2D; diff --git a/packages/core/src/services/renderer/gl.ts b/packages/core/src/services/renderer/gl.ts new file mode 100644 index 0000000000..37bdcd96b4 --- /dev/null +++ b/packages/core/src/services/renderer/gl.ts @@ -0,0 +1,422 @@ +/** + * WebGL 枚举值 + * @see http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14 + * 使用 babel 插件对常量进行内联,以减少最终打包产物大小 + * @see https://github.com/uber/deck.gl/blob/7.1-release/dev-docs/roadmaps/dist-size-roadmap.md#inline-gl-constants + */ +export enum gl { + /* ClearBufferMask */ + DEPTH_BUFFER_BIT = 0x00000100, + STENCIL_BUFFER_BIT = 0x00000400, + COLOR_BUFFER_BIT = 0x00004000, + + /* BeginMode */ + POINTS = 0x0000, + LINES = 0x0001, + LINE_LOOP = 0x0002, + LINE_STRIP = 0x0003, + TRIANGLES = 0x0004, + TRIANGLE_STRIP = 0x0005, + TRIANGLE_FAN = 0x0006, + + /* AlphaFunction (not supported in ES20) */ + /* NEVER */ + /* LESS */ + /* EQUAL */ + /* LEQUAL */ + /* GREATER */ + /* NOTEQUAL */ + /* GEQUAL */ + /* ALWAYS */ + + /* BlendingFactorDest */ + ZERO = 0, + ONE = 1, + SRC_COLOR = 0x0300, + ONE_MINUS_SRC_COLOR = 0x0301, + SRC_ALPHA = 0x0302, + ONE_MINUS_SRC_ALPHA = 0x0303, + DST_ALPHA = 0x0304, + ONE_MINUS_DST_ALPHA = 0x0305, + + /* BlendingFactorSrc */ + /* ZERO */ + /* ONE */ + DST_COLOR = 0x0306, + ONE_MINUS_DST_COLOR = 0x0307, + SRC_ALPHA_SATURATE = 0x0308, + /* SRC_ALPHA */ + /* ONE_MINUS_SRC_ALPHA */ + /* DST_ALPHA */ + /* ONE_MINUS_DST_ALPHA */ + + /* BlendEquationSeparate */ + FUNC_ADD = 0x8006, + BLEND_EQUATION = 0x8009, + BLEND_EQUATION_RGB = 0x8009 /* same as BLEND_EQUATION */, + BLEND_EQUATION_ALPHA = 0x883d, + + /* BlendSubtract */ + FUNC_SUBTRACT = 0x800a, + FUNC_REVERSE_SUBTRACT = 0x800b, + + /* Separate Blend Functions */ + BLEND_DST_RGB = 0x80c8, + BLEND_SRC_RGB = 0x80c9, + BLEND_DST_ALPHA = 0x80ca, + BLEND_SRC_ALPHA = 0x80cb, + CONSTANT_COLOR = 0x8001, + ONE_MINUS_CONSTANT_COLOR = 0x8002, + CONSTANT_ALPHA = 0x8003, + ONE_MINUS_CONSTANT_ALPHA = 0x8004, + BLEND_COLOR = 0x8005, + + /* Buffer Objects */ + ARRAY_BUFFER = 0x8892, + ELEMENT_ARRAY_BUFFER = 0x8893, + ARRAY_BUFFER_BINDING = 0x8894, + ELEMENT_ARRAY_BUFFER_BINDING = 0x8895, + + STREAM_DRAW = 0x88e0, + STATIC_DRAW = 0x88e4, + DYNAMIC_DRAW = 0x88e8, + + BUFFER_SIZE = 0x8764, + BUFFER_USAGE = 0x8765, + + CURRENT_VERTEX_ATTRIB = 0x8626, + + /* CullFaceMode */ + FRONT = 0x0404, + BACK = 0x0405, + FRONT_AND_BACK = 0x0408, + + /* DepthFunction */ + /* NEVER */ + /* LESS */ + /* EQUAL */ + /* LEQUAL */ + /* GREATER */ + /* NOTEQUAL */ + /* GEQUAL */ + /* ALWAYS */ + + /* EnableCap */ + /* TEXTURE_2D */ + CULL_FACE = 0x0b44, + BLEND = 0x0be2, + DITHER = 0x0bd0, + STENCIL_TEST = 0x0b90, + DEPTH_TEST = 0x0b71, + SCISSOR_TEST = 0x0c11, + POLYGON_OFFSET_FILL = 0x8037, + SAMPLE_ALPHA_TO_COVERAGE = 0x809e, + SAMPLE_COVERAGE = 0x80a0, + + /* ErrorCode */ + NO_ERROR = 0, + INVALID_ENUM = 0x0500, + INVALID_VALUE = 0x0501, + INVALID_OPERATION = 0x0502, + OUT_OF_MEMORY = 0x0505, + + /* FrontFaceDirection */ + CW = 0x0900, + CCW = 0x0901, + + /* GetPName */ + LINE_WIDTH = 0x0b21, + ALIASED_POINT_SIZE_RANGE = 0x846d, + ALIASED_LINE_WIDTH_RANGE = 0x846e, + CULL_FACE_MODE = 0x0b45, + FRONT_FACE = 0x0b46, + DEPTH_RANGE = 0x0b70, + DEPTH_WRITEMASK = 0x0b72, + DEPTH_CLEAR_VALUE = 0x0b73, + DEPTH_FUNC = 0x0b74, + STENCIL_CLEAR_VALUE = 0x0b91, + STENCIL_FUNC = 0x0b92, + STENCIL_FAIL = 0x0b94, + STENCIL_PASS_DEPTH_FAIL = 0x0b95, + STENCIL_PASS_DEPTH_PASS = 0x0b96, + STENCIL_REF = 0x0b97, + STENCIL_VALUE_MASK = 0x0b93, + STENCIL_WRITEMASK = 0x0b98, + STENCIL_BACK_FUNC = 0x8800, + STENCIL_BACK_FAIL = 0x8801, + STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802, + STENCIL_BACK_PASS_DEPTH_PASS = 0x8803, + STENCIL_BACK_REF = 0x8ca3, + STENCIL_BACK_VALUE_MASK = 0x8ca4, + STENCIL_BACK_WRITEMASK = 0x8ca5, + VIEWPORT = 0x0ba2, + SCISSOR_BOX = 0x0c10, + /* SCISSOR_TEST */ + COLOR_CLEAR_VALUE = 0x0c22, + COLOR_WRITEMASK = 0x0c23, + UNPACK_ALIGNMENT = 0x0cf5, + PACK_ALIGNMENT = 0x0d05, + MAX_TEXTURE_SIZE = 0x0d33, + MAX_VIEWPORT_DIMS = 0x0d3a, + SUBPIXEL_BITS = 0x0d50, + RED_BITS = 0x0d52, + GREEN_BITS = 0x0d53, + BLUE_BITS = 0x0d54, + ALPHA_BITS = 0x0d55, + DEPTH_BITS = 0x0d56, + STENCIL_BITS = 0x0d57, + POLYGON_OFFSET_UNITS = 0x2a00, + /* POLYGON_OFFSET_FILL */ + POLYGON_OFFSET_FACTOR = 0x8038, + TEXTURE_BINDING_2D = 0x8069, + SAMPLE_BUFFERS = 0x80a8, + SAMPLES = 0x80a9, + SAMPLE_COVERAGE_VALUE = 0x80aa, + SAMPLE_COVERAGE_INVERT = 0x80ab, + + /* GetTextureParameter */ + /* TEXTURE_MAG_FILTER */ + /* TEXTURE_MIN_FILTER */ + /* TEXTURE_WRAP_S */ + /* TEXTURE_WRAP_T */ + + COMPRESSED_TEXTURE_FORMATS = 0x86a3, + + /* HintMode */ + DONT_CARE = 0x1100, + FASTEST = 0x1101, + NICEST = 0x1102, + + /* HintTarget */ + GENERATE_MIPMAP_HINT = 0x8192, + + /* DataType */ + BYTE = 0x1400, + UNSIGNED_BYTE = 0x1401, + SHORT = 0x1402, + UNSIGNED_SHORT = 0x1403, + INT = 0x1404, + UNSIGNED_INT = 0x1405, + FLOAT = 0x1406, + + /* PixelFormat */ + DEPTH_COMPONENT = 0x1902, + ALPHA = 0x1906, + RGB = 0x1907, + RGBA = 0x1908, + LUMINANCE = 0x1909, + LUMINANCE_ALPHA = 0x190a, + + /* PixelType */ + /* UNSIGNED_BYTE */ + UNSIGNED_SHORT_4_4_4_4 = 0x8033, + UNSIGNED_SHORT_5_5_5_1 = 0x8034, + UNSIGNED_SHORT_5_6_5 = 0x8363, + + /* Shaders */ + FRAGMENT_SHADER = 0x8b30, + VERTEX_SHADER = 0x8b31, + MAX_VERTEX_ATTRIBS = 0x8869, + MAX_VERTEX_UNIFORM_VECTORS = 0x8dfb, + MAX_VARYING_VECTORS = 0x8dfc, + MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8b4d, + MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8b4c, + MAX_TEXTURE_IMAGE_UNITS = 0x8872, + MAX_FRAGMENT_UNIFORM_VECTORS = 0x8dfd, + SHADER_TYPE = 0x8b4f, + DELETE_STATUS = 0x8b80, + LINK_STATUS = 0x8b82, + VALIDATE_STATUS = 0x8b83, + ATTACHED_SHADERS = 0x8b85, + ACTIVE_UNIFORMS = 0x8b86, + ACTIVE_ATTRIBUTES = 0x8b89, + SHADING_LANGUAGE_VERSION = 0x8b8c, + CURRENT_PROGRAM = 0x8b8d, + + /* StencilFunction */ + NEVER = 0x0200, + LESS = 0x0201, + EQUAL = 0x0202, + LEQUAL = 0x0203, + GREATER = 0x0204, + NOTEQUAL = 0x0205, + GEQUAL = 0x0206, + ALWAYS = 0x0207, + + /* StencilOp */ + /* ZERO */ + KEEP = 0x1e00, + REPLACE = 0x1e01, + INCR = 0x1e02, + DECR = 0x1e03, + INVERT = 0x150a, + INCR_WRAP = 0x8507, + DECR_WRAP = 0x8508, + + /* StringName */ + VENDOR = 0x1f00, + RENDERER = 0x1f01, + VERSION = 0x1f02, + + /* TextureMagFilter */ + NEAREST = 0x2600, + LINEAR = 0x2601, + + /* TextureMinFilter */ + /* NEAREST */ + /* LINEAR */ + NEAREST_MIPMAP_NEAREST = 0x2700, + LINEAR_MIPMAP_NEAREST = 0x2701, + NEAREST_MIPMAP_LINEAR = 0x2702, + LINEAR_MIPMAP_LINEAR = 0x2703, + + /* TextureParameterName */ + TEXTURE_MAG_FILTER = 0x2800, + TEXTURE_MIN_FILTER = 0x2801, + TEXTURE_WRAP_S = 0x2802, + TEXTURE_WRAP_T = 0x2803, + + /* TextureTarget */ + TEXTURE_2D = 0x0de1, + TEXTURE = 0x1702, + + TEXTURE_CUBE_MAP = 0x8513, + TEXTURE_BINDING_CUBE_MAP = 0x8514, + TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515, + TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516, + TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517, + TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518, + TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519, + TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851a, + MAX_CUBE_MAP_TEXTURE_SIZE = 0x851c, + + /* TextureUnit */ + TEXTURE0 = 0x84c0, + TEXTURE1 = 0x84c1, + TEXTURE2 = 0x84c2, + TEXTURE3 = 0x84c3, + TEXTURE4 = 0x84c4, + TEXTURE5 = 0x84c5, + TEXTURE6 = 0x84c6, + TEXTURE7 = 0x84c7, + TEXTURE8 = 0x84c8, + TEXTURE9 = 0x84c9, + TEXTURE10 = 0x84ca, + TEXTURE11 = 0x84cb, + TEXTURE12 = 0x84cc, + TEXTURE13 = 0x84cd, + TEXTURE14 = 0x84ce, + TEXTURE15 = 0x84cf, + TEXTURE16 = 0x84d0, + TEXTURE17 = 0x84d1, + TEXTURE18 = 0x84d2, + TEXTURE19 = 0x84d3, + TEXTURE20 = 0x84d4, + TEXTURE21 = 0x84d5, + TEXTURE22 = 0x84d6, + TEXTURE23 = 0x84d7, + TEXTURE24 = 0x84d8, + TEXTURE25 = 0x84d9, + TEXTURE26 = 0x84da, + TEXTURE27 = 0x84db, + TEXTURE28 = 0x84dc, + TEXTURE29 = 0x84dd, + TEXTURE30 = 0x84de, + TEXTURE31 = 0x84df, + ACTIVE_TEXTURE = 0x84e0, + + /* TextureWrapMode */ + REPEAT = 0x2901, + CLAMP_TO_EDGE = 0x812f, + MIRRORED_REPEAT = 0x8370, + + /* Uniform Types */ + FLOAT_VEC2 = 0x8b50, + FLOAT_VEC3 = 0x8b51, + FLOAT_VEC4 = 0x8b52, + INT_VEC2 = 0x8b53, + INT_VEC3 = 0x8b54, + INT_VEC4 = 0x8b55, + BOOL = 0x8b56, + BOOL_VEC2 = 0x8b57, + BOOL_VEC3 = 0x8b58, + BOOL_VEC4 = 0x8b59, + FLOAT_MAT2 = 0x8b5a, + FLOAT_MAT3 = 0x8b5b, + FLOAT_MAT4 = 0x8b5c, + SAMPLER_2D = 0x8b5e, + SAMPLER_CUBE = 0x8b60, + + /* Vertex Arrays */ + VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622, + VERTEX_ATTRIB_ARRAY_SIZE = 0x8623, + VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624, + VERTEX_ATTRIB_ARRAY_TYPE = 0x8625, + VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886a, + VERTEX_ATTRIB_ARRAY_POINTER = 0x8645, + VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889f, + + /* Shader Source */ + COMPILE_STATUS = 0x8b81, + + /* Shader Precision-Specified Types */ + LOW_FLOAT = 0x8df0, + MEDIUM_FLOAT = 0x8df1, + HIGH_FLOAT = 0x8df2, + LOW_INT = 0x8df3, + MEDIUM_INT = 0x8df4, + HIGH_INT = 0x8df5, + + /* Framebuffer Object. */ + FRAMEBUFFER = 0x8d40, + RENDERBUFFER = 0x8d41, + + RGBA4 = 0x8056, + RGB5_A1 = 0x8057, + RGB565 = 0x8d62, + DEPTH_COMPONENT16 = 0x81a5, + STENCIL_INDEX = 0x1901, + STENCIL_INDEX8 = 0x8d48, + DEPTH_STENCIL = 0x84f9, + + RENDERBUFFER_WIDTH = 0x8d42, + RENDERBUFFER_HEIGHT = 0x8d43, + RENDERBUFFER_INTERNAL_FORMAT = 0x8d44, + RENDERBUFFER_RED_SIZE = 0x8d50, + RENDERBUFFER_GREEN_SIZE = 0x8d51, + RENDERBUFFER_BLUE_SIZE = 0x8d52, + RENDERBUFFER_ALPHA_SIZE = 0x8d53, + RENDERBUFFER_DEPTH_SIZE = 0x8d54, + RENDERBUFFER_STENCIL_SIZE = 0x8d55, + + FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8cd0, + FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8cd1, + FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8cd2, + FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8cd3, + + COLOR_ATTACHMENT0 = 0x8ce0, + DEPTH_ATTACHMENT = 0x8d00, + STENCIL_ATTACHMENT = 0x8d20, + DEPTH_STENCIL_ATTACHMENT = 0x821a, + + NONE = 0, + + FRAMEBUFFER_COMPLETE = 0x8cd5, + FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8cd6, + FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8cd7, + FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8cd9, + FRAMEBUFFER_UNSUPPORTED = 0x8cdd, + + FRAMEBUFFER_BINDING = 0x8ca6, + RENDERBUFFER_BINDING = 0x8ca7, + MAX_RENDERBUFFER_SIZE = 0x84e8, + + INVALID_FRAMEBUFFER_OPERATION = 0x0506, + + /* WebGL-specific enums */ + UNPACK_FLIP_Y_WEBGL = 0x9240, + UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241, + CONTEXT_LOST_WEBGL = 0x9242, + UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243, + BROWSER_DEFAULT_WEBGL = 0x9244, +} diff --git a/packages/core/src/services/renderer/passes/BasePostProcessingPass.ts b/packages/core/src/services/renderer/passes/BasePostProcessingPass.ts new file mode 100644 index 0000000000..52bcb3eda8 --- /dev/null +++ b/packages/core/src/services/renderer/passes/BasePostProcessingPass.ts @@ -0,0 +1,138 @@ +import { inject, injectable } from 'inversify'; +import { + gl, + IModel, + IRendererService, + IShaderModuleService, +} from '../../../index'; +import { TYPES } from '../../../types'; +import { ILayer } from '../../layer/ILayerService'; +import { IPostProcessingPass, PassType } from '../IMultiPassRenderer'; +import { IUniform } from '../IUniform'; + +/** + * 后处理 Pass 基类,通过 PostProcessor 驱动。 + * + * 约定使用 u_Texture 传递渲染纹理。 + */ +@injectable() +export default class BasePostProcessingPass + implements IPostProcessingPass { + @inject(TYPES.IShaderModuleService) + protected readonly shaderModule: IShaderModuleService; + + @inject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + protected config: Partial | undefined; + + /** + * 启用开关 + */ + private enabled: boolean = true; + + /** + * 是否渲染到屏幕 + */ + private renderToScreen: boolean = false; + + /** + * 渲染命令 + */ + private model: IModel; + + private optionsToUpdate: Partial = {}; + + public getName() { + return ''; + } + + public getType() { + return PassType.PostProcessing; + } + + public init(layer: ILayer, config?: Partial) { + this.config = config; + + const { createAttribute, createBuffer, createModel } = this.rendererService; + const { vs, fs, uniforms } = this.setupShaders(); + + this.model = createModel({ + vs, + fs, + attributes: { + // 使用一个全屏三角形,相比 Quad 顶点数目更少 + a_Position: createAttribute({ + buffer: createBuffer({ + data: [-4, -4, 4, -4, 0, 4], + type: gl.FLOAT, + }), + size: 2, + }), + }, + // @ts-ignore + uniforms: { + u_Texture: null, + ...uniforms, + ...(this.config && this.convertOptionsToUniforms(this.config)), + }, + depth: { + enable: false, + }, + count: 3, + }); + } + + public render(layer: ILayer) { + const postProcessor = layer.multiPassRenderer.getPostProcessor(); + const { useFramebuffer, getViewportSize } = this.rendererService; + const { width, height } = getViewportSize(); + useFramebuffer( + this.renderToScreen ? null : postProcessor.getWriteFBO(), + () => { + this.model.draw({ + uniforms: { + u_Texture: postProcessor.getReadFBO(), + u_ViewportSize: [width, height], + ...this.convertOptionsToUniforms(this.optionsToUpdate), + }, + }); + }, + ); + } + + public isEnabled() { + return this.enabled; + } + + public setEnabled(enabled: boolean) { + this.enabled = enabled; + } + + public setRenderToScreen(renderToScreen: boolean) { + this.renderToScreen = renderToScreen; + } + + public updateOptions(config: Partial) { + this.optionsToUpdate = { + ...this.optionsToUpdate, + ...config, + }; + } + + protected setupShaders(): { + vs: string; + fs: string; + uniforms?: { [key: string]: IUniform }; + } { + throw new Error('Method not implemented.'); + } + + protected convertOptionsToUniforms( + options: Partial, + ): { + [uniformName: string]: IUniform; + } | void { + throw new Error('Method not implemented.'); + } +} diff --git a/packages/core/src/services/renderer/passes/ClearPass.ts b/packages/core/src/services/renderer/passes/ClearPass.ts new file mode 100644 index 0000000000..ec0163c4f7 --- /dev/null +++ b/packages/core/src/services/renderer/passes/ClearPass.ts @@ -0,0 +1,35 @@ +import { inject, injectable } from 'inversify'; +import { lazyInject } from '../../../index'; +import { TYPES } from '../../../types'; +import { IPass, PassType } from '../IMultiPassRenderer'; +import { IRendererService } from '../IRendererService'; + +/** + * ClearPass + */ +@injectable() +export default class ClearPass + implements IPass { + @lazyInject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + public getType() { + return PassType.Normal; + } + + public getName() { + return 'clear'; + } + + public init() { + // + } + + public render() { + this.rendererService.clear({ + color: [0, 0, 0, 0], + depth: 1, + framebuffer: null, + }); + } +} diff --git a/packages/core/src/services/renderer/passes/MultiPassRenderer.ts b/packages/core/src/services/renderer/passes/MultiPassRenderer.ts new file mode 100644 index 0000000000..587f3661d0 --- /dev/null +++ b/packages/core/src/services/renderer/passes/MultiPassRenderer.ts @@ -0,0 +1,84 @@ +import { injectable } from 'inversify'; +import { ILayer } from '../../layer/ILayerService'; +import { + IMultiPassRenderer, + IPass, + IPostProcessingPass, + IPostProcessor, + PassType, +} from '../IMultiPassRenderer'; +import PostProcessor from './PostProcessor'; + +/** + * ported from Three.js EffectComposer + * @example + * const renderer = new MultiPassRenderer([ + * new ClearPass(), + * new RenderPass({ + * models: [ + * new Model(), + * new Model(), + * ], + * }), + * new CopyPass({ + * renderToScreen: true, + * }), + * new TAAPass(), + * ]); + * renderer.render(); + * @see https://yuque.antfin-inc.com/yuqi.pyq/fgetpa/apuvbf#dRM8W + */ +@injectable() +export default class MultiPassRenderer implements IMultiPassRenderer { + private passes: Array> = []; + private postProcessor: IPostProcessor; + + private layer: ILayer; + private renderFlag: boolean; + + constructor(layer: ILayer) { + this.layer = layer; + this.postProcessor = new PostProcessor(); + } + + public setRenderFlag(renderFlag: boolean) { + this.renderFlag = renderFlag; + } + + public getRenderFlag() { + return this.renderFlag; + } + + public getPostProcessor() { + return this.postProcessor; + } + + public async render() { + for (const pass of this.passes) { + await pass.render(this.layer); + } + await this.postProcessor.render(this.layer); + } + + public resize(width: number, height: number) { + this.postProcessor.resize(width, height); + } + + public add(pass: IPass, config?: Partial) { + if (pass.getType() === PassType.PostProcessing) { + this.postProcessor.add( + pass as IPostProcessingPass, + this.layer, + config, + ); + } else { + pass.init(this.layer, config); + this.passes.push(pass); + } + } + + public insert(pass: IPass, config: Partial, index: number) { + pass.init(this.layer, config); + this.passes.splice(index, 0, pass); + } +} diff --git a/packages/core/src/services/renderer/passes/PixelPickingPass.ts b/packages/core/src/services/renderer/passes/PixelPickingPass.ts new file mode 100644 index 0000000000..08df995baf --- /dev/null +++ b/packages/core/src/services/renderer/passes/PixelPickingPass.ts @@ -0,0 +1,246 @@ +import { injectable } from 'inversify'; +import { lazyInject } from '../../../index'; +import { TYPES } from '../../../types'; +import { + IInteractionService, + InteractionEvent, +} from '../../interaction/IInteractionService'; +import { ILayer } from '../../layer/ILayerService'; +import { ILogService } from '../../log/ILogService'; +import { gl } from '../gl'; +import { IFramebuffer } from '../IFramebuffer'; +import { IPass, PassType } from '../IMultiPassRenderer'; +import { IRendererService } from '../IRendererService'; + +function decodePickingColor(color: Uint8Array): number { + const [i1, i2, i3] = color; + // 1 was added to seperate from no selection + const index = i1 + i2 * 256 + i3 * 65536 - 1; + return index; +} + +/** + * color-based PixelPickingPass + * @see https://github.com/antvis/L7/blob/next/dev-docs/PixelPickingEngine.md + */ +@injectable() +export default class PixelPickingPass + implements IPass { + @lazyInject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + @lazyInject(TYPES.IInteractionService) + protected readonly interactionService: IInteractionService; + + @lazyInject(TYPES.ILogService) + protected readonly logger: ILogService; + + /** + * picking framebuffer,供 attributes 颜色编码后输出 + */ + private pickingFBO: IFramebuffer; + + /** + * 保存 layer 引用 + */ + private layer: ILayer; + + /** + * 简单的 throttle,防止连续触发 hover 时导致频繁渲染到 picking framebuffer + */ + private alreadyInRendering: boolean = false; + + public getType() { + return PassType.Normal; + } + + public getName() { + return 'pixelPicking'; + } + + public init(layer: ILayer) { + this.layer = layer; + const { createTexture2D, createFramebuffer } = this.rendererService; + + // 创建 picking framebuffer,后续实时 resize + this.pickingFBO = createFramebuffer({ + color: createTexture2D({ + width: 1, + height: 1, + wrapS: gl.CLAMP_TO_EDGE, + wrapT: gl.CLAMP_TO_EDGE, + }), + }); + + // 监听 hover 事件 + this.interactionService.on(InteractionEvent.Hover, this.pickFromPickingFBO); + } + + public render(layer: ILayer) { + if (this.alreadyInRendering) { + return; + } + + const { getViewportSize, useFramebuffer, clear } = this.rendererService; + const { width, height } = getViewportSize(); + + // throttled + this.alreadyInRendering = true; + + // resize first, fbo can't be resized in use + this.pickingFBO.resize({ width, height }); + + useFramebuffer(this.pickingFBO, () => { + clear({ + framebuffer: this.pickingFBO, + color: [0, 0, 0, 0], + stencil: 0, + depth: 1, + }); + + // this.logger.info(`picking fbo cleared ${width} ${height}`); + + /** + * picking pass 不需要 multipass,原因如下: + * 1. 已经 clear,无需 ClearPass + * 2. 只需要 RenderPass + * 3. 后处理 pass 需要跳过 + */ + const originRenderFlag = this.layer.multiPassRenderer.getRenderFlag(); + this.layer.multiPassRenderer.setRenderFlag(false); + // trigger hooks + layer.hooks.beforePickingEncode.call(); + layer.render(); + layer.hooks.afterPickingEncode.call(); + this.layer.multiPassRenderer.setRenderFlag(originRenderFlag); + + this.alreadyInRendering = false; + }); + } + + /** + * 拾取视口指定坐标属于的要素 + * TODO:支持区域拾取 + */ + private pickFromPickingFBO = ({ x, y }: { x: number; y: number }) => { + const { + getViewportSize, + readPixels, + useFramebuffer, + } = this.rendererService; + const { width, height } = getViewportSize(); + const { enableHighlight } = this.layer.getStyleOptions(); + + const xInDevicePixel = x * window.devicePixelRatio; + const yInDevicePixel = y * window.devicePixelRatio; + if ( + xInDevicePixel > width || + xInDevicePixel < 0 || + yInDevicePixel > height || + yInDevicePixel < 0 + ) { + return; + } + + let pickedColors: Uint8Array | undefined; + useFramebuffer(this.pickingFBO, () => { + // avoid realloc + pickedColors = readPixels({ + x: Math.round(xInDevicePixel), + // 视口坐标系原点在左上,而 WebGL 在左下,需要翻转 Y 轴 + y: Math.round(height - (y + 1) * window.devicePixelRatio), + width: 1, + height: 1, + data: new Uint8Array(1 * 1 * 4), + framebuffer: this.pickingFBO, + }); + + if ( + pickedColors[0] !== 0 || + pickedColors[1] !== 0 || + pickedColors[2] !== 0 + ) { + this.logger.info('picked'); + const pickedFeatureIdx = decodePickingColor(pickedColors); + const rawFeature = this.layer.getSource()?.data?.dataArray[ + pickedFeatureIdx + ]; + + // trigger onHover/Click callback on layer + this.triggerHoverOnLayer({ x, y, feature: rawFeature }); + } + }); + + if (enableHighlight) { + this.highlightPickedFeature(pickedColors); + } + }; + + private triggerHoverOnLayer({ + x, + y, + feature, + }: { + x: number; + y: number; + feature: unknown; + }) { + const { onHover, onClick } = this.layer.getStyleOptions(); + if (onHover) { + onHover({ + x, + y, + feature, + }); + } + if (onClick) { + onClick({ + x, + y, + feature, + }); + } + } + + /** + * highlight 如果直接修改选中 feature 的 buffer,存在两个问题: + * 1. 鼠标移走时无法恢复 + * 2. 无法实现高亮颜色与原始原色的 alpha 混合 + * 因此高亮还是放在 shader 中做比较好 + * @example + * this.layer.color('name', ['#000000'], { + * featureRange: { + * startIndex: pickedFeatureIdx, + * endIndex: pickedFeatureIdx + 1, + * }, + * }); + */ + private highlightPickedFeature(pickedColors: Uint8Array | undefined) { + const [r, g, b] = pickedColors; + const { clear, useFramebuffer } = this.rendererService; + + // 先输出到 PostProcessor + const readFBO = this.layer.multiPassRenderer + .getPostProcessor() + .getReadFBO(); + this.layer.hooks.beforeRender.call(); + useFramebuffer(readFBO, () => { + clear({ + color: [0, 0, 0, 0], + depth: 1, + stencil: 0, + framebuffer: readFBO, + }); + + // TODO: highlight pass 需要 multipass + const originRenderFlag = this.layer.multiPassRenderer.getRenderFlag(); + this.layer.multiPassRenderer.setRenderFlag(false); + this.layer.hooks.beforeHighlight.call([r, g, b]); + this.layer.render(); + this.layer.hooks.afterHighlight.call(); + this.layer.hooks.afterRender.call(); + this.layer.multiPassRenderer.setRenderFlag(originRenderFlag); + }); + this.layer.multiPassRenderer.getPostProcessor().render(this.layer); + } +} diff --git a/packages/core/src/services/renderer/passes/PostProcessor.ts b/packages/core/src/services/renderer/passes/PostProcessor.ts new file mode 100644 index 0000000000..f76437f3e5 --- /dev/null +++ b/packages/core/src/services/renderer/passes/PostProcessor.ts @@ -0,0 +1,116 @@ +import { injectable } from 'inversify'; +import { lazyInject } from '../../../index'; +import { TYPES } from '../../../types'; +import { ILayer } from '../../layer/ILayerService'; +import { gl } from '../gl'; +import { IFramebuffer } from '../IFramebuffer'; +import { IPostProcessingPass, IPostProcessor } from '../IMultiPassRenderer'; +import { IRendererService } from '../IRendererService'; + +/** + * ported from Three.js EffectComposer + * 后处理负责 pingpong read/write framebuffer,最后一个 pass 默认输出到屏幕 + */ +@injectable() +export default class PostProcessor implements IPostProcessor { + @lazyInject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + private passes: Array> = []; + private readFBO: IFramebuffer; + private writeFBO: IFramebuffer; + + constructor() { + const { createFramebuffer, createTexture2D } = this.rendererService; + this.readFBO = createFramebuffer({ + color: createTexture2D({ + width: 1, + height: 1, + wrapS: gl.CLAMP_TO_EDGE, + wrapT: gl.CLAMP_TO_EDGE, + }), + }); + + this.writeFBO = createFramebuffer({ + color: createTexture2D({ + width: 1, + height: 1, + wrapS: gl.CLAMP_TO_EDGE, + wrapT: gl.CLAMP_TO_EDGE, + }), + }); + } + + public getReadFBO() { + return this.readFBO; + } + + public getWriteFBO() { + return this.writeFBO; + } + + public async render(layer: ILayer) { + for (let i = 0; i < this.passes.length; i++) { + const pass = this.passes[i]; + // last pass should render to screen + pass.setRenderToScreen(this.isLastEnabledPass(i)); + await pass.render(layer); + + // pingpong + if (i !== this.passes.length - 1) { + this.swap(); + } + } + } + + public resize(width: number, height: number) { + this.readFBO.resize({ + width, + height, + }); + this.writeFBO.resize({ + width, + height, + }); + } + + public add( + pass: IPostProcessingPass, + layer: ILayer, + config?: Partial, + ) { + pass.init(layer, config); + this.passes.push(pass); + } + + public insert( + pass: IPostProcessingPass, + index: number, + layer: ILayer, + config?: Partial, + ) { + pass.init(layer, config); + this.passes.splice(index, 0, pass); + } + + public getPostProcessingPassByName( + name: string, + ): IPostProcessingPass | undefined { + return this.passes.find((p) => p.getName() === name); + } + + private isLastEnabledPass(index: number): boolean { + for (let i = index + 1; i < this.passes.length; i++) { + if (this.passes[i].isEnabled()) { + return false; + } + } + return true; + } + + private swap() { + const tmp = this.readFBO; + this.readFBO = this.writeFBO; + this.writeFBO = tmp; + } +} diff --git a/packages/core/src/services/renderer/passes/RenderPass.ts b/packages/core/src/services/renderer/passes/RenderPass.ts new file mode 100644 index 0000000000..c5f7b19704 --- /dev/null +++ b/packages/core/src/services/renderer/passes/RenderPass.ts @@ -0,0 +1,46 @@ +import { injectable } from 'inversify'; +import { lazyInject } from '../../../index'; +import { TYPES } from '../../../types'; +import { ILayer } from '../../layer/ILayerService'; +import { IPass, PassType } from '../IMultiPassRenderer'; +import { IRendererService } from '../IRendererService'; + +/** + * RenderPass,负责输出到后续 PostProcessor 的 readFBO 中 + */ +@injectable() +export default class RenderPass + implements IPass { + @lazyInject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + public getType() { + return PassType.Normal; + } + + public getName() { + return 'render'; + } + + public init(layer: ILayer) { + // + } + + public render(layer: ILayer) { + const { useFramebuffer, clear } = this.rendererService; + const readFBO = layer.multiPassRenderer.getPostProcessor().getReadFBO(); + useFramebuffer(readFBO, () => { + clear({ + color: [0, 0, 0, 0], + depth: 1, + stencil: 0, + framebuffer: readFBO, + }); + + // render to post processor + layer.multiPassRenderer.setRenderFlag(false); + layer.render(); + layer.multiPassRenderer.setRenderFlag(true); + }); + } +} diff --git a/packages/core/src/services/renderer/passes/TAAPass.ts b/packages/core/src/services/renderer/passes/TAAPass.ts new file mode 100644 index 0000000000..0a33a02a49 --- /dev/null +++ b/packages/core/src/services/renderer/passes/TAAPass.ts @@ -0,0 +1,341 @@ +import { injectable } from 'inversify'; +import { lazyInject } from '../../../index'; +import blendFS from '../../../shaders/post-processing/blend.glsl'; +import copyFS from '../../../shaders/post-processing/copy.glsl'; +import quadVS from '../../../shaders/post-processing/quad.glsl'; +import { TYPES } from '../../../types'; +import { ICameraService } from '../../camera/ICameraService'; +import { ILayer } from '../../layer/ILayerService'; +import { ILogService } from '../../log/ILogService'; +import { IShaderModuleService } from '../../shader/IShaderModuleService'; +import { gl } from '../gl'; +import { IFramebuffer } from '../IFramebuffer'; +import { IModel, IModelInitializationOptions } from '../IModel'; +import { IPass, PassType } from '../IMultiPassRenderer'; +import { IRendererService } from '../IRendererService'; + +// Generate halton sequence +// https://en.wikipedia.org/wiki/Halton_sequence +function halton(index: number, base: number) { + let result = 0; + let f = 1 / base; + let i = index; + while (i > 0) { + result = result + f * (i % base); + i = Math.floor(i / base); + f = f / base; + } + return result; +} + +// 累加计数器 +let accumulatingId = 1; + +/** + * TAA(Temporal Anti-Aliasing) + * 在需要后处理的场景中(例如 L7 的热力图需要 blur pass、PBR 中的 SSAO 环境光遮蔽),无法使用浏览器内置的 MSAA, + * 只能使用 TAA + * @see https://yuque.antfin-inc.com/yuqi.pyq/fgetpa/ri52hv + */ +@injectable() +export default class TAAPass + implements IPass { + @lazyInject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + @lazyInject(TYPES.IShaderModuleService) + protected readonly shaderModule: IShaderModuleService; + + @lazyInject(TYPES.ICameraService) + protected readonly cameraService: ICameraService; + + @lazyInject(TYPES.ILogService) + protected readonly logger: ILogService; + + /** + * 低差异序列 + */ + private haltonSequence: Array<[number, number]> = []; + + /** + * 当前累加任务 ID,例如用户连续拖拽时上一次累加很有可能没有结束,此时在开启新一轮累加之前需要结束掉之前未完成的 + */ + private accumulatingId: number = 0; + + /** + * 每一轮累加中的 frameID + */ + private frame: number = 0; + + /** + * 每一轮累加中的 frame 定时器 + */ + private timer: number | undefined = undefined; + + private sampleRenderTarget: IFramebuffer; + private prevRenderTarget: IFramebuffer; + private outputRenderTarget: IFramebuffer; + private copyRenderTarget: IFramebuffer; + + private blendModel: IModel; + private outputModel: IModel; + private copyModel: IModel; + + public getType() { + return PassType.Normal; + } + + public getName() { + return 'taa'; + } + + public init(layer: ILayer) { + const { createFramebuffer, createTexture2D } = this.rendererService; + this.sampleRenderTarget = createFramebuffer({ + color: createTexture2D({ + width: 1, + height: 1, + wrapS: gl.CLAMP_TO_EDGE, + wrapT: gl.CLAMP_TO_EDGE, + }), + }); + this.prevRenderTarget = createFramebuffer({ + color: createTexture2D({ + width: 1, + height: 1, + wrapS: gl.CLAMP_TO_EDGE, + wrapT: gl.CLAMP_TO_EDGE, + }), + }); + this.outputRenderTarget = createFramebuffer({ + color: createTexture2D({ + width: 1, + height: 1, + wrapS: gl.CLAMP_TO_EDGE, + wrapT: gl.CLAMP_TO_EDGE, + }), + }); + this.copyRenderTarget = createFramebuffer({ + color: createTexture2D({ + width: 1, + height: 1, + wrapS: gl.CLAMP_TO_EDGE, + wrapT: gl.CLAMP_TO_EDGE, + }), + }); + + for (let i = 0; i < 30; i++) { + this.haltonSequence.push([halton(i, 2), halton(i, 3)]); + } + + this.blendModel = this.createTriangleModel('blend-pass', blendFS); + this.outputModel = this.createTriangleModel('copy-pass', copyFS, { + blend: { + enable: true, + func: { + srcRGB: gl.ONE, + dstRGB: gl.ONE_MINUS_SRC_ALPHA, + srcAlpha: gl.ONE, + dstAlpha: gl.ONE_MINUS_SRC_ALPHA, + }, + equation: { + rgb: gl.FUNC_ADD, + alpha: gl.FUNC_ADD, + }, + }, + }); + this.copyModel = this.createTriangleModel('copy-pass', copyFS); + } + + public render(layer: ILayer) { + const { clear, getViewportSize, useFramebuffer } = this.rendererService; + const { width, height } = getViewportSize(); + this.sampleRenderTarget.resize({ width, height }); + this.prevRenderTarget.resize({ width, height }); + this.outputRenderTarget.resize({ width, height }); + this.copyRenderTarget.resize({ width, height }); + + this.resetFrame(); + // 首先停止上一次的累加 + this.stopAccumulating(); + + // 先输出到 PostProcessor + const readFBO = layer.multiPassRenderer.getPostProcessor().getReadFBO(); + useFramebuffer(readFBO, () => { + clear({ + color: [0, 0, 0, 0], + depth: 1, + stencil: 0, + framebuffer: readFBO, + }); + + // render to post processor + layer.multiPassRenderer.setRenderFlag(false); + layer.render(); + layer.multiPassRenderer.setRenderFlag(true); + }); + + const accumulate = (id: number) => { + // 在开启新一轮累加之前,需要先结束掉之前的累加 + if (!this.accumulatingId || id !== this.accumulatingId) { + return; + } + + if (!this.isFinished()) { + this.doRender(layer); + + requestAnimationFrame(() => { + accumulate(id); + }); + } + }; + + this.accumulatingId = accumulatingId++; + this.timer = window.setTimeout(() => { + accumulate(this.accumulatingId); + }, 50); + } + + private doRender(layer: ILayer) { + this.logger.info(`accumulatingId: ${this.accumulatingId}`); + + const { clear, getViewportSize, useFramebuffer } = this.rendererService; + const { width, height } = getViewportSize(); + const { jitterScale = 1 } = layer.getStyleOptions(); + + // 使用 Halton 序列抖动投影矩阵 + const offset = this.haltonSequence[this.frame % this.haltonSequence.length]; + this.cameraService.jitterProjectionMatrix( + ((offset[0] * 2.0 - 1.0) / width) * jitterScale, + ((offset[1] * 2.0 - 1.0) / height) * jitterScale, + ); + + // 按抖动后的投影矩阵渲染 + layer.multiPassRenderer.setRenderFlag(false); + layer.hooks.beforeRender.call(); + useFramebuffer(this.sampleRenderTarget, () => { + clear({ + color: [0, 0, 0, 0], + depth: 1, + stencil: 0, + framebuffer: this.sampleRenderTarget, + }); + + layer.render(); + }); + layer.hooks.afterRender.call(); + layer.multiPassRenderer.setRenderFlag(true); + + // 混合 + const layerStyleOptions = layer.getStyleOptions(); + useFramebuffer(this.outputRenderTarget, () => { + this.blendModel.draw({ + uniforms: { + // @ts-ignore + u_opacity: layerStyleOptions.opacity || 1, + u_MixRatio: this.frame === 0 ? 1 : 0.9, + u_Diffuse1: this.sampleRenderTarget, + u_Diffuse2: + this.frame === 0 + ? layer.multiPassRenderer.getPostProcessor().getReadFBO() + : this.prevRenderTarget, + }, + }); + }); + + // 输出累加结果 + if (this.frame === 0) { + clear({ + color: [0, 0, 0, 0], + depth: 1, + stencil: 0, + framebuffer: this.copyRenderTarget, + }); + } + + if (this.frame >= 1) { + useFramebuffer(this.copyRenderTarget, () => { + this.outputModel.draw({ + uniforms: { + u_Texture: this.outputRenderTarget, + }, + }); + }); + + useFramebuffer( + layer.multiPassRenderer.getPostProcessor().getReadFBO(), + () => { + this.copyModel.draw({ + uniforms: { + u_Texture: this.copyRenderTarget, + }, + }); + }, + ); + layer.multiPassRenderer.getPostProcessor().render(layer); + } + + // 保存前序帧结果 + const tmp = this.prevRenderTarget; + this.prevRenderTarget = this.outputRenderTarget; + this.outputRenderTarget = tmp; + + this.frame++; + + // 恢复 jitter 后的相机 + this.cameraService.clearJitterProjectionMatrix(); + } + + /** + * 是否已经完成累加 + * @return {boolean} isFinished + */ + private isFinished() { + return this.frame >= this.haltonSequence.length; + } + + private resetFrame() { + this.frame = 0; + } + + private stopAccumulating() { + this.accumulatingId = 0; + window.clearTimeout(this.timer); + } + + private createTriangleModel( + shaderModuleName: string, + fragmentShader: string, + options?: Partial, + ) { + this.shaderModule.registerModule(shaderModuleName, { + vs: quadVS, + fs: fragmentShader, + }); + + const { vs, fs, uniforms } = this.shaderModule.getModule(shaderModuleName); + const { createAttribute, createBuffer, createModel } = this.rendererService; + return createModel({ + vs, + fs, + attributes: { + // 使用一个全屏三角形,相比 Quad 顶点数目更少 + a_Position: createAttribute({ + buffer: createBuffer({ + data: [-4, -4, 4, -4, 0, 4], + type: gl.FLOAT, + }), + size: 2, + }), + }, + uniforms: { + ...uniforms, + }, + depth: { + enable: false, + }, + count: 3, + ...options, + }); + } +} diff --git a/packages/core/src/services/renderer/passes/post-processing/BlurHPass.ts b/packages/core/src/services/renderer/passes/post-processing/BlurHPass.ts new file mode 100644 index 0000000000..9188ba221d --- /dev/null +++ b/packages/core/src/services/renderer/passes/post-processing/BlurHPass.ts @@ -0,0 +1,59 @@ +import { inject, injectable } from 'inversify'; +import { isNil } from 'lodash'; +import blur from '../../../../shaders/post-processing/blur.glsl'; +import quad from '../../../../shaders/post-processing/quad.glsl'; +import { TYPES } from '../../../../types'; +import { IRendererService } from '../../IRendererService'; +import { IUniform } from '../../IUniform'; +import BasePostProcessingPass from '../BasePostProcessingPass'; + +export interface IBlurHPassConfig { + blurRadius: number; +} + +@injectable() +export default class BlurHPass extends BasePostProcessingPass< + IBlurHPassConfig +> { + @inject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + public getName() { + return 'blurH'; + } + + protected setupShaders() { + this.shaderModule.registerModule('blur-pass', { + vs: quad, + fs: blur, + }); + + const { vs, fs, uniforms } = this.shaderModule.getModule('blur-pass'); + const { width, height } = this.rendererService.getViewportSize(); + + return { + vs, + fs, + uniforms: { + ...uniforms, + u_ViewportSize: [width, height], + }, + }; + } + + protected convertOptionsToUniforms( + options: Partial, + ): { + [uniformName: string]: IUniform; + } | void { + const uniforms: { + [key: string]: IUniform; + } = {}; + + if (!isNil(options.blurRadius)) { + uniforms.u_BlurDir = [options.blurRadius, 0]; + } + + return uniforms; + } +} diff --git a/packages/core/src/services/renderer/passes/post-processing/BlurVPass.ts b/packages/core/src/services/renderer/passes/post-processing/BlurVPass.ts new file mode 100644 index 0000000000..906feafa73 --- /dev/null +++ b/packages/core/src/services/renderer/passes/post-processing/BlurVPass.ts @@ -0,0 +1,59 @@ +import { inject, injectable } from 'inversify'; +import { isNil } from 'lodash'; +import blur from '../../../../shaders/post-processing/blur.glsl'; +import quad from '../../../../shaders/post-processing/quad.glsl'; +import { TYPES } from '../../../../types'; +import { IRendererService } from '../../IRendererService'; +import { IUniform } from '../../IUniform'; +import BasePostProcessingPass from '../BasePostProcessingPass'; + +export interface IBlurVPassConfig { + blurRadius: number; +} + +@injectable() +export default class BlurVPass extends BasePostProcessingPass< + IBlurVPassConfig +> { + @inject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + public getName() { + return 'blurV'; + } + + public setupShaders() { + this.shaderModule.registerModule('blur-pass', { + vs: quad, + fs: blur, + }); + + const { vs, fs, uniforms } = this.shaderModule.getModule('blur-pass'); + const { width, height } = this.rendererService.getViewportSize(); + + return { + vs, + fs, + uniforms: { + ...uniforms, + u_ViewportSize: [width, height], + }, + }; + } + + protected convertOptionsToUniforms( + options: Partial, + ): { + [uniformName: string]: IUniform; + } | void { + const uniforms: { + [key: string]: IUniform; + } = {}; + + if (!isNil(options.blurRadius)) { + uniforms.u_BlurDir = [0, options.blurRadius]; + } + + return uniforms; + } +} diff --git a/packages/core/src/services/renderer/passes/post-processing/ColorHalfTonePass.ts b/packages/core/src/services/renderer/passes/post-processing/ColorHalfTonePass.ts new file mode 100644 index 0000000000..80b322f467 --- /dev/null +++ b/packages/core/src/services/renderer/passes/post-processing/ColorHalfTonePass.ts @@ -0,0 +1,71 @@ +import { inject, injectable } from 'inversify'; +import { isNil } from 'lodash'; +import colorHalftone from '../../../../shaders/post-processing/colorhalftone.glsl'; +import quad from '../../../../shaders/post-processing/quad.glsl'; +import { TYPES } from '../../../../types'; +import { IRendererService } from '../../IRendererService'; +import { IUniform } from '../../IUniform'; +import BasePostProcessingPass from '../BasePostProcessingPass'; + +export interface IColorHalftonePassConfig { + center: [number, number]; + angle: number; + size: number; +} + +@injectable() +export default class ColorHalftonePass extends BasePostProcessingPass< + IColorHalftonePassConfig +> { + @inject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + public getName() { + return 'colorHalftone'; + } + + protected setupShaders() { + this.shaderModule.registerModule('colorhalftone-pass', { + vs: quad, + fs: colorHalftone, + }); + + const { vs, fs, uniforms } = this.shaderModule.getModule( + 'colorhalftone-pass', + ); + const { width, height } = this.rendererService.getViewportSize(); + + return { + vs, + fs, + uniforms: { + ...uniforms, + u_ViewportSize: [width, height], + }, + }; + } + + protected convertOptionsToUniforms( + options: Partial, + ): { + [uniformName: string]: IUniform; + } | void { + const uniforms: { + [key: string]: IUniform; + } = {}; + + if (!isNil(options.center)) { + uniforms.u_Center = options.center; + } + + if (!isNil(options.angle)) { + uniforms.u_Angle = options.angle; + } + + if (!isNil(options.size)) { + uniforms.u_Size = options.size; + } + + return uniforms; + } +} diff --git a/packages/core/src/services/renderer/passes/post-processing/CopyPass.ts b/packages/core/src/services/renderer/passes/post-processing/CopyPass.ts new file mode 100644 index 0000000000..0b0e18a736 --- /dev/null +++ b/packages/core/src/services/renderer/passes/post-processing/CopyPass.ts @@ -0,0 +1,29 @@ +import { injectable } from 'inversify'; +import copy from '../../../../shaders/post-processing/copy.glsl'; +import quad from '../../../../shaders/post-processing/quad.glsl'; +import { IUniform } from '../../IUniform'; +import BasePostProcessingPass from '../BasePostProcessingPass'; + +@injectable() +export default class CopyPass extends BasePostProcessingPass { + public getName() { + return 'copy'; + } + + public setupShaders() { + this.shaderModule.registerModule('copy-pass', { + vs: quad, + fs: copy, + }); + + return this.shaderModule.getModule('copy-pass'); + } + + protected convertOptionsToUniforms( + options: Partial<{}>, + ): { + [uniformName: string]: IUniform; + } | void { + return {}; + } +} diff --git a/packages/core/src/services/renderer/passes/post-processing/HexagonalPixelatePass.ts b/packages/core/src/services/renderer/passes/post-processing/HexagonalPixelatePass.ts new file mode 100644 index 0000000000..16aa7d1b3e --- /dev/null +++ b/packages/core/src/services/renderer/passes/post-processing/HexagonalPixelatePass.ts @@ -0,0 +1,66 @@ +import { inject, injectable } from 'inversify'; +import { isNil } from 'lodash'; +import hexagonalPixelate from '../../../../shaders/post-processing/hexagonalpixelate.glsl'; +import quad from '../../../../shaders/post-processing/quad.glsl'; +import { TYPES } from '../../../../types'; +import { IRendererService } from '../../IRendererService'; +import { IUniform } from '../../IUniform'; +import BasePostProcessingPass from '../BasePostProcessingPass'; + +export interface IHexagonalPixelatePassConfig { + center: [number, number]; + scale: number; +} + +@injectable() +export default class HexagonalPixelatePass extends BasePostProcessingPass< + IHexagonalPixelatePassConfig +> { + @inject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + public getName() { + return 'hexagonalPixelate'; + } + + protected setupShaders() { + this.shaderModule.registerModule('hexagonalpixelate-pass', { + vs: quad, + fs: hexagonalPixelate, + }); + + const { vs, fs, uniforms } = this.shaderModule.getModule( + 'hexagonalpixelate-pass', + ); + const { width, height } = this.rendererService.getViewportSize(); + + return { + vs, + fs, + uniforms: { + ...uniforms, + u_ViewportSize: [width, height], + }, + }; + } + + protected convertOptionsToUniforms( + options: Partial, + ): { + [uniformName: string]: IUniform; + } | void { + const uniforms: { + [key: string]: IUniform; + } = {}; + + if (!isNil(options.center)) { + uniforms.u_Center = options.center; + } + + if (!isNil(options.scale)) { + uniforms.u_Scale = options.scale; + } + + return uniforms; + } +} diff --git a/packages/core/src/services/renderer/passes/post-processing/InkPass.ts b/packages/core/src/services/renderer/passes/post-processing/InkPass.ts new file mode 100644 index 0000000000..d9032ffa33 --- /dev/null +++ b/packages/core/src/services/renderer/passes/post-processing/InkPass.ts @@ -0,0 +1,57 @@ +import { inject, injectable } from 'inversify'; +import { isNil } from 'lodash'; +import ink from '../../../../shaders/post-processing/ink.glsl'; +import quad from '../../../../shaders/post-processing/quad.glsl'; +import { TYPES } from '../../../../types'; +import { IRendererService } from '../../IRendererService'; +import { IUniform } from '../../IUniform'; +import BasePostProcessingPass from '../BasePostProcessingPass'; + +export interface IInkPassConfig { + strength: number; +} + +@injectable() +export default class InkPass extends BasePostProcessingPass { + @inject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + public getName() { + return 'ink'; + } + + protected setupShaders() { + this.shaderModule.registerModule('ink-pass', { + vs: quad, + fs: ink, + }); + + const { vs, fs, uniforms } = this.shaderModule.getModule('ink-pass'); + const { width, height } = this.rendererService.getViewportSize(); + + return { + vs, + fs, + uniforms: { + ...uniforms, + u_ViewportSize: [width, height], + }, + }; + } + + protected convertOptionsToUniforms( + options: Partial, + ): { + [uniformName: string]: IUniform; + } | void { + const uniforms: { + [key: string]: IUniform; + } = {}; + + if (!isNil(options.strength)) { + uniforms.u_Strength = options.strength; + } + + return uniforms; + } +} diff --git a/packages/core/src/services/renderer/passes/post-processing/NoisePass.ts b/packages/core/src/services/renderer/passes/post-processing/NoisePass.ts new file mode 100644 index 0000000000..5c1eaaa9aa --- /dev/null +++ b/packages/core/src/services/renderer/passes/post-processing/NoisePass.ts @@ -0,0 +1,44 @@ +import { injectable } from 'inversify'; +import { isNil } from 'lodash'; +import noise from '../../../../shaders/post-processing/noise.glsl'; +import quad from '../../../../shaders/post-processing/quad.glsl'; +import { IUniform } from '../../IUniform'; +import BasePostProcessingPass from '../BasePostProcessingPass'; + +export interface INoisePassConfig { + amount: number; +} + +@injectable() +export default class NoisePass extends BasePostProcessingPass< + INoisePassConfig +> { + public getName() { + return 'noise'; + } + + public setupShaders() { + this.shaderModule.registerModule('noise-pass', { + vs: quad, + fs: noise, + }); + + return this.shaderModule.getModule('noise-pass'); + } + + protected convertOptionsToUniforms( + options: Partial, + ): { + [uniformName: string]: IUniform; + } | void { + const uniforms: { + [key: string]: IUniform; + } = {}; + + if (!isNil(options.amount)) { + uniforms.u_Amount = options.amount; + } + + return uniforms; + } +} diff --git a/packages/core/src/services/renderer/passes/post-processing/SepiaPass.ts b/packages/core/src/services/renderer/passes/post-processing/SepiaPass.ts new file mode 100644 index 0000000000..7bcc318be9 --- /dev/null +++ b/packages/core/src/services/renderer/passes/post-processing/SepiaPass.ts @@ -0,0 +1,44 @@ +import { injectable } from 'inversify'; +import { isNil } from 'lodash'; +import quad from '../../../../shaders/post-processing/quad.glsl'; +import sepia from '../../../../shaders/post-processing/sepia.glsl'; +import { IUniform } from '../../IUniform'; +import BasePostProcessingPass from '../BasePostProcessingPass'; + +export interface ISepiaPassConfig { + amount: number; +} + +@injectable() +export default class SepiaPass extends BasePostProcessingPass< + ISepiaPassConfig +> { + public getName() { + return 'sepia'; + } + + public setupShaders() { + this.shaderModule.registerModule('sepia-pass', { + vs: quad, + fs: sepia, + }); + + return this.shaderModule.getModule('sepia-pass'); + } + + protected convertOptionsToUniforms( + options: Partial, + ): { + [uniformName: string]: IUniform; + } | void { + const uniforms: { + [key: string]: IUniform; + } = {}; + + if (!isNil(options.amount)) { + uniforms.u_Amount = options.amount; + } + + return uniforms; + } +} diff --git a/packages/core/src/services/scene/ISceneService.ts b/packages/core/src/services/scene/ISceneService.ts new file mode 100644 index 0000000000..373238cf55 --- /dev/null +++ b/packages/core/src/services/scene/ISceneService.ts @@ -0,0 +1,15 @@ +import { ILayer } from '../layer/ILayerService'; +import { IMapConfig } from '../map/IMapService'; +import { IRenderConfig } from '../renderer/IRendererService'; + +export interface ISceneService { + on(type: string, hander: (...args: any[]) => void): void; + off(type: string, hander: (...args: any[]) => void): void; + removeAllListeners(event?: string): this; + init(config: IMapConfig & IRenderConfig): void; + addLayer(layer: ILayer): void; + render(): void; + destroy(): void; +} +// scene 事件 +export const SceneEventList = ['loaded', 'maploaded', 'resize', 'destroy']; diff --git a/packages/core/src/services/scene/SceneService.ts b/packages/core/src/services/scene/SceneService.ts new file mode 100644 index 0000000000..89d66acefa --- /dev/null +++ b/packages/core/src/services/scene/SceneService.ts @@ -0,0 +1,225 @@ +import { EventEmitter } from 'eventemitter3'; +import { inject, injectable } from 'inversify'; +import { AsyncParallelHook, AsyncSeriesHook } from 'tapable'; +import { TYPES } from '../../types'; +import { createRendererContainer } from '../../utils/dom'; +import { IFontService } from '../asset/IFontService'; +import { IIconService, IImage } from '../asset/IIconService'; +import { ICameraService, IViewport } from '../camera/ICameraService'; +import { IControlService } from '../component/IControlService'; +import { IGlobalConfig, IGlobalConfigService } from '../config/IConfigService'; +import { IInteractionService } from '../interaction/IInteractionService'; +import { ILayer, ILayerService } from '../layer/ILayerService'; +import { ILogService } from '../log/ILogService'; +import { IMapCamera, IMapService } from '../map/IMapService'; +import { IRendererService } from '../renderer/IRendererService'; +import { IShaderModuleService } from '../shader/IShaderModuleService'; +import { ISceneService } from './ISceneService'; +/** + * will emit `loaded` `resize` `destroy` event + */ +@injectable() +export default class Scene extends EventEmitter implements ISceneService { + /** + * 使用各种 Service + */ + @inject(TYPES.IIconService) + private readonly iconService: IIconService; + + @inject(TYPES.IFontService) + private readonly fontService: IFontService; + + @inject(TYPES.IControlService) + private readonly controlService: IControlService; + + @inject(TYPES.ILogService) + private readonly logger: ILogService; + + @inject(TYPES.IGlobalConfigService) + private readonly configService: IGlobalConfigService; + + @inject(TYPES.IMapService) + private readonly map: IMapService; + + @inject(TYPES.IRendererService) + private readonly rendererService: IRendererService; + + @inject(TYPES.ILayerService) + private readonly layerService: ILayerService; + + @inject(TYPES.ICameraService) + private readonly cameraService: ICameraService; + + @inject(TYPES.IInteractionService) + private readonly interactionService: IInteractionService; + + @inject(TYPES.IShaderModuleService) + private readonly shaderModule: IShaderModuleService; + + /** + * 是否首次渲染 + */ + private inited: boolean = false; + private initPromise: Promise; + + /** + * canvas 容器 + */ + private $container: HTMLDivElement | null; + + private hooks: { + init: AsyncParallelHook; + }; + + public constructor() { + super(); + // @see https://github.com/webpack/tapable#usage + this.hooks = { + /** + * 初始化异步任务,可并行: + * 1. initMap:初始化地图底图、相机 + * 2. initRenderer:初始化渲染引擎 + * 3. initWorker:初始化 Worker + */ + init: new AsyncParallelHook(['config']), + }; + } + + public init(globalConfig: IGlobalConfig) { + this.initClear(); + this.configService.setAndCheckConfig(globalConfig); + // 初始化 ShaderModule + this.shaderModule.registerBuiltinModules(); + + // 初始化资源管理 图片 + this.iconService.init(); + // 字体资源 + this.fontService.init(); + + this.controlService.init({ + container: document.getElementById( + this.configService.getConfig().id || 'map', + ) as HTMLElement, + }); + + /** + * 初始化底图 + */ + this.hooks.init.tapPromise('initMap', async (config: unknown) => { + // 等待首次相机同步 + await new Promise((resolve) => { + this.map.onCameraChanged((viewport: IViewport) => { + this.cameraService.init(); + this.cameraService.update(viewport); + resolve(); + }); + this.map.init(config as Partial); + }); + + // 重新绑定非首次相机更新事件 + this.map.onCameraChanged(this.handleMapCameraChanged); + this.logger.info('map loaded'); + + // scene 创建完成自动调用render 方法 + this.render(); + }); + + /** + * 初始化渲染引擎 + */ + this.hooks.init.tapPromise('initRenderer', async () => { + // 创建底图之上的 container + const $container = createRendererContainer( + this.configService.getConfig().id || '', + ); + this.$container = $container; + if ($container) { + await this.rendererService.init($container); + window.addEventListener('resize', this.handleWindowResized, false); + } else { + this.logger.error('容器 id 不存在'); + } + + // 初始化 container 上的交互 + this.interactionService.init(); + + this.logger.info('renderer loaded'); + }); + + // TODO:init worker, fontAtlas... + + // 执行异步并行初始化任务 + this.initPromise = this.hooks.init.promise(this.configService.getConfig()); + } + + public addLayer(layer: ILayer) { + this.logger.info(`add layer ${layer.name}`); + this.layerService.add(layer); + } + + public async render() { + // 首次初始化,或者地图的容器被强制销毁的需要重新初始化 + if (!this.inited) { + // 还未初始化完成需要等待 + await this.initPromise; + // 初始化 marker 容器 TODO: 可以放到 map 初始化方法中? + this.map.addMarkerContainer(); + this.logger.info(' render inited'); + this.inited = true; + this.emit('loaded'); + } + + this.layerService.renderLayers(); + this.logger.info('render'); + } + + public destroy() { + this.emit('destroy'); + this.inited = false; + this.layerService.destroy(); + this.configService.reset(); + this.interactionService.destroy(); + this.controlService.destroy(); + this.removeAllListeners(); + this.rendererService.destroy(); + this.map.destroy(); + window.removeEventListener('resize', this.handleWindowResized, false); + } + private handleWindowResized = () => { + this.emit('resize'); + if (this.$container) { + // recalculate the viewport's size and call gl.viewport + // @see https://github.com/regl-project/regl/blob/master/lib/webgl.js#L24-L38 + const pixelRatio = window.devicePixelRatio; + let w = window.innerWidth; + let h = window.innerHeight; + if (this.$container !== document.body) { + const bounds = this.$container.getBoundingClientRect(); + w = bounds.right - bounds.left; + h = bounds.bottom - bounds.top; + } + this.rendererService.viewport({ + x: 0, + y: 0, + width: pixelRatio * w, + height: pixelRatio * h, + }); + // repaint layers + this.render(); + } + }; + private handleMapCameraChanged = (viewport: IViewport) => { + this.cameraService.update(viewport); + this.render(); + }; + private initClear() { + this.inited = false; + this.layerService.destroy(); + this.configService.reset(); + this.interactionService.destroy(); + this.controlService.destroy(); + this.removeAllListeners(); + this.map.destroy(); + window.removeEventListener('resize', this.handleWindowResized, false); + } +} diff --git a/packages/core/src/services/shader/IShaderModuleService.ts b/packages/core/src/services/shader/IShaderModuleService.ts new file mode 100644 index 0000000000..7a0a4089ed --- /dev/null +++ b/packages/core/src/services/shader/IShaderModuleService.ts @@ -0,0 +1,24 @@ +import { IUniform } from '../renderer/IUniform'; + +/** + * 提供 ShaderModule 管理服务 + */ + +export interface IModuleParams { + vs: string; + fs: string; + uniforms?: { + [key: string]: IUniform; + }; +} + +export interface IShaderModuleService { + registerModule(moduleName: string, moduleParams: IModuleParams): void; + getModule(moduleName: string): IModuleParams; + + /** + * 注册 L7 内置 shader module + */ + registerBuiltinModules(): void; + destroy(): void; +} diff --git a/packages/core/src/services/shader/ShaderModuleService.ts b/packages/core/src/services/shader/ShaderModuleService.ts new file mode 100644 index 0000000000..f35163ab03 --- /dev/null +++ b/packages/core/src/services/shader/ShaderModuleService.ts @@ -0,0 +1,138 @@ +import { inject, injectable } from 'inversify'; +import { uniq } from 'lodash'; +import { extractUniforms } from '../../utils/shader-module'; +import { IModuleParams, IShaderModuleService } from './IShaderModuleService'; + +import common from '../../shaders/common.glsl'; +import decode from '../../shaders/decode.glsl'; +import light from '../../shaders/light2.glsl'; +import lighting from '../../shaders/lighting.glsl'; +import pickingFrag from '../../shaders/picking.frag.glsl'; +import pickingVert from '../../shaders/picking.vert.glsl'; +import project from '../../shaders/project.glsl'; +import projection from '../../shaders/projection.glsl'; +import sdf2d from '../../shaders/sdf_2d.glsl'; + +const precisionRegExp = /precision\s+(high|low|medium)p\s+float/; +const globalDefaultprecision = + '#ifdef GL_FRAGMENT_PRECISION_HIGH\n precision highp float;\n #else\n precision mediump float;\n#endif\n'; +const includeRegExp = /#pragma include (["^+"]?["\ "[a-zA-Z_0-9](.*)"]*?)/g; + +@injectable() +export default class ShaderModuleService implements IShaderModuleService { + private moduleCache: { [key: string]: IModuleParams } = {}; + private rawContentCache: { [key: string]: IModuleParams } = {}; + + public registerBuiltinModules() { + this.destroy(); + this.registerModule('common', { vs: common, fs: common }); + this.registerModule('decode', { vs: decode, fs: '' }); + this.registerModule('projection', { vs: projection, fs: '' }); + this.registerModule('project', { vs: project, fs: '' }); + this.registerModule('sdf_2d', { vs: '', fs: sdf2d }); + this.registerModule('lighting', { vs: lighting, fs: '' }); + this.registerModule('light', { vs: light, fs: '' }); + this.registerModule('picking', { vs: pickingVert, fs: pickingFrag }); + } + + public registerModule(moduleName: string, moduleParams: IModuleParams) { + // prevent registering the same module multiple times + if (this.rawContentCache[moduleName]) { + return; + } + + const { vs, fs, uniforms: declaredUniforms } = moduleParams; + const { content: extractedVS, uniforms: vsUniforms } = extractUniforms(vs); + const { content: extractedFS, uniforms: fsUniforms } = extractUniforms(fs); + + this.rawContentCache[moduleName] = { + fs: extractedFS, + uniforms: { + ...vsUniforms, + ...fsUniforms, + ...declaredUniforms, + }, + vs: extractedVS, + }; + } + public destroy() { + this.moduleCache = {}; + this.rawContentCache = {}; + } + public getModule(moduleName: string): IModuleParams { + if (this.moduleCache[moduleName]) { + return this.moduleCache[moduleName]; + } + + const rawVS = this.rawContentCache[moduleName].vs; + const rawFS = this.rawContentCache[moduleName].fs; + + const { content: vs, includeList: vsIncludeList } = this.processModule( + rawVS, + [], + 'vs', + ); + const { content: fs, includeList: fsIncludeList } = this.processModule( + rawFS, + [], + 'fs', + ); + let compiledFs = fs; + // TODO: extract uniforms and their default values from GLSL + const uniforms: { + [key: string]: any; + } = uniq(vsIncludeList.concat(fsIncludeList).concat(moduleName)).reduce( + (prev, cur: string) => { + return { + ...prev, + ...this.rawContentCache[cur].uniforms, + }; + }, + {}, + ); + + /** + * set default precision for fragment shader + * https://stackoverflow.com/questions/28540290/why-it-is-necessary-to-set-precision-for-the-fragment-shader + */ + if (!precisionRegExp.test(fs)) { + compiledFs = globalDefaultprecision + fs; + } + + this.moduleCache[moduleName] = { + fs: compiledFs.trim(), + uniforms, + vs: vs.trim(), + }; + return this.moduleCache[moduleName]; + } + + private processModule( + rawContent: string, + includeList: string[], + type: 'vs' | 'fs', + ): { + content: string; + includeList: string[]; + } { + const compiled = rawContent.replace(includeRegExp, (_, strMatch) => { + const includeOpt = strMatch.split(' '); + const includeName = includeOpt[0].replace(/"/g, ''); + + if (includeList.indexOf(includeName) > -1) { + return ''; + } + + const txt = this.rawContentCache[includeName][type]; + includeList.push(includeName); + + const { content } = this.processModule(txt, includeList, type); + return content; + }); + + return { + content: compiled, + includeList, + }; + } +} diff --git a/packages/core/src/services/shader/__tests__/shader.spec.ts b/packages/core/src/services/shader/__tests__/shader.spec.ts new file mode 100644 index 0000000000..b81fdf9eec --- /dev/null +++ b/packages/core/src/services/shader/__tests__/shader.spec.ts @@ -0,0 +1,30 @@ +import 'reflect-metadata'; +import { IShaderModuleService } from '../IShaderModuleService'; +import ShaderModuleService from '../ShaderModuleService'; + +describe('ShaderService', () => { + let shaderService: IShaderModuleService; + + beforeEach(() => { + shaderService = new ShaderModuleService(); + }); + + it('should register common module correctly and generate proper fragment/vertex shader code', () => { + const rawShaderCode = ` + #define PI 3.14 + `; + + const commonModule = { + fs: rawShaderCode, + vs: rawShaderCode, + }; + shaderService.registerModule('common', commonModule); + + const { vs, fs } = shaderService.getModule('common'); + + expect(vs).toMatch(/3\.14/); + expect(fs).toMatch(/3\.14/); + + expect(fs).toMatch(/precision mediump float;/); + }); +}); diff --git a/packages/core/src/services/shader/glsl.d.ts b/packages/core/src/services/shader/glsl.d.ts new file mode 100644 index 0000000000..88eb5a0d56 --- /dev/null +++ b/packages/core/src/services/shader/glsl.d.ts @@ -0,0 +1,4 @@ +declare module '*.glsl' { + const value: string; + export default value; +} \ No newline at end of file diff --git a/packages/core/src/services/source/ISourceService.ts b/packages/core/src/services/source/ISourceService.ts new file mode 100644 index 0000000000..c04b21a931 --- /dev/null +++ b/packages/core/src/services/source/ISourceService.ts @@ -0,0 +1,63 @@ +export type DataType = string | object[] | object; +export interface IParserCfg { + type: string; + x?: string; + y?: string; + x1?: string; + y1?: string; + coordinates?: string; + [key: string]: any; +} +type CallBack = (...args: any[]) => any; +export interface ITransform { + type: string; + [key: string]: any; + callback?: CallBack; +} + +export interface ISourceCFG { + parser?: IParserCfg; + transforms?: ITransform[]; +} +export interface IDictionary { + [key: string]: TValue; +} +export interface IFeatureKey { + [key: string]: { + index: number; + idField: any; + }; +} +// 解析后返回数据类型 +export interface IParseDataItem { + coordinates: any[]; + _id: number; + [key: string]: any; +} +export interface IParserData { + [key: string]: any; + dataArray: IParseDataItem[]; + // 瓦片地图数据字典 + featureKeys?: IFeatureKey; +} +export interface IJsonItem { + [key: string]: any; +} +export type IJsonData = IJsonItem[]; + +export interface ISource { + data: IParserData; +} +export interface IRasterCfg { + extent: [number, number, number, number]; + width: number; + height: number; + max: number; + min: number; +} + +export interface IRasterParserDataItem extends IParseDataItem { + data: number[]; + width: number; + height: number; +} diff --git a/packages/core/src/shaders/common.glsl b/packages/core/src/shaders/common.glsl new file mode 100644 index 0000000000..d4b6e8dbaf --- /dev/null +++ b/packages/core/src/shaders/common.glsl @@ -0,0 +1 @@ +#define PI 3.14159265359 \ No newline at end of file diff --git a/packages/core/src/shaders/decode.glsl b/packages/core/src/shaders/decode.glsl new file mode 100644 index 0000000000..07818873f9 --- /dev/null +++ b/packages/core/src/shaders/decode.glsl @@ -0,0 +1,30 @@ +#define SHIFT_RIGHT17 1.0 / 131072.0 +#define SHIFT_RIGHT18 1.0 / 262144.0 +#define SHIFT_RIGHT19 1.0 / 524288.0 +#define SHIFT_RIGHT20 1.0 / 1048576.0 +#define SHIFT_RIGHT21 1.0 / 2097152.0 +#define SHIFT_RIGHT22 1.0 / 4194304.0 +#define SHIFT_RIGHT23 1.0 / 8388608.0 +#define SHIFT_RIGHT24 1.0 / 16777216.0 + +#define SHIFT_LEFT17 131072.0 +#define SHIFT_LEFT18 262144.0 +#define SHIFT_LEFT19 524288.0 +#define SHIFT_LEFT20 1048576.0 +#define SHIFT_LEFT21 2097152.0 +#define SHIFT_LEFT22 4194304.0 +#define SHIFT_LEFT23 8388608.0 +#define SHIFT_LEFT24 16777216.0 + +vec2 unpack_float(const float packedValue) { + int packedIntValue = int(packedValue); + int v0 = packedIntValue / 256; + return vec2(v0, packedIntValue - v0 * 256); +} + +vec4 decode_color(const vec2 encodedColor) { + return vec4( + unpack_float(encodedColor[0]) / 255.0, + unpack_float(encodedColor[1]) / 255.0 + ); +} \ No newline at end of file diff --git a/packages/core/src/shaders/light2.glsl b/packages/core/src/shaders/light2.glsl new file mode 100644 index 0000000000..a22101d161 --- /dev/null +++ b/packages/core/src/shaders/light2.glsl @@ -0,0 +1,25 @@ +#define ambientRatio 0.5 +#define diffuseRatio 0.3 +#define specularRatio 0.2 + + +float calc_lighting(vec4 pos) { + + vec3 worldPos = vec3(pos * u_ModelMatrix); + + vec3 worldNormal = a_Normal; + // //cal light weight + vec3 viewDir = normalize(u_CameraPosition - worldPos); + + vec3 lightDir = normalize(reverse_offset_normal(vec3(1, 10.5, 12))); + + vec3 halfDir = normalize(viewDir+lightDir); + // //lambert + float lambert = dot(worldNormal, lightDir); + //specular + float specular = pow(max(0.0, dot(worldNormal, halfDir)), 32.0); + //sum to light weight + float lightWeight = ambientRatio + diffuseRatio * lambert + specularRatio * specular; + + return lightWeight; +} diff --git a/packages/core/src/shaders/lighting.glsl b/packages/core/src/shaders/lighting.glsl new file mode 100644 index 0000000000..fa4d2911e5 --- /dev/null +++ b/packages/core/src/shaders/lighting.glsl @@ -0,0 +1,97 @@ +// Blinn-Phong model +// apply lighting in vertex shader instead of fragment shader +// @see https://learnopengl.com/Advanced-Lighting/Advanced-Lighting +uniform float u_Ambient : 1.0; +uniform float u_Diffuse : 1.0; +uniform float u_Specular : 1.0; +uniform int u_NumOfDirectionalLights : 1; +uniform int u_NumOfSpotLights : 0; + +#define SHININESS 32.0 +#define MAX_NUM_OF_DIRECTIONAL_LIGHTS 3 +#define MAX_NUM_OF_SPOT_LIGHTS 3 + +struct DirectionalLight { + vec3 direction; + vec3 ambient; + vec3 diffuse; + vec3 specular; +}; + +struct SpotLight { + vec3 position; + vec3 direction; + vec3 ambient; + vec3 diffuse; + vec3 specular; + float constant; + float linear; + float quadratic; + float angle; + float blur; + float exponent; +}; + +uniform DirectionalLight u_DirectionalLights[MAX_NUM_OF_DIRECTIONAL_LIGHTS]; +uniform SpotLight u_SpotLights[MAX_NUM_OF_SPOT_LIGHTS]; + +vec3 calc_directional_light(DirectionalLight light, vec3 normal, vec3 viewDir) { + vec3 lightDir = normalize(light.direction); + // diffuse shading + float diff = max(dot(normal, lightDir), 0.0); + // Blinn-Phong specular shading + vec3 halfwayDir = normalize(lightDir + viewDir); + float spec = pow(max(dot(normal, halfwayDir), 0.0), SHININESS); + + vec3 ambient = light.ambient * u_Ambient; + vec3 diffuse = light.diffuse * diff * u_Diffuse; + vec3 specular = light.specular * spec * u_Specular; + + return ambient + diffuse + specular; +} + +// vec3 calc_spot_light(SpotLight light, vec3 normal, vec3 fragPos, vec3 viewDir) { +// vec3 lightDir = normalize(light.position - fragPos); +// // diffuse shading +// float diff = max(dot(normal, lightDir), 0.0); +// // specular shading +// vec3 reflectDir = reflect(-lightDir, normal); +// float spec = pow(max(dot(viewDir, reflectDir), 0.0), SHININESS); +// // attenuation +// float distance = length(light.position - fragPos); +// float attenuation = 1.0 / (light.constant + light.linear * distance + +// light.quadratic * (distance * distance)); + +// vec3 ambient = light.ambient * u_Ambient; +// vec3 diffuse = light.diffuse * diff * u_Diffuse; +// vec3 specular = light.specular * spec * u_Specular; + +// float spotEffect = dot(normalize(light.direction), -lightDir); +// float spotCosCutoff = cos(light.angle / 180.0 * PI); +// float spotCosOuterCutoff = cos((light.angle + light.blur) / 180.0 * PI); +// float spotCosInnerCutoff = cos((light.angle - light.blur) / 180.0 * PI); +// if (spotEffect > spotCosCutoff) { +// spotEffect = pow(smoothstep(spotCosOuterCutoff, spotCosInnerCutoff, spotEffect), light.exponent); +// } else { +// spotEffect = 0.0; +// } + +// return ambient + attenuation * (spotEffect * diffuse + specular); +// } + +vec3 calc_lighting(vec3 position, vec3 normal, vec3 viewDir) { + vec3 weight = vec3(0.0); + for (int i = 0; i < MAX_NUM_OF_DIRECTIONAL_LIGHTS; i++) { + if (i >= u_NumOfDirectionalLights) { + break; + } + weight += calc_directional_light(u_DirectionalLights[i], normal, viewDir); + } + // for (int i = 0; i < MAX_NUM_OF_SPOT_LIGHTS; i++) { + // if (i >= u_NumOfSpotLights) { + // break; + // } + // weight += calc_spot_light(u_SpotLights[i], normal, position, viewDir); + // } + return weight; +} \ No newline at end of file diff --git a/packages/core/src/shaders/picking.frag.glsl b/packages/core/src/shaders/picking.frag.glsl new file mode 100644 index 0000000000..66e78052ac --- /dev/null +++ b/packages/core/src/shaders/picking.frag.glsl @@ -0,0 +1,46 @@ +varying vec4 v_PickingResult; +uniform vec4 u_HighlightColor : [0, 0, 0, 0]; +uniform float u_PickingStage : 0.0; + +#define PICKING_NONE 0.0 +#define PICKING_ENCODE 1.0 +#define PICKING_HIGHLIGHT 2.0 +#define COLOR_SCALE 1. / 255. + +/* + * Returns highlight color if this item is selected. + */ +vec4 filterHighlightColor(vec4 color) { + bool selected = bool(v_PickingResult.a); + + if (selected) { + vec4 highLightColor = u_HighlightColor * COLOR_SCALE; + + float highLightAlpha = highLightColor.a; + float highLightRatio = highLightAlpha / (highLightAlpha + color.a * (1.0 - highLightAlpha)); + + vec3 resultRGB = mix(color.rgb, highLightColor.rgb, highLightRatio); + return vec4(resultRGB, color.a); + } else { + return color; + } +} + +/* + * Returns picking color if picking enabled else unmodified argument. + */ +vec4 filterPickingColor(vec4 color) { + vec3 pickingColor = v_PickingResult.rgb; + if (u_PickingStage == PICKING_ENCODE && length(pickingColor) < 0.001) { + discard; + } + return u_PickingStage == PICKING_ENCODE ? vec4(pickingColor, 1.0) : color; +} + +/* + * Returns picking color if picking is enabled if not + * highlight color if this item is selected, otherwise unmodified argument. + */ +vec4 filterColor(vec4 color) { + return filterPickingColor(filterHighlightColor(color)); +} \ No newline at end of file diff --git a/packages/core/src/shaders/picking.vert.glsl b/packages/core/src/shaders/picking.vert.glsl new file mode 100644 index 0000000000..7b1f2c8b5a --- /dev/null +++ b/packages/core/src/shaders/picking.vert.glsl @@ -0,0 +1,27 @@ +attribute vec3 a_PickingColor; +varying vec4 v_PickingResult; + +uniform vec3 u_PickingColor : [0, 0, 0]; +uniform vec4 u_HighlightColor : [0, 0, 0, 0]; +uniform float u_PickingStage : 0.0; +uniform float u_PickingThreshold : 1.0; + +#define PICKING_NONE 0.0 +#define PICKING_ENCODE 1.0 +#define PICKING_HIGHLIGHT 2.0 +#define COLOR_SCALE 1. / 255. + +bool isVertexPicked(vec3 vertexColor) { + return + abs(vertexColor.r - u_PickingColor.r) < u_PickingThreshold && + abs(vertexColor.g - u_PickingColor.g) < u_PickingThreshold && + abs(vertexColor.b - u_PickingColor.b) < u_PickingThreshold; +} + +void setPickingColor(vec3 pickingColor) { + // compares only in highlight stage + v_PickingResult.a = float((u_PickingStage == PICKING_HIGHLIGHT) && isVertexPicked(pickingColor)); + + // Stores the picking color so that the fragment shader can render it during picking + v_PickingResult.rgb = pickingColor * COLOR_SCALE; +} diff --git a/packages/core/src/shaders/post-processing/blend.glsl b/packages/core/src/shaders/post-processing/blend.glsl new file mode 100644 index 0000000000..2a8cbf98dd --- /dev/null +++ b/packages/core/src/shaders/post-processing/blend.glsl @@ -0,0 +1,13 @@ +uniform float u_opacity : 1.0; +uniform float u_MixRatio : 0.5; + +uniform sampler2D u_Diffuse1; +uniform sampler2D u_Diffuse2; + +varying vec2 v_UV; + +void main() { + vec4 texel1 = texture2D(u_Diffuse1, v_UV); + vec4 texel2 = texture2D(u_Diffuse2, v_UV); + gl_FragColor = u_opacity * mix(texel1, texel2, u_MixRatio); +} diff --git a/packages/core/src/shaders/post-processing/blur.glsl b/packages/core/src/shaders/post-processing/blur.glsl new file mode 100644 index 0000000000..988f625841 --- /dev/null +++ b/packages/core/src/shaders/post-processing/blur.glsl @@ -0,0 +1,23 @@ +varying vec2 v_UV; + +uniform sampler2D u_Texture; + +uniform vec2 u_ViewportSize: [1.0, 1.0]; +uniform vec2 u_BlurDir: [1.0, 0.0]; + +// https://github.com/Jam3/glsl-fast-gaussian-blur/blob/master/9.glsl +vec4 blur9(sampler2D image, vec2 uv, vec2 resolution, vec2 direction) { + vec4 color = vec4(0.0); + vec2 off1 = vec2(1.3846153846) * direction; + vec2 off2 = vec2(3.2307692308) * direction; + color += texture2D(image, uv) * 0.2270270270; + color += texture2D(image, uv + (off1 / resolution)) * 0.3162162162; + color += texture2D(image, uv - (off1 / resolution)) * 0.3162162162; + color += texture2D(image, uv + (off2 / resolution)) * 0.0702702703; + color += texture2D(image, uv - (off2 / resolution)) * 0.0702702703; + return color; +} + +void main() { + gl_FragColor = blur9(u_Texture, v_UV, u_ViewportSize, u_BlurDir); +} \ No newline at end of file diff --git a/packages/core/src/shaders/post-processing/colorhalftone.glsl b/packages/core/src/shaders/post-processing/colorhalftone.glsl new file mode 100644 index 0000000000..dd43c37d90 --- /dev/null +++ b/packages/core/src/shaders/post-processing/colorhalftone.glsl @@ -0,0 +1,44 @@ +varying vec2 v_UV; + +uniform sampler2D u_Texture; +uniform vec2 u_ViewportSize: [1.0, 1.0]; +uniform vec2 u_Center : [0.5, 0.5]; +uniform float u_Angle : 0; +uniform float u_Size : 8; + +#pragma include "common" + +float scale = PI / u_Size; + +float pattern(float u_Angle, vec2 texSize, vec2 texCoord) { + float s = sin(u_Angle), c = cos(u_Angle); + vec2 tex = texCoord * texSize - u_Center * texSize; + vec2 point = vec2( + c * tex.x - s * tex.y, + s * tex.x + c * tex.y + ) * scale; + return (sin(point.x) * sin(point.y)) * 4.0; +} + +// https://github.com/evanw/glfx.js/blob/master/src/filters/fun/colorhalftone.js +vec4 colorHalftone_filterColor(vec4 color, vec2 texSize, vec2 texCoord) { + vec3 cmy = 1.0 - color.rgb; + float k = min(cmy.x, min(cmy.y, cmy.z)); + cmy = (cmy - k) / (1.0 - k); + cmy = clamp( + cmy * 10.0 - 3.0 + vec3( + pattern(u_Angle + 0.26179, texSize, texCoord), + pattern(u_Angle + 1.30899, texSize, texCoord), + pattern(u_Angle, texSize, texCoord) + ), + 0.0, + 1.0 + ); + k = clamp(k * 10.0 - 5.0 + pattern(u_Angle + 0.78539, texSize, texCoord), 0.0, 1.0); + return vec4(1.0 - cmy - k, color.a); +} + +void main() { + gl_FragColor = vec4(texture2D(u_Texture, v_UV)); + gl_FragColor = colorHalftone_filterColor(gl_FragColor, u_ViewportSize, v_UV); +} \ No newline at end of file diff --git a/packages/core/src/shaders/post-processing/copy.glsl b/packages/core/src/shaders/post-processing/copy.glsl new file mode 100644 index 0000000000..6f5eeab786 --- /dev/null +++ b/packages/core/src/shaders/post-processing/copy.glsl @@ -0,0 +1,7 @@ +varying vec2 v_UV; + +uniform sampler2D u_Texture; + +void main() { + gl_FragColor = vec4(texture2D(u_Texture, v_UV)); +} \ No newline at end of file diff --git a/packages/core/src/shaders/post-processing/hexagonalpixelate.glsl b/packages/core/src/shaders/post-processing/hexagonalpixelate.glsl new file mode 100644 index 0000000000..1892e29991 --- /dev/null +++ b/packages/core/src/shaders/post-processing/hexagonalpixelate.glsl @@ -0,0 +1,44 @@ +varying vec2 v_UV; + +uniform sampler2D u_Texture; +uniform vec2 u_ViewportSize: [1.0, 1.0]; +uniform vec2 u_Center : [0.5, 0.5]; +uniform float u_Scale : 10; + +// https://github.com/evanw/glfx.js/blob/master/src/filters/fun/hexagonalpixelate.js +vec4 hexagonalPixelate_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) { + vec2 tex = (texCoord * texSize - u_Center * texSize) / u_Scale; + tex.y /= 0.866025404; + tex.x -= tex.y * 0.5; + vec2 a; + if (tex.x + tex.y - floor(tex.x) - floor(tex.y) < 1.0) { + a = vec2(floor(tex.x), floor(tex.y)); + } + else a = vec2(ceil(tex.x), ceil(tex.y)); + vec2 b = vec2(ceil(tex.x), floor(tex.y)); + vec2 c = vec2(floor(tex.x), ceil(tex.y)); + vec3 TEX = vec3(tex.x, tex.y, 1.0 - tex.x - tex.y); + vec3 A = vec3(a.x, a.y, 1.0 - a.x - a.y); + vec3 B = vec3(b.x, b.y, 1.0 - b.x - b.y); + vec3 C = vec3(c.x, c.y, 1.0 - c.x - c.y); + float alen = length(TEX - A); + float blen = length(TEX - B); + float clen = length(TEX - C); + vec2 choice; + if (alen < blen) { + if (alen < clen) choice = a; + else choice = c; + } else { + if (blen < clen) choice = b; + else choice = c; + } + choice.x += choice.y * 0.5; + choice.y *= 0.866025404; + choice *= u_Scale / texSize; + return texture2D(texture, choice + u_Center); +} + +void main() { + gl_FragColor = vec4(texture2D(u_Texture, v_UV)); + gl_FragColor = hexagonalPixelate_sampleColor(u_Texture, u_ViewportSize, v_UV); +} \ No newline at end of file diff --git a/packages/core/src/shaders/post-processing/ink.glsl b/packages/core/src/shaders/post-processing/ink.glsl new file mode 100644 index 0000000000..3d5e76777b --- /dev/null +++ b/packages/core/src/shaders/post-processing/ink.glsl @@ -0,0 +1,34 @@ +varying vec2 v_UV; + +uniform sampler2D u_Texture; +uniform vec2 u_ViewportSize: [1.0, 1.0]; +uniform float u_Strength : 0.6; + +vec4 ink_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) { + vec2 dx = vec2(1.0 / texSize.x, 0.0); + vec2 dy = vec2(0.0, 1.0 / texSize.y); + vec4 color = texture2D(texture, texCoord); + float bigTotal = 0.0; + float smallTotal = 0.0; + vec3 bigAverage = vec3(0.0); + vec3 smallAverage = vec3(0.0); + for (float x = -2.0; x <= 2.0; x += 1.0) { + for (float y = -2.0; y <= 2.0; y += 1.0) { + vec3 sample = texture2D(texture, texCoord + dx * x + dy * y).rgb; + bigAverage += sample; + bigTotal += 1.0; + if (abs(x) + abs(y) < 2.0) { + smallAverage += sample; + smallTotal += 1.0; + } + } + } + vec3 edge = max(vec3(0.0), bigAverage / bigTotal - smallAverage / smallTotal); + float power = u_Strength * u_Strength * u_Strength * u_Strength * u_Strength; + return vec4(color.rgb - dot(edge, edge) * power * 100000.0, color.a); +} + +void main() { + gl_FragColor = vec4(texture2D(u_Texture, v_UV)); + gl_FragColor = ink_sampleColor(u_Texture, u_ViewportSize, v_UV); +} \ No newline at end of file diff --git a/packages/core/src/shaders/post-processing/noise.glsl b/packages/core/src/shaders/post-processing/noise.glsl new file mode 100644 index 0000000000..e66109f029 --- /dev/null +++ b/packages/core/src/shaders/post-processing/noise.glsl @@ -0,0 +1,22 @@ +varying vec2 v_UV; + +uniform sampler2D u_Texture; +uniform float u_Amount : 0.5; + +float rand(vec2 co) { + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); +} + +// https://github.com/evanw/glfx.js/blob/master/src/filters/adjust/noise.js +vec4 noise_filterColor(vec4 color, vec2 texCoord) { + float diff = (rand(texCoord) - 0.5) * u_Amount; + color.r += diff; + color.g += diff; + color.b += diff; + return color; +} + +void main() { + gl_FragColor = vec4(texture2D(u_Texture, v_UV)); + gl_FragColor = noise_filterColor(gl_FragColor, v_UV); +} \ No newline at end of file diff --git a/packages/core/src/shaders/post-processing/quad.glsl b/packages/core/src/shaders/post-processing/quad.glsl new file mode 100644 index 0000000000..040e54efe1 --- /dev/null +++ b/packages/core/src/shaders/post-processing/quad.glsl @@ -0,0 +1,8 @@ +attribute vec2 a_Position; + +varying vec2 v_UV; + +void main() { + v_UV = 0.5 * (a_Position + 1.0); + gl_Position = vec4(a_Position, 0., 1.); +} \ No newline at end of file diff --git a/packages/core/src/shaders/post-processing/sepia.glsl b/packages/core/src/shaders/post-processing/sepia.glsl new file mode 100644 index 0000000000..204ede6ec7 --- /dev/null +++ b/packages/core/src/shaders/post-processing/sepia.glsl @@ -0,0 +1,22 @@ +varying vec2 v_UV; + +uniform sampler2D u_Texture; + +uniform float u_Amount : 0.5; + +// https://github.com/evanw/glfx.js/blob/master/src/filters/adjust/sepia.js +vec4 sepia_filterColor(vec4 color) { + float r = color.r; + float g = color.g; + float b = color.b; + color.r = + min(1.0, (r * (1.0 - (0.607 * u_Amount))) + (g * (0.769 * u_Amount)) + (b * (0.189 * u_Amount))); + color.g = min(1.0, (r * 0.349 * u_Amount) + (g * (1.0 - (0.314 * u_Amount))) + (b * 0.168 * u_Amount)); + color.b = min(1.0, (r * 0.272 * u_Amount) + (g * 0.534 * u_Amount) + (b * (1.0 - (0.869 * u_Amount)))); + return color; +} + +void main() { + gl_FragColor = vec4(texture2D(u_Texture, v_UV)); + gl_FragColor = sepia_filterColor(gl_FragColor); +} \ No newline at end of file diff --git a/packages/core/src/shaders/project.glsl b/packages/core/src/shaders/project.glsl new file mode 100644 index 0000000000..df6ee0bc43 --- /dev/null +++ b/packages/core/src/shaders/project.glsl @@ -0,0 +1,34 @@ + +#define E 2.718281828459045 +vec2 ProjectFlat(vec2 lnglat){ + float maxs=85.0511287798; + float lat=max(min(maxs,lnglat.y),-maxs); + float scale= 268435456.; + float d=PI/180.; + float x=lnglat.x*d; + float y=lat*d; + y=log(tan((PI/4.)+(y/2.))); + + float a=.5/PI, + b=.5, + c=-.5/PI; + d=.5; + x=scale*(a*x+b); + y=scale*(c*y+d); + return vec2(x,y); +} + +vec2 unProjectFlat(vec2 px){ + float a=.5/PI; + float b=.5; + float c=-.5/PI; + float d=.5; + float scale = 268435456.; + float x=(px.x/scale-b)/a; + float y=(px.y/scale-d)/c; + y=(atan(pow(E,y))-(PI/4.))*2.; + d=PI/180.; + float lat=y/d; + float lng=x/d; + return vec2(lng,lat); +} diff --git a/packages/core/src/shaders/projection.glsl b/packages/core/src/shaders/projection.glsl new file mode 100644 index 0000000000..4f792e549e --- /dev/null +++ b/packages/core/src/shaders/projection.glsl @@ -0,0 +1,151 @@ +#define TILE_SIZE 512.0 +#define PI 3.1415926536 +#define WORLD_SCALE TILE_SIZE / (PI * 2.0) + +#define COORDINATE_SYSTEM_LNGLAT 1.0 +#define COORDINATE_SYSTEM_LNGLAT_OFFSET 2.0 +#define COORDINATE_SYSTEM_VECTOR_TILE 3.0 +#define COORDINATE_SYSTEM_IDENTITY 4.0 +#define COORDINATE_SYSTEM_P20 5.0 +#define COORDINATE_SYSTEM_P20_OFFSET 6.0 +#define COORDINATE_SYSTEM_METER_OFFSET 7.0 + +uniform mat4 u_ViewMatrix; +uniform mat4 u_ProjectionMatrix; +uniform mat4 u_ViewProjectionMatrix; +uniform float u_Zoom : 1; +uniform float u_ZoomScale : 1; + +uniform float u_CoordinateSystem; +uniform vec2 u_ViewportCenter; +uniform vec4 u_ViewportCenterProjection; +uniform vec3 u_PixelsPerDegree; +uniform vec3 u_PixelsPerDegree2; +uniform vec3 u_PixelsPerMeter; + +uniform vec2 u_ViewportSize; +uniform float u_DevicePixelRatio; +uniform float u_FocalDistance; +uniform vec3 u_CameraPosition; + +// web mercator coords -> world coords +vec2 project_mercator(vec2 lnglat) { + float x = lnglat.x; + return vec2( + radians(x) + PI, + PI - log(tan(PI * 0.25 + radians(lnglat.y) * 0.5)) + ); +} + +float project_scale(float meters) { + return meters * u_PixelsPerMeter.z; +} + + +// offset coords -> world coords +vec4 project_offset(vec4 offset) { + float dy = offset.y; + dy = clamp(dy, -1., 1.); + vec3 pixels_per_unit = u_PixelsPerDegree + u_PixelsPerDegree2 * dy; + return vec4(offset.xyz * pixels_per_unit, offset.w); +} + +vec3 project_normal(vec3 normal) { + vec4 normal_modelspace = u_ModelMatrix * vec4(normal, 0.0); + return normalize(normal_modelspace.xyz * u_PixelsPerMeter); +} + +vec3 project_offset_normal(vec3 vector) { + if (u_CoordinateSystem == COORDINATE_SYSTEM_LNGLAT + || u_CoordinateSystem == COORDINATE_SYSTEM_LNGLAT_OFFSET) { + // normals generated by the polygon tesselator are in lnglat offsets instead of meters + return normalize(vector * u_PixelsPerDegree); + } + return project_normal(vector); +} + +// reverse Y +vec3 reverse_offset_normal(vec3 vector) { + if (u_CoordinateSystem == COORDINATE_SYSTEM_P20) { + return vector * vec3(1.0, -1.0, 1.0); + } + return vector; +} + +vec4 project_position(vec4 position) { + if (u_CoordinateSystem == COORDINATE_SYSTEM_LNGLAT_OFFSET + || u_CoordinateSystem == COORDINATE_SYSTEM_P20_OFFSET) { + float X = position.x - u_ViewportCenter.x; + float Y = position.y - u_ViewportCenter.y; + return project_offset(vec4(X, Y, position.z, position.w)); + } + + if (u_CoordinateSystem == COORDINATE_SYSTEM_LNGLAT) { + return vec4( + project_mercator(position.xy) * WORLD_SCALE * u_ZoomScale, + project_scale(position.z), + position.w + ); + } + + if (u_CoordinateSystem == COORDINATE_SYSTEM_P20) { + return vec4( + (project_mercator(position.xy) * WORLD_SCALE * u_ZoomScale - vec2(215440491., 106744817.)) * vec2(1., -1.), + project_scale(position.z), + position.w + ); + } + + // TODO: 瓦片坐标系 & 常规世界坐标系 +} + +vec2 project_pixel_size_to_clipspace(vec2 pixels) { + vec2 offset = pixels / u_ViewportSize * u_DevicePixelRatio * 2.0; + return offset * u_FocalDistance; +} + +float project_pixel(float pixel) { + if (u_CoordinateSystem == COORDINATE_SYSTEM_P20 + || u_CoordinateSystem == COORDINATE_SYSTEM_P20_OFFSET) { + // P20 坐标系下,为了和 Web 墨卡托坐标系统一,zoom 默认减1 + return pixel * pow(2.0, (19.0 - u_Zoom)); + } + return pixel; +} +vec2 project_pixel(vec2 pixel) { + if (u_CoordinateSystem == COORDINATE_SYSTEM_P20 + || u_CoordinateSystem == COORDINATE_SYSTEM_P20_OFFSET) { + // P20 坐标系下,为了和 Web 墨卡托坐标系统一,zoom 默认减1 + return pixel * pow(2.0, (19.0 - u_Zoom)); + } + return pixel; +} + +vec4 project_common_position_to_clipspace(vec4 position, mat4 viewProjectionMatrix, vec4 center) { + if (u_CoordinateSystem == COORDINATE_SYSTEM_METER_OFFSET || + u_CoordinateSystem == COORDINATE_SYSTEM_LNGLAT_OFFSET) { + // Needs to be divided with project_uCommonUnitsPerMeter + position.w *= u_PixelsPerMeter.z; + } + return viewProjectionMatrix * position + center; +} + +// Projects from common space coordinates to clip space +vec4 project_common_position_to_clipspace(vec4 position) { + return project_common_position_to_clipspace( + position, + u_ViewProjectionMatrix, + u_ViewportCenterProjection + ); +} + +vec4 unproject_clipspace_to_position(vec4 clipspacePos, mat4 u_InverseViewProjectionMatrix) { + vec4 pos = u_InverseViewProjectionMatrix * (clipspacePos - u_ViewportCenterProjection); + + if (u_CoordinateSystem == COORDINATE_SYSTEM_METER_OFFSET || + u_CoordinateSystem == COORDINATE_SYSTEM_LNGLAT_OFFSET) { + // Needs to be divided with project_uCommonUnitsPerMeter + pos.w = pos.w / u_PixelsPerMeter.z; + } + return pos; +} diff --git a/packages/core/src/shaders/sdf_2d.glsl b/packages/core/src/shaders/sdf_2d.glsl new file mode 100644 index 0000000000..4498415879 --- /dev/null +++ b/packages/core/src/shaders/sdf_2d.glsl @@ -0,0 +1,74 @@ +/** + * 2D signed distance field functions + * @see http://www.iquilezles.org/www/articles/distfunctions2d/distfunctions2d.htm + */ + +float ndot(vec2 a, vec2 b ) { return a.x*b.x - a.y*b.y; } + +float sdCircle(vec2 p, float r) { + return length(p) - r; +} + +float sdEquilateralTriangle(vec2 p) { + const float k = sqrt(3.0); + p.x = abs(p.x) - 1.0; + p.y = p.y + 1.0/k; + if( p.x + k*p.y > 0.0 ) p = vec2(p.x-k*p.y,-k*p.x-p.y)/2.0; + p.x -= clamp( p.x, -2.0, 0.0 ); + return -length(p)*sign(p.y); +} + +float sdBox(vec2 p, vec2 b) { + vec2 d = abs(p)-b; + return length(max(d,vec2(0))) + min(max(d.x,d.y),0.0); +} + +float sdPentagon(vec2 p, float r) { + const vec3 k = vec3(0.809016994,0.587785252,0.726542528); + p.x = abs(p.x); + p -= 2.0*min(dot(vec2(-k.x,k.y),p),0.0)*vec2(-k.x,k.y); + p -= 2.0*min(dot(vec2( k.x,k.y),p),0.0)*vec2( k.x,k.y); + p -= vec2(clamp(p.x,-r*k.z,r*k.z),r); + return length(p)*sign(p.y); +} + +float sdHexagon(vec2 p, float r) { + const vec3 k = vec3(-0.866025404,0.5,0.577350269); + p = abs(p); + p -= 2.0*min(dot(k.xy,p),0.0)*k.xy; + p -= vec2(clamp(p.x, -k.z*r, k.z*r), r); + return length(p)*sign(p.y); +} + +float sdOctogon(vec2 p, float r) { + const vec3 k = vec3(-0.9238795325, 0.3826834323, 0.4142135623 ); + p = abs(p); + p -= 2.0*min(dot(vec2( k.x,k.y),p),0.0)*vec2( k.x,k.y); + p -= 2.0*min(dot(vec2(-k.x,k.y),p),0.0)*vec2(-k.x,k.y); + p -= vec2(clamp(p.x, -k.z*r, k.z*r), r); + return length(p)*sign(p.y); +} + +float sdHexagram(vec2 p, float r) { + const vec4 k=vec4(-0.5,0.8660254038,0.5773502692,1.7320508076); + p = abs(p); + p -= 2.0*min(dot(k.xy,p),0.0)*k.xy; + p -= 2.0*min(dot(k.yx,p),0.0)*k.yx; + p -= vec2(clamp(p.x,r*k.z,r*k.w),r); + return length(p)*sign(p.y); +} + +float sdRhombus(vec2 p, vec2 b) { + vec2 q = abs(p); + float h = clamp((-2.0*ndot(q,b)+ndot(b,b))/dot(b,b),-1.0,1.0); + float d = length( q - 0.5*b*vec2(1.0-h,1.0+h) ); + return d * sign( q.x*b.y + q.y*b.x - b.x*b.y ); +} + +float sdVesica(vec2 p, float r, float d) { + p = abs(p); + float b = sqrt(r*r-d*d); // can delay this sqrt + return ((p.y-b)*d>p.x*b) + ? length(p-vec2(0.0,b)) + : length(p-vec2(-d,0.0))-r; +} \ No newline at end of file diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts new file mode 100644 index 0000000000..388c2fdf5d --- /dev/null +++ b/packages/core/src/types.ts @@ -0,0 +1,25 @@ +const TYPES = { + IEventEmitter: Symbol.for('IEventEmitter'), + ISceneService: Symbol.for('ISceneService'), + IGlobalConfigService: Symbol.for('IGlobalConfigService'), + ICameraService: Symbol.for('ICameraService'), + ICoordinateSystemService: Symbol.for('ICoordinateSystemService'), + ILayerService: Symbol.for('ILayerService'), + ILayerMappingService: Symbol.for('ILayerMappingService'), + ILayerStyleService: Symbol.for('ILayerStyleService'), + ILogService: Symbol.for('ILogService'), + IMapService: Symbol.for('IMapService'), + IFactoryMapService: Symbol.for('Factory'), + IRendererService: Symbol.for('IRendererService'), + IShaderModuleService: Symbol.for('IShaderModuleService'), + IIconService: Symbol.for('IIconService'), + IFontService: Symbol.for('IFontService'), + IInteractionService: Symbol.for('IInteractionService'), + IControlService: Symbol.for('IControlService'), + IStyleAttributeService: Symbol.for('IStyleAttributeService'), + ILayerPlugin: Symbol.for('ILayerPlugin'), + IPostProcessingPass: Symbol.for('IPostProcessingPass'), + IFactoryPostProcessingPass: Symbol.for('Factory'), +}; + +export { TYPES }; diff --git a/packages/core/src/utils/__tests__/math.spec.ts b/packages/core/src/utils/__tests__/math.spec.ts new file mode 100644 index 0000000000..a6e0fe3322 --- /dev/null +++ b/packages/core/src/utils/__tests__/math.spec.ts @@ -0,0 +1,10 @@ +import { createVec3, getAngle } from '../math'; + +describe('util.math', () => { + it('should clamp angle with `getAngle()`', () => { + expect(getAngle(30)).toBe(30); + expect(getAngle(361)).toBe(1); + expect(getAngle(-361)).toBe(-1); + expect(getAngle(undefined)).toBe(0); + }); +}); diff --git a/packages/core/src/utils/clock.ts b/packages/core/src/utils/clock.ts new file mode 100644 index 0000000000..a51f946242 --- /dev/null +++ b/packages/core/src/utils/clock.ts @@ -0,0 +1,50 @@ +// https://github.com/mrdoob/three.js/blob/master/src/core/Clock.js +export default class Clock { + private autoStart: boolean; + private startTime: number = 0; + private oldTime: number = 0; + private running: boolean = false; + private elapsedTime: number = 0; + constructor(autoStart = true) { + this.autoStart = autoStart; + } + public start() { + this.startTime = (typeof performance === 'undefined' + ? Date + : performance + ).now(); + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + } + public stop() { + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + } + + public getElapsedTime() { + this.getDelta(); + return this.elapsedTime; + } + public getDelta() { + let diff = 0; + + if (this.autoStart && !this.running) { + this.start(); + return 0; + } + + if (this.running) { + const newTime = (typeof performance === 'undefined' + ? Date + : performance + ).now(); + diff = (newTime - this.oldTime) / 1000; + this.oldTime = newTime; + this.elapsedTime += diff; + } + return diff; + } +} diff --git a/packages/core/src/utils/dom.ts b/packages/core/src/utils/dom.ts new file mode 100644 index 0000000000..35b543e7ce --- /dev/null +++ b/packages/core/src/utils/dom.ts @@ -0,0 +1,22 @@ +const docStyle = window.document.documentElement.style; +type ELType = HTMLElement | SVGElement; +export function createRendererContainer(domId: string): HTMLDivElement | null { + const $wrapper = document.getElementById(domId); + + if ($wrapper) { + const $container = document.createElement('div'); + $container.style.cssText += ` + position: absolute; + top: 0; + z-index:2; + height: 100%; + width: 100%; + pointer-events: none; + `; + $container.id = 'l7_canvaslayer'; + $wrapper.appendChild($container); + return $container; + } + + return null; +} diff --git a/packages/core/src/utils/font_util.ts b/packages/core/src/utils/font_util.ts new file mode 100644 index 0000000000..e53d327d83 --- /dev/null +++ b/packages/core/src/utils/font_util.ts @@ -0,0 +1,107 @@ +import { IFontMappingOption } from '../services/asset/IFontService'; +import { IIcon, IICONMap } from '../services/asset/IIconService'; +/** + * tiny-sdf 中每个 glyph 的宽度(加上 buffer 24 + 3 + 3 = 30) + */ +const glyphSizeInSDF = 30; +export function buildMapping({ + characterSet, + getFontWidth, + fontHeight, + buffer, + maxCanvasWidth, + mapping = {}, + xOffset = 0, + yOffset = 0, +}: IFontMappingOption) { + let row = 0; + let x = xOffset; + Array.from(characterSet).forEach((char: string, i: number) => { + if (!mapping[char]) { + const width = getFontWidth(char, i); + if (x + glyphSizeInSDF > maxCanvasWidth) { + x = 0; + row++; + } + mapping[char] = { + x, + y: yOffset + row * glyphSizeInSDF, + width: glyphSizeInSDF, + height: glyphSizeInSDF, + advance: width, + }; + x += glyphSizeInSDF; + } + }); + + const rowHeight = fontHeight + buffer * 2; + + return { + mapping, + xOffset: x, + yOffset: yOffset + row * rowHeight, + canvasHeight: nextPowOfTwo(yOffset + (row + 1) * rowHeight), + }; +} + +export function buildIconMaping( + icons: IIcon[], + buffer: number, + maxCanvasWidth: number, +) { + let xOffset = 0; + let yOffset = 0; + let rowHeight = 0; + let columns = []; + const mapping: IICONMap = {}; + for (const icon of icons) { + if (!mapping[icon.id]) { + const { height, width } = icon; + + // fill one row + if (xOffset + width + buffer > maxCanvasWidth) { + buildRowMapping(mapping, columns, yOffset); + + xOffset = 0; + yOffset = rowHeight + yOffset + buffer; + rowHeight = 0; + columns = []; + } + + columns.push({ + icon, + xOffset, + }); + + xOffset = xOffset + width + buffer; + rowHeight = Math.max(rowHeight, height); + } + } + + if (columns.length > 0) { + buildRowMapping(mapping, columns, yOffset); + } + + const canvasHeight = nextPowOfTwo(rowHeight + yOffset + buffer); + + return { + mapping, + canvasHeight, + }; +} +function buildRowMapping( + mapping: IICONMap, + columns: Array<{ + icon: IIcon; + xOffset: number; + }>, + yOffset: number, +) { + for (const column of columns) { + const { icon, xOffset } = column; + mapping[icon.id] = { ...icon, x: xOffset, y: yOffset, image: icon.image }; + } +} +export function nextPowOfTwo(num: number) { + return Math.pow(2, Math.ceil(Math.log2(num))); +} diff --git a/packages/core/src/utils/math.ts b/packages/core/src/utils/math.ts new file mode 100644 index 0000000000..ec194b21a4 --- /dev/null +++ b/packages/core/src/utils/math.ts @@ -0,0 +1,18 @@ +import { mat3, mat4, vec3, vec4 } from 'gl-matrix'; + +export function getAngle(angle: number | undefined) { + if (angle === undefined) { + return 0; + } else if (angle > 360 || angle < -360) { + return angle % 360; + } + return angle; +} + +export function createVec3(x: number | vec3 | vec4, y?: number, z?: number) { + return x instanceof vec3 + ? vec3.clone(x) + : x instanceof vec4 + ? vec3.fromValues(x[0], x[1], x[2]) + : vec3.fromValues(x, y as number, z as number); +} diff --git a/packages/core/src/utils/project.ts b/packages/core/src/utils/project.ts new file mode 100644 index 0000000000..7811299748 --- /dev/null +++ b/packages/core/src/utils/project.ts @@ -0,0 +1,120 @@ +const DEGREES_TO_RADIANS = Math.PI / 180; +const TILE_SIZE = 512; +// Average circumference (40075 km equatorial, 40007 km meridional) +const EARTH_CIRCUMFERENCE = 40.03e6; + +interface IDistanceScales { + pixelsPerMeter: [number, number, number]; + metersPerPixel: [number, number, number]; + pixelsPerDegree: [number, number, number]; + degreesPerPixel: [number, number, number]; + pixelsPerDegree2: [number, number, number]; + pixelsPerMeter2: [number, number, number]; +} + +/** + * Calculate distance scales in meters around current lat/lon, both for + * degrees and pixels. + * In mercator projection mode, the distance scales vary significantly + * with latitude. + */ +export function getDistanceScales({ + latitude = 0, + zoom = 0, + scale, + highPrecision = false, + flipY = false, +}: Partial<{ + latitude: number; + zoom: number; + scale: number | undefined; + highPrecision: boolean; + flipY: boolean; +}>): IDistanceScales { + // Calculate scale from zoom if not provided + scale = scale !== undefined ? scale : Math.pow(2, zoom); + + // @ts-ignore + const result: IDistanceScales = {}; + const worldSize = TILE_SIZE * scale; + const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS); + + /** + * Number of pixels occupied by one degree longitude around current lat/lon: + * pixelsPerDegreeX = d(lngLatToWorld([lng, lat])[0])/d(lng) + * = scale * TILE_SIZE * DEGREES_TO_RADIANS / (2 * PI) + * pixelsPerDegreeY = d(lngLatToWorld([lng, lat])[1])/d(lat) + * = -scale * TILE_SIZE * DEGREES_TO_RADIANS / cos(lat * DEGREES_TO_RADIANS) / (2 * PI) + */ + const pixelsPerDegreeX = worldSize / 360; + const pixelsPerDegreeY = pixelsPerDegreeX / latCosine; + + /** + * Number of pixels occupied by one meter around current lat/lon: + */ + const altPixelsPerMeter = worldSize / EARTH_CIRCUMFERENCE / latCosine; + + /** + * LngLat: longitude -> east and latitude -> north (bottom left) + * UTM meter offset: x -> east and y -> north (bottom left) + * World space: x -> east and y -> south (top left) + * + * Y needs to be flipped when converting delta degree/meter to delta pixels + */ + result.pixelsPerMeter = [ + altPixelsPerMeter, + -altPixelsPerMeter, + altPixelsPerMeter, + ]; + result.metersPerPixel = [ + 1 / altPixelsPerMeter, + -1 / altPixelsPerMeter, + 1 / altPixelsPerMeter, + ]; + + result.pixelsPerDegree = [ + pixelsPerDegreeX, + -pixelsPerDegreeY, + altPixelsPerMeter, + ]; + result.degreesPerPixel = [ + 1 / pixelsPerDegreeX, + -1 / pixelsPerDegreeY, + 1 / altPixelsPerMeter, + ]; + + /** + * Taylor series 2nd order for 1/latCosine + * f'(a) * (x - a) + * = d(1/cos(lat * DEGREES_TO_RADIANS))/d(lat) * dLat + * = DEGREES_TO_RADIANS * tan(lat * DEGREES_TO_RADIANS) / cos(lat * DEGREES_TO_RADIANS) * dLat + */ + if (highPrecision) { + const latCosine2 = + (DEGREES_TO_RADIANS * Math.tan(latitude * DEGREES_TO_RADIANS)) / + latCosine; + const pixelsPerDegreeY2 = (pixelsPerDegreeX * latCosine2) / 2; + + const altPixelsPerDegree2 = (worldSize / EARTH_CIRCUMFERENCE) * latCosine2; + const altPixelsPerMeter2 = + (altPixelsPerDegree2 / pixelsPerDegreeY) * altPixelsPerMeter; + + result.pixelsPerDegree2 = [0, -pixelsPerDegreeY2, altPixelsPerDegree2]; + result.pixelsPerMeter2 = [altPixelsPerMeter2, 0, altPixelsPerMeter2]; + + if (flipY) { + result.pixelsPerDegree2[1] = -result.pixelsPerDegree2[1]; + result.pixelsPerMeter2[1] = -result.pixelsPerMeter2[1]; + } + } + + if (flipY) { + result.pixelsPerMeter[1] = -result.pixelsPerMeter[1]; + result.metersPerPixel[1] = -result.metersPerPixel[1]; + result.pixelsPerDegree[1] = -result.pixelsPerDegree[1]; + result.degreesPerPixel[1] = -result.degreesPerPixel[1]; + } + + // Main results, used for converting meters to latlng deltas and scaling offsets + return result; +} diff --git a/packages/core/src/utils/sdf-2d.ts b/packages/core/src/utils/sdf-2d.ts new file mode 100644 index 0000000000..8660c8a008 --- /dev/null +++ b/packages/core/src/utils/sdf-2d.ts @@ -0,0 +1,15 @@ +export const sdf2DFunctions = [ + 'circle', + 'triangle', + 'square', + 'pentagon', + 'hexagon', + 'octogon', + 'hexagram', + 'rhombus', + 'vesica', +]; + +export function getShapeIndex(shape: string): number { + return sdf2DFunctions.indexOf(shape); +} diff --git a/packages/core/src/utils/shader-module.ts b/packages/core/src/utils/shader-module.ts new file mode 100644 index 0000000000..6bf16c612f --- /dev/null +++ b/packages/core/src/utils/shader-module.ts @@ -0,0 +1,89 @@ +export function getUniformLengthByType(type: string): number { + let arrayLength = 0; + switch (type) { + case 'vec2': + case 'ivec2': + arrayLength = 2; + break; + case 'vec3': + case 'ivec3': + arrayLength = 3; + break; + case 'vec4': + case 'ivec4': + case 'mat2': + arrayLength = 4; + break; + case 'mat3': + arrayLength = 9; + break; + case 'mat4': + arrayLength = 16; + break; + default: + } + return arrayLength; +} + +const uniformRegExp = /uniform\s+(bool|float|int|vec2|vec3|vec4|ivec2|ivec3|ivec4|mat2|mat3|mat4|sampler2D|samplerCube)\s+([\s\S]*?);/g; +export function extractUniforms( + content: string, +): { + content: string; + uniforms: { + [key: string]: any; + }; +} { + const uniforms = {}; + content = content.replace(uniformRegExp, (_, type, c) => { + const defaultValues = c.split(':'); + const uniformName = defaultValues[0].trim(); + let defaultValue: any = ''; + if (defaultValues.length > 1) { + defaultValue = defaultValues[1].trim(); + } + + // set default value for uniform according to its type + // eg. vec2 u -> [0.0, 0.0] + switch (type) { + case 'bool': + defaultValue = defaultValue === 'true'; + break; + case 'float': + case 'int': + defaultValue = Number(defaultValue); + break; + case 'vec2': + case 'vec3': + case 'vec4': + case 'ivec2': + case 'ivec3': + case 'ivec4': + case 'mat2': + case 'mat3': + case 'mat4': + if (defaultValue) { + defaultValue = defaultValue + .replace('[', '') + .replace(']', '') + .split(',') + .reduce((prev: number[], cur: string) => { + prev.push(Number(cur.trim())); + return prev; + }, []); + } else { + defaultValue = new Array(getUniformLengthByType(type)).fill(0); + } + break; + default: + } + + // @ts-ignore + uniforms[uniformName] = defaultValue; + return `uniform ${type} ${uniformName};\n`; + }); + return { + content, + uniforms, + }; +} diff --git a/packages/core/src/utils/vertex-compression.ts b/packages/core/src/utils/vertex-compression.ts new file mode 100644 index 0000000000..1930d4531b --- /dev/null +++ b/packages/core/src/utils/vertex-compression.ts @@ -0,0 +1,145 @@ +/** + * WebGL 中的顶点数据压缩 + * 使用 float-pack 技术,在 shader 中解压 + * @see https://zhuanlan.zhihu.com/p/67484498 + */ + +import { clamp } from 'lodash'; +import { getShapeIndex } from './sdf-2d'; + +export interface ICircleVertex { + tileX: number; + tileY: number; + shape: string; + color: number[]; + radius: number; + opacity: number; + strokeColor: number[]; + strokeWidth: number; + strokeOpacity: number; +} + +export const LEFT_SHIFT1 = 2; +export const LEFT_SHIFT2 = 4; +export const LEFT_SHIFT6 = 64; +export const LEFT_SHIFT7 = 128; +export const LEFT_SHIFT8 = 256; +export const LEFT_SHIFT9 = 512; +export const LEFT_SHIFT13 = 8192; +export const LEFT_SHIFT14 = 16384; +export const LEFT_SHIFT15 = 32768; +export const LEFT_SHIFT16 = 32768 * 2; +export const LEFT_SHIFT17 = 131072.0; +export const LEFT_SHIFT18 = 262144.0; +export const LEFT_SHIFT19 = 524288.0; +export const LEFT_SHIFT20 = 1048576.0; +export const LEFT_SHIFT21 = 2097152.0; +export const LEFT_SHIFT22 = 4194304.0; +export const LEFT_SHIFT23 = 8388608.0; +export const LEFT_SHIFT24 = 16777216.0; +export const LEFT_SHIFT25 = 16777216.0 * 2; + +/** + * encode 2 8-bit unsigned int into a 16-bit float + * @param {number} a 8-bit int + * @param {number} b 8-bit int + * @return {number} float + */ +export function packUint8ToFloat(a: number, b: number): number { + a = clamp(Math.floor(a), 0, 255); + b = clamp(Math.floor(b), 0, 255); + return 256 * a + b; +} + +/** + * 为 SDF circle 压缩顶点数据 + */ +export function packCircleVertex( + props: ICircleVertex, +): { + packedBuffer: number[][]; + packedBuffer2: number[][]; + packedBuffer3: number[][]; +} { + const { + color, + radius, + tileX, + tileY, + shape, + opacity, // packed buffer1 + strokeColor, + strokeWidth, + strokeOpacity, // packed buffer2 + } = props; + const packedBuffer: number[][] = []; + const packedBuffer2: number[][] = []; + const packedBuffer3: number[][] = []; + + const packedColor: [number, number] = [ + packUint8ToFloat(color[0], color[1]), + packUint8ToFloat(color[2], color[3]), + ]; + const packedStrokeColor: [number, number] = [ + packUint8ToFloat(strokeColor[0], strokeColor[1]), + packUint8ToFloat(strokeColor[2], strokeColor[3]), + ]; + + [ + [-1, -1], + [1, -1], + [1, 1], + [-1, 1], + ].forEach(([extrudeX, extrudeY]) => { + // vec4( + // color, + // color, + // (4-bit extrude, 4-bit shape, 16-bit radius), + // tileCoords + // ) + packedBuffer.push([ + ...packedColor, + (extrudeX + 1) * LEFT_SHIFT23 + + (extrudeY + 1) * LEFT_SHIFT21 + + getShapeIndex(shape) * LEFT_SHIFT17 + + radius, + (tileX + 512) * LEFT_SHIFT19 + (tileY + 512) * LEFT_SHIFT6, + ]); + + // vec4( + // strokeColor, + // strokeColor, + // strokeWidth, + // strokeOpacity + // ) + packedBuffer2.push([...packedStrokeColor, strokeWidth, strokeOpacity]); + + packedBuffer3.push([opacity, 0, 0, 0]); + }); + + return { + packedBuffer, + packedBuffer2, + packedBuffer3, + }; +} + +export function packOpacity(opacity: number, placed: boolean): number { + if (opacity === 0 && !placed) { + return 0; + } else if (opacity === 1 && placed) { + return 4294967295; + } + const targetBit = placed ? 1 : 0; + const opacityBits = Math.floor(opacity * 127); + return ( + opacityBits * LEFT_SHIFT25 + + targetBit * LEFT_SHIFT24 + + opacityBits * LEFT_SHIFT17 + + targetBit * LEFT_SHIFT16 + + opacityBits * LEFT_SHIFT9 + + targetBit * LEFT_SHIFT8 + + opacityBits * LEFT_SHIFT1 + + targetBit + ); +} diff --git a/packages/core/tsconfig.build.json b/packages/core/tsconfig.build.json new file mode 100644 index 0000000000..17f6c4525a --- /dev/null +++ b/packages/core/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "declarationDir": "./es", + "rootDir": "./src", + "baseUrl": "./" + }, + "include": ["./src"] +} \ No newline at end of file diff --git a/packages/core/typings/index.d.ts b/packages/core/typings/index.d.ts new file mode 100644 index 0000000000..790cf4872b --- /dev/null +++ b/packages/core/typings/index.d.ts @@ -0,0 +1,13 @@ + +declare module 'probe.gl' { + class Log { + constructor(options: { id: string }); + + enable(enabled?: boolean): Log; + + warn(message: string): () => any; + info(message: string): () => any; + error(message: string): () => any; + } +} +/// diff --git a/packages/layers/.gitignore b/packages/layers/.gitignore new file mode 100644 index 0000000000..49c199b6ab --- /dev/null +++ b/packages/layers/.gitignore @@ -0,0 +1,3 @@ +lib +es +dist diff --git a/packages/layers/package.json b/packages/layers/package.json new file mode 100644 index 0000000000..06eb9bb952 --- /dev/null +++ b/packages/layers/package.json @@ -0,0 +1,56 @@ +{ + "name": "@l7/layers", + "version": "0.0.1", + "description": "", + "main": "lib/index.js", + "module": "es/index.js", + "types": "es/index.d.ts", + "sideEffects": false, + "files": [ + "lib", + "es", + "README.md" + ], + "scripts": { + "tsc": "tsc --project tsconfig.build.json", + "clean": "rimraf dist; rimraf es; rimraf lib;", + "build": "run-p build:*", + "build:cjs": "BABEL_ENV=cjs babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "build:esm": "BABEL_ENV=esm babel src --root-mode upward --out-dir es --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "watch": "BABEL_ENV=cjs babel src --watch --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments" + }, + "author": "xiaoiver", + "license": "ISC", + "dependencies": { + "@l7/core": "^0.0.1", + "@l7/source": "^0.0.1", + "@l7/utils": "^0.0.1", + "@mapbox/martini": "^0.1.0", + "@turf/meta": "^6.0.2", + "@types/d3-color": "^1.2.2", + "d3-array": "^2.3.1", + "d3-color": "^1.4.0", + "d3-scale": "^3.1.0", + "earcut": "^2.2.1", + "eventemitter3": "^4.0.0", + "gl-matrix": "^3.1.0", + "gl-vec2": "^1.3.0", + "inversify": "^5.0.1", + "lodash": "^4.17.15", + "merge-json-schemas": "1.0.0", + "polyline-miter-util": "^1.0.1", + "reflect-metadata": "^0.1.13", + "tapable": "^2.0.0-beta.8" + }, + "devDependencies": { + "@types/d3-array": "^2.0.0", + "@types/d3-scale": "^2.1.1", + "@types/earcut": "^2.1.0", + "@types/gl-matrix": "^2.4.5", + "@types/lodash": "^4.14.138" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/layers/src/core/BaseLayer.ts b/packages/layers/src/core/BaseLayer.ts new file mode 100644 index 0000000000..d429712f89 --- /dev/null +++ b/packages/layers/src/core/BaseLayer.ts @@ -0,0 +1,508 @@ +import { + gl, + IAnimateOption, + ICameraService, + IEncodeFeature, + IFontService, + IGlobalConfigService, + IIconService, + IInteractionService, + ILayer, + ILayerInitializationOptions, + ILayerModel, + ILayerModelInitializationOptions, + ILayerPlugin, + ILayerService, + IMapService, + IModel, + IModelInitializationOptions, + IMultiPassRenderer, + IRendererService, + IScale, + IScaleOptions, + IShaderModuleService, + ISourceCFG, + IStyleAttributeService, + IStyleAttributeUpdateOptions, + lazyInject, + lazyMultiInject, + StyleAttributeField, + StyleAttributeOption, + Triangulation, + TYPES, +} from '@l7/core'; +import Source from '@l7/source'; +import { EventEmitter } from 'eventemitter3'; +import { isFunction, isObject } from 'lodash'; +// @ts-ignore +import mergeJsonSchemas from 'merge-json-schemas'; +import { SyncBailHook, SyncHook } from 'tapable'; +import { normalizePasses } from '../plugins/MultiPassRendererPlugin'; +import baseLayerSchema from './schema'; + +/** + * 分配 layer id + */ +let layerIdCounter = 0; + +/** + * Layer 基类默认样式属性 + */ +const defaultLayerInitializationOptions: Partial = { + minZoom: 0, + maxZoom: 20, + visible: true, + zIndex: 0, + enableMultiPassRenderer: false, + enablePicking: false, + enableHighlight: false, + highlightColor: 'red', + enableTAA: false, + jitterScale: 1, +}; + +export default class BaseLayer extends EventEmitter + implements ILayer { + public id: string = `${layerIdCounter++}`; + public name: string; + public visible: boolean = true; + public zIndex: number = 0; + public minZoom: number; + public maxZoom: number; + + // 生命周期钩子 + public hooks = { + init: new SyncBailHook(), + beforeRender: new SyncBailHook(), + afterRender: new SyncHook(), + beforePickingEncode: new SyncHook(), + afterPickingEncode: new SyncHook(), + beforeHighlight: new SyncHook<[number[]]>(['pickedColor']), + afterHighlight: new SyncHook(), + beforeDestroy: new SyncHook(), + afterDestroy: new SyncHook(), + }; + + // 待渲染 model 列表 + public models: IModel[] = []; + + // 每个 Layer 都有一个 + public multiPassRenderer: IMultiPassRenderer; + + // 注入插件集 + @lazyMultiInject(TYPES.ILayerPlugin) + public plugins: ILayerPlugin[]; + + public sourceOption: { + data: any; + options?: ISourceCFG; + }; + + @lazyInject(TYPES.IStyleAttributeService) + public styleAttributeService: IStyleAttributeService; + + @lazyInject(TYPES.IGlobalConfigService) + public readonly configService: IGlobalConfigService; + + @lazyInject(TYPES.IIconService) + public readonly iconService: IIconService; + + @lazyInject(TYPES.IFontService) + public readonly fontService: IFontService; + + @lazyInject(TYPES.IRendererService) + public readonly rendererService: IRendererService; + + protected layerSource: Source; + + @lazyInject(TYPES.IShaderModuleService) + protected readonly shaderModuleService: IShaderModuleService; + + @lazyInject(TYPES.IMapService) + protected readonly map: IMapService; + + @lazyInject(TYPES.ILayerService) + protected readonly layerService: ILayerService; + + protected layerModel: ILayerModel; + + protected enodeOptions: { + [type: string]: { + field: StyleAttributeField; + values?: StyleAttributeOption; + }; + } = {}; + + protected animateOptions: IAnimateOption = { enable: false }; + + private encodedData: IEncodeFeature[]; + + private configSchema: object; + + /** + * 保存样式属性 + */ + private styleOptions: Partial< + ILayerInitializationOptions & ChildLayerStyleOptions + >; + private scaleOptions: IScaleOptions = {}; + + @lazyInject(TYPES.IInteractionService) + private readonly interactionService: IInteractionService; + + constructor( + styleOptions: Partial, + ) { + super(); + this.styleOptions = { + ...defaultLayerInitializationOptions, + ...styleOptions, + }; + const { minZoom, maxZoom, zIndex, visible } = this + .styleOptions as ILayerInitializationOptions; + this.visible = visible; + this.zIndex = zIndex; + this.minZoom = minZoom; + this.maxZoom = maxZoom; + } + + public addPlugin(plugin: ILayerPlugin) { + // TODO: 控制插件注册顺序 + // @example: + // pointLayer.addPlugin(new MyCustomPlugin(), { + // before: 'L7BuiltinPlugin' + // }); + this.plugins.push(plugin); + return this; + } + + public init() { + this.hooks.init.call(); + this.buildModels(); + return this; + } + + public color( + field: StyleAttributeField, + values?: StyleAttributeOption, + updateOptions?: Partial, + ) { + this.styleAttributeService.updateStyleAttribute( + 'color', + { + // @ts-ignore + scale: { + field, + ...this.splitValuesAndCallbackInAttribute( + // @ts-ignore + values, + this.configService.getConfig().colors, + ), + }, + }, + // @ts-ignore + updateOptions, + ); + return this; + } + + public size( + field: StyleAttributeField, + values?: StyleAttributeOption, + updateOptions?: Partial, + ) { + this.styleAttributeService.updateStyleAttribute( + 'size', + { + // @ts-ignore + scale: { + field, + ...this.splitValuesAndCallbackInAttribute( + // @ts-ignore + values, + this.configService.getConfig().size, + ), + }, + }, + // @ts-ignore + updateOptions, + ); + return this; + } + + public shape( + field: StyleAttributeField, + values?: StyleAttributeOption, + updateOptions?: Partial, + ) { + this.enodeOptions.shape = { + field, + values, + }; + this.styleAttributeService.updateStyleAttribute( + 'shape', + { + // @ts-ignore + scale: { + field, + ...this.splitValuesAndCallbackInAttribute( + // @ts-ignore + values, + this.configService.getConfig().shape, + ), + }, + }, + // @ts-ignore + updateOptions, + ); + return this; + } + public label( + field: StyleAttributeField, + values?: StyleAttributeOption, + updateOptions?: Partial, + ) { + this.styleAttributeService.updateStyleAttribute( + 'label', + { + // @ts-ignore + scale: { + field, + ...this.splitValuesAndCallbackInAttribute( + // @ts-ignore + values, + null, + ), + }, + }, + // @ts-ignore + updateOptions, + ); + return this; + } + public animate(options: IAnimateOption) { + this.animateOptions = options; + return this; + } + + public source(data: any, options?: ISourceCFG): ILayer { + this.sourceOption = { + data, + options, + }; + return this; + } + public style(options: object & Partial): ILayer { + const { passes, ...rest } = options; + + // passes 特殊处理 + if (passes) { + normalizePasses(passes).forEach( + (pass: [string, { [key: string]: unknown }]) => { + const postProcessingPass = this.multiPassRenderer + .getPostProcessor() + .getPostProcessingPassByName(pass[0]); + if (postProcessingPass) { + postProcessingPass.updateOptions(pass[1]); + } + }, + ); + } + + this.styleOptions = { + ...this.styleOptions, + ...rest, + }; + return this; + } + public scale(field: string | IScaleOptions, cfg: IScale) { + if (isObject(field)) { + this.scaleOptions = { + ...this.scaleOptions, + ...field, + }; + } else { + this.scaleOptions[field] = cfg; + } + return this; + } + public render(): ILayer { + if (this.multiPassRenderer && this.multiPassRenderer.getRenderFlag()) { + this.multiPassRenderer.render(); + } else { + this.renderModels(); + } + return this; + } + + public show(): ILayer { + this.visible = true; + this.layerService.renderLayers(); + return this; + } + + public hide(): ILayer { + this.visible = false; + this.layerService.renderLayers(); + return this; + } + + public setIndex(index: number): ILayer { + this.zIndex = index; + this.layerService.updateRenderOrder(); + return this; + } + + public isVisible(): boolean { + const zoom = this.map.getZoom(); + return this.visible && zoom >= this.minZoom && zoom <= this.maxZoom; + } + + public setMinZoom(min: number): ILayer { + this.minZoom = min; + return this; + } + + public setMaxZoom(max: number): ILayer { + this.maxZoom = max; + return this; + } + /** + * zoom to layer Bounds + */ + public fitBounds(): void { + const source = this.getSource(); + const extent = source.extent; + this.map.fitBounds([ + [extent[0], extent[1]], + [extent[2], extent[3]], + ]); + } + + public destroy() { + this.hooks.beforeDestroy.call(); + + // 清除所有属性以及关联的 vao + this.styleAttributeService.clearAllAttributes(); + // 销毁所有 model + this.models.forEach((model) => model.destroy()); + + this.hooks.afterDestroy.call(); + } + + public isDirty() { + return !!( + this.styleAttributeService.getLayerStyleAttributes() || [] + ).filter( + (attribute) => + attribute.needRescale || + attribute.needRemapping || + attribute.needRegenerateVertices, + ).length; + } + + public setSource(source: Source) { + this.layerSource = source; + } + public getSource() { + return this.layerSource; + } + + public getStyleOptions() { + return this.styleOptions; + } + public getScaleOptions() { + return this.scaleOptions; + } + + public setEncodedData(encodedData: IEncodeFeature[]) { + this.encodedData = encodedData; + } + public getEncodedData() { + return this.encodedData; + } + + public getConfigSchemaForValidation() { + if (!this.configSchema) { + // 相比 allOf, merge 有一些优势 + // @see https://github.com/goodeggs/merge-json-schemas + this.configSchema = mergeJsonSchemas([ + baseLayerSchema, + this.getConfigSchema(), + ]); + } + return this.configSchema; + } + + public pick({ x, y }: { x: number; y: number }) { + this.interactionService.triggerHover({ x, y }); + } + + public buildLayerModel( + options: ILayerModelInitializationOptions & + Partial, + ): IModel { + const { + moduleName, + vertexShader, + fragmentShader, + triangulation, + ...rest + } = options; + this.shaderModuleService.registerModule(moduleName, { + vs: vertexShader, + fs: fragmentShader, + }); + const { vs, fs, uniforms } = this.shaderModuleService.getModule(moduleName); + const { createModel } = this.rendererService; + const parserData = this.getSource().data.dataArray; + const { + attributes, + elements, + } = this.styleAttributeService.createAttributesAndIndices( + this.encodedData, + triangulation, + ); + return createModel({ + attributes, + uniforms, + fs, + vs, + elements, + blend: { + enable: true, + func: { + srcRGB: gl.SRC_ALPHA, + srcAlpha: 1, + dstRGB: gl.ONE_MINUS_SRC_ALPHA, + dstAlpha: 1, + }, + }, + ...rest, + }); + } + + protected getConfigSchema() { + throw new Error('Method not implemented.'); + } + + protected buildModels() { + throw new Error('Method not implemented.'); + } + + protected renderModels() { + throw new Error('Method not implemented.'); + } + + private splitValuesAndCallbackInAttribute( + valuesOrCallback?: unknown[], + defaultValues?: unknown[], + ) { + return { + values: isFunction(valuesOrCallback) + ? undefined + : valuesOrCallback || defaultValues, + callback: isFunction(valuesOrCallback) ? valuesOrCallback : undefined, + }; + } +} diff --git a/packages/layers/src/core/baseModel.ts b/packages/layers/src/core/baseModel.ts new file mode 100644 index 0000000000..ffc238dee5 --- /dev/null +++ b/packages/layers/src/core/baseModel.ts @@ -0,0 +1,68 @@ +import { + AttributeType, + gl, + ICameraService, + IEncodeFeature, + IFontService, + IGlobalConfigService, + IIconService, + ILayer, + ILayerModel, + ILayerPlugin, + ILogService, + IMapService, + IModel, + IModelUniform, + IRendererService, + IShaderModuleService, + IStyleAttributeService, + lazyInject, + TYPES, +} from '@l7/core'; + +export default class BaseModel implements ILayerModel { + @lazyInject(TYPES.IStyleAttributeService) + public styleAttributeService: IStyleAttributeService; + protected layer: ILayer; + + @lazyInject(TYPES.IGlobalConfigService) + protected readonly configService: IGlobalConfigService; + + @lazyInject(TYPES.IIconService) + protected readonly iconService: IIconService; + + @lazyInject(TYPES.IFontService) + protected readonly fontService: IFontService; + + @lazyInject(TYPES.IRendererService) + protected readonly rendererService: IRendererService; + + @lazyInject(TYPES.IShaderModuleService) + protected readonly shaderModuleService: IShaderModuleService; + + @lazyInject(TYPES.IMapService) + protected readonly map: IMapService; + + @lazyInject(TYPES.ICameraService) + protected readonly camera: ICameraService; + + constructor(layer: ILayer) { + this.layer = layer; + this.registerBuiltinAttributes(); + } + + public getUninforms(): IModelUniform { + throw new Error('Method not implemented.'); + } + + public buildModels(): IModel[] { + throw new Error('Method not implemented.'); + } + + public render() { + throw new Error('Method not implemented.'); + } + protected registerBuiltinAttributes() { + throw new Error('Method not implemented.'); + } +} diff --git a/packages/layers/src/core/schema.ts b/packages/layers/src/core/schema.ts new file mode 100644 index 0000000000..cdb88ea1be --- /dev/null +++ b/packages/layers/src/core/schema.ts @@ -0,0 +1,28 @@ +/** + * BaseLayer Schema + */ +export default { + properties: { + enablePicking: { + type: 'boolean', + }, + enableHighlight: { + type: 'boolean', + }, + highlightColor: { + oneOf: [ + { + type: 'array', + items: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + { + type: 'string', + }, + ], + }, + }, +}; diff --git a/packages/layers/src/core/shape/Path.ts b/packages/layers/src/core/shape/Path.ts new file mode 100644 index 0000000000..d256eba7c9 --- /dev/null +++ b/packages/layers/src/core/shape/Path.ts @@ -0,0 +1,65 @@ +export type IPosition = [number, number, number] | [number, number]; +export type IPath = IPosition[]; +export enum ShapeType3D { + CYLINDER = 'cylinder', + SQUARECOLUMN = 'squareColumn', + TRIANGLECOLUMN = 'triangleColumn', + HEXAGONCOLUMN = 'hexagonColumn', + PENTAGONCOLUMN = 'pentagonColumn', +} +export enum ShapeType2D { + CIRCLE = 'circle', + SQUARE = 'square', + TRIANGLE = 'triangle', + HEXAGON = 'hexagon', + PENTAGON = 'pentagon', +} + +/** + * 生成规则多边形顶点个数 + * @param pointCount 顶点个数 3 => 三角形 + * @param start 顶点起始角度 调整图形的方向 + */ +export function polygonPath(pointCount: number, start: number = 0): IPath { + const step = (Math.PI * 2) / pointCount; + const line = []; + for (let i = 0; i < pointCount; i++) { + line.push(step * i + (start * Math.PI) / 12); + } + const path: IPath = line.map((t) => { + const x = Math.sin(t + Math.PI / 4); + const y = Math.cos(t + Math.PI / 4); + return [x, y, 0]; + }); + // path.push(path[0]); + return path; +} + +export function circle(): IPath { + return polygonPath(30); +} +export function square(): IPath { + return polygonPath(4); +} +export function triangle(): IPath { + return polygonPath(3); +} +export function hexagon(): IPath { + return polygonPath(6, 1); +} +export function pentagon(): IPath { + return polygonPath(5); +} + +export const geometryShape = { + [ShapeType2D.CIRCLE]: circle, + [ShapeType2D.HEXAGON]: hexagon, + [ShapeType2D.TRIANGLE]: triangle, + [ShapeType2D.SQUARE]: square, + [ShapeType2D.PENTAGON]: pentagon, + [ShapeType3D.CYLINDER]: circle, + [ShapeType3D.HEXAGONCOLUMN]: hexagon, + [ShapeType3D.TRIANGLECOLUMN]: triangle, + [ShapeType3D.SQUARECOLUMN]: square, + [ShapeType3D.PENTAGONCOLUMN]: pentagon, +}; diff --git a/packages/layers/src/core/shape/extrude.ts b/packages/layers/src/core/shape/extrude.ts new file mode 100644 index 0000000000..a8e5ead887 --- /dev/null +++ b/packages/layers/src/core/shape/extrude.ts @@ -0,0 +1,185 @@ +import { lngLatToMeters } from '@l7/utils'; +import earcut from 'earcut'; +import { vec3 } from 'gl-matrix'; +import { IPath } from './Path'; +export interface IExtrudeGeomety { + positions: number[]; + index: number[]; + normals?: number[]; +} +/** + * 拉伸多边形顶点,返回拉伸后的顶点信息 + * @param paths 路径数据组 + * @param extrude 是否拉伸 + */ +export default function extrudePolygon(path: IPath[]): IExtrudeGeomety { + const p1 = path[0][0]; + const p2 = path[0][path[0].length - 1]; + if (p1[0] === p2[0] && p1[1] === p2[1]) { + path[0] = path[0].slice(0, path[0].length - 1); + } + + const n = path[0].length; + const flattengeo = earcut.flatten(path); + const { vertices, dimensions } = flattengeo; + const positions = []; + const indexArray = []; + // 设置顶部z值 + for (let j = 0; j < vertices.length / dimensions; j++) { + if (dimensions === 2) { + positions.push(vertices[j * 2], vertices[j * 2 + 1], 1); + } else { + positions.push(vertices[j * 3], vertices[j * 3 + 1], 1); + } + } + const triangles = earcut( + flattengeo.vertices, + flattengeo.holes, + flattengeo.dimensions, + ); + indexArray.push(...triangles); + for (let i = 0; i < n; i++) { + const prePoint = flattengeo.vertices.slice( + i * dimensions, + (i + 1) * dimensions, + ); + let nextPoint = flattengeo.vertices.slice( + (i + 1) * dimensions, + (i + 2) * dimensions, + ); + if (nextPoint.length === 0) { + nextPoint = flattengeo.vertices.slice(0, dimensions); + } + const indexOffset = positions.length / 3; + positions.push( + prePoint[0], + prePoint[1], + 1, + nextPoint[0], + nextPoint[1], + 1, + prePoint[0], + prePoint[1], + 0, + nextPoint[0], + nextPoint[1], + 0, + ); + indexArray.push(...[0, 2, 1, 2, 3, 1].map((v) => v + indexOffset)); + } + return { + positions, + index: indexArray, + }; +} +export function fillPolygon(points: IPath[]) { + const flattengeo = earcut.flatten(points); + const triangles = earcut( + flattengeo.vertices, + flattengeo.holes, + flattengeo.dimensions, + ); + return { + positions: flattengeo.vertices, + index: triangles, + }; +} + +export function extrude_PolygonNormal( + path: IPath[], + needFlat = false, +): IExtrudeGeomety { + const p1 = path[0][0]; + const p2 = path[0][path[0].length - 1]; + if (p1[0] === p2[0] && p1[1] === p2[1]) { + path[0] = path[0].slice(0, path[0].length - 1); + } + const n = path[0].length; + const flattengeo = earcut.flatten(path); + const { vertices, dimensions } = flattengeo; + const positions = []; + const indexArray = []; + const normals = []; + // 设置顶部z值 + for (let j = 0; j < vertices.length / dimensions; j++) { + if (dimensions === 2) { + positions.push(vertices[j * 2], vertices[j * 2 + 1], 1); + } else { + positions.push(vertices[j * 3], vertices[j * 3 + 1], 1); + } + normals.push(0, 0, 1); + } + const triangles = earcut( + flattengeo.vertices, + flattengeo.holes, + flattengeo.dimensions, + ); + indexArray.push(...triangles); + for (let i = 0; i < n; i++) { + const prePoint = flattengeo.vertices.slice( + i * dimensions, + (i + 1) * dimensions, + ); + let nextPoint = flattengeo.vertices.slice( + (i + 1) * dimensions, + (i + 2) * dimensions, + ); + if (nextPoint.length === 0) { + nextPoint = flattengeo.vertices.slice(0, dimensions); + } + const indexOffset = positions.length / 3; + positions.push( + prePoint[0], + prePoint[1], + 1, + nextPoint[0], + nextPoint[1], + 1, + prePoint[0], + prePoint[1], + 0, + nextPoint[0], + nextPoint[1], + 0, + ); + const normal = computeVertexNormals( + [nextPoint[0], nextPoint[1], 1], + [prePoint[0], prePoint[1], 0], + [prePoint[0], prePoint[1], 1], + needFlat, + ); + normals.push(...normal, ...normal, ...normal, ...normal); + indexArray.push(...[1, 2, 0, 3, 2, 1].map((v) => v + indexOffset)); + } + return { + positions, + index: indexArray, + normals, + }; +} +function computeVertexNormals( + p1: [number, number, number], + p2: [number, number, number], + p3: [number, number, number], + needFlat: boolean = false, +) { + const cb = vec3.create(); + const ab = vec3.create(); + const normal = vec3.create(); + + if (needFlat) { + p1 = lngLatToMeters(p1) as [number, number, number]; + p2 = lngLatToMeters(p2) as [number, number, number]; + p3 = lngLatToMeters(p3) as [number, number, number]; + } + const pA = vec3.fromValues(...p1); + const pB = vec3.fromValues(...p2); + const pC = vec3.fromValues(...p3); + vec3.sub(cb, pC, pB); + vec3.sub(ab, pA, pB); + vec3.cross(normal, cb, ab); + const newNormal = vec3.create(); + vec3.normalize(newNormal, normal); + + return newNormal; +} diff --git a/packages/layers/src/core/triangulation.ts b/packages/layers/src/core/triangulation.ts new file mode 100644 index 0000000000..66d027c759 --- /dev/null +++ b/packages/layers/src/core/triangulation.ts @@ -0,0 +1,339 @@ +import { IEncodeFeature } from '@l7/core'; +import { aProjectFlat, lngLatToMeters } from '@l7/utils'; +import earcut from 'earcut'; +import { vec3 } from 'gl-matrix'; +import getNormals from '../utils/polylineNormal'; +import extrudePolygon, { + extrude_PolygonNormal, + fillPolygon, + IExtrudeGeomety, +} from './shape/extrude'; +import { + geometryShape, + IPosition, + ShapeType2D, + ShapeType3D, +} from './shape/Path'; +type IShape = ShapeType2D & ShapeType3D; +interface IGeometryCache { + [key: string]: IExtrudeGeomety; +} +const GeometryCache: IGeometryCache = {}; +/** + * 计算2D 填充点图顶点 + * @param feature 映射feature + */ +export function PointFillTriangulation(feature: IEncodeFeature) { + const coordinates = feature.coordinates as number[]; + return { + vertices: [...coordinates, ...coordinates, ...coordinates, ...coordinates], + indices: [0, 1, 2, 2, 3, 0], + size: coordinates.length, + }; +} + +/** + * 计算3D 拉伸点图 + * @param feature 映射feature + */ +export function PointExtrudeTriangulation(feature: IEncodeFeature) { + const { shape } = feature; + const { positions, index, normals } = getGeometry( + shape as ShapeType3D, + false, + ); + return { + vertices: positions, + indices: index, + normals, + // normals: Array.from(computeVertexNormals(positions, index, 3, false)), + size: 3, + }; +} + +/** + * 计算图片标注 + * @param feature 映射feature + */ +export function PointImageTriangulation(feature: IEncodeFeature) { + const coordinates = feature.coordinates as number[]; + return { + vertices: [...coordinates], + indices: [0], + size: coordinates.length, + }; +} + +/** + * 线三角化 + * @param feature 映射feature + */ +export function LineTriangulation(feature: IEncodeFeature) { + const { coordinates } = feature; + let path = coordinates; + if (Array.isArray(path[0][0])) { + path = coordinates[0]; + } + const line = getNormals(path as number[][], false, 0); + return { + vertices: line.attrPos, // [ x,y,z, distance, miter,total ] + indices: line.attrIndex, + normals: line.normals, + size: 6, + }; +} + +export function polygonTriangulation(feature: IEncodeFeature) { + const { coordinates } = feature; + const flattengeo = earcut.flatten(coordinates as number[][][]); + const { vertices, dimensions, holes } = flattengeo; + + return { + indices: earcut(vertices, holes, dimensions), + vertices, + size: dimensions, + }; +} + +export function PolygonExtrudeTriangulation(feature: IEncodeFeature) { + const coordinates = feature.coordinates as IPosition[][]; + const { positions, index, normals } = extrude_PolygonNormal( + coordinates, + true, + ); + + return { + vertices: positions, // [ x, y, z ] + indices: index, + normals, + size: 3, + }; +} + +export function HeatmapGridTriangulation(feature: IEncodeFeature) { + const { shape } = feature; + const { positions, index } = getHeatmapGeometry(shape as IShape); + return { + vertices: positions, // [ x, y, z ] 多边形顶点 + indices: index, + size: 3, + }; +} + +/** + * 图片图层顶点构造 + * @param feature 数据 + */ +export function RasterImageTriangulation(feature: IEncodeFeature) { + const coordinates = feature.coordinates as IPosition[]; + // [ x, y, z. uv.x, uv.y] + const positions: number[] = [ + ...coordinates[0], + 0, + 0, + 1, + coordinates[1][0], + coordinates[0][1], + 0, + 1, + 1, + ...coordinates[1], + 0, + 1, + 0, + ...coordinates[0], + 0, + 0, + 1, + ...coordinates[1], + 0, + 1, + 0, + coordinates[0][0], + coordinates[1][1], + 0, + 0, + 0, + ]; + const indexs = [0, 1, 2, 3, 4, 5]; + return { + vertices: positions, + indices: indexs, + size: 5, + }; +} +/** + * 计算3D弧线顶点 + * @param feature 映射数据 + * @param segNum 弧线线段数 + */ +export function LineArcTriangulation(feature: IEncodeFeature) { + const segNum = 30; + const coordinates = feature.coordinates as IPosition[]; + const positions = []; + const indexArray = []; + for (let i = 0; i < segNum; i++) { + // 上线两个顶点 + // [ x, y, z, sx,sy, tx,ty] + positions.push( + i, + 1, + i, + coordinates[0][0], + coordinates[0][1], + coordinates[1][0], + coordinates[1][1], + i, + -1, + i, + coordinates[0][0], + coordinates[0][1], + coordinates[1][0], + coordinates[1][1], + ); + if (i !== segNum - 1) { + indexArray.push( + ...[0, 1, 2, 1, 3, 2].map((v) => { + return i * 2 + v; + }), + ); + } + } + return { + vertices: positions, + indices: indexArray, + size: 7, + }; +} + +export function HeatmapTriangulation(feature: IEncodeFeature) { + const coordinates = feature.coordinates as number[]; + if (coordinates.length === 2) { + coordinates.push(0); + } + const size = feature.size as number; + const dir = addDir(-1, 1); + const dir1 = addDir(1, 1); + const dir2 = addDir(-1, -1); + const dir3 = addDir(1, -1); + // [x,y,z, dirx ,diry, weight] + const positions = [ + ...coordinates, + ...dir, + ...coordinates, + ...dir2, + ...coordinates, + ...dir3, + ...coordinates, + ...dir1, + ]; + const indexArray = [0, 1, 2, 3, 0, 2]; + return { + vertices: positions, + indices: indexArray, + size: 5, + }; +} + +/** + * 点图层3d geomerty + * @param shape 3D形状 + */ +function getGeometry(shape: ShapeType3D, needFlat = false): IExtrudeGeomety { + if (GeometryCache && GeometryCache[shape]) { + return GeometryCache[shape]; + } + const path = geometryShape[shape] + ? geometryShape[shape]() + : geometryShape.cylinder(); + const geometry = extrude_PolygonNormal([path], needFlat); + GeometryCache[shape] = geometry; + return geometry; +} + +function computeVertexNormals( + positions: number[], + indexArray: number[], + dim: number = 3, + needFlat: boolean = false, +) { + const normals = new Float32Array((positions.length / dim) * 3); + let vA: number; + let vB: number; + let vC: number; + const cb = vec3.create(); + const ab = vec3.create(); + const normal = vec3.create(); + for (let i = 0, li = indexArray.length; i < li; i += 3) { + vA = indexArray[i + 0] * 3; + vB = indexArray[i + 1] * 3; + vC = indexArray[i + 2] * 3; + let p1 = [positions[vA], positions[vA + 1]]; + let p2 = [positions[vB], positions[vB + 1]]; + let p3 = [positions[vC], positions[vC + 1]]; + if (needFlat) { + p1 = lngLatToMeters(p1); + p2 = lngLatToMeters(p2); + p3 = lngLatToMeters(p3); + } + const [ax, ay] = p1; + const pA = vec3.fromValues(ax, ay, positions[vA + 2]); + const [bx, by] = p2; + const pB = vec3.fromValues(bx, by, positions[vB + 2]); + const [cx, cy] = p3; + const pC = vec3.fromValues(cx, cy, positions[vC + 2]); + vec3.sub(cb, pC, pB); + vec3.sub(ab, pA, pB); + vec3.cross(normal, cb, ab); + normals[vA] += cb[0]; + normals[vA + 1] += cb[1]; + normals[vA + 2] += cb[2]; + normals[vB] += cb[0]; + normals[vB + 1] += cb[1]; + normals[vB + 2] += cb[2]; + normals[vC] += cb[0]; + normals[vC + 1] += cb[1]; + normals[vC + 2] += cb[2]; + } + normalizeNormals(normals); + return normals; +} + +function normalizeNormals(normals: Float32Array) { + for (let i = 0, li = normals.length; i < li; i += 3) { + const normal = vec3.fromValues(normals[i], normals[i + 1], normals[i + 2]); + const newNormal = vec3.create(); + vec3.normalize(newNormal, normal); + normals.set(newNormal, i); + } +} + +function checkIsClosed(points: number[][][]) { + const p1 = points[0][0]; + const p2 = points[0][points[0].length - 1]; + return p1[0] === p2[0] && p1[1] === p2[1]; +} + +function getHeatmapGeometry(shape: ShapeType2D | ShapeType3D): IExtrudeGeomety { + const shape3d = [ + 'cylinder', + 'triangleColumn', + 'hexagonColumn', + 'squareColumn', + ]; + const path = geometryShape[shape] + ? geometryShape[shape]() + : geometryShape.circle(); + const geometry = + shape3d.indexOf(shape) === -1 + ? fillPolygon([path]) + : extrudePolygon([path]); + // const geometry = fillPolygon([path]); + return geometry; +} +// 热力图计算范围 +function addDir(dirX: number, dirY: number) { + const x = (dirX + 1) / 2; + const y = (dirY + 1) / 2; + return [x, y]; +} diff --git a/packages/layers/src/heatmap/index.ts b/packages/layers/src/heatmap/index.ts new file mode 100644 index 0000000000..0e0de961e1 --- /dev/null +++ b/packages/layers/src/heatmap/index.ts @@ -0,0 +1,60 @@ +import { AttributeType, gl, IEncodeFeature, ILayer } from '@l7/core'; +import BaseLayer from '../core/BaseLayer'; +import HeatMapModels, { HeatMapModelType } from './models'; +interface IPointLayerStyleOptions { + opacity: number; +} +export default class HeatMapLayer extends BaseLayer { + public name: string = 'HeatMapLayer'; + protected getConfigSchema() { + return { + properties: { + opacity: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + }; + } + + protected renderModels() { + const shape = this.getModelType(); + if (shape === 'heatmap') { + this.layerModel.render(); + return; + } + this.models.forEach((model) => + model.draw({ + uniforms: this.layerModel.getUninforms(), + }), + ); + return this; + } + + protected buildModels() { + const shape = this.getModelType(); + this.layerModel = new HeatMapModels[shape](this); + this.models = this.layerModel.buildModels(); + } + private getModelType(): HeatMapModelType { + const shapeAttribute = this.styleAttributeService.getLayerStyleAttribute( + 'shape', + ); + const { shape3d } = this.configService.getConfig(); + const source = this.getSource(); + const sourceType = source.data.type; + const shape = + (shapeAttribute?.scale?.field as HeatMapModelType) || 'heatmap'; + if (shape === 'heatmap' || shape === 'heatmap3d') { + return 'heatmap'; + } + if (sourceType === 'hexagon') { + return shape3d?.indexOf(shape) === -1 ? 'hexagon' : 'grid3d'; + } + if (sourceType === 'grid') { + return shape3d?.indexOf(shape) === -1 ? 'grid' : 'grid3d'; + } + return 'heatmap'; + } +} diff --git a/packages/layers/src/heatmap/models/grid.ts b/packages/layers/src/heatmap/models/grid.ts new file mode 100644 index 0000000000..96dbed19a6 --- /dev/null +++ b/packages/layers/src/heatmap/models/grid.ts @@ -0,0 +1,92 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + IModel, + IModelUniform, +} from '@l7/core'; +import BaseModel from '../../core/baseModel'; +import { HeatmapGridTriangulation } from '../../core/triangulation'; +import heatmapGridVert from '../shaders/grid_vert.glsl'; +import heatmapGridFrag from '../shaders/hexagon_frag.glsl'; +interface IHeatMapLayerStyleOptions { + opacity: number; + coverage: number; +} +export default class GridModel extends BaseModel { + public getUninforms(): IModelUniform { + const { + opacity, + coverage, + } = this.layer.getStyleOptions() as IHeatMapLayerStyleOptions; + return { + u_opacity: opacity || 1.0, + u_coverage: coverage || 0.9, + u_radius: [ + this.layer.getSource().data.xOffset, + this.layer.getSource().data.yOffset, + ], + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'gridheatmap', + vertexShader: heatmapGridVert, + fragmentShader: heatmapGridFrag, + triangulation: HeatmapGridTriangulation, + depth: { enable: false }, + primitive: gl.TRIANGLES, + }), + ]; + } + protected registerBuiltinAttributes() { + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'pos', // 顶点经纬度位置 + type: AttributeType.Attribute, + descriptor: { + name: 'a_Pos', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 3, + update: (feature: IEncodeFeature, featureIdx: number) => { + const coordinates = feature.coordinates as number[]; + return [coordinates[0], coordinates[1], 0]; + }, + }, + }); + } +} diff --git a/packages/layers/src/heatmap/models/grid3d.ts b/packages/layers/src/heatmap/models/grid3d.ts new file mode 100644 index 0000000000..6433facdcd --- /dev/null +++ b/packages/layers/src/heatmap/models/grid3d.ts @@ -0,0 +1,115 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + IModel, + IModelUniform, +} from '@l7/core'; +import BaseModel from '../../core/baseModel'; +import { PointExtrudeTriangulation } from '../../core/triangulation'; +import heatmapGrid3dVert from '../shaders/hexagon_3d_vert.glsl'; +import heatmapGridFrag from '../shaders/hexagon_frag.glsl'; + +interface IHeatMapLayerStyleOptions { + opacity: number; + coverage: number; +} +export default class Grid3DModel extends BaseModel { + public getUninforms(): IModelUniform { + const { + opacity, + coverage, + } = this.layer.getStyleOptions() as IHeatMapLayerStyleOptions; + return { + u_opacity: opacity || 1.0, + u_coverage: coverage || 1.0, + u_radius: [ + this.layer.getSource().data.xOffset, + this.layer.getSource().data.yOffset, + ], + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'grid3dheatmap', + vertexShader: heatmapGrid3dVert, + fragmentShader: heatmapGridFrag, + triangulation: PointExtrudeTriangulation, + depth: { enable: true }, + }), + ]; + } + protected registerBuiltinAttributes() { + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'normal', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Normal', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.STATIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 3, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + normal: number[], + ) => { + return normal; + }, + }, + }); + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'pos', // 顶点经纬度位置 + type: AttributeType.Attribute, + descriptor: { + name: 'a_Pos', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 3, + update: (feature: IEncodeFeature, featureIdx: number) => { + const coordinates = feature.coordinates as number[]; + return [coordinates[0], coordinates[1], 0]; + }, + }, + }); + } +} diff --git a/packages/layers/src/heatmap/models/heatmap.ts b/packages/layers/src/heatmap/models/heatmap.ts new file mode 100644 index 0000000000..47aad15ca2 --- /dev/null +++ b/packages/layers/src/heatmap/models/heatmap.ts @@ -0,0 +1,347 @@ +import { + AttributeType, + gl, + ICameraService, + IEncodeFeature, + IFramebuffer, + ILayer, + ILayerModel, + IModel, + IModelUniform, + ITexture2D, + lazyInject, + TYPES, +} from '@l7/core'; +import { mat4 } from 'gl-matrix'; +import BaseModel from '../../core/baseModel'; +import { HeatmapTriangulation } from '../../core/triangulation'; +import { generateColorRamp, IColorRamp } from '../../utils/color'; +import heatmap3DFrag from '../shaders/heatmap_3d_frag.glsl'; +import heatmap3DVert from '../shaders/heatmap_3d_vert.glsl'; +import heatmapColorFrag from '../shaders/heatmap_frag.glsl'; +import heatmapFrag from '../shaders/heatmap_framebuffer_frag.glsl'; +import heatmapVert from '../shaders/heatmap_framebuffer_vert.glsl'; +import heatmapColorVert from '../shaders/heatmap_vert.glsl'; +import { heatMap3DTriangulation } from '../triangulation'; +interface IHeatMapLayerStyleOptions { + opacity: number; + intensity: number; + radius: number; + rampColors: IColorRamp; +} + +export default class HeatMapModel extends BaseModel { + protected texture: ITexture2D; + protected colorTexture: ITexture2D; + protected heatmapFramerBuffer: IFramebuffer; + private intensityModel: IModel; + private colorModel: IModel; + private shapeType: string; + + public render() { + const { clear, useFramebuffer } = this.rendererService; + useFramebuffer(this.heatmapFramerBuffer, () => { + clear({ + color: [0, 0, 0, 0], + depth: 1, + stencil: 0, + framebuffer: this.heatmapFramerBuffer, + }); + this.drawIntensityMode(); + }); + this.shapeType === 'heatmap' ? this.drawColorMode() : this.draw3DHeatMap(); + } + + public getUninforms(): IModelUniform { + throw new Error('Method not implemented.'); + } + + public buildModels(): IModel[] { + const { + createFramebuffer, + clear, + getViewportSize, + createTexture2D, + useFramebuffer, + } = this.rendererService; + const shapeAttr = this.layer.styleAttributeService.getLayerStyleAttribute( + 'shape', + ); + const shapeType = shapeAttr?.scale?.field || 'heatmap'; + this.shapeType = shapeType as string; + // 生成热力图密度图 + this.intensityModel = this.buildHeatMapIntensity(); + // 渲染到屏幕 + this.colorModel = + shapeType === 'heatmap' + ? this.buildHeatmapColor() // 2D + : this.build3dHeatMap(); // 3D + + const { + rampColors, + } = this.layer.getStyleOptions() as IHeatMapLayerStyleOptions; + const imageData = generateColorRamp(rampColors as IColorRamp); + const { width, height } = getViewportSize(); + + // 初始化密度图纹理 + this.heatmapFramerBuffer = createFramebuffer({ + color: createTexture2D({ + width, + height, + wrapS: gl.CLAMP_TO_EDGE, + wrapT: gl.CLAMP_TO_EDGE, + min: gl.LINEAR, + mag: gl.LINEAR, + }), + }); + + // 初始化颜色纹理 + + this.colorTexture = createTexture2D({ + data: imageData.data, + width: imageData.width, + height: imageData.height, + wrapS: gl.CLAMP_TO_EDGE, + wrapT: gl.CLAMP_TO_EDGE, + min: gl.LINEAR, + mag: gl.LINEAR, + flipY: true, + }); + + return [this.intensityModel, this.colorModel]; + } + protected registerBuiltinAttributes() { + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'dir', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Dir', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 2, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + return [vertex[3], vertex[4]]; + }, + }, + }); + + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size = 2 } = feature; + return [size as number]; + }, + }, + }); + } + private buildHeatMapIntensity(): IModel { + return this.layer.buildLayerModel({ + moduleName: 'heatmapintensity', + vertexShader: heatmapVert, + fragmentShader: heatmapFrag, + triangulation: HeatmapTriangulation, + depth: { + enable: false, + }, + blend: { + enable: true, + func: { + srcRGB: gl.ONE, + srcAlpha: gl.ONE_MINUS_SRC_ALPHA, + dstRGB: gl.ONE, + dstAlpha: gl.ONE_MINUS_SRC_ALPHA, + }, + }, + }); + } + + private buildHeatmapColor(): IModel { + this.shaderModuleService.registerModule('heatmapColor', { + vs: heatmapColorVert, + fs: heatmapColorFrag, + }); + + const { vs, fs, uniforms } = this.shaderModuleService.getModule( + 'heatmapColor', + ); + const { + createAttribute, + createElements, + createBuffer, + createModel, + } = this.rendererService; + return createModel({ + vs, + fs, + attributes: { + a_Position: createAttribute({ + buffer: createBuffer({ + data: [-1, 1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0], + type: gl.FLOAT, + }), + size: 3, + }), + a_Uv: createAttribute({ + buffer: createBuffer({ + data: [0, 1, 1, 1, 0, 0, 1, 0], + type: gl.FLOAT, + }), + size: 2, + }), + }, + uniforms: { + ...uniforms, + }, + depth: { + enable: false, + }, + blend: { + enable: true, + func: { + srcRGB: gl.SRC_ALPHA, + srcAlpha: 1, + dstRGB: gl.ONE_MINUS_SRC_ALPHA, + dstAlpha: 1, + }, + }, + count: 6, + elements: createElements({ + data: [0, 2, 1, 2, 3, 1], + type: gl.UNSIGNED_INT, + count: 6, + }), + }); + } + + private drawIntensityMode() { + const { + opacity, + intensity = 10, + radius = 5, + } = this.layer.getStyleOptions() as IHeatMapLayerStyleOptions; + this.intensityModel.draw({ + uniforms: { + u_opacity: opacity || 1.0, + u_radius: radius, + u_intensity: intensity, + }, + }); + } + + private drawColorMode() { + const { + opacity, + } = this.layer.getStyleOptions() as IHeatMapLayerStyleOptions; + this.colorModel.draw({ + uniforms: { + u_opacity: opacity || 1.0, + u_colorTexture: this.colorTexture, + u_texture: this.heatmapFramerBuffer, + }, + }); + } + + private draw3DHeatMap() { + const { + opacity, + } = this.layer.getStyleOptions() as IHeatMapLayerStyleOptions; + const invert = mat4.invert( + mat4.create(), + // @ts-ignore + mat4.fromValues(...this.camera.getViewProjectionMatrix()), + ) as mat4; + this.colorModel.draw({ + uniforms: { + u_opacity: opacity || 1.0, + u_colorTexture: this.colorTexture, + u_texture: this.heatmapFramerBuffer, + u_InverseViewProjectionMatrix: [...invert], + }, + }); + } + private build3dHeatMap() { + const { getViewportSize } = this.rendererService; + const { width, height } = getViewportSize(); + const triangulation = heatMap3DTriangulation(width / 2.0, height / 2.0); + this.shaderModuleService.registerModule('heatmap3dColor', { + vs: heatmap3DVert, + fs: heatmap3DFrag, + }); + + const { vs, fs, uniforms } = this.shaderModuleService.getModule( + 'heatmap3dColor', + ); + const { + createAttribute, + createElements, + createBuffer, + createModel, + } = this.rendererService; + return createModel({ + vs, + fs, + attributes: { + a_Position: createAttribute({ + buffer: createBuffer({ + data: triangulation.vertices, + type: gl.FLOAT, + }), + size: 3, + }), + a_Uv: createAttribute({ + buffer: createBuffer({ + data: triangulation.uvs, + type: gl.FLOAT, + }), + size: 2, + }), + }, + primitive: gl.TRIANGLES, + uniforms: { + ...uniforms, + }, + depth: { + enable: true, + }, + blend: { + enable: true, + func: { + srcRGB: gl.SRC_ALPHA, + srcAlpha: 1, + dstRGB: gl.ONE_MINUS_SRC_ALPHA, + dstAlpha: 1, + }, + }, + elements: createElements({ + data: triangulation.indices, + type: gl.UNSIGNED_INT, + count: triangulation.indices.length, + }), + }); + } +} diff --git a/packages/layers/src/heatmap/models/hexagon.ts b/packages/layers/src/heatmap/models/hexagon.ts new file mode 100644 index 0000000000..f26a081afd --- /dev/null +++ b/packages/layers/src/heatmap/models/hexagon.ts @@ -0,0 +1,92 @@ +import { + AttributeType, + gl, + IEncodeFeature, + IModel, + IModelUniform, +} from '@l7/core'; +import BaseModel from '../../core/baseModel'; +import { HeatmapGridTriangulation } from '../../core/triangulation'; +import heatmapGridFrag from '../shaders/hexagon_frag.glsl'; +import heatmapGridVert from '../shaders/hexagon_vert.glsl'; + +interface IHeatMapLayerStyleOptions { + opacity: number; + coverage: number; +} + +export default class HexagonModel extends BaseModel { + public getUninforms(): IModelUniform { + const { + opacity, + coverage, + } = this.layer.getStyleOptions() as IHeatMapLayerStyleOptions; + return { + u_opacity: opacity || 1.0, + u_coverage: coverage || 0.9, + u_radius: [ + this.layer.getSource().data.xOffset, + this.layer.getSource().data.yOffset, + ], + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'hexagonheatmap', + vertexShader: heatmapGridVert, + fragmentShader: heatmapGridFrag, + triangulation: HeatmapGridTriangulation, + depth: { enable: false }, + primitive: gl.TRIANGLES, + }), + ]; + } + protected registerBuiltinAttributes() { + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'pos', // 顶点经纬度位置 + type: AttributeType.Attribute, + descriptor: { + name: 'a_Pos', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 3, + update: (feature: IEncodeFeature, featureIdx: number) => { + const coordinates = feature.coordinates as number[]; + return [coordinates[0], coordinates[1], 0]; + }, + }, + }); + } +} diff --git a/packages/layers/src/heatmap/models/index.ts b/packages/layers/src/heatmap/models/index.ts new file mode 100644 index 0000000000..1bcd1cf6af --- /dev/null +++ b/packages/layers/src/heatmap/models/index.ts @@ -0,0 +1,20 @@ +import GridModel from './grid'; +import Grid3DModel from './grid3d'; +import HeatMapModel from './heatmap'; +import HexagonModel from './hexagon'; + +export type HeatMapModelType = + | 'heatmap' + | 'heatmap3d' + | 'hexagon' + | 'grid' + | 'grid3d'; + +const HeatMapModels: { [key in HeatMapModelType]: any } = { + heatmap: HeatMapModel, + heatmap3d: HeatMapModel, + grid: GridModel, + grid3d: Grid3DModel, + hexagon: HexagonModel, +}; +export default HeatMapModels; diff --git a/packages/layers/src/heatmap/shaders/grid_vert.glsl b/packages/layers/src/heatmap/shaders/grid_vert.glsl new file mode 100644 index 0000000000..5cc66a19b6 --- /dev/null +++ b/packages/layers/src/heatmap/shaders/grid_vert.glsl @@ -0,0 +1,24 @@ +precision highp float; +// 多边形顶点坐标 +attribute vec3 a_Position; +// 多边形经纬度坐标 +attribute vec3 a_Pos; +attribute float a_Size; +attribute vec4 a_Color; +uniform vec2 u_radius; +uniform float u_coverage: 0.9; +uniform float u_angle: 0; +uniform mat4 u_ModelMatrix; +varying vec4 v_color; + +#pragma include "projection" +#pragma include "project" +void main() { + v_color = a_Color; + + mat2 rotationMatrix = mat2(cos(u_angle), sin(u_angle), -sin(u_angle), cos(u_angle)); + vec2 offset = a_Position.xy * u_radius * rotationMatrix * u_coverage ; + // vec2 lnglat = unProjectFlat(a_Pos.xy); + vec4 project_pos = project_position(vec4(a_Pos.xy + offset, 0, 1.0)); + gl_Position = project_common_position_to_clipspace(project_pos); +} diff --git a/packages/layers/src/heatmap/shaders/heatmap_3d_frag.glsl b/packages/layers/src/heatmap/shaders/heatmap_3d_frag.glsl new file mode 100644 index 0000000000..48b48907ea --- /dev/null +++ b/packages/layers/src/heatmap/shaders/heatmap_3d_frag.glsl @@ -0,0 +1,17 @@ +uniform sampler2D u_texture; +uniform sampler2D u_colorTexture; +uniform float u_opacity; +varying vec2 v_texCoord; +varying float v_intensity; + +void main(){ + + float intensity = texture2D(u_texture, v_texCoord).r; + vec2 ramp_pos = vec2( + fract(16.0 * (1.0 - v_intensity)), + floor(16.0 * (1.0 - v_intensity)) / 16.0); + // vec4 color = texture2D(u_colorTexture,vec2(0.5,1.0-intensity)); + vec4 color = texture2D(u_colorTexture,ramp_pos); + gl_FragColor = color; + gl_FragColor.a = color.a * smoothstep(0.1,0.2,intensity)* u_opacity; +} diff --git a/packages/layers/src/heatmap/shaders/heatmap_3d_vert.glsl b/packages/layers/src/heatmap/shaders/heatmap_3d_vert.glsl new file mode 100644 index 0000000000..972323b636 --- /dev/null +++ b/packages/layers/src/heatmap/shaders/heatmap_3d_vert.glsl @@ -0,0 +1,45 @@ +precision highp float; +attribute vec3 a_Position; +attribute vec2 a_Uv; +uniform sampler2D u_texture; +varying vec2 v_texCoord; +uniform mat4 u_ModelMatrix; +uniform mat4 u_InverseViewProjectionMatrix; +varying float v_intensity; + +vec2 toBezier(float t, vec2 P0, vec2 P1, vec2 P2, vec2 P3) { + float t2 = t * t; + float one_minus_t = 1.0 - t; + float one_minus_t2 = one_minus_t * one_minus_t; + return (P0 * one_minus_t2 * one_minus_t + P1 * 3.0 * t * one_minus_t2 + P2 * 3.0 * t2 * one_minus_t + P3 * t2 * t); +} +vec2 toBezier(float t, vec4 p){ + return toBezier(t, vec2(0.0, 0.0), vec2(p.x, p.y), vec2(p.z, p.w), vec2(1.0, 1.0)); +} +#pragma include "projection" +void main() { + v_texCoord = a_Uv; + + vec2 pos = 1.8 * (a_Uv * vec2(2.0) - vec2(1.0)); + + + vec4 p1 = vec4(pos, 0.0, 1.0); + vec4 p2 = vec4(pos, 1.0, 1.0); + + vec4 inverseP1 = unproject_clipspace_to_position(p1, u_InverseViewProjectionMatrix); + vec4 inverseP2 = unproject_clipspace_to_position(p2, u_InverseViewProjectionMatrix) ; + + inverseP1 = inverseP1 / inverseP1.w; + inverseP2 = inverseP2 / inverseP2.w; + + float zPos = (0.0 - inverseP1.z) / (inverseP2.z - inverseP1.z); + vec4 position = inverseP1 + zPos * (inverseP2 - inverseP1); + + vec4 b= vec4(0.5000, 0, 1, 0.5000); + float fh; + + v_intensity = texture2D(u_texture, v_texCoord).r; + fh = toBezier(v_intensity, b).y; + gl_Position = project_common_position_to_clipspace(vec4(position.xy, fh * 50., 1.0)); + +} diff --git a/packages/layers/src/heatmap/shaders/heatmap_frag.glsl b/packages/layers/src/heatmap/shaders/heatmap_frag.glsl new file mode 100644 index 0000000000..a20d904c3b --- /dev/null +++ b/packages/layers/src/heatmap/shaders/heatmap_frag.glsl @@ -0,0 +1,17 @@ +uniform sampler2D u_texture; +uniform sampler2D u_colorTexture; +uniform float u_opacity; +varying vec2 v_texCoord; +varying float v_intensity; + +void main(){ + float intensity = texture2D(u_texture, v_texCoord).r; + vec2 ramp_pos = vec2( + fract(16.0 * (1.0 - intensity)), + floor(16.0 * (1.0 - intensity)) / 16.0); + // vec4 color = texture2D(u_colorTexture,vec2(0.5,1.0-intensity)); + vec4 color = texture2D(u_colorTexture,ramp_pos); + gl_FragColor = color; + gl_FragColor.a = color.a * smoothstep(0.,0.05,intensity) * u_opacity; + +} diff --git a/packages/layers/src/heatmap/shaders/heatmap_framebuffer_frag.glsl b/packages/layers/src/heatmap/shaders/heatmap_framebuffer_frag.glsl new file mode 100644 index 0000000000..1e234110e7 --- /dev/null +++ b/packages/layers/src/heatmap/shaders/heatmap_framebuffer_frag.glsl @@ -0,0 +1,12 @@ +precision highp float; +uniform float u_intensity; +varying float v_weight; +varying vec2 v_extrude; + + +void main(){ + float GAUSS_COEF = 0.3989422804014327; + float d = -0.5 * 3.0 * 3.0 * dot(v_extrude, v_extrude); + float val = v_weight * u_intensity * GAUSS_COEF * exp(d); + gl_FragColor = vec4(val, val, val, val); +} diff --git a/packages/layers/src/heatmap/shaders/heatmap_framebuffer_vert.glsl b/packages/layers/src/heatmap/shaders/heatmap_framebuffer_vert.glsl new file mode 100644 index 0000000000..ad8a2507e6 --- /dev/null +++ b/packages/layers/src/heatmap/shaders/heatmap_framebuffer_vert.glsl @@ -0,0 +1,27 @@ +precision highp float; +attribute vec3 a_Position; +attribute float a_Size; +attribute vec2 a_Dir; +uniform float u_intensity; +uniform float u_radius; +varying vec2 v_extrude; +varying float v_weight; +uniform mat4 u_ModelMatrix; + +#pragma include "projection" + +void main(){ + v_weight = a_Size; + float GAUSS_COEF = 0.3989422804014327; + float ZERO = 1.0 / 255.0 / 16.0; + float extrude_x = a_Dir.x * 2.0 -1.0; + float extrude_y = a_Dir.y * 2.0 -1.0; + vec2 extrude_dir = normalize(vec2(extrude_x,extrude_y)); + float S = sqrt(-2.0 * log(ZERO / a_Size / u_intensity / GAUSS_COEF)) / 3.0; + v_extrude = extrude_dir * S; + + vec2 offset = project_pixel(v_extrude * u_radius); + vec4 project_pos = project_position(vec4(a_Position.xy, 0.0, 1.0)); + + gl_Position = project_common_position_to_clipspace(vec4(project_pos.xy + offset, 0.0, 1.0)); +} diff --git a/packages/layers/src/heatmap/shaders/heatmap_vert.glsl b/packages/layers/src/heatmap/shaders/heatmap_vert.glsl new file mode 100644 index 0000000000..cfa03fe386 --- /dev/null +++ b/packages/layers/src/heatmap/shaders/heatmap_vert.glsl @@ -0,0 +1,11 @@ +precision highp float; +attribute vec3 a_Position; +attribute vec2 a_Uv; +uniform sampler2D u_texture; +varying vec2 v_texCoord; +varying float v_intensity; +void main() { + v_texCoord = a_Uv; + v_intensity = texture2D(u_texture, v_texCoord).r; + gl_Position = vec4(a_Position.xy, 0, 1.); +} diff --git a/packages/layers/src/heatmap/shaders/hexagon_3d_frag.glsl b/packages/layers/src/heatmap/shaders/hexagon_3d_frag.glsl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/layers/src/heatmap/shaders/hexagon_3d_vert.glsl b/packages/layers/src/heatmap/shaders/hexagon_3d_vert.glsl new file mode 100644 index 0000000000..a2f1f722f1 --- /dev/null +++ b/packages/layers/src/heatmap/shaders/hexagon_3d_vert.glsl @@ -0,0 +1,29 @@ +precision highp float; +// 多边形顶点坐标 +attribute vec3 a_Position; +// 多边形经纬度坐标 +attribute vec3 a_Pos; + +attribute vec3 a_Normal; +attribute float a_Size; +attribute vec4 a_Color; +uniform vec2 u_radius; +uniform float u_coverage: 0.9; +uniform float u_angle: 0; +uniform mat4 u_ModelMatrix; +varying vec4 v_color; + +#pragma include "projection" +#pragma include "project" +#pragma include "light" +void main() { + + mat2 rotationMatrix = mat2(cos(u_angle), sin(u_angle), -sin(u_angle), cos(u_angle)); + vec2 offset =(vec2(a_Position.xy * u_radius * rotationMatrix * u_coverage)); + vec2 lnglat = unProjectFlat(a_Pos.xy + offset); + vec4 project_pos = project_position(vec4(lnglat, a_Position.z * project_pixel(a_Size), 1.0)); + float lightWeight = calc_lighting(project_pos); + v_color =vec4(a_Color.rgb*lightWeight, a_Color.w); + + gl_Position = project_common_position_to_clipspace(project_pos); +} diff --git a/packages/layers/src/heatmap/shaders/hexagon_frag.glsl b/packages/layers/src/heatmap/shaders/hexagon_frag.glsl new file mode 100644 index 0000000000..2a1dfa7f88 --- /dev/null +++ b/packages/layers/src/heatmap/shaders/hexagon_frag.glsl @@ -0,0 +1,7 @@ +precision highp float; +varying vec4 v_color; +uniform float u_opacity: 1; +void main() { + gl_FragColor = v_color; + gl_FragColor.a *= u_opacity; +} diff --git a/packages/layers/src/heatmap/shaders/hexagon_vert.glsl b/packages/layers/src/heatmap/shaders/hexagon_vert.glsl new file mode 100644 index 0000000000..ec08c1b99a --- /dev/null +++ b/packages/layers/src/heatmap/shaders/hexagon_vert.glsl @@ -0,0 +1,24 @@ +precision highp float; +// 多边形顶点坐标 +attribute vec3 a_Position; +// 多边形经纬度坐标 +attribute vec3 a_Pos; +attribute float a_Size; +attribute vec4 a_Color; +uniform vec2 u_radius; +uniform float u_coverage: 0.9; +uniform float u_angle: 0; +uniform mat4 u_ModelMatrix; +varying vec4 v_color; + +#pragma include "projection" +#pragma include "project" +void main() { + v_color = a_Color; + + mat2 rotationMatrix = mat2(cos(u_angle), sin(u_angle), -sin(u_angle), cos(u_angle)); + vec2 offset =(vec2(a_Position.xy * u_radius * rotationMatrix * u_coverage)); + vec2 lnglat = unProjectFlat(a_Pos.xy + offset); + vec4 project_pos = project_position(vec4(lnglat, 0, 1.0)); + gl_Position = project_common_position_to_clipspace(vec4(project_pos.xy, 0., 1.0)); +} diff --git a/packages/layers/src/heatmap/triangulation.ts b/packages/layers/src/heatmap/triangulation.ts new file mode 100644 index 0000000000..46c94bc268 --- /dev/null +++ b/packages/layers/src/heatmap/triangulation.ts @@ -0,0 +1,36 @@ +import { IEncodeFeature, IParseDataItem } from '@l7/core'; +// @ts-ignore + +export function heatMap3DTriangulation(width: number, height: number) { + const indices = []; + const vertices = []; + const uvs = []; + const gridX1 = width + 1; + const gridY1 = height + 1; + const widthHalf = width / 2; + const heightHalf = height / 2; + for (let iy = 0; iy < gridY1; iy++) { + const y = iy - heightHalf; + for (let ix = 0; ix < gridX1; ix++) { + const x = ix - widthHalf; + vertices.push(x / widthHalf, -y / heightHalf, 0); + uvs.push(ix / width); + uvs.push(1 - iy / height); + } + } + for (let iy = 0; iy < height; iy++) { + for (let ix = 0; ix < width; 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); + } + } + return { + vertices, + indices, + uvs, + }; +} diff --git a/packages/layers/src/index.ts b/packages/layers/src/index.ts new file mode 100644 index 0000000000..ad87701059 --- /dev/null +++ b/packages/layers/src/index.ts @@ -0,0 +1,77 @@ +import { container, ILayerPlugin, TYPES } from '@l7/core'; +import BaseLayer from './core/BaseLayer'; +import HeatmapLayer from './heatmap'; +import DashLineLayer from './line/dash'; +import LineLayer from './line/index'; +import PointLayer from './point'; +import PolygonLayer from './polygon'; +import ImageLayer from './raster/image'; +import RasterLayer from './raster/raster'; + +import ConfigSchemaValidationPlugin from './plugins/ConfigSchemaValidationPlugin'; +import DataMappingPlugin from './plugins/DataMappingPlugin'; +import DataSourcePlugin from './plugins/DataSourcePlugin'; +import FeatureScalePlugin from './plugins/FeatureScalePlugin'; +import LightingPlugin from './plugins/LightingPlugin'; +import MultiPassRendererPlugin from './plugins/MultiPassRendererPlugin'; +import PixelPickingPlugin from './plugins/PixelPickingPlugin'; +import RegisterStyleAttributePlugin from './plugins/RegisterStyleAttributePlugin'; +import ShaderUniformPlugin from './plugins/ShaderUniformPlugin'; +import UpdateStyleAttributePlugin from './plugins/UpdateStyleAttributePlugin'; + +/** + * 校验传入参数配置项的正确性 + * @see /dev-docs/ConfigSchemaValidation.md + */ +container + .bind(TYPES.ILayerPlugin) + .to(ConfigSchemaValidationPlugin); +/** + * 获取 Source + */ +container.bind(TYPES.ILayerPlugin).to(DataSourcePlugin); +/** + * 根据 StyleAttribute 创建 VertexAttribute + */ +container + .bind(TYPES.ILayerPlugin) + .to(RegisterStyleAttributePlugin); +/** + * 根据 Source 创建 Scale + */ +container.bind(TYPES.ILayerPlugin).to(FeatureScalePlugin); +/** + * 使用 Scale 进行数据映射 + */ +container.bind(TYPES.ILayerPlugin).to(DataMappingPlugin); +/** + * 负责属性更新 + */ +container.bind(TYPES.ILayerPlugin).to(UpdateStyleAttributePlugin); +/** + * Multi Pass 自定义渲染管线 + */ +container.bind(TYPES.ILayerPlugin).to(MultiPassRendererPlugin); +/** + * 传入相机坐标系参数 + */ +container.bind(TYPES.ILayerPlugin).to(ShaderUniformPlugin); +/** + * 传入光照相关参数 + */ +container.bind(TYPES.ILayerPlugin).to(LightingPlugin); +/** + * 负责拾取过程中 Encode 以及 Highlight 阶段及结束后恢复 + */ +container.bind(TYPES.ILayerPlugin).to(PixelPickingPlugin); + +export { + BaseLayer, + PointLayer, + PolygonLayer, + LineLayer, + DashLineLayer, + ImageLayer, + RasterLayer, + HeatmapLayer, +}; diff --git a/packages/layers/src/line/dash.ts b/packages/layers/src/line/dash.ts new file mode 100644 index 0000000000..56c9a47e12 --- /dev/null +++ b/packages/layers/src/line/dash.ts @@ -0,0 +1,206 @@ +import { AttributeType, gl, IEncodeFeature, ILayer } from '@l7/core'; +import BaseLayer from '../core/BaseLayer'; +import { LineTriangulation } from '../core/triangulation'; +import line_dash_frag from './shaders/line_dash_frag.glsl'; +import line_dash_vert from './shaders/line_dash_vert.glsl'; +interface IDashLineLayerStyleOptions { + opacity: number; + dashArray: [number, number]; +} +export default class DashLineLayer extends BaseLayer< + IDashLineLayerStyleOptions +> { + public name: string = 'LineLayer'; + + protected getConfigSchema() { + return { + properties: { + opacity: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + }; + } + + protected renderModels() { + const { opacity, dashArray = [10, 5] } = this.getStyleOptions(); + this.models.forEach((model) => + model.draw({ + uniforms: { + u_opacity: opacity || 1.0, + u_dash_array: dashArray, + }, + }), + ); + return this; + } + + protected buildModels() { + this.registerBuiltinAttributes(this); + this.models = [ + this.buildLayerModel({ + moduleName: 'line_dash', + vertexShader: line_dash_vert, + fragmentShader: line_dash_frag, + triangulation: LineTriangulation, + blend: { + enable: true, + func: { + srcRGB: gl.SRC_ALPHA, + srcAlpha: 1, + dstRGB: gl.ONE_MINUS_SRC_ALPHA, + dstAlpha: 1, + }, + }, + }), + ]; + } + + private registerBuiltinAttributes(layer: ILayer) { + // point layer size; + layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + + // point layer size; + layer.styleAttributeService.registerStyleAttribute({ + name: 'normal', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Normal', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.STATIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 3, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + normal: number[], + ) => { + return normal; + }, + }, + }); + + layer.styleAttributeService.registerStyleAttribute({ + name: 'miter', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Miter', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + return [vertex[4]]; + }, + }, + }); + + layer.styleAttributeService.registerStyleAttribute({ + name: 'startPos', + type: AttributeType.Attribute, + descriptor: { + name: 'a_StartPos', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 3, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const coordinates = feature.coordinates as number[][]; + const coord = coordinates[0]; + return coord.length === 3 ? coord : [...coord, 0.0]; + }, + }, + }); + + layer.styleAttributeService.registerStyleAttribute({ + name: 'distance', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Distance', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + return [vertex[3]]; + }, + }, + }); + + layer.styleAttributeService.registerStyleAttribute({ + name: 'total_distance', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Total_Distance', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + return [vertex[5]]; + }, + }, + }); + } +} diff --git a/packages/layers/src/line/index.ts b/packages/layers/src/line/index.ts new file mode 100644 index 0000000000..f7cee5bc06 --- /dev/null +++ b/packages/layers/src/line/index.ts @@ -0,0 +1,53 @@ +import { AttributeType, gl, IEncodeFeature, ILayer } from '@l7/core'; +import BaseLayer from '../core/BaseLayer'; +import LineModels, { LineModelType } from './models'; +interface IPointLayerStyleOptions { + opacity: number; +} +export default class LineLayer extends BaseLayer { + public name: string = 'LineLayer'; + + private animateStartTime: number = 0; + + protected getConfigSchema() { + return { + properties: { + opacity: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + }; + } + + protected renderModels() { + this.models.forEach((model) => + model.draw({ + uniforms: this.layerModel.getUninforms(), + }), + ); + return this; + } + + protected buildModels() { + const shape = this.getModelType(); + this.layerModel = new LineModels[shape](this); + this.models = this.layerModel.buildModels(); + } + private getModelType(): LineModelType { + const shapeAttribute = this.styleAttributeService.getLayerStyleAttribute( + 'shape', + ); + const shape = shapeAttribute?.scale?.field as LineModelType; + return shape || 'line'; + } + // 拆分的动画插件 + private initAnimate() { + const { enable } = this.animateOptions; + if (enable) { + this.layerService.startAnimate(); + this.animateStartTime = this.layerService.clock.getElapsedTime(); + } + } +} diff --git a/packages/layers/src/line/models/arc.ts b/packages/layers/src/line/models/arc.ts new file mode 100644 index 0000000000..ef8a5816f7 --- /dev/null +++ b/packages/layers/src/line/models/arc.ts @@ -0,0 +1,103 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + IModel, + IModelUniform, +} from '@l7/core'; + +import BaseModel from '../../core/baseModel'; +import { LineArcTriangulation } from '../../core/triangulation'; +import line_arc_frag from '../shaders/line_arc_frag.glsl'; +import line_arc2d_vert from '../shaders/line_bezier_vert.glsl'; + +interface IArcLayerStyleOptions { + opacity: number; + segmentNumber: number; + blur: number; +} +export default class ArcModel extends BaseModel { + public getUninforms(): IModelUniform { + const { + opacity, + blur = 0.99, + } = this.layer.getStyleOptions() as IArcLayerStyleOptions; + return { + u_opacity: opacity || 1, + segmentNumber: 30, + u_blur: blur, + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'arc2dline', + vertexShader: line_arc2d_vert, + fragmentShader: line_arc_frag, + triangulation: LineArcTriangulation, + depth: { enable: false }, + blend: { + enable: true, + func: { + srcRGB: gl.ONE, + srcAlpha: 1, + dstRGB: gl.ONE, + dstAlpha: 1, + }, + }, + }), + ]; + } + + protected registerBuiltinAttributes() { + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'instance', // 弧线起始点信息 + type: AttributeType.Attribute, + descriptor: { + name: 'a_Instance', + buffer: { + usage: gl.STATIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 4, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + return [vertex[3], vertex[4], vertex[5], vertex[6]]; + }, + }, + }); + } +} diff --git a/packages/layers/src/line/models/arc_3d.ts b/packages/layers/src/line/models/arc_3d.ts new file mode 100644 index 0000000000..5c3ff2bd72 --- /dev/null +++ b/packages/layers/src/line/models/arc_3d.ts @@ -0,0 +1,95 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + IModel, + IModelUniform, +} from '@l7/core'; +import BaseModel from '../../core/baseModel'; +import { LineArcTriangulation } from '../../core/triangulation'; +import line_arc_frag from '../shaders/line_arc_frag.glsl'; +import line_arc_vert from '../shaders/line_arc_vert.glsl'; + +interface IArcLayerStyleOptions { + opacity: number; + segmentNumber: number; +} +export default class Arc3DModel extends BaseModel { + public getUninforms(): IModelUniform { + const { opacity } = this.layer.getStyleOptions() as IArcLayerStyleOptions; + return { + u_opacity: opacity || 1, + segmentNumber: 30, + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'arcline', + vertexShader: line_arc_vert, + fragmentShader: line_arc_frag, + triangulation: LineArcTriangulation, + blend: { + enable: true, + func: { + srcRGB: gl.ONE, + srcAlpha: 1, + dstRGB: gl.ONE, + dstAlpha: 1, + }, + }, + }), + ]; + } + protected registerBuiltinAttributes() { + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'instance', // 弧线起始点信息 + type: AttributeType.Attribute, + descriptor: { + name: 'a_Instance', + buffer: { + usage: gl.STATIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 4, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + return [vertex[3], vertex[4], vertex[5], vertex[6]]; + }, + }, + }); + } +} diff --git a/packages/layers/src/line/models/dash.ts b/packages/layers/src/line/models/dash.ts new file mode 100644 index 0000000000..7aa44a4dbc --- /dev/null +++ b/packages/layers/src/line/models/dash.ts @@ -0,0 +1,22 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + IModel, +} from '@l7/core'; + +import BaseModel from '../../core/baseModel'; +export default class ArcModel extends BaseModel { + public getUninforms() { + throw new Error('Method not implemented.'); + } + + public buildModels(): IModel[] { + throw new Error('Method not implemented.'); + } + private registerBuiltinAttributes() { + throw new Error('Method not implemented.'); + } +} diff --git a/packages/layers/src/line/models/great_circle.ts b/packages/layers/src/line/models/great_circle.ts new file mode 100644 index 0000000000..5a990694e5 --- /dev/null +++ b/packages/layers/src/line/models/great_circle.ts @@ -0,0 +1,102 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + IModel, + IModelUniform, +} from '@l7/core'; + +import BaseModel from '../../core/baseModel'; +import { LineArcTriangulation } from '../../core/triangulation'; +import line_arc2d_vert from '../shaders/line_arc2d_vert.glsl'; +import line_arc_frag from '../shaders/line_arc_frag.glsl'; + +interface IArcLayerStyleOptions { + opacity: number; + segmentNumber: number; + blur: number; +} +export default class GreatCircleModel extends BaseModel { + public getUninforms(): IModelUniform { + const { + opacity, + blur = 0.99, + } = this.layer.getStyleOptions() as IArcLayerStyleOptions; + return { + u_opacity: opacity || 1, + segmentNumber: 30, + u_blur: blur, + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'arc2dline', + vertexShader: line_arc2d_vert, + fragmentShader: line_arc_frag, + triangulation: LineArcTriangulation, + depth: { enable: false }, + blend: { + enable: true, + func: { + srcRGB: gl.ONE, + srcAlpha: 1, + dstRGB: gl.ONE, + dstAlpha: 1, + }, + }, + }), + ]; + } + protected registerBuiltinAttributes() { + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'instance', // 弧线起始点信息 + type: AttributeType.Attribute, + descriptor: { + name: 'a_Instance', + buffer: { + usage: gl.STATIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 4, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + return [vertex[3], vertex[4], vertex[5], vertex[6]]; + }, + }, + }); + } +} diff --git a/packages/layers/src/line/models/index.ts b/packages/layers/src/line/models/index.ts new file mode 100644 index 0000000000..54a3a124e8 --- /dev/null +++ b/packages/layers/src/line/models/index.ts @@ -0,0 +1,15 @@ +import ArcModel from './arc'; +import Arc3DModel from './arc_3d'; +import GreatCircleModel from './great_circle'; +import LineModel from './line'; + +export type LineModelType = 'arc' | 'arc3d' | 'greatcircle' | 'line'; + +const LineModels: { [key in LineModelType]: any } = { + arc: ArcModel, + arc3d: Arc3DModel, + greatcircle: GreatCircleModel, + line: LineModel, +}; + +export default LineModels; diff --git a/packages/layers/src/line/models/line.ts b/packages/layers/src/line/models/line.ts new file mode 100644 index 0000000000..24cee5dff2 --- /dev/null +++ b/packages/layers/src/line/models/line.ts @@ -0,0 +1,120 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + IModel, + IModelUniform, +} from '@l7/core'; + +import BaseModel from '../../core/baseModel'; +import { LineTriangulation } from '../../core/triangulation'; +import line_frag from '../shaders/line_frag.glsl'; +import line_vert from '../shaders/line_vert.glsl'; + +interface ILineLayerStyleOptions { + opacity: number; +} +export default class LineModel extends BaseModel { + public getUninforms(): IModelUniform { + const { opacity } = this.layer.getStyleOptions() as ILineLayerStyleOptions; + return { + u_opacity: opacity || 1.0, + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'line', + vertexShader: line_vert, + fragmentShader: line_frag, + triangulation: LineTriangulation, + blend: { + enable: true, + func: { + srcRGB: gl.SRC_ALPHA, + srcAlpha: 1, + dstRGB: gl.ONE_MINUS_SRC_ALPHA, + dstAlpha: 1, + }, + }, + }), + ]; + } + protected registerBuiltinAttributes() { + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 2, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size = 1 } = feature; + return Array.isArray(size) ? [size[0], size[1]] : [size as number, 0]; + }, + }, + }); + + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'normal', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Normal', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.STATIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 3, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + normal: number[], + ) => { + return normal; + }, + }, + }); + + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'miter', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Miter', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + return [vertex[4]]; + }, + }, + }); + } +} diff --git a/packages/layers/src/line/shaders/arc_chunks.vert.glsl b/packages/layers/src/line/shaders/arc_chunks.vert.glsl new file mode 100644 index 0000000000..f0d2689c4c --- /dev/null +++ b/packages/layers/src/line/shaders/arc_chunks.vert.glsl @@ -0,0 +1,21 @@ +vec2 interpolate (vec2 source, vec2 target, float t) { + // if the angularDist is PI, linear interpolation is applied. otherwise, use spherical interpolation + vec2 mid = midPoint(source, target); + vec3 x = vec3(source.x, mid.x, target.x); + vec3 y = vec3(source.y, mid.y, target.y) + return vec2(bezier3(x ,t), bezier3(y,t)); +} +float bezier3(vec3 arr, float t) { + float ut = 1 - t + return (arr.x * ut + arr.y * t) * ut + (arr.y * ut + arr.z * t) * t +} +vec2 midPoint(vec2 source, vec2 target) { + vec2 center = target - source; + float r = length(center); + float theta = atan(center.y, center.x); + float thetaOffset = 0.314; + float r2 = r / 2.0 / cos(thetaOffset); + float theta2 = theta + thetaOffset; + vec2 mid = vec2(r2*cos(theta2) + source.x, r2*sin(theta2) + source.y); + return mid; +} diff --git a/packages/layers/src/line/shaders/line_arc2d_vert.glsl b/packages/layers/src/line/shaders/line_arc2d_vert.glsl new file mode 100644 index 0000000000..6bb16a07f9 --- /dev/null +++ b/packages/layers/src/line/shaders/line_arc2d_vert.glsl @@ -0,0 +1,95 @@ +precision mediump float; +attribute vec4 a_Color; +attribute vec3 a_Position; +attribute vec4 a_Instance; +attribute float a_Size; +uniform mat4 u_ModelMatrix; +uniform float segmentNumber; +varying vec4 v_color; +varying vec2 v_normal; + +#pragma include "projection" + +float maps (float value, float start1, float stop1, float start2, float stop2) { + return start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1)); +} + +float getSegmentRatio(float index) { + return smoothstep(0.0, 1.0, index / (segmentNumber - 1.)); +} + +float paraboloid(vec2 source, vec2 target, float ratio) { + vec2 x = mix(source, target, ratio); + vec2 center = mix(source, target, 0.5); + float dSourceCenter = distance(source, center); + float dXCenter = distance(x, center); + return (dSourceCenter + dXCenter) * (dSourceCenter - dXCenter); +} + +vec3 getPos(vec2 source, vec2 target, float segmentRatio) { + float vertex_height = paraboloid(source, target, segmentRatio); + + return vec3( + mix(source, target, segmentRatio), + sqrt(max(0.0, vertex_height)) + ); +} +vec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction) { + // normalized direction of the line + vec2 dir_screenspace = normalize(line_clipspace); + // rotate by 90 degrees + dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x); + vec2 offset = dir_screenspace * offset_direction * a_Size / 2.0; + return offset * vec2(1.0, -1.0); +} +vec2 getNormal(vec2 line_clipspace, float offset_direction) { + // normalized direction of the line + vec2 dir_screenspace = normalize(line_clipspace); + // rotate by 90 degrees + dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x); + return reverse_offset_normal(vec3(dir_screenspace,1.0)).xy * sign(offset_direction); +} +float getAngularDist (vec2 source, vec2 target) { + vec2 delta = source - target; + vec2 sin_half_delta = sin(delta / 2.0); + float a = + sin_half_delta.y * sin_half_delta.y + + cos(source.y) * cos(target.y) * + sin_half_delta.x * sin_half_delta.x; + return 2.0 * atan(sqrt(a), sqrt(1.0 - a)); +} +vec2 interpolate (vec2 source, vec2 target, float angularDist, float t) { + // if the angularDist is PI, linear interpolation is applied. otherwise, use spherical interpolation + if(abs(angularDist - PI) < 0.001) { + return (1.0 - t) * source + t * target; + } + float a = sin((1.0 - t) * angularDist) / sin(angularDist); + float b = sin(t * angularDist) / sin(angularDist); + vec2 sin_source = sin(source); + vec2 cos_source = cos(source); + vec2 sin_target = sin(target); + vec2 cos_target = cos(target); + float x = a * cos_source.y * cos_source.x + b * cos_target.y * cos_target.x; + float y = a * cos_source.y * sin_source.x + b * cos_target.y * sin_target.x; + float z = a * sin_source.y + b * sin_target.y; + return vec2(atan(y, x), atan(z, sqrt(x * x + y * y))); +} + + +void main() { + v_color = a_Color; + vec2 source = radians(a_Instance.rg); + vec2 target = radians(a_Instance.ba); + float angularDist = getAngularDist(source, target); + float segmentIndex = a_Position.x; + float segmentRatio = getSegmentRatio(segmentIndex); + float indexDir = mix(-1.0, 1.0, step(segmentIndex, 0.0)); + float nextSegmentRatio = getSegmentRatio(segmentIndex + indexDir); + vec4 curr = project_position(vec4(degrees(interpolate(source, target, angularDist, segmentRatio)), 0.0, 1.0)); + vec4 next = project_position(vec4(degrees(interpolate(source, target, angularDist, nextSegmentRatio)), 0.0, 1.0)); + v_normal = getNormal((next.xy - curr.xy) * indexDir, a_Position.y); + vec2 offset = project_pixel(getExtrusionOffset((next.xy - curr.xy) * indexDir, a_Position.y)); + // vec4 project_pos = project_position(vec4(curr.xy, 0, 1.0)); + gl_Position = project_common_position_to_clipspace(vec4(curr.xy + offset, 0, 1.0)); +} + diff --git a/packages/layers/src/line/shaders/line_arc_frag.glsl b/packages/layers/src/line/shaders/line_arc_frag.glsl new file mode 100644 index 0000000000..e60a9710cd --- /dev/null +++ b/packages/layers/src/line/shaders/line_arc_frag.glsl @@ -0,0 +1,13 @@ + precision mediump float; + uniform float u_opacity; + varying vec4 v_color; + uniform float u_blur : 0.90; + varying vec2 v_normal; + + void main() { + + gl_FragColor = v_color; + float blur = 1.- smoothstep(u_blur, 1., length(v_normal.xy)); + gl_FragColor.a *= (blur * u_opacity); + + } diff --git a/packages/layers/src/line/shaders/line_arc_vert.glsl b/packages/layers/src/line/shaders/line_arc_vert.glsl new file mode 100644 index 0000000000..5a548d510d --- /dev/null +++ b/packages/layers/src/line/shaders/line_arc_vert.glsl @@ -0,0 +1,72 @@ +precision mediump float; +attribute vec3 a_Position; +attribute vec4 a_Instance; +attribute vec4 a_Color; +attribute float a_Size; + + +uniform mat4 u_ModelMatrix; +uniform float segmentNumber; +varying vec4 v_color; +varying vec2 v_normal; +#pragma include "projection" + +float maps (float value, float start1, float stop1, float start2, float stop2) { + return start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1)); +} + +float getSegmentRatio(float index) { + return smoothstep(0.0, 1.0, index / (segmentNumber - 1.0)); +} + +float paraboloid(vec2 source, vec2 target, float ratio) { + vec2 x = mix(source, target, ratio); + vec2 center = mix(source, target, 0.5); + float dSourceCenter = distance(source, center); + float dXCenter = distance(x, center); + return (dSourceCenter + dXCenter) * (dSourceCenter - dXCenter); +} + +vec3 getPos(vec2 source, vec2 target, float segmentRatio) { + float vertex_height = paraboloid(source, target, segmentRatio); + + return vec3( + mix(source, target, segmentRatio), + sqrt(max(0.0, vertex_height)) + ); +} +vec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction) { + // normalized direction of the line + vec2 dir_screenspace = normalize(line_clipspace); + // rotate by 90 degrees + dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x); + + vec2 offset = dir_screenspace * offset_direction * a_Size / 2.0; + + return offset; +} +vec2 getNormal(vec2 line_clipspace, float offset_direction) { + // normalized direction of the line + vec2 dir_screenspace = normalize(line_clipspace); + // rotate by 90 degrees + dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x); + return reverse_offset_normal(vec3(dir_screenspace,1.0)).xy * sign(offset_direction); +} + +void main() { + v_color = a_Color; + vec2 source = project_position(vec4(a_Instance.rg, 0, 0)).xy; + vec2 target = project_position(vec4(a_Instance.ba, 0, 0)).xy; + float segmentIndex = a_Position.x; + float segmentRatio = getSegmentRatio(segmentIndex); + float indexDir = mix(-1.0, 1.0, step(segmentIndex, 0.0)); + + float nextSegmentRatio = getSegmentRatio(segmentIndex + indexDir); + vec3 curr = getPos(source, target, segmentRatio); + vec3 next = getPos(source, target, nextSegmentRatio); + vec2 offset = getExtrusionOffset((next.xy - curr.xy) * indexDir, a_Position.y); + v_normal = getNormal((next.xy - curr.xy) * indexDir, a_Position.y); + + gl_Position = project_common_position_to_clipspace(vec4(curr.xy + project_pixel(offset), curr.z, 1.0)); + +} diff --git a/packages/layers/src/line/shaders/line_bezier_vert.glsl b/packages/layers/src/line/shaders/line_bezier_vert.glsl new file mode 100644 index 0000000000..c20ad08621 --- /dev/null +++ b/packages/layers/src/line/shaders/line_bezier_vert.glsl @@ -0,0 +1,67 @@ +precision mediump float; +attribute vec4 a_Color; +attribute vec3 a_Position; +attribute vec4 a_Instance; +attribute float a_Size; +uniform mat4 u_ModelMatrix; +uniform float segmentNumber; +varying vec4 v_color; +varying vec2 v_normal; +#pragma include "projection" + +float bezier3(vec3 arr, float t) { + float ut = 1. - t; + return (arr.x * ut + arr.y * t) * ut + (arr.y * ut + arr.z * t) * t; +} +vec2 midPoint(vec2 source, vec2 target) { + vec2 center = target - source; + float r = length(center); + float theta = atan(center.y, center.x); + float thetaOffset = 0.314; + float r2 = r / 2.0 / cos(thetaOffset); + float theta2 = theta + thetaOffset; + vec2 mid = vec2(r2*cos(theta2) + source.x, r2*sin(theta2) + source.y); + return mid; +} +float getSegmentRatio(float index) { + return smoothstep(0.0, 1.0, index / (segmentNumber - 1.)); +} +vec2 interpolate (vec2 source, vec2 target, float t) { + // if the angularDist is PI, linear interpolation is applied. otherwise, use spherical interpolation + vec2 mid = midPoint(source, target); + vec3 x = vec3(source.x, mid.x, target.x); + vec3 y = vec3(source.y, mid.y, target.y); + return vec2(bezier3(x ,t), bezier3(y,t)); +} +vec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction) { + // normalized direction of the line + vec2 dir_screenspace = normalize(line_clipspace); + // rotate by 90 degrees + dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x); + vec2 offset = dir_screenspace * offset_direction * a_Size / 2.0; + return offset * vec2(1.0, -1.0); +} +vec2 getNormal(vec2 line_clipspace, float offset_direction) { + // normalized direction of the line + vec2 dir_screenspace = normalize(line_clipspace); + // rotate by 90 degrees + dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x); + return reverse_offset_normal(vec3(dir_screenspace,1.0)).xy * sign(offset_direction); +} + +void main() { + v_color = a_Color; + vec2 source = a_Instance.rg; + vec2 target = a_Instance.ba; + float segmentIndex = a_Position.x; + float segmentRatio = getSegmentRatio(segmentIndex); + float indexDir = mix(-1.0, 1.0, step(segmentIndex, 0.0)); + float nextSegmentRatio = getSegmentRatio(segmentIndex + indexDir); + + vec4 curr = project_position(vec4(interpolate(source, target, segmentRatio), 0.0, 1.0)); + vec4 next = project_position(vec4(interpolate(source, target, nextSegmentRatio), 0.0, 1.0)); + v_normal = getNormal((next.xy - curr.xy) * indexDir, a_Position.y); + vec2 offset = project_pixel(getExtrusionOffset((next.xy - curr.xy) * indexDir, a_Position.y)); + + gl_Position = project_common_position_to_clipspace(vec4(curr.xy + offset, 0, 1.0)); +} diff --git a/packages/layers/src/line/shaders/line_dash_frag.glsl b/packages/layers/src/line/shaders/line_dash_frag.glsl new file mode 100644 index 0000000000..698c72179f --- /dev/null +++ b/packages/layers/src/line/shaders/line_dash_frag.glsl @@ -0,0 +1,22 @@ +uniform float u_blur : 0.9; +uniform float u_opacity : 1.0; +uniform float u_dash_offset : 0.0; +uniform float u_dash_ratio : 0.1; +varying vec4 v_color; +varying vec2 v_normal; + +uniform float u_time; +uniform vec3 u_aimate: [ 0, 2., 1.0, 0.2 ]; + +varying float v_distance_ratio; +varying vec2 v_dash_array; +void main() { + gl_FragColor = v_color; + // gl_FragColor.a = v_distance_ratio; + // anti-alias + float blur = 1.- smoothstep(u_blur, 1., length(v_normal.xy)) * u_opacity; + // gl_FragColor.a *= blur * ceil(mod(v_distance_ratio, v_dash_array.x) - v_dash_array.y); + gl_FragColor.a *= blur * (1.0- step(v_dash_array.x, mod(v_distance_ratio, v_dash_array.x +v_dash_array.y))); + + +} diff --git a/packages/layers/src/line/shaders/line_dash_vert.glsl b/packages/layers/src/line/shaders/line_dash_vert.glsl new file mode 100644 index 0000000000..43f0332b00 --- /dev/null +++ b/packages/layers/src/line/shaders/line_dash_vert.glsl @@ -0,0 +1,34 @@ + +attribute float a_Miter; +attribute vec4 a_Color; +attribute float a_Size; +attribute vec3 a_Normal; +attribute float a_Total_Distance; +attribute vec3 a_Position; +attribute float a_Distance; +uniform mat4 u_ModelMatrix; +uniform vec2 u_dash_array: [10.0, 5.]; +uniform float u_dash_offset: 0; + +varying vec4 v_color; +varying vec2 v_dash_array; +varying vec2 v_normal; + +varying float v_distance_ratio; + + + +#pragma include "projection" +void main() { + + v_distance_ratio = a_Distance / a_Total_Distance; + + v_dash_array = pow(2.0, 20.0 - u_Zoom) * u_dash_array / a_Total_Distance; + + v_normal = vec2(reverse_offset_normal(a_Normal) * sign(a_Miter)); + v_color = a_Color; + vec3 size = a_Miter * a_Size * reverse_offset_normal(a_Normal); //v_normal * vec3(1., -1., 1.0); + vec2 offset = project_pixel(size.xy); + vec4 project_pos = project_position(vec4(a_Position.xy, 0, 1.0)); + gl_Position = project_common_position_to_clipspace(vec4(project_pos.xy + offset, 0, 1.0)); +} diff --git a/packages/layers/src/line/shaders/line_frag.glsl b/packages/layers/src/line/shaders/line_frag.glsl new file mode 100644 index 0000000000..817c97e4cf --- /dev/null +++ b/packages/layers/src/line/shaders/line_frag.glsl @@ -0,0 +1,27 @@ +uniform float u_blur : 0.9; +uniform float u_opacity : 1.0; +uniform float u_dash_offset : 0.0; +uniform float u_dash_ratio : 0.0; +varying vec4 v_color; +varying vec2 v_normal; + +uniform float u_time; +uniform vec4 u_aimate: [ 0, 2., 1.0, 0.2 ]; +// [animate, duration, interval, trailLength], +varying float v_distance_ratio; +varying float v_dash_array; +void main() { + gl_FragColor = v_color; + // anti-alias + float blur = 1.- smoothstep(u_blur, 1., length(v_normal.xy)) * u_opacity; + // gl_FragColor.a *= blur; + + #ifdef ANIMATE + + float alpha =1.0 - fract( mod(1.0- v_distance_ratio,u_aimate.z)* (1.0/ u_aimate.z) + u_time / u_aimate.y); + alpha = (alpha + u_aimate.w -1.0) / u_aimate.w; + alpha = smoothstep(0., 1., alpha); + gl_FragColor.a *= alpha * blur; + #endif + +} diff --git a/packages/layers/src/line/shaders/line_vert.glsl b/packages/layers/src/line/shaders/line_vert.glsl new file mode 100644 index 0000000000..7b4c674f4c --- /dev/null +++ b/packages/layers/src/line/shaders/line_vert.glsl @@ -0,0 +1,21 @@ + +attribute float a_Miter; +attribute vec4 a_Color; +attribute vec2 a_Size; +attribute vec3 a_Normal; +attribute vec3 a_Position; +uniform mat4 u_ModelMatrix; + +#pragma include "projection" +varying vec4 v_color; +varying float v_dash_array; +varying vec2 v_normal; + +void main() { + v_normal = vec2(reverse_offset_normal(a_Normal) * sign(a_Miter)); + v_color = a_Color; + vec3 size = a_Miter * a_Size.x * reverse_offset_normal(a_Normal); //v_normal * vec3(1., -1., 1.0); + vec2 offset = project_pixel(size.xy); + vec4 project_pos = project_position(vec4(a_Position.xy, 0, 1.0)); + gl_Position = project_common_position_to_clipspace(vec4(project_pos.xy + offset, a_Size.y, 1.0)); +} diff --git a/packages/layers/src/plugins/ConfigSchemaValidationPlugin.ts b/packages/layers/src/plugins/ConfigSchemaValidationPlugin.ts new file mode 100644 index 0000000000..8674daef49 --- /dev/null +++ b/packages/layers/src/plugins/ConfigSchemaValidationPlugin.ts @@ -0,0 +1,43 @@ +import { + IGlobalConfigService, + ILayer, + ILayerPlugin, + ILogService, + TYPES, +} from '@l7/core'; +import { inject, injectable } from 'inversify'; + +/** + * Layer 初始化阶段以及重绘阶段首先校验传入参数,如果校验失败则中断后续插件处理。 + */ +@injectable() +export default class ConfigSchemaValidationPlugin implements ILayerPlugin { + @inject(TYPES.IGlobalConfigService) + private readonly configService: IGlobalConfigService; + + @inject(TYPES.ILogService) + private readonly logger: ILogService; + + public apply(layer: ILayer) { + layer.hooks.init.tap('ConfigSchemaValidationPlugin', () => { + this.configService.registerLayerConfigSchemaValidator( + layer.name, + layer.getConfigSchemaForValidation(), + ); + + const { valid, errorText } = this.configService.validateLayerConfig( + layer.name, + layer.getStyleOptions(), + ); + + if (!valid) { + this.logger.error(errorText || ''); + // 中断 init 过程 + return false; + } + }); + layer.hooks.beforeRender.tap('ConfigSchemaValidationPlugin', () => { + // TODO: 配置项发生变化,需要重新校验 + }); + } +} diff --git a/packages/layers/src/plugins/DataMappingPlugin.ts b/packages/layers/src/plugins/DataMappingPlugin.ts new file mode 100644 index 0000000000..35370a9ff6 --- /dev/null +++ b/packages/layers/src/plugins/DataMappingPlugin.ts @@ -0,0 +1,101 @@ +import { + IEncodeFeature, + IGlobalConfigService, + ILayer, + ILayerPlugin, + ILogService, + IParseDataItem, + IStyleAttribute, + lazyInject, + TYPES, +} from '@l7/core'; +import { inject, injectable } from 'inversify'; +import { rgb2arr } from '../utils/color'; + +@injectable() +export default class DataMappingPlugin implements ILayerPlugin { + @inject(TYPES.IGlobalConfigService) + private readonly configService: IGlobalConfigService; + + @inject(TYPES.ILogService) + private readonly logger: ILogService; + + public apply(layer: ILayer) { + layer.hooks.init.tap('DataMappingPlugin', () => { + const attributes = + layer.styleAttributeService.getLayerStyleAttributes() || []; + const { dataArray } = layer.getSource().data; + + // TODO: FIXME + if (!dataArray) { + return; + } + + // mapping with source data + layer.setEncodedData(this.mapping(attributes, dataArray)); + }); + + // remapping before render + layer.hooks.beforeRender.tap('DataMappingPlugin', () => { + const attributes = + layer.styleAttributeService.getLayerStyleAttributes() || []; + const { dataArray } = layer.getSource().data; + const attributesToRemapping = attributes.filter( + (attribute) => attribute.needRemapping, + ); + if (attributesToRemapping.length) { + layer.setEncodedData(this.mapping(attributesToRemapping, dataArray)); + this.logger.info('remapping finished'); + } + }); + } + + private mapping( + attributes: IStyleAttribute[], + data: IParseDataItem[], + ): IEncodeFeature[] { + return data.map((record: IParseDataItem) => { + const encodeRecord: IEncodeFeature = { + id: record._id, + coordinates: record.coordinates, + }; + // TODO 数据过滤 + attributes.forEach((attribute: IStyleAttribute) => { + let values = this.applyAttributeMapping(attribute, record); + attribute.needRemapping = false; + + // TODO: 支持每个属性配置 postprocess + if (attribute.name === 'color') { + values = values.map((c: unknown) => { + return rgb2arr(c as string); + }); + } + // @ts-ignore + encodeRecord[attribute.name] = + Array.isArray(values) && values.length === 1 ? values[0] : values; + }); + return encodeRecord; + }) as IEncodeFeature[]; + } + + private applyAttributeMapping( + attribute: IStyleAttribute, + record: { [key: string]: unknown }, + ) { + if (!attribute.scale) { + return []; + } + const scalers = attribute?.scale?.scalers || []; + const params: unknown[] = []; + + scalers.forEach(({ field }) => { + if ( + record.hasOwnProperty(field) || + attribute.scale?.type === 'variable' + ) { + params.push(record[field]); + } + }); + return attribute.mapping ? attribute.mapping(params) : []; + } +} diff --git a/packages/layers/src/plugins/DataSourcePlugin.ts b/packages/layers/src/plugins/DataSourcePlugin.ts new file mode 100644 index 0000000000..df7cfb0c9a --- /dev/null +++ b/packages/layers/src/plugins/DataSourcePlugin.ts @@ -0,0 +1,13 @@ +import { ILayer, ILayerPlugin } from '@l7/core'; +import Source from '@l7/source'; +import { injectable } from 'inversify'; + +@injectable() +export default class DataSourcePlugin implements ILayerPlugin { + public apply(layer: ILayer) { + layer.hooks.init.tap('DataSourcePlugin', () => { + const { data, options } = layer.sourceOption; + layer.setSource(new Source(data, options)); + }); + } +} diff --git a/packages/layers/src/plugins/FeatureScalePlugin.ts b/packages/layers/src/plugins/FeatureScalePlugin.ts new file mode 100644 index 0000000000..f3acd03b60 --- /dev/null +++ b/packages/layers/src/plugins/FeatureScalePlugin.ts @@ -0,0 +1,249 @@ +import { + IGlobalConfigService, + ILayer, + ILayerPlugin, + ILogService, + IScale, + IScaleOptions, + IStyleAttribute, + IStyleScale, + lazyInject, + ScaleTypes, + StyleScaleType, + TYPES, +} from '@l7/core'; +import { IParseDataItem } from '@l7/source'; +import { extent, ticks } from 'd3-array'; +import * as d3 from 'd3-scale'; +import { inject, injectable } from 'inversify'; +import { isNil, isString, uniq } from 'lodash'; + +const dateRegex = /^(?:(?!0000)[0-9]{4}([-/.]+)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-/.]?)0?2\2(?:29))(\s+([01]|([01][0-9]|2[0-3])):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9]))?$/; + +const scaleMap = { + [ScaleTypes.LINEAR]: d3.scaleLinear, + [ScaleTypes.POWER]: d3.scalePow, + [ScaleTypes.LOG]: d3.scaleLog, + [ScaleTypes.IDENTITY]: d3.scaleIdentity, + [ScaleTypes.TIME]: d3.scaleTime, + [ScaleTypes.QUANTILE]: d3.scaleQuantile, + [ScaleTypes.QUANTIZE]: d3.scaleQuantize, + [ScaleTypes.THRESHOLD]: d3.scaleThreshold, + [ScaleTypes.CAT]: d3.scaleOrdinal, +}; + +/** + * 根据 Source 原始数据为指定字段创建 Scale,保存在 StyleAttribute 上,供下游插件使用 + */ +@injectable() +export default class FeatureScalePlugin implements ILayerPlugin { + @inject(TYPES.IGlobalConfigService) + private readonly configService: IGlobalConfigService; + + @inject(TYPES.ILogService) + private readonly logger: ILogService; + + // key = field_attribute name + private scaleCache: { + [field: string]: IStyleScale; + } = {}; + + private scaleOptions: IScaleOptions = {}; + + public apply(layer: ILayer) { + layer.hooks.init.tap('FeatureScalePlugin', () => { + this.scaleOptions = layer.getScaleOptions(); + const attributes = layer.styleAttributeService.getLayerStyleAttributes(); + const { dataArray } = layer.getSource().data; + this.caculateScalesForAttributes(attributes || [], dataArray); + }); + + layer.hooks.beforeRender.tap('FeatureScalePlugin', () => { + this.scaleOptions = layer.getScaleOptions(); + const attributes = layer.styleAttributeService.getLayerStyleAttributes(); + if (attributes) { + const { dataArray } = layer.getSource().data; + const attributesToRescale = attributes.filter( + (attribute) => attribute.needRescale, + ); + if (attributesToRescale.length) { + this.caculateScalesForAttributes(attributesToRescale, dataArray); + this.logger.info('rescale finished'); + } + } + }); + } + private isNumber(n: any) { + return !isNaN(parseFloat(n)) && isFinite(n); + } + + private caculateScalesForAttributes( + attributes: IStyleAttribute[], + dataArray: IParseDataItem[], + ) { + this.scaleCache = {}; + attributes.forEach((attribute) => { + if (attribute.scale) { + // 创建Scale + const attributeScale = attribute.scale; + const type = attribute.name; + attributeScale.names = this.parseFields(attribute!.scale!.field || []); + const scales: IStyleScale[] = attributeScale.names.map( + (field: string) => { + return this.getOrCreateScale(field, attribute, dataArray); + }, + ); + + // 为scales 设置值区间 + if (scales.some((scale) => scale.type === StyleScaleType.VARIABLE)) { + attributeScale.type = StyleScaleType.VARIABLE; + scales.forEach((scale) => { + // 如果设置了回调, 这不需要设置让range + if (!attributeScale.callback) { + if (attributeScale.values) { + if ( + scale.option?.type === 'linear' && + attributeScale.values.length > 2 + ) { + const tick = scale.scale.ticks(attributeScale.values.length); + if (type === 'color') { + scale.scale.domain(tick); + } + } + scale.scale.range(attributeScale.values); + } else if (scale.option?.type === 'cat') { + // 如果没有设置初值且 类型为cat,range ==domain; + scale.scale.range(scale.option.domain); + } + } + }); + } else { + // 设置attribute 常量值 常量直接在value取值 + attributeScale.type = StyleScaleType.CONSTANT; + attributeScale.values = scales.map((scale, index) => { + return scale.scale(attributeScale.names[index]); + }); + } + attributeScale.scalers = scales.map((scale: IStyleScale) => { + return { + field: scale.field, + func: scale.scale, + }; + }); + + attribute.needRescale = false; + } + }); + } + private getOrCreateScale( + field: string, + attribute: IStyleAttribute, + dataArray: IParseDataItem[], + ) { + const scalekey = [field, attribute.name].join('_'); + if (this.scaleCache[scalekey]) { + return this.scaleCache[scalekey]; + } + const styleScale = this.createScale(field, dataArray); + this.scaleCache[scalekey] = styleScale; + + // if ( + // styleScale.type === StyleScaleType.VARIABLE && + // attribute.scale?.values && + // attribute.scale?.values.length > 0 + // ) { // 只有变量初始化range + // styleScale.scale.range(attribute.scale?.values); + // } + + return this.scaleCache[scalekey]; + } + + /** + * @example + * 'w*h' => ['w', 'h'] + * 'w' => ['w'] + */ + private parseFields(field: string[] | string): string[] { + if (Array.isArray(field)) { + return field; + } + if (isString(field)) { + return field.split('*'); + } + return [field]; + } + + private createScale(field: string, data?: IParseDataItem[]): IStyleScale { + // 首先查找全局默认配置例如 color + const scaleOption: IScale | undefined = this.scaleOptions[field]; + const styleScale: IStyleScale = { + field, + scale: undefined, + type: StyleScaleType.VARIABLE, + option: scaleOption, + }; + if (!data || !data.length) { + if (scaleOption && scaleOption.type) { + styleScale.scale = this.createDefaultScale(scaleOption); + } else { + styleScale.scale = d3.scaleOrdinal([field]); + styleScale.type = StyleScaleType.CONSTANT; + } + return styleScale; + } + const firstValue = data!.find((d) => !isNil(d[field]))?.[field]; + // 常量 Scale + if (this.isNumber(field) || (isNil(firstValue) && !scaleOption)) { + styleScale.scale = d3.scaleOrdinal([field]); + styleScale.type = StyleScaleType.CONSTANT; + } else { + // 根据数据类型判断 默认等分位,时间,和枚举类型 + const type = + (scaleOption && scaleOption.type) || this.getDefaultType(firstValue); + + const cfg = this.createDefaultScaleConfig(type, field, data); + Object.assign(cfg, scaleOption); + styleScale.scale = this.createDefaultScale(cfg); + styleScale.option = cfg; + } + return styleScale; + } + + private getDefaultType(firstValue: unknown) { + let type = ScaleTypes.LINEAR; + if (typeof firstValue === 'string') { + type = dateRegex.test(firstValue) ? ScaleTypes.TIME : ScaleTypes.CAT; + } + return type; + } + + private createDefaultScaleConfig( + type: ScaleTypes, + field: string, + data?: IParseDataItem[], + ) { + const cfg: IScale = { + type, + }; + const values = data?.map((item) => item[field]) || []; + // 默认类型为 Quantile Scales https://github.com/d3/d3-scale#quantile-scales + if (type !== ScaleTypes.CAT && type !== ScaleTypes.QUANTILE) { + cfg.domain = extent(values); + } else if (type === ScaleTypes.CAT) { + cfg.domain = uniq(values); + } else if (type === ScaleTypes.QUANTILE) { + cfg.domain = values; + } + return cfg; + } + + private createDefaultScale({ type, domain }: IScale) { + // @ts-ignore + const scale = scaleMap[type](); + if (domain) { + scale.domain(domain); + } + // TODO 其他属性支持 + return scale; + } +} diff --git a/packages/layers/src/plugins/LightingPlugin.ts b/packages/layers/src/plugins/LightingPlugin.ts new file mode 100644 index 0000000000..3908c45aa2 --- /dev/null +++ b/packages/layers/src/plugins/LightingPlugin.ts @@ -0,0 +1,133 @@ +import { + CameraUniform, + CoordinateUniform, + ICameraService, + ICoordinateSystemService, + ILayer, + ILayerPlugin, + IRendererService, + TYPES, +} from '@l7/core'; +import { inject, injectable } from 'inversify'; + +const lightTypeUniformMap = { + directional: { + lights: 'u_DirectionalLights', + num: 'u_NumOfDirectionalLights', + }, + spot: { + lights: 'u_SpotLights', + num: 'u_NumOfSpotLights', + }, +}; + +interface IDirectionalLight { + type: 'directional'; + direction: [number, number, number]; + ambient: [number, number, number]; + diffuse: [number, number, number]; + specular: [number, number, number]; +} + +interface ISpotLight { + type: 'spot'; + position: [number, number, number]; + direction: [number, number, number]; + ambient: [number, number, number]; + diffuse: [number, number, number]; + specular: [number, number, number]; + constant: number; + linear: number; + quadratic: number; + angle: number; + exponent: number; + blur: number; +} + +const DEFAULT_LIGHT: IDirectionalLight = { + type: 'directional', + direction: [1, 10.5, 12], + ambient: [0.2, 0.2, 0.2], + diffuse: [0.6, 0.6, 0.6], + specular: [0.1, 0.1, 0.1], +}; + +const DEFAULT_DIRECTIONAL_LIGHT = { + direction: [0, 0, 0], + ambient: [0, 0, 0], + diffuse: [0, 0, 0], + specular: [0, 0, 0], +}; + +const DEFAULT_SPOT_LIGHT = { + position: [0, 0, 0], + direction: [0, 0, 0], + ambient: [0, 0, 0], + diffuse: [0, 0, 0], + specular: [0, 0, 0], + constant: 1, + linear: 0, + quadratic: 0, + angle: 14, + exponent: 40, + blur: 5, +}; + +const COLOR_ATTRIBUTES = ['ambient', 'diffuse', 'specular']; + +export function generateLightingUniforms( + lights?: Array>, +) { + const lightsMap: { + u_DirectionalLights: IDirectionalLight[]; + u_NumOfDirectionalLights: number; + u_SpotLights: ISpotLight[]; + u_NumOfSpotLights: number; + } = { + u_DirectionalLights: new Array(3).fill({ ...DEFAULT_DIRECTIONAL_LIGHT }), + u_NumOfDirectionalLights: 0, + u_SpotLights: new Array(3).fill({ ...DEFAULT_SPOT_LIGHT }), + u_NumOfSpotLights: 0, + }; + if (!lights || !lights.length) { + lights = [DEFAULT_LIGHT]; + } + lights.forEach(({ type = 'directional', ...rest }, i) => { + const lightsUniformName = lightTypeUniformMap[type].lights; + const lightsNumUniformName = lightTypeUniformMap[type].num; + + // Object.keys(rest).forEach(key => { + // if (Util.isString(rest[key]) && COLOR_ATTRIBUTES.indexOf(key) > -1) { + // rest[key] = ColorUtil.color2RGBA(rest[key]).slice(0, 3); + // } + // }); + + // @ts-ignore + const num = lightsMap[lightsNumUniformName]; + // @ts-ignore + lightsMap[lightsUniformName][num] = { + // @ts-ignore + ...lightsMap[lightsUniformName][num], + ...rest, + }; + // @ts-ignore + lightsMap[lightsNumUniformName]++; + }); + return lightsMap; +} + +/** + * 光照 & Shadow + */ +@injectable() +export default class LightingPlugin implements ILayerPlugin { + public apply(layer: ILayer) { + layer.hooks.beforeRender.tap('LightingPlugin', () => { + layer.models.forEach((model) => + model.addUniforms({ + // + }), + ); + }); + } +} diff --git a/packages/layers/src/plugins/MultiPassRendererPlugin.ts b/packages/layers/src/plugins/MultiPassRendererPlugin.ts new file mode 100644 index 0000000000..02bff96d62 --- /dev/null +++ b/packages/layers/src/plugins/MultiPassRendererPlugin.ts @@ -0,0 +1,126 @@ +import { + ClearPass, + IGlobalConfigService, + ILayer, + ILayerPlugin, + IPostProcessingPass, + IRendererService, + MultiPassRenderer, + PixelPickingPass, + RenderPass, + TAAPass, + TYPES, +} from '@l7/core'; +import { inject, injectable, interfaces, multiInject } from 'inversify'; + +/** + * 'blurH' -> ['blurH', {}] + */ +export function normalizePasses( + passes: Array, +) { + return passes.map((pass: string | [string, { [key: string]: unknown }]) => { + if (typeof pass === 'string') { + pass = [pass, {}]; + } + return pass; + }); +} + +/** + * 自定义渲染管线: + * ClearPass -> PixelPickingPass(可选) -> RenderPass/TAAPass -> PostProcessing -> CopyPass + * 根据 Layer 配置的 passes 创建 PostProcessing + * @example + * new PolygonLayer({ + * enableMultiPassRenderer: true, + * passes: [ + * 'blurH', + * ['blurV', { radius: 10 }], + * ], + * }) + */ +@injectable() +export default class MultiPassRendererPlugin implements ILayerPlugin { + @inject(TYPES.IGlobalConfigService) + private readonly configService: IGlobalConfigService; + + @inject(TYPES.IRendererService) + private readonly rendererService: IRendererService; + + @inject(TYPES.IFactoryPostProcessingPass) + private readonly postProcessingPassFactory: ( + name: string, + ) => IPostProcessingPass; + + private enabled: boolean; + + public apply(layer: ILayer) { + layer.hooks.init.tap('MultiPassRendererPlugin', () => { + const { enableMultiPassRenderer, passes = [] } = layer.getStyleOptions(); + + // SceneConfig 的 enableMultiPassRenderer 配置项可以统一关闭 + this.enabled = + !!enableMultiPassRenderer && + this.configService.getConfig().enableMultiPassRenderer !== false; + + // 根据 LayerConfig passes 配置项初始化 + if (this.enabled) { + layer.multiPassRenderer = this.createMultiPassRenderer(layer, passes); + layer.multiPassRenderer.setRenderFlag(true); + } + }); + + layer.hooks.beforeRender.tap('MultiPassRendererPlugin', () => { + if (this.enabled) { + // 渲染前根据 viewport 调整 FBO size + const { width, height } = this.rendererService.getViewportSize(); + layer.multiPassRenderer.resize(width, height); + } + }); + } + + /** + * 默认添加 ClearPass、RenderPass + * 以及 PostProcessing 中的最后一个 CopyPass + */ + private createMultiPassRenderer( + layer: ILayer, + passes: Array, + ) { + const multiPassRenderer = new MultiPassRenderer(layer); + const { enablePicking, enableTAA } = layer.getStyleOptions(); + + // clear first + // multiPassRenderer.add(new ClearPass()); + + // picking pass if enabled + if (enablePicking) { + multiPassRenderer.add(new PixelPickingPass()); + } + + // use TAA pass if enabled instead of render pass + if (enableTAA) { + multiPassRenderer.add(new TAAPass()); + } else { + // render all layers in this pass + multiPassRenderer.add(new RenderPass()); + } + + // post processing + normalizePasses(passes).forEach( + (pass: [string, { [key: string]: unknown }]) => { + const [passName, initializationOptions] = pass; + multiPassRenderer.add( + this.postProcessingPassFactory(passName), + initializationOptions, + ); + }, + ); + + // 末尾为固定的 CopyPass + multiPassRenderer.add(this.postProcessingPassFactory('copy')); + + return multiPassRenderer; + } +} diff --git a/packages/layers/src/plugins/PixelPickingPlugin.ts b/packages/layers/src/plugins/PixelPickingPlugin.ts new file mode 100644 index 0000000000..1c3f1b341e --- /dev/null +++ b/packages/layers/src/plugins/PixelPickingPlugin.ts @@ -0,0 +1,99 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerPlugin, + IRendererService, + lazyInject, + TYPES, +} from '@l7/core'; +import { inject, injectable } from 'inversify'; +import { rgb2arr } from '../utils/color'; + +function encodePickingColor(featureIdx: number): [number, number, number] { + return [ + (featureIdx + 1) & 255, + ((featureIdx + 1) >> 8) & 255, + (((featureIdx + 1) >> 8) >> 8) & 255, + ]; +} + +const PickingStage = { + NONE: 0.0, + ENCODE: 1.0, + HIGHLIGHT: 2.0, +}; + +@injectable() +export default class PixelPickingPlugin implements ILayerPlugin { + @inject(TYPES.IRendererService) + private readonly rendererService: IRendererService; + + public apply(layer: ILayer) { + // TODO: 由于 Shader 目前无法根据是否开启拾取进行内容修改,因此即使不开启也需要生成 a_PickingColor + layer.hooks.init.tap('PixelPickingPlugin', () => { + const { enablePicking } = layer.getStyleOptions(); + layer.styleAttributeService.registerStyleAttribute({ + name: 'pickingColor', + type: AttributeType.Attribute, + descriptor: { + name: 'a_PickingColor', + buffer: { + data: [], + type: gl.FLOAT, + }, + size: 3, + // TODO: 固定 feature range 范围内的 pickingColor 都是固定的,可以生成 cache + update: (feature: IEncodeFeature, featureIdx: number) => + // 只有开启拾取才需要 encode + enablePicking ? encodePickingColor(featureIdx) : [0, 0, 0], + }, + }); + }); + // 必须要与 PixelPickingPass 结合使用,因此必须开启 multiPassRenderer + // if (layer.multiPassRenderer) { + layer.hooks.beforePickingEncode.tap('PixelPickingPlugin', () => { + const { enablePicking } = layer.getStyleOptions(); + if (enablePicking) { + layer.models.forEach((model) => + model.addUniforms({ + u_PickingStage: PickingStage.ENCODE, + }), + ); + } + }); + + layer.hooks.afterPickingEncode.tap('PixelPickingPlugin', () => { + const { enablePicking } = layer.getStyleOptions(); + if (enablePicking) { + layer.models.forEach((model) => + model.addUniforms({ + u_PickingStage: PickingStage.NONE, + u_PickingColor: [0, 0, 0], + u_HighlightColor: [0, 0, 0, 0], + }), + ); + } + }); + + layer.hooks.beforeHighlight.tap( + 'PixelPickingPlugin', + (pickedColor: number[]) => { + const { highlightColor } = layer.getStyleOptions(); + const highlightColorInArray = + typeof highlightColor === 'string' + ? rgb2arr(highlightColor) + : highlightColor || [1, 0, 0, 1]; + layer.models.forEach((model) => + model.addUniforms({ + u_PickingStage: PickingStage.HIGHLIGHT, + u_PickingColor: pickedColor, + u_HighlightColor: highlightColorInArray.map((c) => c * 255), + }), + ); + }, + ); + // } + } +} diff --git a/packages/layers/src/plugins/RegisterStyleAttributePlugin.ts b/packages/layers/src/plugins/RegisterStyleAttributePlugin.ts new file mode 100644 index 0000000000..ea709b6952 --- /dev/null +++ b/packages/layers/src/plugins/RegisterStyleAttributePlugin.ts @@ -0,0 +1,69 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerPlugin, + ILogService, + lazyInject, + TYPES, +} from '@l7/core'; +import { inject, injectable } from 'inversify'; + +/** + * 在初始化阶段完成属性的注册,以及首次根据 Layer 指定的三角化方法完成 indices 和 attribute 的创建 + */ +@injectable() +export default class RegisterStyleAttributePlugin implements ILayerPlugin { + @inject(TYPES.ILogService) + private readonly logger: ILogService; + + public apply(layer: ILayer) { + layer.hooks.init.tap('RegisterStyleAttributePlugin', () => { + this.registerBuiltinAttributes(layer); + }); + } + + private registerBuiltinAttributes(layer: ILayer) { + layer.styleAttributeService.registerStyleAttribute({ + name: 'position', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Position', + buffer: { + data: [], + type: gl.FLOAT, + }, + size: 3, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + ) => { + return vertex.length === 2 + ? [vertex[0], vertex[1], 0] + : [vertex[0], vertex[1], vertex[2]]; + }, + }, + }); + + layer.styleAttributeService.registerStyleAttribute({ + name: 'color', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Color', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 4, + update: (feature: IEncodeFeature, featureIdx: number) => { + const { color } = feature; + return !color || !color.length ? [0, 0, 0, 0] : color; + }, + }, + }); + } +} diff --git a/packages/layers/src/plugins/ShaderUniformPlugin.ts b/packages/layers/src/plugins/ShaderUniformPlugin.ts new file mode 100644 index 0000000000..82ffadf0e8 --- /dev/null +++ b/packages/layers/src/plugins/ShaderUniformPlugin.ts @@ -0,0 +1,66 @@ +import { + CameraUniform, + CoordinateUniform, + ICameraService, + ICoordinateSystemService, + ILayer, + ILayerPlugin, + IRendererService, + lazyInject, + TYPES, +} from '@l7/core'; +import { inject, injectable } from 'inversify'; + +/** + * 在渲染之前需要获取当前 Shader 所需 Uniform,例如: + * 1. 从相机服务中获取 View & ProjectionMatrix,当前缩放等级等等 + * 2. 从坐标系服务中获取当前坐标系,例如是否是偏移坐标系 + * @see https://yuque.antfin-inc.com/yuqi.pyq/fgetpa/doml91 + * 3. 当前 Layer 本身的样式属性 + */ +@injectable() +export default class ShaderUniformPlugin implements ILayerPlugin { + @inject(TYPES.ICameraService) + private readonly cameraService: ICameraService; + + @inject(TYPES.ICoordinateSystemService) + private readonly coordinateSystemService: ICoordinateSystemService; + + @inject(TYPES.IRendererService) + private readonly rendererService: IRendererService; + + public apply(layer: ILayer) { + layer.hooks.beforeRender.tap('ShaderUniformPlugin', () => { + // 重新计算坐标系参数 + this.coordinateSystemService.refresh(); + + const { width, height } = this.rendererService.getViewportSize(); + + layer.models.forEach((model) => + model.addUniforms({ + // 相机参数,包含 VP 矩阵、缩放等级 + [CameraUniform.ProjectionMatrix]: this.cameraService.getProjectionMatrix(), + [CameraUniform.ViewMatrix]: this.cameraService.getViewMatrix(), + [CameraUniform.ViewProjectionMatrix]: this.cameraService.getViewProjectionMatrix(), + [CameraUniform.Zoom]: this.cameraService.getZoom(), + [CameraUniform.ZoomScale]: this.cameraService.getZoomScale(), + [CameraUniform.FocalDistance]: this.cameraService.getFocalDistance(), + [CameraUniform.CameraPosition]: this.cameraService.getCameraPosition(), + // 坐标系参数 + [CoordinateUniform.CoordinateSystem]: this.coordinateSystemService.getCoordinateSystem(), + [CoordinateUniform.ViewportCenter]: this.coordinateSystemService.getViewportCenter(), + [CoordinateUniform.ViewportCenterProjection]: this.coordinateSystemService.getViewportCenterProjection(), + [CoordinateUniform.PixelsPerDegree]: this.coordinateSystemService.getPixelsPerDegree(), + [CoordinateUniform.PixelsPerDegree2]: this.coordinateSystemService.getPixelsPerDegree2(), + [CoordinateUniform.PixelsPerMeter]: this.coordinateSystemService.getPixelsPerMeter(), + // 其他参数,例如视口大小、DPR 等 + u_ViewportSize: [width, height], + u_DevicePixelRatio: window.devicePixelRatio, + u_ModelMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], + }), + ); + + // TODO:脏检查,决定是否需要渲染 + }); + } +} diff --git a/packages/layers/src/plugins/UpdateStyleAttributePlugin.ts b/packages/layers/src/plugins/UpdateStyleAttributePlugin.ts new file mode 100644 index 0000000000..36618a1978 --- /dev/null +++ b/packages/layers/src/plugins/UpdateStyleAttributePlugin.ts @@ -0,0 +1,33 @@ +import { ILayer, ILayerPlugin, ILogService, lazyInject, TYPES } from '@l7/core'; +import { inject, injectable } from 'inversify'; + +/** + * 在初始化阶段完成属性的注册,以及首次根据 Layer 指定的三角化方法完成 indices 和 attribute 的创建 + */ +@injectable() +export default class UpdateStyleAttributePlugin implements ILayerPlugin { + @inject(TYPES.ILogService) + private readonly logger: ILogService; + + public apply(layer: ILayer) { + layer.hooks.beforeRender.tap('UpdateStyleAttributePlugin', () => { + const attributes = + layer.styleAttributeService.getLayerStyleAttributes() || []; + attributes + .filter((attribute) => attribute.needRegenerateVertices) + .forEach((attribute) => { + // 精确更新某个/某些 feature(s),需要传入 featureIdx + layer.styleAttributeService.updateAttributeByFeatureRange( + attribute.name, + layer.getEncodedData(), // 获取经过 mapping 最新的数据 + attribute.featureRange.startIndex, + attribute.featureRange.endIndex, + ); + attribute.needRegenerateVertices = false; + this.logger.info( + `regenerate vertex attributes: ${attribute.name} finished`, + ); + }); + }); + } +} diff --git a/packages/layers/src/plugins/__tests__/lighting.spec.ts b/packages/layers/src/plugins/__tests__/lighting.spec.ts new file mode 100644 index 0000000000..31666feea6 --- /dev/null +++ b/packages/layers/src/plugins/__tests__/lighting.spec.ts @@ -0,0 +1,47 @@ +import 'reflect-metadata'; +import { generateLightingUniforms } from '../LightingPlugin'; + +describe('LightingPlugin', () => { + it('should generate proper uniforms for a directional light', () => { + const lightsMap = generateLightingUniforms([ + { + type: 'directional', + }, + ]); + + expect(lightsMap.u_NumOfDirectionalLights).toEqual(1); + expect(lightsMap.u_NumOfSpotLights).toEqual(0); + }); + + it('should generate proper uniforms for directional and spot lights', () => { + const lightsMap = generateLightingUniforms([ + { + type: 'directional', + }, + { + type: 'spot', + }, + ]); + + expect(lightsMap.u_NumOfDirectionalLights).toEqual(1); + expect(lightsMap.u_NumOfSpotLights).toEqual(1); + }); + + it('should generate proper uniforms for directional and spot lights', () => { + const lightsMap = generateLightingUniforms([ + { + type: 'directional', + ambient: [1, 1, 1], + }, + { + type: 'spot', + angle: 10, + }, + ]); + + expect(lightsMap.u_NumOfDirectionalLights).toEqual(1); + expect(lightsMap.u_NumOfSpotLights).toEqual(1); + expect(lightsMap.u_DirectionalLights[0].ambient).toEqual([1, 1, 1]); + expect(lightsMap.u_SpotLights[0].angle).toEqual(10); + }); +}); diff --git a/packages/layers/src/point/index.ts b/packages/layers/src/point/index.ts new file mode 100644 index 0000000000..d2a556c092 --- /dev/null +++ b/packages/layers/src/point/index.ts @@ -0,0 +1,62 @@ +import { IEncodeFeature } from '@l7/core'; +import BaseLayer from '../core/BaseLayer'; +import PointModels, { PointType } from './models/index'; +interface IPointLayerStyleOptions { + opacity: number; + strokeWidth: number; + strokeColor: string; +} +export default class PointLayer extends BaseLayer { + public name: string = 'PointLayer'; + protected getConfigSchema() { + return { + properties: { + opacity: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + }; + } + protected renderModels() { + this.models.forEach((model) => + model.draw({ + uniforms: this.layerModel.getUninforms(), + }), + ); + return this; + } + + protected buildModels() { + const modelType = this.getModelType(); + this.layerModel = new PointModels[modelType](this); + this.models = this.layerModel.buildModels(); + } + + private getModelType(): PointType { + // pointlayer + // 2D、 3d、 shape、image、text、normal、 + const layerData = this.getEncodedData(); + const { shape2d, shape3d } = this.configService.getConfig(); + const iconMap = this.iconService.getIconMap(); + const item = layerData.find((fe: IEncodeFeature) => { + return fe.hasOwnProperty('shape'); + }); + if (!item) { + return 'normal'; + } else { + const shape = item.shape; + if (shape2d?.indexOf(shape as string) !== -1) { + return 'fill'; + } + if (shape3d?.indexOf(shape as string) !== -1) { + return 'extrude'; + } + if (iconMap.hasOwnProperty(shape as string)) { + return 'image'; + } + return 'text'; + } + } +} diff --git a/packages/layers/src/point/models/extrude.ts b/packages/layers/src/point/models/extrude.ts new file mode 100644 index 0000000000..d7a7a8e477 --- /dev/null +++ b/packages/layers/src/point/models/extrude.ts @@ -0,0 +1,124 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + IModel, +} from '@l7/core'; +import BaseModel from '../../core/baseModel'; +import { PointExtrudeTriangulation } from '../../core/triangulation'; +import pointExtrudeVert from '../shaders/extrude3_vert.glsl'; +import pointExtrudeFrag from '../shaders/extrude_frag.glsl'; +interface IPointLayerStyleOptions { + opacity: number; +} +export default class ExtrudeModel extends BaseModel { + public getUninforms() { + const { opacity } = this.layer.getStyleOptions() as IPointLayerStyleOptions; + return { + u_opacity: opacity || 1.0, + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'pointExtrude2', + vertexShader: pointExtrudeVert, + fragmentShader: pointExtrudeFrag, + triangulation: PointExtrudeTriangulation, + blend: { + enable: true, + func: { + srcRGB: gl.SRC_ALPHA, + srcAlpha: 1, + dstRGB: gl.ONE_MINUS_SRC_ALPHA, + dstAlpha: 1, + }, + }, + }), + ]; + } + protected registerBuiltinAttributes() { + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 3, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + if (size) { + let buffersize: number[] = []; + if (Array.isArray(size)) { + buffersize = + size.length === 2 ? [size[0], size[0], size[1]] : size; + } + if (!Array.isArray(size)) { + buffersize = [size]; + } + return buffersize; + } else { + return [2, 2, 2]; + } + }, + }, + }); + + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'normal', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Normal', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.STATIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 3, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + normal: number[], + ) => { + return normal; + }, + }, + }); + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'pos', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Pos', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 3, + update: (feature: IEncodeFeature, featureIdx: number) => { + const coordinates = feature.coordinates as number[]; + return [coordinates[0], coordinates[1], 0]; + }, + }, + }); + } +} diff --git a/packages/layers/src/point/models/fill.ts b/packages/layers/src/point/models/fill.ts new file mode 100644 index 0000000000..560a6dda18 --- /dev/null +++ b/packages/layers/src/point/models/fill.ts @@ -0,0 +1,130 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + ILayerPlugin, + ILogService, + IModel, + IModelUniform, + IStyleAttributeService, + lazyInject, + TYPES, +} from '@l7/core'; +import BaseModel from '../../core/baseModel'; +import { PointFillTriangulation } from '../../core/triangulation'; +import { rgb2arr } from '../../utils/color'; +import pointFillFrag from '../shaders/fill_frag.glsl'; +import pointFillVert from '../shaders/fill_vert.glsl'; +interface IPointLayerStyleOptions { + opacity: number; + strokeWidth: number; + strokeColor: string; +} +export default class FillModel extends BaseModel { + public getUninforms(): IModelUniform { + const { + opacity = 1, + strokeColor = 'rgb(0,0,0,0)', + strokeWidth = 1, + } = this.layer.getStyleOptions() as IPointLayerStyleOptions; + return { + u_opacity: opacity, + u_stroke_width: strokeWidth, + u_stroke_color: rgb2arr(strokeColor), + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'pointfill', + vertexShader: pointFillVert, + fragmentShader: pointFillFrag, + triangulation: PointFillTriangulation, + depth: { enable: false }, + }), + ]; + } + + protected registerBuiltinAttributes() { + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'extrude', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Extrude', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 2, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const extrude = [-1, -1, 1, -1, 1, 1, -1, 1]; + const extrudeIndex = (attributeIdx % 4) * 2; + return [extrude[extrudeIndex], extrude[extrudeIndex + 1]]; + }, + }, + }); + + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'shape', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Shape', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { shape = 2 } = feature; + const shape2d = this.layer.configService.getConfig() + .shape2d as string[]; + const shapeIndex = shape2d.indexOf(shape as string); + return [shapeIndex]; + }, + }, + }); + } +} diff --git a/packages/layers/src/point/models/image.ts b/packages/layers/src/point/models/image.ts new file mode 100644 index 0000000000..0b15517b6d --- /dev/null +++ b/packages/layers/src/point/models/image.ts @@ -0,0 +1,123 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + IModel, + IModelUniform, + ITexture2D, +} from '@l7/core'; + +import BaseModel from '../../core/baseModel'; +import { PointImageTriangulation } from '../../core/triangulation'; +import pointImageFrag from '../shaders/image_frag.glsl'; +import pointImageVert from '../shaders/image_vert.glsl'; +interface IPointLayerStyleOptions { + opacity: number; +} + +export default class ImageModel extends BaseModel { + private texture: ITexture2D; + + public getUninforms(): IModelUniform { + const { opacity } = this.layer.getStyleOptions() as IPointLayerStyleOptions; + return { + u_opacity: opacity || 1.0, + u_texture: this.texture, + u_textSize: [1024, this.iconService.canvasHeight || 128], + }; + } + + public buildModels(): IModel[] { + this.registerBuiltinAttributes(); + this.updateTexture(); + this.iconService.on('imageUpdate', () => { + this.updateTexture(); + this.layer.render(); // TODO 调用全局render + }); + return [ + this.layer.buildLayerModel({ + moduleName: 'pointImage', + vertexShader: pointImageVert, + fragmentShader: pointImageFrag, + triangulation: PointImageTriangulation, + primitive: gl.POINTS, + depth: { enable: false }, + blend: { + enable: true, + func: { + srcRGB: gl.SRC_ALPHA, + srcAlpha: 1, + dstRGB: gl.ONE_MINUS_SRC_ALPHA, + dstAlpha: 1, + }, + }, + }), + ]; + } + + protected registerBuiltinAttributes() { + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'uv', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Uv', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 2, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const iconMap = this.iconService.getIconMap(); + + const { shape } = feature; + const { x, y } = iconMap[shape as string] || { x: 0, y: 0 }; + return [x, y]; + }, + }, + }); + } + + private updateTexture() { + const { createTexture2D } = this.rendererService; + this.texture = createTexture2D({ + data: this.iconService.getCanvas(), + width: 1024, + height: this.iconService.canvasHeight || 128, + }); + } +} diff --git a/packages/layers/src/point/models/index.ts b/packages/layers/src/point/models/index.ts new file mode 100644 index 0000000000..8dd5b347a6 --- /dev/null +++ b/packages/layers/src/point/models/index.ts @@ -0,0 +1,17 @@ +import { ILayerModel } from '@l7/core'; +import ExtrudeModel from './extrude'; +import FillModel from './fill'; +import IMageModel from './image'; +import NormalModel from './normal'; + +export type PointType = 'fill' | 'image' | 'normal' | 'extrude' | 'text'; + +const PointModels: { [key in PointType]: any } = { + fill: FillModel, + image: IMageModel, + normal: NormalModel, + extrude: ExtrudeModel, + text: null, +}; + +export default PointModels; diff --git a/packages/layers/src/point/models/normal.ts b/packages/layers/src/point/models/normal.ts new file mode 100644 index 0000000000..eedabe8b84 --- /dev/null +++ b/packages/layers/src/point/models/normal.ts @@ -0,0 +1,92 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + IModel, + IModelUniform, +} from '@l7/core'; + +import BaseModel from '../../core/baseModel'; +import { rgb2arr } from '../../utils/color'; +import normalFrag from '../shaders/normal_frag.glsl'; +import normalVert from '../shaders/normal_vert.glsl'; + +interface IPointLayerStyleOptions { + opacity: number; + strokeWidth: number; + strokeColor: string; +} +export function PointTriangulation(feature: IEncodeFeature) { + const coordinates = feature.coordinates as number[]; + return { + vertices: [...coordinates], + indices: [0], + size: coordinates.length, + }; +} + +export default class NormalModel extends BaseModel { + public getUninforms(): IModelUniform { + const { + opacity = 1, + strokeColor = 'rgb(0,0,0,0)', + strokeWidth = 1, + } = this.layer.getStyleOptions() as IPointLayerStyleOptions; + return { + u_opacity: opacity, + u_stroke_width: strokeWidth, + u_stroke_color: rgb2arr(strokeColor), + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'normalpoint', + vertexShader: normalVert, + fragmentShader: normalFrag, + triangulation: PointTriangulation, + depth: { enable: false }, + primitive: gl.POINTS, + blend: { + enable: true, + func: { + srcRGB: gl.ONE, + srcAlpha: 1, + dstRGB: gl.ONE, + dstAlpha: 1, + }, + }, + }), + ]; + } + + protected registerBuiltinAttributes() { + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + } +} diff --git a/packages/layers/src/point/models/text.ts b/packages/layers/src/point/models/text.ts new file mode 100644 index 0000000000..e05be1db44 --- /dev/null +++ b/packages/layers/src/point/models/text.ts @@ -0,0 +1,26 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + IModel, + IModelUniform, +} from '@l7/core'; +import BaseModel from '../../core/baseModel'; +import { PointExtrudeTriangulation } from '../core/triangulation'; +import pointExtrudeFrag from '../shaders/extrude_frag.glsl'; +import pointExtrudeVert from '../shaders/extrude_vert.glsl'; + +export default class ExtrudeModel extends BaseModel { + public getUninforms(): IModelUniform { + throw new Error('Method not implemented.'); + } + + public buildModels(): IModel[] { + throw new Error('Method not implemented.'); + } + protected registerBuiltinAttributes() { + throw new Error('Method not implemented.'); + } +} diff --git a/packages/layers/src/point/shaders/extrude3_vert.glsl b/packages/layers/src/point/shaders/extrude3_vert.glsl new file mode 100644 index 0000000000..2c76fdf178 --- /dev/null +++ b/packages/layers/src/point/shaders/extrude3_vert.glsl @@ -0,0 +1,33 @@ +precision highp float; + +#define ambientRatio 0.5 +#define diffuseRatio 0.3 +#define specularRatio 0.2 + +attribute vec3 a_Position; +attribute vec3 a_Pos; +attribute vec4 a_Color; +attribute vec3 a_Size; +attribute vec3 a_Normal; + +uniform mat4 u_ModelMatrix; +varying vec4 v_color; + +#pragma include "projection" + +#pragma include "light" + +void main() { + vec3 size = a_Size * a_Position; + + vec2 offset = project_pixel(size.xy); + + vec4 project_pos = project_position(vec4(a_Pos.xy, 0, 1.0)); + vec4 pos = vec4(project_pos.xy + offset, project_pixel(size.z), 1.0); + + float lightWeight = calc_lighting(pos); + v_color =vec4(a_Color.rgb * lightWeight, a_Color.w); + + gl_Position = project_common_position_to_clipspace(pos); + +} diff --git a/packages/layers/src/point/shaders/extrude_frag.glsl b/packages/layers/src/point/shaders/extrude_frag.glsl new file mode 100644 index 0000000000..3f0cf17883 --- /dev/null +++ b/packages/layers/src/point/shaders/extrude_frag.glsl @@ -0,0 +1,6 @@ +varying vec4 v_color; +uniform float u_opacity: 1.0; +void main() { + gl_FragColor = v_color; + gl_FragColor.a *= u_opacity; +} diff --git a/packages/layers/src/point/shaders/extrude_vert.glsl b/packages/layers/src/point/shaders/extrude_vert.glsl new file mode 100644 index 0000000000..8b5ba21f5c --- /dev/null +++ b/packages/layers/src/point/shaders/extrude_vert.glsl @@ -0,0 +1,33 @@ +precision highp float; + +#define ambientRatio 0.5 +#define diffuseRatio 0.3 +#define specularRatio 0.2 + +attribute vec3 a_Position; +attribute vec3 a_Pos; +attribute vec4 a_Color; +attribute vec3 a_Size; +attribute vec3 a_Normal; + +uniform mat4 u_ModelMatrix; +varying vec4 v_color; + +#pragma include "projection" +#pragma include "light" + +void main() { + vec3 size = a_Size * a_Position; + + vec2 offset = project_pixel(size.xy); + + vec4 project_pos = project_position(vec4(a_Pos.xy, 0, 1.0)); + vec4 pos = vec4(project_pos.xy + offset, project_pixel(size.z), 1.0); + +// float lightWeight = calc_lighting(pos); + + v_color =vec4(a_Color.rgb*lightWeight, a_Color.w); + + gl_Position = project_common_position_to_clipspace(pos); + +} diff --git a/packages/layers/src/point/shaders/fill_frag.glsl b/packages/layers/src/point/shaders/fill_frag.glsl new file mode 100644 index 0000000000..01231d9527 --- /dev/null +++ b/packages/layers/src/point/shaders/fill_frag.glsl @@ -0,0 +1,66 @@ +uniform float u_blur : 0; +uniform float u_opacity : 1; +uniform float u_stroke_width : 1; +uniform vec4 u_stroke_color : [0, 0, 0, 0]; +uniform float u_stroke_opacity : 1; + +varying vec4 v_data; +varying vec4 v_color; +varying float v_radius; + +#pragma include "sdf_2d" +#pragma include "picking" + +void main() { + int shape = int(floor(v_data.w + 0.5)); + + lowp float antialiasblur = v_data.z; + float antialiased_blur = -max(u_blur, antialiasblur); + float r = v_radius / (v_radius + u_stroke_width); + + float outer_df; + float inner_df; + // 'circle', 'triangle', 'square', 'pentagon', 'hexagon', 'octogon', 'hexagram', 'rhombus', 'vesica' + if (shape == 0) { + outer_df = sdCircle(v_data.xy, 1.0); + inner_df = sdCircle(v_data.xy, r); + } else if (shape == 1) { + outer_df = sdEquilateralTriangle(1.1 * v_data.xy); + inner_df = sdEquilateralTriangle(1.1 / r * v_data.xy); + } else if (shape == 2) { + outer_df = sdBox(v_data.xy, vec2(1.)); + inner_df = sdBox(v_data.xy, vec2(r)); + } else if (shape == 3) { + outer_df = sdPentagon(v_data.xy, 0.8); + inner_df = sdPentagon(v_data.xy, r * 0.8); + } else if (shape == 4) { + outer_df = sdHexagon(v_data.xy, 0.8); + inner_df = sdHexagon(v_data.xy, r * 0.8); + } else if (shape == 5) { + outer_df = sdOctogon(v_data.xy, 1.0); + inner_df = sdOctogon(v_data.xy, r); + } else if (shape == 6) { + outer_df = sdHexagram(v_data.xy, 0.52); + inner_df = sdHexagram(v_data.xy, r * 0.52); + } else if (shape == 7) { + outer_df = sdRhombus(v_data.xy, vec2(1.0)); + inner_df = sdRhombus(v_data.xy, vec2(r)); + } else if (shape == 8) { + outer_df = sdVesica(v_data.xy, 1.1, 0.8); + inner_df = sdVesica(v_data.xy, r * 1.1, r * 0.8); + } + + float opacity_t = smoothstep(0.0, antialiased_blur, outer_df); + if(u_stroke_width <0.01 ) { + gl_FragColor = v_color * opacity_t; + return; + } + float color_t = u_stroke_width < 0.01 ? 0.0 : smoothstep( + antialiased_blur, + 0.0, + inner_df + ); + vec4 strokeColor = u_stroke_color == vec4(0) ? v_color : u_stroke_color; + + gl_FragColor = opacity_t * mix(vec4(v_color.rgb, v_color.a * u_opacity), strokeColor * u_stroke_opacity, color_t); +} diff --git a/packages/layers/src/point/shaders/fill_vert.glsl b/packages/layers/src/point/shaders/fill_vert.glsl new file mode 100644 index 0000000000..af5cb17eb2 --- /dev/null +++ b/packages/layers/src/point/shaders/fill_vert.glsl @@ -0,0 +1,40 @@ +attribute vec4 a_Color; +attribute vec3 a_Position; +attribute vec2 a_Extrude; +attribute float a_Size; +attribute float a_Shape; +uniform mat4 u_ModelMatrix; + +uniform float u_stroke_width : 2; + +varying vec4 v_data; +varying vec4 v_color; +varying float v_radius; + +#pragma include "projection" +#pragma include "picking" + +void main() { + // unpack color(vec2) + v_color = a_Color; + vec2 extrude = a_Extrude; + + float shape_type = a_Shape; + + // radius(16-bit) + v_radius = a_Size; + + vec2 offset = project_pixel(extrude * (a_Size + u_stroke_width)); + vec4 project_pos = project_position(vec4(a_Position.xy, 0.0, 1.0)); + + // TODO: billboard + gl_Position = project_common_position_to_clipspace(vec4(project_pos.xy + offset, 0.0, 1.0)); + + // anti-alias + float antialiasblur = 1.0 / (a_Size + u_stroke_width); + + // construct point coords + v_data = vec4(extrude, antialiasblur, shape_type); + + setPickingColor(a_PickingColor); +} diff --git a/packages/layers/src/point/shaders/image_frag.glsl b/packages/layers/src/point/shaders/image_frag.glsl new file mode 100644 index 0000000000..58992a075f --- /dev/null +++ b/packages/layers/src/point/shaders/image_frag.glsl @@ -0,0 +1,28 @@ + +uniform sampler2D u_texture; +varying vec4 v_color; +varying vec2 v_uv; +uniform vec2 u_textSize; +uniform float u_stroke_width : 1; +uniform vec4 u_stroke_color : [1, 1, 1, 1]; +uniform float u_stroke_opacity : 1; +uniform float u_opacity : 1; + +varying float v_size; +void main(){ +vec2 pos= v_uv / u_textSize + gl_PointCoord / u_textSize * 64.; +vec2 fragmentPosition = 2.0*gl_PointCoord - 1.0; +float distance = length(fragmentPosition); +float distanceSqrd = distance * distance; +float radius = 1.; +float r = 1.0 - smoothstep(radius-(radius*0.01), + radius+(radius*0.01), + distanceSqrd); + vec4 textureColor=texture2D(u_texture,pos); + if(v_color == vec4(0.)){ + gl_FragColor= vec4(textureColor.xyz, textureColor.w * r); + }else { + gl_FragColor= step(0.01, textureColor.x) * v_color; + } + return; +} diff --git a/packages/layers/src/point/shaders/image_vert.glsl b/packages/layers/src/point/shaders/image_vert.glsl new file mode 100644 index 0000000000..7aa6a25aa7 --- /dev/null +++ b/packages/layers/src/point/shaders/image_vert.glsl @@ -0,0 +1,24 @@ + +precision highp float; +attribute vec3 a_Position; +attribute vec4 a_Color; +attribute vec2 a_Uv; +attribute float a_Size; +varying vec4 v_color; +varying vec2 v_uv; +uniform mat4 u_ModelMatrix; +uniform float u_stroke_width : 1; +varying float v_size; + +#pragma include "projection" + +void main() { + v_color = a_Color; + v_uv = a_Uv; + vec4 project_pos = project_position(vec4(a_Position, 1.0)); + v_size = a_Size; + + gl_Position = project_common_position_to_clipspace(vec4(project_pos.xyz, 1.0)); + gl_PointSize = a_Size * 2.0 * u_DevicePixelRatio; + +} diff --git a/packages/layers/src/point/shaders/normal_frag.glsl b/packages/layers/src/point/shaders/normal_frag.glsl new file mode 100644 index 0000000000..4481c286f9 --- /dev/null +++ b/packages/layers/src/point/shaders/normal_frag.glsl @@ -0,0 +1,7 @@ + +uniform float u_opacity : 1; +varying vec4 v_color; +void main() { + gl_FragColor = v_color; + gl_FragColor.a = u_opacity; +} diff --git a/packages/layers/src/point/shaders/normal_vert.glsl b/packages/layers/src/point/shaders/normal_vert.glsl new file mode 100644 index 0000000000..819b78c30a --- /dev/null +++ b/packages/layers/src/point/shaders/normal_vert.glsl @@ -0,0 +1,17 @@ + +attribute vec3 a_Position; +uniform mat4 u_ModelMatrix; +attribute float a_Size; +attribute vec4 a_Color; +varying vec4 v_color; + +#pragma include "projection" + +void main() { + + v_color = a_Color; + vec4 project_pos = project_position(vec4(a_Position, 1.0)); + gl_Position = project_common_position_to_clipspace(project_pos); + gl_PointSize = a_Size * 2.0 * u_DevicePixelRatio; + +} diff --git a/packages/layers/src/point/shaders/text_frag.glsl b/packages/layers/src/point/shaders/text_frag.glsl new file mode 100644 index 0000000000..d3dfa93034 --- /dev/null +++ b/packages/layers/src/point/shaders/text_frag.glsl @@ -0,0 +1,27 @@ +uniform sampler2D u_sdf_map; +uniform float u_gamma_scale : 0.5; +uniform float u_font_size : 24; +uniform float u_opacity : 1.0; +uniform vec4 u_stroke : [0, 0, 0, 1]; +uniform float u_strokeWidth : 2.0; +uniform float u_halo_blur : 0.5; + +varying vec4 v_color; +varying vec2 v_uv; +varying float v_gamma_scale; + +void main() { + // get sdf from atlas + float dist = texture2D(u_sdf_map, v_uv).a; + + float fontScale = u_font_size / 24.0; + + lowp float buff = (6.0 - u_strokeWidth / fontScale) / SDF_PX; + highp float gamma = (u_halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale); + + highp float gamma_scaled = gamma * v_gamma_scale; + + highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); + + gl_FragColor = mix(v_color * u_opacity, u_stroke, smoothstep(0., 0.5, 1. - dist)) * alpha; +} diff --git a/packages/layers/src/point/shaders/text_vert.glsl b/packages/layers/src/point/shaders/text_vert.glsl new file mode 100644 index 0000000000..496a5180c2 --- /dev/null +++ b/packages/layers/src/point/shaders/text_vert.glsl @@ -0,0 +1,35 @@ +attribute vec3 a_Position; +attribute vec2 a_tex; +attribute vec2 a_offset; +attribute vec4 a_color; +attribute float a_size; + +uniform vec2 u_sdf_map_size; +uniform vec2 u_viewport_size; + +uniform float u_activeId : 0; +uniform vec4 u_activeColor : [1.0, 0.0, 0.0, 1.0]; + +varying vec2 v_uv; +varying float v_gamma_scale; +varying vec4 v_color; + +#pragma include "projection" + +void main() { + v_color = a_color; + v_uv = a_tex / u_sdf_map_size; + + // 文本缩放比例 + float fontScale = a_size / 24.; + + vec4 project_pos = project_position(vec4(a_Position, 1.0)); + + vec4 projected_position = project_common_position_to_clipspace(vec4(project_pos.xyz, 1.0)); + + gl_Position = vec4(projected_position.xy / projected_position.w + + a_offset * fontScale / u_viewport_size * 2., 0.0, 1.0); + v_gamma_scale = gl_Position.w; + + +} diff --git a/packages/layers/src/point/shape/Path.ts b/packages/layers/src/point/shape/Path.ts new file mode 100644 index 0000000000..1e12eb5709 --- /dev/null +++ b/packages/layers/src/point/shape/Path.ts @@ -0,0 +1,65 @@ +type IPosition = [number, number, number]; +export type IPath = IPosition[]; +export enum ShapeType3D { + CYLINDER = 'cylinder', + SQUARECOLUMN = 'squareColumn', + TRIANGLECOLUMN = 'triangleColumn', + HEXAGONCOLUMN = 'hexagonColumn', + PENTAGONCOLUMN = 'pentagonColumn', +} +export enum ShapeType2D { + CIRCLE = 'circle', + SQUARE = 'square', + TRIANGLE = 'triangle', + HEXAGON = 'hexagon', + PENTAGON = 'pentagon', +} + +/** + * 生成规则多边形顶点个数 + * @param pointCount 顶点个数 3 => 三角形 + * @param start 顶点起始角度 调整图形的方向 + */ +export function polygonPath(pointCount: number, start: number = 0): IPath { + const step = (Math.PI * 2) / pointCount; + const line = []; + for (let i = 0; i < pointCount; i++) { + line.push(step * i + (start * Math.PI) / 12); + } + const path: IPath = line.map((t) => { + const x = Math.sin(t + Math.PI / 4); + const y = Math.cos(t + Math.PI / 4); + return [x, y, 0]; + }); + // path.push(path[0]); + return path; +} + +export function circle(): IPath { + return polygonPath(30); +} +export function square(): IPath { + return polygonPath(4); +} +export function triangle(): IPath { + return polygonPath(3); +} +export function hexagon(): IPath { + return polygonPath(6); +} +export function pentagon(): IPath { + return polygonPath(5); +} + +export const geometryShape = { + [ShapeType2D.CIRCLE]: circle, + [ShapeType2D.HEXAGON]: hexagon, + [ShapeType2D.TRIANGLE]: triangle, + [ShapeType2D.SQUARE]: square, + [ShapeType2D.PENTAGON]: pentagon, + [ShapeType3D.CYLINDER]: circle, + [ShapeType3D.HEXAGONCOLUMN]: hexagon, + [ShapeType3D.TRIANGLECOLUMN]: triangle, + [ShapeType3D.SQUARECOLUMN]: square, + [ShapeType3D.PENTAGONCOLUMN]: pentagon, +}; diff --git a/packages/layers/src/point/shape/extrude.ts b/packages/layers/src/point/shape/extrude.ts new file mode 100644 index 0000000000..717d585609 --- /dev/null +++ b/packages/layers/src/point/shape/extrude.ts @@ -0,0 +1,74 @@ +import earcut from 'earcut'; +import { IPath } from './Path'; +export interface IExtrudeGeomety { + positions: number[]; + index: number[]; +} +/** + * 拉伸多边形顶点,返回拉伸后的顶点信息 + * @param paths 路径数据组 + * @param extrude 是否拉伸 + */ +export default function extrudePolygon(path: IPath[]): IExtrudeGeomety { + const p1 = path[0][0]; + const p2 = path[0][path[0].length - 1]; + if (p1[0] === p2[0] && p1[1] === p2[1]) { + path[0] = path[0].slice(0, path[0].length - 1); + } + const n = path[0].length; + const flattengeo = earcut.flatten(path); + const positions = []; + const indexArray = []; + const normals = []; + // 设置顶部z值 + for (let j = 0; j < flattengeo.vertices.length / 3; j++) { + flattengeo.vertices[j * 3 + 2] = 1; + normals.push(0, 0, 1); + } + positions.push(...flattengeo.vertices); + const triangles = earcut( + flattengeo.vertices, + flattengeo.holes, + flattengeo.dimensions, + ); + indexArray.push(...triangles); + for (let i = 0; i < n; i++) { + const prePoint = flattengeo.vertices.slice(i * 3, i * 3 + 3); + let nextPoint = flattengeo.vertices.slice(i * 3 + 3, i * 3 + 6); + if (nextPoint.length === 0) { + nextPoint = flattengeo.vertices.slice(0, 3); + } + const indexOffset = positions.length / 3; + positions.push( + prePoint[0], + prePoint[1], + 1, + nextPoint[0], + nextPoint[1], + 1, + prePoint[0], + prePoint[1], + 0, + nextPoint[0], + nextPoint[1], + 0, + ); + indexArray.push(...[1, 2, 0, 3, 2, 1].map((v) => v + indexOffset)); + } + return { + positions, + index: indexArray, + }; +} +export function fillPolygon(points: IPath[]) { + const flattengeo = earcut.flatten(points); + const triangles = earcut( + flattengeo.vertices, + flattengeo.holes, + flattengeo.dimensions, + ); + return { + positions: flattengeo.vertices, + index: triangles, + }; +} diff --git a/packages/layers/src/point/text.ts b/packages/layers/src/point/text.ts new file mode 100644 index 0000000000..9ee0a9c28d --- /dev/null +++ b/packages/layers/src/point/text.ts @@ -0,0 +1,188 @@ +import { + AttributeType, + gl, + IEncodeFeature, + IFontOptions, + ILayer, + ILayerPlugin, + ILogService, + IStyleAttributeService, + lazyInject, + TYPES, +} from '@l7/core'; +import BaseLayer from '../core/BaseLayer'; +import { getGlyphQuads, shapeText } from '../utils/symbol-layout'; +import textFrag from './shaders/text_frag.glsl'; +import textVert from './shaders/text_vert.glsl'; +interface IPointTextLayerStyleOptions { + opacity: number; + textAnchor: string; + textOffset: [number, number]; + spacing: number; + padding: [number, number]; + stroke: string; + strokeWidth: number; + strokeOpacity: number; + fontWeight: string; + fontFamily: string; + + textAllowOverlap: boolean; +} +export function PointTriangulation(feature: IEncodeFeature) { + const coordinates = feature.coordinates as number[]; + return { + vertices: [...coordinates, ...coordinates, ...coordinates, ...coordinates], + indices: [0, 1, 2, 2, 3, 0], + size: coordinates.length, + }; +} +export default class TextLayer extends BaseLayer { + public name: string = 'PointLayer'; + + protected getConfigSchema() { + return { + properties: { + opacity: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + }; + } + + protected renderModels() { + const { opacity } = this.getStyleOptions(); + this.models.forEach((model) => + model.draw({ + uniforms: { + u_opacity: opacity || 1.0, + }, + }), + ); + return this; + } + + protected buildModels() { + this.registerBuiltinAttributes(this); + this.models = [ + this.buildLayerModel({ + moduleName: 'pointText', + vertexShader: textVert, + fragmentShader: textFrag, + triangulation: PointTriangulation, + depth: { enable: false }, + blend: { + enable: true, + func: { + srcRGB: gl.SRC_ALPHA, + srcAlpha: 1, + dstRGB: gl.ONE_MINUS_SRC_ALPHA, + dstAlpha: 1, + }, + }, + }), + ]; + } + + private registerBuiltinAttributes(layer: ILayer) { + layer.styleAttributeService.registerStyleAttribute({ + name: 'textOffsets', + type: AttributeType.Attribute, + descriptor: { + name: 'a_textOffsets', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.STATIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 2, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const extrude = [-1, -1, 1, -1, 1, 1, -1, 1]; + const extrudeIndex = (attributeIdx % 4) * 2; + return [extrude[extrudeIndex], extrude[extrudeIndex + 1]]; + }, + }, + }); + + // point layer size; + layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + + // point layer size; + layer.styleAttributeService.registerStyleAttribute({ + name: 'shape', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Shape', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { shape = 2 } = feature; + const shape2d = layer.configService.getConfig().shape2d as string[]; + const shapeIndex = shape2d.indexOf(shape as string); + return [shapeIndex]; + }, + }, + }); + } + + private initTextFont() { + const { fontWeight = 'normal', fontFamily } = this.getStyleOptions(); + const data = this.getEncodedData(); + const characterSet: string[] = []; + data.forEach((item: IEncodeFeature) => { + let { shape = '' } = item; + shape = shape.toString(); + for (const char of shape) { + // 去重 + if (characterSet.indexOf(char) === -1) { + characterSet.push(char); + } + } + }); + + this.fontService.setFontOptions({ + characterSet, + fontWeight, + fontFamily, + }); + } +} diff --git a/packages/layers/src/polygon/__tests__/polygonTriangulation.spec.ts b/packages/layers/src/polygon/__tests__/polygonTriangulation.spec.ts new file mode 100644 index 0000000000..d69c058c28 --- /dev/null +++ b/packages/layers/src/polygon/__tests__/polygonTriangulation.spec.ts @@ -0,0 +1,23 @@ +import { IEncodeFeature } from '@l7/core'; +import { polygonTriangulation } from '../../core/triangulation'; + +describe('PolygonTriangulation', () => { + it('should do triangulation with a polygon correctly', () => { + const mockFeature: IEncodeFeature = { + coordinates: [ + [ + [0, 0], + [1, 0], + [1, 1], + [0, 1], + ], + ], + color: [1, 0, 0, 0], + }; + const { indices, vertices, size } = polygonTriangulation(mockFeature); + + expect(indices).toEqual([2, 3, 0, 0, 1, 2]); + expect(vertices).toEqual([0, 0, 1, 0, 1, 1, 0, 1]); + expect(size).toEqual(2); + }); +}); diff --git a/packages/layers/src/polygon/index.ts b/packages/layers/src/polygon/index.ts new file mode 100644 index 0000000000..52e663069b --- /dev/null +++ b/packages/layers/src/polygon/index.ts @@ -0,0 +1,46 @@ +import { IEncodeFeature } from '@l7/core'; +import BaseLayer from '../core/BaseLayer'; +import PolygonModels, { PolygonModelType } from './models/'; + +interface IPolygonLayerStyleOptions { + opacity: number; +} + +export default class PolygonLayer extends BaseLayer { + public name: string = 'PolygonLayer'; + + protected getConfigSchema() { + return { + properties: { + opacity: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + }; + } + + protected renderModels() { + this.models.forEach((model) => + model.draw({ + uniforms: this.layerModel.getUninforms(), + }), + ); + return this; + } + + protected buildModels() { + const shape = this.getModelType(); + this.layerModel = new PolygonModels[shape](this); + this.models = this.layerModel.buildModels(); + } + + private getModelType(): PolygonModelType { + const shapeAttribute = this.styleAttributeService.getLayerStyleAttribute( + 'shape', + ); + const shape = shapeAttribute?.scale?.field as PolygonModelType; + return shape || 'fill'; + } +} diff --git a/packages/layers/src/polygon/models/extrude.ts b/packages/layers/src/polygon/models/extrude.ts new file mode 100644 index 0000000000..ac4dafc960 --- /dev/null +++ b/packages/layers/src/polygon/models/extrude.ts @@ -0,0 +1,92 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + ILayerPlugin, + ILogService, + IModel, + IStyleAttributeService, + lazyInject, + TYPES, +} from '@l7/core'; +import BaseModel from '../../core/baseModel'; +import { PolygonExtrudeTriangulation } from '../../core/triangulation'; +import polygonExtrudeFrag from '../shaders/polygon_extrude_frag.glsl'; +import polygonExtrudeVert from '../shaders/polygon_extrude_vert.glsl'; +interface IPolygonLayerStyleOptions { + opacity: number; +} +export default class ExtrudeModel extends BaseModel { + public getUninforms() { + const { + opacity = 1, + } = this.layer.getStyleOptions() as IPolygonLayerStyleOptions; + return { + u_opacity: opacity, + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'polygonExtrude', + vertexShader: polygonExtrudeVert, + fragmentShader: polygonExtrudeFrag, + triangulation: PolygonExtrudeTriangulation, + }), + ]; + } + + protected registerBuiltinAttributes() { + // point layer size; + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'normal', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Normal', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.STATIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 3, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + normal: number[], + ) => { + return normal; + }, + }, + }); + + this.layer.styleAttributeService.registerStyleAttribute({ + name: 'size', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Size', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 1, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + const { size } = feature; + return Array.isArray(size) ? [size[0]] : [size as number]; + }, + }, + }); + } +} diff --git a/packages/layers/src/polygon/models/fill.ts b/packages/layers/src/polygon/models/fill.ts new file mode 100644 index 0000000000..26c88f60aa --- /dev/null +++ b/packages/layers/src/polygon/models/fill.ts @@ -0,0 +1,47 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerModel, + ILayerPlugin, + ILogService, + IModel, + IStyleAttributeService, + lazyInject, + TYPES, +} from '@l7/core'; +import BaseModel from '../../core/baseModel'; +import { polygonTriangulation } from '../../core/triangulation'; +import polygon_frag from '../shaders/polygon_frag.glsl'; +import polygon_vert from '../shaders/polygon_vert.glsl'; + +interface IPolygonLayerStyleOptions { + opacity: number; +} +export default class FillModel extends BaseModel { + public getUninforms() { + const { + opacity = 1, + } = this.layer.getStyleOptions() as IPolygonLayerStyleOptions; + return { + u_opacity: opacity, + }; + } + + public buildModels(): IModel[] { + return [ + this.layer.buildLayerModel({ + moduleName: 'polygon', + vertexShader: polygon_vert, + fragmentShader: polygon_frag, + triangulation: polygonTriangulation, + depth: { enable: false }, + }), + ]; + } + + protected registerBuiltinAttributes() { + // point layer size; + } +} diff --git a/packages/layers/src/polygon/models/index.ts b/packages/layers/src/polygon/models/index.ts new file mode 100644 index 0000000000..dd27c23e3c --- /dev/null +++ b/packages/layers/src/polygon/models/index.ts @@ -0,0 +1,13 @@ +import LineModel from '../../line/models/line'; +import ExtrudeModel from './extrude'; +import FillModel from './fill'; + +export type PolygonModelType = 'fill' | 'extrude' | 'line'; + +const PolygonModels: { [key in PolygonModelType]: any } = { + fill: FillModel, + line: LineModel, + extrude: ExtrudeModel, +}; + +export default PolygonModels; diff --git a/packages/layers/src/polygon/shaders/polygon_extrude_frag.glsl b/packages/layers/src/polygon/shaders/polygon_extrude_frag.glsl new file mode 100644 index 0000000000..6a07a19084 --- /dev/null +++ b/packages/layers/src/polygon/shaders/polygon_extrude_frag.glsl @@ -0,0 +1,10 @@ +uniform float u_opacity: 1.0; +varying vec4 v_Color; + +#pragma include "picking" + +void main() { + gl_FragColor = v_Color; + gl_FragColor.a *= u_opacity; + gl_FragColor = filterColor(gl_FragColor); +} diff --git a/packages/layers/src/polygon/shaders/polygon_extrude_vert.glsl b/packages/layers/src/polygon/shaders/polygon_extrude_vert.glsl new file mode 100644 index 0000000000..c06be96eb0 --- /dev/null +++ b/packages/layers/src/polygon/shaders/polygon_extrude_vert.glsl @@ -0,0 +1,46 @@ +precision highp float; + +#define ambientRatio 0.5 +#define diffuseRatio 0.3 +#define specularRatio 0.2 + +attribute vec4 a_Color; +attribute vec3 a_Position; +attribute vec3 a_Normal; +attribute float a_Size; +uniform mat4 u_ModelMatrix; + +varying vec4 v_Color; + +#pragma include "projection" +#pragma include "picking" + +void main() { + vec4 project_pos = project_position(vec4(a_Position.xy, project_pixel(a_Position.z * a_Size), 1.0)); + + gl_Position = project_common_position_to_clipspace(vec4(project_pos.xyz, 1.0)); + + vec3 worldPos = vec3(project_pos * u_ModelMatrix); + + vec3 worldNormal = vec3(vec4(a_Normal,1.0) * u_ModelMatrix); +// vec3 worldNormal = project_normal(a_Normal); + // //cal light weight + vec3 viewDir = normalize(u_CameraPosition - worldPos); + + vec3 lightDir = normalize(vec3(1, -10.5, 12)); + + vec3 halfDir = normalize(viewDir+lightDir); + // //lambert + float lambert = dot(worldNormal, lightDir); + //specular + float specular = pow( max(0.0, dot(worldNormal, halfDir)), 16.0); + //sum to light weight + float lightWeight = ambientRatio + diffuseRatio * lambert + specularRatio * specular; + // v_Color = a_Color; + v_Color =vec4(a_Color.rgb * lightWeight, a_Color.w); + + + + setPickingColor(a_PickingColor); +} + diff --git a/packages/layers/src/polygon/shaders/polygon_frag.glsl b/packages/layers/src/polygon/shaders/polygon_frag.glsl new file mode 100644 index 0000000000..6a07a19084 --- /dev/null +++ b/packages/layers/src/polygon/shaders/polygon_frag.glsl @@ -0,0 +1,10 @@ +uniform float u_opacity: 1.0; +varying vec4 v_Color; + +#pragma include "picking" + +void main() { + gl_FragColor = v_Color; + gl_FragColor.a *= u_opacity; + gl_FragColor = filterColor(gl_FragColor); +} diff --git a/packages/layers/src/polygon/shaders/polygon_vert.glsl b/packages/layers/src/polygon/shaders/polygon_vert.glsl new file mode 100644 index 0000000000..8f83442e9c --- /dev/null +++ b/packages/layers/src/polygon/shaders/polygon_vert.glsl @@ -0,0 +1,19 @@ +attribute vec4 a_Color; +attribute vec3 a_Position; +attribute vec3 a_Normal; +attribute float a_Size; +uniform mat4 u_ModelMatrix; + +varying vec4 v_Color; + +#pragma include "projection" +#pragma include "picking" + +void main() { + v_Color = a_Color; + vec4 project_pos = project_position(vec4(a_Position, 1.0)); + gl_Position = project_common_position_to_clipspace(vec4(project_pos.xyz, 1.0)); + + setPickingColor(a_PickingColor); +} + diff --git a/packages/layers/src/raster/buffers/triangulation.ts b/packages/layers/src/raster/buffers/triangulation.ts new file mode 100644 index 0000000000..be96cf697b --- /dev/null +++ b/packages/layers/src/raster/buffers/triangulation.ts @@ -0,0 +1,22 @@ +import { IEncodeFeature, IParseDataItem } from '@l7/core'; +// @ts-ignore +import Martini from '@mapbox/martini'; +export function RasterTriangulation(parserData: IParseDataItem) { + const { coordinates, data, min, max, width, height } = parserData; + const maxlength = Math.max(width, height); + const gridSize = Math.pow(2, Math.ceil(Math.log2(maxlength))) + 1; + const terrain = new Float32Array(gridSize * gridSize); + for (let i = 0; i < width; i++) { + for (let j = 0; j < height; j++) { + terrain[i * gridSize + j] = data[i * width + j]; + } + } + const martini = new Martini(gridSize); + const tile = martini.createTile(terrain); + const mesh = tile.getMesh(gridSize / 2); + return { + vertices: Array.from(mesh.vertices) as number[], + indices: Array.from(mesh.triangles) as number[], + size: 2, + }; +} diff --git a/packages/layers/src/raster/image.ts b/packages/layers/src/raster/image.ts new file mode 100644 index 0000000000..2c8e24b440 --- /dev/null +++ b/packages/layers/src/raster/image.ts @@ -0,0 +1,111 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerPlugin, + ILogService, + IStyleAttributeService, + ITexture2D, + lazyInject, + TYPES, +} from '@l7/core'; +import BaseLayer from '../core/BaseLayer'; +import { RasterImageTriangulation } from '../core/triangulation'; +import rasterImageFrag from './shaders/image_frag.glsl'; +import rasterImageVert from './shaders/image_vert.glsl'; +interface IPointLayerStyleOptions { + opacity: number; +} + +export default class ImageLayer extends BaseLayer { + public name: string = 'ImageLayer'; + protected texture: ITexture2D; + + protected getConfigSchema() { + return { + properties: { + opacity: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + }; + } + + protected renderModels() { + const { opacity } = this.getStyleOptions(); + if (this.texture) { + this.models.forEach((model) => + model.draw({ + uniforms: { + u_opacity: opacity || 1, + u_texture: this.texture, + }, + }), + ); + } + + return this; + } + + protected buildModels() { + this.registerBuiltinAttributes(this); + const source = this.getSource(); + const { createTexture2D } = this.rendererService; + source.data.images.then((imageData: HTMLImageElement[]) => { + this.texture = createTexture2D({ + data: imageData[0], + width: imageData[0].width, + height: imageData[0].height, + }); + this.renderModels(); + }); + this.models = [ + this.buildLayerModel({ + moduleName: 'RasterImage', + vertexShader: rasterImageVert, + fragmentShader: rasterImageFrag, + triangulation: RasterImageTriangulation, + primitive: gl.TRIANGLES, + depth: { enable: false }, + blend: { + enable: true, + func: { + srcRGB: gl.SRC_ALPHA, + srcAlpha: 1, + dstRGB: gl.ONE_MINUS_SRC_ALPHA, + dstAlpha: 1, + }, + }, + }), + ]; + } + + private registerBuiltinAttributes(layer: ILayer) { + // point layer size; + layer.styleAttributeService.registerStyleAttribute({ + name: 'uv', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Uv', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 2, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + return [vertex[3], vertex[4]]; + }, + }, + }); + } +} diff --git a/packages/layers/src/raster/raster.ts b/packages/layers/src/raster/raster.ts new file mode 100644 index 0000000000..6df660f36c --- /dev/null +++ b/packages/layers/src/raster/raster.ts @@ -0,0 +1,131 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ILayerPlugin, + ILogService, + IRasterParserDataItem, + IStyleAttributeService, + ITexture2D, + lazyInject, + TYPES, +} from '@l7/core'; +import BaseLayer from '../core/BaseLayer'; +import { generateColorRamp, IColorRamp } from '../utils/color'; +import { RasterTriangulation } from './buffers/triangulation'; +import rasterFrag from './shaders/raster_frag.glsl'; +import rasterVert from './shaders/raster_vert.glsl'; +interface IRasterLayerStyleOptions { + opacity: number; + min: number; + max: number; + extent: [number, number, number, number]; + rampColors: IColorRamp; + heightRatio: number; +} + +export default class RasterLayer extends BaseLayer { + public name: string = 'e'; + protected texture: ITexture2D; + protected colorTexture: ITexture2D; + + protected getConfigSchema() { + return { + properties: { + opacity: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + }; + } + + protected renderModels() { + const { opacity, heightRatio = 10 } = this.getStyleOptions(); + const parserDataItem = this.getSource().data.dataArray[0]; + const { coordinates, width, height, min, max } = parserDataItem; + this.models.forEach((model) => + model.draw({ + uniforms: { + u_opacity: opacity || 1, + u_texture: this.texture, + u_min: min, + u_width: width, + u_height: height, + u_max: max, + u_heightRatio: heightRatio, + u_colorTexture: this.colorTexture, + u_extent: [...coordinates[0], ...coordinates[1]], + }, + }), + ); + + return this; + } + + protected buildModels() { + const parserDataItem = this.getSource().data.dataArray[0]; + const { createTexture2D } = this.rendererService; + this.texture = createTexture2D({ + data: parserDataItem.data, + width: parserDataItem.width, + height: parserDataItem.height, + format: gl.LUMINANCE, + type: gl.FLOAT, + aniso: 4, + }); + const { rampColors } = this.getStyleOptions(); + const imageData = generateColorRamp(rampColors as IColorRamp); + this.colorTexture = createTexture2D({ + data: imageData.data, + width: imageData.width, + height: imageData.height, + flipY: true, + }); + this.models = [this.buildRasterModel()]; + } + private buildRasterModel() { + const source = this.getSource(); + const sourceFeature = source.data.dataArray[0]; + const triangulation = RasterTriangulation(sourceFeature); + this.shaderModuleService.registerModule('raster', { + vs: rasterVert, + fs: rasterFrag, + }); + + const { vs, fs, uniforms } = this.shaderModuleService.getModule('raster'); + const { + createAttribute, + createElements, + createBuffer, + createModel, + } = this.rendererService; + return createModel({ + vs, + fs, + attributes: { + a_Position: createAttribute({ + buffer: createBuffer({ + data: triangulation.vertices, + type: gl.FLOAT, + }), + size: 2, + }), + }, + primitive: gl.TRIANGLES, + uniforms: { + ...uniforms, + }, + depth: { + enable: true, + }, + elements: createElements({ + data: triangulation.indices, + type: gl.UNSIGNED_INT, + count: triangulation.indices.length, + }), + }); + } +} diff --git a/packages/layers/src/raster/raster2d.ts b/packages/layers/src/raster/raster2d.ts new file mode 100644 index 0000000000..c805aadbfe --- /dev/null +++ b/packages/layers/src/raster/raster2d.ts @@ -0,0 +1,125 @@ +import { + AttributeType, + gl, + IEncodeFeature, + ILayer, + ITexture2D, +} from '@l7/core'; +import BaseLayer from '../core/BaseLayer'; +import { RasterImageTriangulation } from '../core/triangulation'; +import { generateColorRamp, IColorRamp } from '../utils/color'; +import rasterImageFrag from './shaders/raster_2d_frag.glsl'; +import rasterImageVert from './shaders/raster_2d_vert.glsl'; +interface IRasterLayerStyleOptions { + opacity: number; + min: number; + max: number; + rampColors: IColorRamp; +} + +export default class Raster2dLayer extends BaseLayer { + public name: string = 'RasterLayer'; + protected texture: ITexture2D; + protected colorTexture: ITexture2D; + + protected getConfigSchema() { + return { + properties: { + opacity: { + type: 'number', + minimum: 0, + maximum: 1, + }, + }, + }; + } + + protected renderModels() { + const { opacity } = this.getStyleOptions(); + const parserDataItem = this.getSource().data.dataArray[0]; + const { min, max } = parserDataItem; + if (this.texture) { + this.models.forEach((model) => + model.draw({ + uniforms: { + u_opacity: opacity || 1, + u_texture: this.texture, + u_min: min, + u_max: max, + u_colorTexture: this.colorTexture, + }, + }), + ); + } + + return this; + } + + protected buildModels() { + this.registerBuiltinAttributes(this); + const source = this.getSource(); + const { createTexture2D } = this.rendererService; + const parserDataItem = this.getSource().data.dataArray[0]; + this.texture = createTexture2D({ + data: parserDataItem.data, + width: parserDataItem.width, + height: parserDataItem.height, + format: gl.LUMINANCE, + type: gl.FLOAT, + aniso: 4, + }); + const { rampColors } = this.getStyleOptions(); + const imageData = generateColorRamp(rampColors as IColorRamp); + this.colorTexture = createTexture2D({ + data: imageData.data, + width: imageData.width, + height: imageData.height, + flipY: true, + }); + this.models = [ + this.buildLayerModel({ + moduleName: 'Raster3DImage', + vertexShader: rasterImageVert, + fragmentShader: rasterImageFrag, + triangulation: RasterImageTriangulation, + primitive: gl.TRIANGLES, + depth: { enable: false }, + blend: { + enable: true, + func: { + srcRGB: gl.SRC_ALPHA, + srcAlpha: 1, + dstRGB: gl.ONE_MINUS_SRC_ALPHA, + dstAlpha: 1, + }, + }, + }), + ]; + } + + private registerBuiltinAttributes(layer: ILayer) { + // point layer size; + layer.styleAttributeService.registerStyleAttribute({ + name: 'uv', + type: AttributeType.Attribute, + descriptor: { + name: 'a_Uv', + buffer: { + // give the WebGL driver a hint that this buffer may change + usage: gl.DYNAMIC_DRAW, + data: [], + type: gl.FLOAT, + }, + size: 2, + update: ( + feature: IEncodeFeature, + featureIdx: number, + vertex: number[], + attributeIdx: number, + ) => { + return [vertex[3], vertex[4]]; + }, + }, + }); + } +} diff --git a/packages/layers/src/raster/shaders/image_frag.glsl b/packages/layers/src/raster/shaders/image_frag.glsl new file mode 100644 index 0000000000..91901e16b2 --- /dev/null +++ b/packages/layers/src/raster/shaders/image_frag.glsl @@ -0,0 +1,8 @@ +precision mediump float; +uniform float u_opacity: 1.0; +uniform sampler2D u_texture; +varying vec2 v_texCoord; +void main() { + vec4 color = texture2D(u_texture,vec2(v_texCoord.x,v_texCoord.y)); + gl_FragColor = color; +} diff --git a/packages/layers/src/raster/shaders/image_vert.glsl b/packages/layers/src/raster/shaders/image_vert.glsl new file mode 100644 index 0000000000..0d317c7e3f --- /dev/null +++ b/packages/layers/src/raster/shaders/image_vert.glsl @@ -0,0 +1,11 @@ +precision highp float; +uniform mat4 u_ModelMatrix; +attribute vec3 a_Position; +attribute vec2 a_Uv; +varying vec2 v_texCoord; +#pragma include "projection" +void main() { + v_texCoord = a_Uv; + vec4 project_pos = project_position(vec4(a_Position, 1.0)); + gl_Position = project_common_position_to_clipspace(vec4(project_pos.xy,0., 1.0)); +} diff --git a/packages/layers/src/raster/shaders/raster_2d_frag.glsl b/packages/layers/src/raster/shaders/raster_2d_frag.glsl new file mode 100644 index 0000000000..b2be740612 --- /dev/null +++ b/packages/layers/src/raster/shaders/raster_2d_frag.glsl @@ -0,0 +1,18 @@ +precision mediump float; +uniform float u_opacity: 1.0; +uniform sampler2D u_texture; +uniform sampler2D u_colorTexture; +uniform float u_min; +uniform float u_max; +varying vec2 v_texCoord; + +void main() { + + float value = texture2D(u_texture,vec2(v_texCoord.x,v_texCoord.y)).a; + value = clamp(value,u_min,u_max); + float value1 = (value - u_min) / (u_max -u_min); + vec2 ramp_pos = vec2( + fract(16.0 * (1.0 - value1)), + floor(16.0 * (1.0 - value1)) / 16.0); + gl_FragColor = texture2D(u_colorTexture,ramp_pos);; +} diff --git a/packages/layers/src/raster/shaders/raster_2d_vert.glsl b/packages/layers/src/raster/shaders/raster_2d_vert.glsl new file mode 100644 index 0000000000..0d317c7e3f --- /dev/null +++ b/packages/layers/src/raster/shaders/raster_2d_vert.glsl @@ -0,0 +1,11 @@ +precision highp float; +uniform mat4 u_ModelMatrix; +attribute vec3 a_Position; +attribute vec2 a_Uv; +varying vec2 v_texCoord; +#pragma include "projection" +void main() { + v_texCoord = a_Uv; + vec4 project_pos = project_position(vec4(a_Position, 1.0)); + gl_Position = project_common_position_to_clipspace(vec4(project_pos.xy,0., 1.0)); +} diff --git a/packages/layers/src/raster/shaders/raster_frag.glsl b/packages/layers/src/raster/shaders/raster_frag.glsl new file mode 100644 index 0000000000..8c56cd6d8d --- /dev/null +++ b/packages/layers/src/raster/shaders/raster_frag.glsl @@ -0,0 +1,9 @@ +varying vec4 v_color; +uniform float u_opacity: 1.0; +#define PI 3.141592653589793 + +void main() { + gl_FragColor = v_color; + gl_FragColor.a *= u_opacity; + +} diff --git a/packages/layers/src/raster/shaders/raster_vert.glsl b/packages/layers/src/raster/shaders/raster_vert.glsl new file mode 100644 index 0000000000..7ada3b09ce --- /dev/null +++ b/packages/layers/src/raster/shaders/raster_vert.glsl @@ -0,0 +1,40 @@ +precision highp float; +attribute vec3 a_Position; +uniform mat4 u_ModelMatrix; +uniform vec4 u_extent; +uniform sampler2D u_texture; +uniform sampler2D u_colorTexture; +uniform float u_min; +uniform float u_max; +uniform float u_width; +uniform float u_height; +uniform float u_heightRatio; + +varying vec2 v_texCoord; +varying vec4 v_color; + +#pragma include "projection" +void main() { + vec2 uv = a_Position.xy / vec2(u_width, u_height); + vec2 minxy = project_position(vec4(u_extent.xy, 0, 1.0)).xy; + vec2 maxxy = project_position(vec4(u_extent.zw, 0, 1.0)).xy; + float value = texture2D(u_texture, vec2(uv.x,1.0 - uv.y)).x; + vec2 step = (maxxy - minxy) / vec2(u_width, u_height); + vec2 pos = minxy + vec2(a_Position.x, a_Position.y ) * step; + // v_texCoord = a_Uv; + value = clamp(value,u_min,u_max); + float value1 = (value - u_min) / (u_max -u_min); + vec2 ramp_pos = vec2( + fract(16.0 * (1.0 - value1)), + floor(16.0 * (1.0 - value1)) / 16.0); + v_color = texture2D(u_colorTexture,ramp_pos); + + // if(uv.x > 1.0 || uv.y > 1.0) { + // v_color = vec4(0.); + // } + + // vec2 range = u_extent.zw - u_extent.xy; + // vec4 project_pos = project_position(vec4(pos, 0, 1.0)); + gl_Position = project_common_position_to_clipspace(vec4(pos.xy, project_scale(value) * u_heightRatio, 1.0)); + +} diff --git a/packages/layers/src/utils/color.ts b/packages/layers/src/utils/color.ts new file mode 100644 index 0000000000..20cbcff16e --- /dev/null +++ b/packages/layers/src/utils/color.ts @@ -0,0 +1,36 @@ +import * as d3 from 'd3-color'; +export interface IColorRamp { + positions: number[]; + colors: string[]; +} +export function rgb2arr(str: string) { + const color = d3.color(str) as d3.RGBColor; + const arr = [0, 0, 0, 0]; + if (color != null) { + arr[0] = color.r / 255; + arr[1] = color.g / 255; + arr[2] = color.b / 255; + arr[3] = color.opacity; + } + return arr; +} + +export function generateColorRamp(colorRamp: IColorRamp): ImageData { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d') as CanvasRenderingContext2D; + canvas.width = 256; + canvas.height = 1; + const gradient = ctx.createLinearGradient(0, 0, 256, 0); + let data = null; + const min = colorRamp.positions[0]; + const max = colorRamp.positions[colorRamp.positions.length - 1]; + for (let i = 0; i < colorRamp.colors.length; ++i) { + const value = (colorRamp.positions[i] - min) / (max - min); + gradient.addColorStop(value, colorRamp.colors[i]); + } + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, 256, 1); + data = new Uint8ClampedArray(ctx.getImageData(0, 0, 256, 1).data); + + return new ImageData(data, 16, 16); +} diff --git a/packages/layers/src/utils/polylineNormal.ts b/packages/layers/src/utils/polylineNormal.ts new file mode 100644 index 0000000000..3ac7ee0d54 --- /dev/null +++ b/packages/layers/src/utils/polylineNormal.ts @@ -0,0 +1,232 @@ +import { aProjectFlat, lngLatToMeters, Point } from '@l7/utils'; +import { vec2 } from 'gl-matrix'; +export function computeMiter( + tangent: vec2, + miter: vec2, + lineA: vec2, + lineB: vec2, + halfThick: number, +) { + vec2.add(tangent, lineA, lineB); + vec2.normalize(tangent, tangent); + miter = vec2.fromValues(-tangent[1], tangent[0]); + const tmp = vec2.fromValues(-lineA[1], lineA[0]); + return halfThick / vec2.dot(miter, tmp); +} +export function computeNormal(out: vec2, dir: vec2) { + return vec2.set(out, -dir[1], dir[0]); +} +export function direction(out: vec2, a: vec2, b: vec2) { + const a1 = aProjectFlat([a[0], a[1]]); + const b1 = aProjectFlat([b[0], b[1]]); + vec2.sub(out, a1, b1); + vec2.normalize(out, out); + return out; +} +function extrusions( + positions: number[], + out: number[], + miters: number[], + point: vec2, + normal: vec2, + scale: number, +) { + addNext(out, miters, normal, -scale); + addNext(out, miters, normal, scale); + positions.push(point[0], point[1], 0); + positions.push(point[0], point[1], 0); +} + +function addNext( + out: number[], + miters: number[], + normal: vec2, + length: number, +) { + out.push(normal[0], normal[1], 0); + miters.push(length); +} + +function lineSegmentDistance(end: vec2, start: vec2) { + const a1 = aProjectFlat([start[0], start[1]]); + const b1 = aProjectFlat([end[0], end[1]]); + const dx = a1[0] - b1[0]; + const dy = a1[1] - b1[1]; + return Math.sqrt(dx * dx + dy * dy); +} + +function isPointEqual(a: vec2, b: vec2) { + return a[0] === b[0] && a[1] === b[1]; +} + +export default function( + points: number[][], + closed: boolean, + indexOffset: number, +) { + const lineA = vec2.fromValues(0, 0); + const lineB = vec2.fromValues(0, 0); + const tangent = vec2.fromValues(0, 0); + const miter: vec2 = vec2.create(); + let started = false; + let lineNormal = null; + const tmp = vec2.create(); + let count = indexOffset || 0; + const miterLimit = 3; + + const out: number[] = []; + const attrPos: number[] = []; + const attrIndex: number[] = []; + const miters: number[] = []; + const attrDistance = [0, 0]; + if (closed) { + points = points.slice(); + points.push(points[0]); + } + + const total = points.length; + + for (let i = 1; i < total; i++) { + const index = count; + const last = vec2.fromValues(points[i - 1][0], points[i - 1][1]); + const cur = vec2.fromValues(points[i][0], points[i][1]); + let next = + i < points.length - 1 + ? vec2.fromValues(points[i + 1][0], points[i + 1][1]) + : null; + // 如果当前点和前一点相同,跳过 + if (isPointEqual(last, cur)) { + continue; + } + if (next) { + let nextIndex = i + 1; + // 找到不相同的下一点 + while (next && isPointEqual(cur, next)) { + next = + nextIndex < points.length - 1 + ? vec2.fromValues(points[++nextIndex][0], points[nextIndex][1]) + : null; + } + } + const lineDistance = lineSegmentDistance(cur, last); + const d = lineDistance + attrDistance[attrDistance.length - 1]; + direction(lineA, cur, last); + if (!lineNormal) { + lineNormal = vec2.create(); + computeNormal(lineNormal, lineA); + } + + if (!started) { + started = true; + extrusions(attrPos, out, miters, last, lineNormal, 1); + } + + attrIndex.push(index + 0, index + 2, index + 1); + + // no miter, simple segment + if (!next) { + // reset normal + computeNormal(lineNormal, lineA); + extrusions(attrPos, out, miters, cur, lineNormal, 1); + attrDistance.push(d, d); + attrIndex.push(index + 1, index + 2, index + 3); + count += 2; + } else { + // get unit dir of next line + direction(lineB, next, cur); + + // stores tangent & miter + let miterLen = computeMiter( + tangent, + vec2.fromValues(miter[0], miter[1]), + lineA, + lineB, + 1, + ); + + // get orientation + const flip = vec2.dot(tangent, lineNormal) < 0 ? -1 : 1; + const bevel = Math.abs(miterLen) > miterLimit; + + // 处理前后两条线段重合的情况,这种情况不需要使用任何接头(miter/bevel)。 + // 理论上这种情况下 miterLen = Infinity,本应通过 isFinite(miterLen) 判断, + // 但是 AMap 投影变换后丢失精度,只能通过一个阈值(1000)判断。 + + if (Math.abs(miterLen) > 1000) { + extrusions(attrPos, out, miters, cur, lineNormal, 1); + attrIndex.push(index + 1, index + 2, index + 3); + attrIndex.push(index + 2, index + 4, index + 3); + computeNormal(tmp, lineB); + vec2.copy(lineNormal, tmp); // store normal for next round + + extrusions(attrPos, out, miters, cur, lineNormal, 1); + attrDistance.push(d, d, d, d); + + // the miter is now the normal for our next join + count += 4; + continue; + } + + if (bevel) { + miterLen = miterLimit; + + // next two points in our first segment + extrusions(attrPos, out, miters, cur, lineNormal, 1); + + attrIndex.push(index + 1, index + 2, index + 3); + + // now add the bevel triangle + attrIndex.push( + ...(flip === 1 + ? [index + 2, index + 4, index + 5] + : [index + 4, index + 5, index + 3]), + ); + + computeNormal(tmp, lineB); + vec2.copy(lineNormal, tmp); // store normal for next round + + extrusions(attrPos, out, miters, cur, lineNormal, 1); + attrDistance.push(d, d, d, d); + + // the miter is now the normal for our next join + count += 4; + } else { + // next two points in our first segment + extrusions(attrPos, out, miters, cur, lineNormal, 1); + attrIndex.push(index + 1, index + 2, index + 3); + + // now add the miter triangles + addNext(out, miters, lineNormal, miterLen * -flip); + attrPos.push(cur[0], cur[1], 0); + attrIndex.push(index + 2, index + 4, index + 3); + attrIndex.push(index + 4, index + 5, index + 6); + computeNormal(tmp, lineB); + vec2.copy(lineNormal, tmp); // store normal for next round + + extrusions(attrPos, out, miters, cur, lineNormal, 1); + attrDistance.push(d, d, d, d, d); + + // the miter is now the normal for our next join + count += 5; + } + } + } + const pickData = []; + for (let i = 0; i < miters.length; i++) { + const totalDistance = attrDistance[attrDistance.length - 1]; + pickData.push( + attrPos[i * 3], + attrPos[i * 3 + 1], + attrPos[i * 3 + 1], + attrDistance[i], + miters[i], + totalDistance, + ); + } + return { + normals: out, + attrIndex, + attrPos: pickData, // [x,y,z, distance, miter ] + }; +} +// [x,y,z, distance, miter ] diff --git a/packages/layers/src/utils/symbol-layout.ts b/packages/layers/src/utils/symbol-layout.ts new file mode 100644 index 0000000000..204e192395 --- /dev/null +++ b/packages/layers/src/utils/symbol-layout.ts @@ -0,0 +1,260 @@ +/** + * 返回文本相对锚点位置 + * @param {string} anchor 锚点位置 + * @return {alignment} alignment + */ +function getAnchorAlignment(anchor: string) { + let horizontalAlign = 0.5; + let 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; + default: + horizontalAlign = 0.5; + } + + switch (anchor) { + case 'bottom': + case 'bottom-right': + case 'bottom-left': + verticalAlign = 1; + break; + case 'top': + case 'top-right': + case 'top-left': + verticalAlign = 0; + break; + default: + verticalAlign = 0.5; + } + + return { horizontalAlign, verticalAlign }; +} + +// justify right = 1, left = 0, center = 0.5 +function justifyLine( + positionedGlyphs: any, + glyphMap: any, + start: number, + end: number, + justify: number, +) { + if (!justify) { + return; + } + + const lastPositionedGlyph = positionedGlyphs[end]; + const glyph = lastPositionedGlyph.glyph; + if (glyph) { + const lastAdvance = glyphMap[glyph].advance * lastPositionedGlyph.scale; + const lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify; + + for (let j = start; j <= end; j++) { + positionedGlyphs[j].x -= lineIndent; + } + } +} + +// justify right=1 left=0 center=0.5 +// horizontalAlign right=1 left=0 center=0.5 +// verticalAlign right=1 left=0 center=0.5 +function align( + positionedGlyphs: any[], + justify: number, + horizontalAlign: number, + verticalAlign: number, + maxLineLength: number, + lineHeight: number, + lineCount: number, +) { + const shiftX = (justify - horizontalAlign) * maxLineLength; + const shiftY = (-verticalAlign * lineCount + 0.5) * lineHeight; + + for (const glyphs of positionedGlyphs) { + glyphs.x += shiftX; + glyphs.y += shiftY; + } +} + +function shapeLines( + shaping: any, + glyphMap: any, + lines: any[], + lineHeight: number, + textAnchor: string, + textJustify: string, + spacing: number, +) { + // buffer 为 4 + const yOffset = -8; + + let x = 0; + let y = yOffset; + + let maxLineLength = 0; + const positionedGlyphs = shaping.positionedGlyphs; + + const justify = + textJustify === 'right' ? 1 : textJustify === 'left' ? 0 : 0.5; + + const lineStartIndex = positionedGlyphs.length; + lines.forEach((line) => { + line.split('').forEach((char: string) => { + const glyph = glyphMap[char]; + const baselineOffset = 0; + + if (glyph) { + positionedGlyphs.push({ + glyph: char, + x, + y: y + baselineOffset, + vertical: false, // TODO:目前只支持水平方向 + scale: 1, + metrics: glyph, + }); + x += glyph.advance + spacing; + } + }); + + // 左右对齐 + if (positionedGlyphs.length !== lineStartIndex) { + const lineLength = x - spacing; + maxLineLength = Math.max(lineLength, maxLineLength); + justifyLine( + positionedGlyphs, + glyphMap, + lineStartIndex, + positionedGlyphs.length - 1, + justify, + ); + } + + x = 0; + y += lineHeight; + }); + + const { horizontalAlign, verticalAlign } = getAnchorAlignment(textAnchor); + align( + positionedGlyphs, + justify, + horizontalAlign, + verticalAlign, + maxLineLength, + lineHeight, + lines.length, + ); + + // 计算包围盒 + const height = y - yOffset; + + shaping.top += -verticalAlign * height; + shaping.bottom = shaping.top + height; + shaping.left += -horizontalAlign * maxLineLength; + shaping.right = shaping.left + maxLineLength; +} + +/** + * 计算文本中每个独立字符相对锚点的位置 + * + * @param {string} text 原始文本 + * @param {*} glyphs mapping + * @param {number} lineHeight 行高 + * @param {string} textAnchor 文本相对于锚点的位置 + * @param {string} textJustify 左右对齐 + * @param {number} spacing 字符间距 + * @param {[number, number]} translate 文本水平 & 垂直偏移量 + * @return {boolean|shaping} 每个字符相对于锚点的位置 + */ +export function shapeText( + text: string, + glyphs: any, + lineHeight: number, + textAnchor: string, + textJustify: string, + spacing: number, + translate: [number, number], +) { + // TODO:处理换行 + const lines = text.split('\n'); + + const positionedGlyphs: any[] = []; + const shaping = { + positionedGlyphs, + top: translate[1], + bottom: translate[1], + left: translate[0], + right: translate[0], + lineCount: lines.length, + text, + }; + + shapeLines( + shaping, + glyphs, + lines, + lineHeight, + textAnchor, + textJustify, + spacing, + ); + if (!positionedGlyphs.length) { + return false; + } + + return shaping; +} + +export function getGlyphQuads( + shaping: any, + textOffset: [number, number], + alongLine: boolean, +) { + const { positionedGlyphs } = shaping; + const quads = []; + + for (const positionedGlyph of positionedGlyphs) { + const rect = positionedGlyph.metrics; + + // The rects have an addditional buffer that is not included in their size. + const rectBuffer = 4; + + const halfAdvance = (rect.advance * positionedGlyph.scale) / 2; + + const glyphOffset = alongLine + ? [positionedGlyph.x + halfAdvance, positionedGlyph.y] + : [0, 0]; + + const builtInOffset = alongLine + ? [0, 0] + : [ + positionedGlyph.x + halfAdvance + textOffset[0], + positionedGlyph.y + textOffset[1], + ]; + + const x1 = + (0 - rectBuffer) * positionedGlyph.scale - halfAdvance + builtInOffset[0]; + const y1 = (0 - rectBuffer) * positionedGlyph.scale + builtInOffset[1]; + const x2 = x1 + rect.width * positionedGlyph.scale; + const y2 = y1 + rect.height * positionedGlyph.scale; + + const tl = { x: x1, y: y1 }; + const tr = { x: x2, y: y1 }; + const bl = { x: x1, y: y2 }; + const br = { x: x2, y: y2 }; + + // TODO:处理字符旋转的情况 + + quads.push({ tl, tr, bl, br, tex: rect, glyphOffset }); + } + + return quads; +} diff --git a/packages/layers/tsconfig.build.json b/packages/layers/tsconfig.build.json new file mode 100644 index 0000000000..17f6c4525a --- /dev/null +++ b/packages/layers/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "declarationDir": "./es", + "rootDir": "./src", + "baseUrl": "./" + }, + "include": ["./src"] +} \ No newline at end of file diff --git a/packages/maps/.gitignore b/packages/maps/.gitignore new file mode 100644 index 0000000000..49c199b6ab --- /dev/null +++ b/packages/maps/.gitignore @@ -0,0 +1,3 @@ +lib +es +dist diff --git a/packages/maps/package.json b/packages/maps/package.json new file mode 100644 index 0000000000..bbc9cfa1d2 --- /dev/null +++ b/packages/maps/package.json @@ -0,0 +1,43 @@ +{ + "name": "@l7/maps", + "version": "0.0.1", + "description": "", + "main": "lib/index.js", + "module": "es/index.js", + "types": "es/index.d.ts", + "sideEffects": false, + "files": [ + "lib", + "es", + "typings/index.d.ts", + "README.md" + ], + "scripts": { + "tsc": "tsc --project tsconfig.build.json", + "clean": "rimraf dist; rimraf es; rimraf lib;", + "build": "run-p build:*", + "build:cjs": "BABEL_ENV=cjs babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "build:esm": "BABEL_ENV=esm babel src --root-mode upward --out-dir es --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "watch": "BABEL_ENV=cjs babel src --watch --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments" + }, + "author": "xiaoiver", + "license": "ISC", + "dependencies": { + "@l7/core": "^0.0.1", + "@l7/utils": "0.0.1", + "gl-matrix": "^3.1.0", + "inversify": "^5.0.1", + "mapbox-gl": "^1.2.1", + "viewport-mercator-project": "^6.2.1" + }, + "devDependencies": { + "@types/amap-js-api": "^1.4.6", + "@types/gl-matrix": "^2.4.5", + "@types/mapbox-gl": "^0.54.3", + "@types/viewport-mercator-project": "^6.1.0" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/maps/src/amap/Viewport.ts b/packages/maps/src/amap/Viewport.ts new file mode 100644 index 0000000000..d7b63e5ca5 --- /dev/null +++ b/packages/maps/src/amap/Viewport.ts @@ -0,0 +1,123 @@ +import { IMapCamera, IViewport } from '@l7/core'; +import { mat4, vec3 } from 'gl-matrix'; + +const DEGREES_TO_RADIANS = Math.PI / 180; + +export default class Viewport implements IViewport { + private projectionMatrix: mat4 = mat4.create(); + private viewMatrix: mat4 = mat4.create(); + private viewProjectionMatrix: mat4 = mat4.create(); + private viewUncenteredMatrix: mat4 = mat4.create(); + private zoom: number; + private center: number[]; + + public syncWithMapCamera(mapCamera: Partial) { + const { + zoom = 1, + pitch = 0, + bearing = 0, + center = [0, 0], + offsetOrigin = [0, 0], + cameraHeight = 1, + aspect = 1, + near = 0.1, + far = 1000, + fov = 0, + } = mapCamera; + this.zoom = zoom; + this.center = center; + + const pitchInRadians = pitch * DEGREES_TO_RADIANS; + const rotationInRadians = (360 - bearing) * DEGREES_TO_RADIANS; + + // 计算透视投影矩阵 projectionMatrix + mat4.perspective(this.projectionMatrix, fov, aspect, near, far); + + // 计算相机矩阵 viewMatrix + const eye = vec3.fromValues( + cameraHeight * Math.sin(pitchInRadians) * Math.sin(rotationInRadians), + -cameraHeight * Math.sin(pitchInRadians) * Math.cos(rotationInRadians), + cameraHeight * Math.cos(pitchInRadians), + ); + const up = vec3.fromValues( + -Math.cos(pitchInRadians) * Math.sin(rotationInRadians), + Math.cos(pitchInRadians) * Math.cos(rotationInRadians), + Math.sin(pitchInRadians), + ); + mat4.lookAt(this.viewMatrix, eye, vec3.fromValues(0, 0, 0), up); + + // 移动相机位置 + mat4.translate( + this.viewMatrix, + this.viewMatrix, + vec3.fromValues(-offsetOrigin[0], offsetOrigin[1], 0), + ); + + mat4.multiply( + this.viewProjectionMatrix, + this.projectionMatrix, + this.viewMatrix, + ); + } + + public getZoom(): number { + return this.zoom; + } + + public getZoomScale(): number { + // 512 尺寸下的缩放:2 ^ 19 + return 524288; + } + + public getCenter(): [number, number] { + const [lng, lat] = this.center; + return [lng, lat]; + } + + public getProjectionMatrix(): number[] { + // @ts-ignore + return this.projectionMatrix; + } + + public getViewMatrix(): number[] { + // @ts-ignore + return this.viewMatrix; + } + + public getViewMatrixUncentered(): number[] { + // @ts-ignore + return this.viewUncenteredMatrix; + } + public getViewProjectionMatrix(): number[] { + // @ts-ignore + return this.viewProjectionMatrix; + } + + public getFocalDistance() { + return 1; + } + + /** + * P20 坐标系,固定 scale + */ + public projectFlat( + lngLat: [number, number], + scale?: number | undefined, + ): [number, number] { + const maxs = 85.0511287798; + const lat = Math.max(Math.min(maxs, lngLat[1]), -maxs); + // tslint:disable-next-line:no-bitwise + const zoomScale = 256 << 20; + let d = Math.PI / 180; + let x = lngLat[0] * d; + let y = lat * d; + y = Math.log(Math.tan(Math.PI / 4 + y / 2)); + const a = 0.5 / Math.PI; + const b = 0.5; + const c = -0.5 / Math.PI; + d = 0.5; + x = zoomScale * (a * x + b) - 215440491; + y = -(zoomScale * (c * y + d) - 106744817); + return [x, y]; + } +} diff --git a/packages/maps/src/amap/index.ts b/packages/maps/src/amap/index.ts new file mode 100644 index 0000000000..cc715e0a1a --- /dev/null +++ b/packages/maps/src/amap/index.ts @@ -0,0 +1,296 @@ +/** + * AMapService + */ +import { + Bounds, + CoordinateSystem, + ICoordinateSystemService, + ILngLat, + IMapConfig, + IMapService, + IPoint, + IViewport, + MapServiceEvent, + MapType, + TYPES, +} from '@l7/core'; +import { DOM } from '@l7/utils'; +import { inject, injectable } from 'inversify'; +import { IAMapEvent, IAMapInstance } from '../../typings/index'; +import { MapTheme } from './theme'; +import Viewport from './Viewport'; + +const AMAP_API_KEY: string = '15cd8a57710d40c9b7c0e3cc120f1200'; +const AMAP_VERSION: string = '1.4.15'; +const LNGLAT_OFFSET_ZOOM_THRESHOLD = 12; + +/** + * AMapService + */ +@injectable() +export default class AMapService implements IMapService { + public map: AMap.Map & IAMapInstance; + + @inject(TYPES.ICoordinateSystemService) + private readonly coordinateSystemService: ICoordinateSystemService; + @inject(TYPES.IEventEmitter) + private eventEmitter: any; + private markerContainer: HTMLElement; + private $mapContainer: HTMLElement | null; + private $jsapi: HTMLScriptElement; + + private viewport: Viewport; + + private cameraChangedCallback: (viewport: IViewport) => void; + + // init + public addMarkerContainer(): void { + const mapContainer = this.map.getContainer(); + if (mapContainer !== null) { + const amap = mapContainer.getElementsByClassName( + 'amap-maps', + )[0] as HTMLElement; + this.markerContainer = DOM.create('div', 'l7-marker-container', amap); + } + } + public getMarkerContainer(): HTMLElement { + return this.markerContainer; + } + + // map event + public on(type: string, handler: (...args: any[]) => void): void { + if (MapServiceEvent.indexOf(type) !== -1) { + this.eventEmitter.on(type, handler); + } else { + this.map.on(type, handler); + } + } + public off(type: string, handler: (...args: any[]) => void): void { + if (MapServiceEvent.indexOf(type) !== -1) { + this.eventEmitter.off(type, handler); + } else { + this.map.off(type, handler); + } + } + + public getContainer(): HTMLElement | null { + return this.map.getContainer(); + } + + public getSize(): [number, number] { + const size = this.map.getSize(); + return [size.getWidth(), size.getHeight()]; + } + + public getType() { + return MapType.amap; + } + public getZoom(): number { + return this.map.getZoom(); + } + public getCenter(): ILngLat { + const center = this.map.getCenter(); + return { + lng: center.getLng(), + lat: center.getLat(), + }; + } + + public getPitch(): number { + return this.map.getPitch(); + } + + public getRotation(): number { + return this.map.getRotation(); + } + + public getBounds(): Bounds { + // @ts-ignore + const amapBound = this.map.getBounds().toBounds(); + const NE = amapBound.getNorthEast(); + const SW = amapBound.getSouthWest(); + return [ + [NE.getLng(), NE.getLat()], + [SW.getLng(), SW.getLat()], + ]; + } + + public getMinZoom(): number { + const zooms = this.map.get('zooms') as [number, number]; + return zooms[0]; + } + public getMaxZoom(): number { + const zooms = this.map.get('zooms') as [number, number]; + return zooms[1]; + } + public setRotation(rotation: number): void { + return this.map.setRotation(rotation); + } + + public zoomIn(): void { + this.map.zoomIn(); + } + + public zoomOut(): void { + this.map.zoomOut(); + } + + public panTo(p: [number, number]): void { + this.map.panTo(p); + } + public panBy(pixel: [number, number]): void { + this.map.panTo(pixel); + } + public fitBounds(extent: Bounds): void { + this.map.setBounds( + new AMap.Bounds([extent[0][0], extent[0][1], extent[1][0], extent[1][1]]), + ); + } + public setZoomAndCenter(zoom: number, center: [number, number]): void { + this.map.setZoomAndCenter(zoom, center); + } + public setMapStyle(style: string): void { + this.map.setMapStyle(this.getMapStyle(style)); + } + public pixelToLngLat(pixel: [number, number]): ILngLat { + const lngLat = this.map.pixelToLngLat(new AMap.Pixel(pixel[0], pixel[1])); + return { lng: lngLat.getLng(), lat: lngLat.getLat() }; + } + public lngLatToPixel(lnglat: [number, number]): IPoint { + const p = this.map.lnglatToPixel(new AMap.LngLat(lnglat[0], lnglat[1])); + return { + x: p.getX(), + y: p.getY(), + }; + } + public containerToLngLat(pixel: [number, number]): ILngLat { + const ll = new AMap.Pixel(pixel[0], pixel[1]); + const lngLat = this.map.containerToLngLat(ll); + return { + lng: lngLat.getLng(), + lat: lngLat.getLat(), + }; + } + public lngLatToContainer(lnglat: [number, number]): IPoint { + const ll = new AMap.LngLat(lnglat[0], lnglat[1]); + const pixel = this.map.lngLatToContainer(ll); + return { + x: pixel.getX(), + y: pixel.getY(), + }; + } + + public async init(mapConfig: IMapConfig): Promise { + const { + id, + style = 'light', + minZoom = 0, + maxZoom = 18, + token = AMAP_API_KEY, + ...rest + } = mapConfig; + + this.$mapContainer = document.getElementById(id); + + // this.eventEmitter = container.get(TYPES.IEventEmitter); + + // tslint:disable-next-line:typedef + await new Promise((resolve) => { + // 异步加载高德地图 + // @see https://lbs.amap.com/api/javascript-api/guide/abc/load + window.onload = (): void => { + // @ts-ignore + this.map = new AMap.Map(id, { + mapStyle: this.getMapStyle(style), + zooms: [minZoom, maxZoom], + viewMode: '3D', + ...rest, + }); + + // 监听地图相机时间 + this.map.on('camerachange', this.handlerCameraChanged); + this.emit('mapload'); + resolve(); + }; + + const url: string = `https://webapi.amap.com/maps?v=${AMAP_VERSION}&key=${token}&plugin=Map3D&callback=onload`; + this.$jsapi = document.createElement('script'); + this.$jsapi.charset = 'utf-8'; + this.$jsapi.src = url; + document.head.appendChild(this.$jsapi); + }); + + this.viewport = new Viewport(); + } + public emit(name: string, ...args: any[]) { + this.eventEmitter.emit(name, ...args); + } + + public once(name: string, ...args: any[]) { + this.eventEmitter.once(name, ...args); + } + + public destroy() { + this.eventEmitter.removeAllListeners(); + if (this.map) { + this.map.destroy(); + document.head.removeChild(this.$jsapi); + } + } + + public getMapContainer() { + return this.$mapContainer; + } + + public onCameraChanged(callback: (viewport: IViewport) => void): void { + this.cameraChangedCallback = callback; + } + + private handlerCameraChanged = (e: IAMapEvent): void => { + const { + fov, + near, + far, + height, + pitch, + rotation, + aspect, + position, + } = e.camera; + const { lng, lat } = this.getCenter(); + if (this.cameraChangedCallback) { + // resync viewport + this.viewport.syncWithMapCamera({ + aspect, + // AMap 定义 rotation 为顺时针方向,而 Mapbox 为逆时针 + // @see https://docs.mapbox.com/mapbox-gl-js/api/#map#getbearing + bearing: 360 - rotation, + far, + fov, + cameraHeight: height, + near, + pitch, + // AMap 定义的缩放等级 与 Mapbox 相差 1 + zoom: this.map.getZoom() - 1, + center: [lng, lat], + offsetOrigin: [position.x, position.y], + }); + + // set coordinate system + // if (this.viewport.getZoom() > LNGLAT_OFFSET_ZOOM_THRESHOLD) { + // // TODO:偏移坐标系高德地图不支持 pitch bear 同步 + // this.coordinateSystemService.setCoordinateSystem( + // CoordinateSystem.P20_OFFSET, + // ); + // } else { + // this.coordinateSystemService.setCoordinateSystem(CoordinateSystem.P20); + // } + this.coordinateSystemService.setCoordinateSystem(CoordinateSystem.P20); + this.cameraChangedCallback(this.viewport); + } + }; + + private getMapStyle(name: string) { + return MapTheme[name] ? MapTheme[name] : name; + } +} diff --git a/packages/maps/src/amap/theme.ts b/packages/maps/src/amap/theme.ts new file mode 100644 index 0000000000..ce284d7338 --- /dev/null +++ b/packages/maps/src/amap/theme.ts @@ -0,0 +1,7 @@ +export const MapTheme: { + [key: string]: any; +} = { + dark: 'amap://styles/2a09079c3daac9420ee53b67307a8006?isPublic=true', + light: 'amap://styles/1fd9f8ef9751298f11f5c56968312c70?isPublic=true', + normal: 'amap://styles/12db649ba3493333b098127ed892c0cb?isPublic=true', +}; diff --git a/packages/maps/src/index.ts b/packages/maps/src/index.ts new file mode 100644 index 0000000000..b70638e8a5 --- /dev/null +++ b/packages/maps/src/index.ts @@ -0,0 +1,4 @@ +import AMapService from './amap'; +import MapboxService from './mapbox'; + +export { AMapService, MapboxService }; diff --git a/packages/maps/src/mapbox/Viewport.ts b/packages/maps/src/mapbox/Viewport.ts new file mode 100644 index 0000000000..90fa2a5e3f --- /dev/null +++ b/packages/maps/src/mapbox/Viewport.ts @@ -0,0 +1,71 @@ +import { IMapCamera, IViewport } from '@l7/core'; +import WebMercatorViewport from 'viewport-mercator-project'; + +export default class Viewport implements IViewport { + private viewport: WebMercatorViewport; + + public syncWithMapCamera(mapCamera: Partial) { + const { + center, + zoom, + pitch, + bearing, + viewportHeight, + viewportWidth, + } = mapCamera; + + /** + * Deck.gl 使用的也是 Mapbox 同步相机,相机参数保持一致 + * 例如相机高度固定为 height * 1.5,因此不需要传 + */ + this.viewport = new WebMercatorViewport({ + width: viewportWidth, + height: viewportHeight, + longitude: center && center[0], + latitude: center && center[1], + zoom, + pitch, + bearing, + }); + } + + public getZoom(): number { + return this.viewport.zoom; + } + + public getZoomScale(): number { + return Math.pow(2, this.getZoom()); + } + + public getCenter(): [number, number] { + return [this.viewport.longitude, this.viewport.latitude]; + } + + public getProjectionMatrix(): number[] { + return this.viewport.projectionMatrix; + } + + public getViewMatrix(): number[] { + return this.viewport.viewMatrix; + } + + public getViewMatrixUncentered(): number[] { + // @ts-ignore + return this.viewport.viewMatrixUncentered; + } + public getViewProjectionMatrix(): number[] { + // @ts-ignore + return this.viewport.viewProjectionMatrix; + } + + public getFocalDistance() { + return 1; + } + + public projectFlat( + lngLat: [number, number], + scale?: number | undefined, + ): [number, number] { + return this.viewport.projectFlat(lngLat, scale); + } +} diff --git a/packages/maps/src/mapbox/index.ts b/packages/maps/src/mapbox/index.ts new file mode 100644 index 0000000000..d37be55f6f --- /dev/null +++ b/packages/maps/src/mapbox/index.ts @@ -0,0 +1,274 @@ +/** + * MapboxService + */ +import { + Bounds, + CoordinateSystem, + ICoordinateSystemService, + ILngLat, + IMapConfig, + IMapService, + IPoint, + IViewport, + MapServiceEvent, + MapType, + TYPES, +} from '@l7/core'; +import { DOM } from '@l7/utils'; +import { inject, injectable } from 'inversify'; +import mapboxgl, { IControl, Map } from 'mapbox-gl'; +import { IMapboxInstance } from '../../typings/index'; +import Viewport from './Viewport'; +const EventMap: { + [key: string]: any; +} = { + mapmove: 'move', + camerachange: 'move', +}; +import { MapTheme } from './theme'; + +const LNGLAT_OFFSET_ZOOM_THRESHOLD = 12; + +/** + * AMapService + */ +@injectable() +export default class MapboxService implements IMapService { + public map: Map & IMapboxInstance; + @inject(TYPES.ICoordinateSystemService) + private readonly coordinateSystemService: ICoordinateSystemService; + + @inject(TYPES.IEventEmitter) + private eventEmitter: any; + private viewport: Viewport; + private markerContainer: HTMLElement; + private cameraChangedCallback: (viewport: IViewport) => void; + private $mapContainer: HTMLElement | null; + + // init + public addMarkerContainer(): void { + const container = this.map.getCanvasContainer(); + this.markerContainer = DOM.create('div', 'l7-marker-container', container); + } + + public getMarkerContainer(): HTMLElement { + return this.markerContainer; + } + + // map event + public on(type: string, handle: (...args: any[]) => void): void { + if (MapServiceEvent.indexOf(type) !== -1) { + this.eventEmitter.on(type, handle); + } else { + // 统一事件名称 + this.map.on(EventMap[type] || type, handle); + } + } + public off(type: string, handle: (...args: any[]) => void): void { + this.map.off(EventMap[type] || type, handle); + } + + public getContainer(): HTMLElement | null { + return this.map.getContainer(); + } + + public getSize(): [number, number] { + const size = this.map.transform; + return [size.width, size.height]; + } + // get mapStatus method + + public getType() { + return MapType.mapbox; + } + public getZoom(): number { + return this.map.getZoom(); + } + + public getCenter(): ILngLat { + return this.map.getCenter(); + } + + public getPitch(): number { + return this.map.getPitch(); + } + + public getRotation(): number { + return this.map.getBearing(); + } + + public getBounds(): Bounds { + return this.map.getBounds().toArray() as Bounds; + } + + public getMinZoom(): number { + return this.map.getMinZoom(); + } + + public getMaxZoom(): number { + return this.map.getMaxZoom(); + } + + public setRotation(rotation: number): void { + this.map.setBearing(rotation); + } + + public zoomIn(): void { + this.map.zoomIn(); + } + + public zoomOut(): void { + this.map.zoomOut(); + } + + public panTo(p: [number, number]): void { + this.map.panTo(p); + } + + public panBy(pixel: [number, number]): void { + this.panTo(pixel); + } + + public fitBounds(bound: Bounds): void { + this.map.fitBounds(bound); + } + + public setMaxZoom(max: number): void { + this.map.setMaxZoom(max); + } + + public setMinZoom(min: number): void { + this.map.setMinZoom(min); + } + + public setZoomAndCenter(zoom: number, center: [number, number]): void { + this.map.flyTo({ + zoom, + center, + }); + } + + public setMapStyle(style: string): void { + this.map.setStyle(this.getMapStyle(style)); + } + // TODO: 计算像素坐标 + public pixelToLngLat(pixel: [number, number]): ILngLat { + return this.map.unproject(pixel); + } + + public lngLatToPixel(lnglat: [number, number]): IPoint { + return this.map.project(lnglat); + } + + public containerToLngLat(pixel: [number, number]): ILngLat { + return this.map.unproject(pixel); + } + + public lngLatToContainer(lnglat: [number, number]): IPoint { + return this.map.project(lnglat); + } + + public async init(mapConfig: IMapConfig): Promise { + const { + id, + attributionControl = false, + style = 'light', + token = 'pk.eyJ1IjoieGlhb2l2ZXIiLCJhIjoiY2pxcmc5OGNkMDY3cjQzbG42cXk5NTl3YiJ9.hUC5Chlqzzh0FFd_aEc-uQ', + rotation = 0, + ...rest + } = mapConfig; + this.$mapContainer = document.getElementById(id); + + this.viewport = new Viewport(); + + /** + * TODO: 使用 mapbox v0.53.x 版本 custom layer,需要共享 gl context + * @see https://github.com/mapbox/mapbox-gl-js/blob/master/debug/threejs.html#L61-L64 + */ + mapboxgl.accessToken = token; + // @ts-ignore + this.map = new mapboxgl.Map({ + container: id, + style: this.getMapStyle(style), + attributionControl, + bearing: rotation, + ...rest, + }); + this.map.on('load', this.handleCameraChanged); + this.map.on('move', this.handleCameraChanged); + + // 不同于高德地图,需要手动触发首次渲染 + this.handleCameraChanged(); + this.removeLogoControl(); + } + + public destroy() { + this.eventEmitter.removeAllListeners(); + if (this.map) { + this.map.remove(); + this.$mapContainer = null; + } + } + public emit(name: string, ...args: any[]) { + this.eventEmitter.emit(name, ...args); + } + public once(name: string, ...args: any[]) { + this.eventEmitter.once(name, ...args); + } + + public getMapContainer() { + return this.$mapContainer; + } + + public onCameraChanged(callback: (viewport: IViewport) => void): void { + this.cameraChangedCallback = callback; + } + // 同步不同底图的配置项 + private initMapConig(): void { + throw new Error('Method not implemented.'); + } + private handleCameraChanged = () => { + // @see https://github.com/mapbox/mapbox-gl-js/issues/2572 + const { lat, lng } = this.map.getCenter().wrap(); + + // resync + this.viewport.syncWithMapCamera({ + bearing: this.map.getBearing(), + center: [lng, lat], + viewportHeight: this.map.transform.height, + pitch: this.map.getPitch(), + viewportWidth: this.map.transform.width, + zoom: this.map.getZoom(), + // mapbox 中固定相机高度为 viewport 高度的 1.5 倍 + cameraHeight: 0, + }); + + // set coordinate system + if (this.viewport.getZoom() > LNGLAT_OFFSET_ZOOM_THRESHOLD) { + this.coordinateSystemService.setCoordinateSystem( + CoordinateSystem.LNGLAT_OFFSET, + ); + } else { + this.coordinateSystemService.setCoordinateSystem(CoordinateSystem.LNGLAT); + } + + this.cameraChangedCallback(this.viewport); + }; + + private removeLogoControl(): void { + // @ts-ignore + const controls = this.map._controls as IControl[]; + const logoCtr = controls.find((ctr: IControl) => { + if (ctr.hasOwnProperty('_updateLogo')) { + return true; + } + }); + if (logoCtr) { + this.map.removeControl(logoCtr); + } + } + + private getMapStyle(name: string) { + return MapTheme[name] ? MapTheme[name] : name; + } +} diff --git a/packages/maps/src/mapbox/theme.ts b/packages/maps/src/mapbox/theme.ts new file mode 100644 index 0000000000..b665cb74e7 --- /dev/null +++ b/packages/maps/src/mapbox/theme.ts @@ -0,0 +1,7 @@ +export const MapTheme: { + [key: string]: any; +} = { + light: 'mapbox://styles/zcxduo/ck233y3ru1di71cnulo9jdg2v', + dark: 'mapbox://styles/zcxduo/ck241p6413s0b1cpayzldv7x7', + normal: 'mapbox://styles/mapbox/streets-v11', +}; diff --git a/packages/maps/tsconfig.build.json b/packages/maps/tsconfig.build.json new file mode 100644 index 0000000000..17f6c4525a --- /dev/null +++ b/packages/maps/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "declarationDir": "./es", + "rootDir": "./src", + "baseUrl": "./" + }, + "include": ["./src"] +} \ No newline at end of file diff --git a/packages/maps/typings/index.d.ts b/packages/maps/typings/index.d.ts new file mode 100644 index 0000000000..2cc081b0c5 --- /dev/null +++ b/packages/maps/typings/index.d.ts @@ -0,0 +1,51 @@ +/// +/// + +import { IControl } from 'mapbox-gl'; + +interface Window { + onLoad: () => void; +} +interface IAMapEvent { + camera: { + fov: number; + near: number; + far: number; + height: number; + pitch: number; + rotation: number; + aspect: number; + position: { x: number; y: number }; + }; +} + +interface IAMapInstance { + get(key: string): unknown; +} + +interface IMapboxInstance { + _controls: IControl[]; + transform: { + width: number; + height: number; + }; +} +interface IEventEmitter { + emit(event: EventTypes, ...args: any[]): boolean; + /** + * Add a listener for a given event. + */ + on(event: EventTypes, handle: (...args: any[]) => void, context?: any): this; + + off( + event: EventTypes, + handle: (...args: any[]) => void, + context?: any, + once?: boolean, + ): this; + + /** + * Remove all listeners, or those of the specified event. + */ + removeAllListeners(event?: EventTypes): this; +} diff --git a/packages/renderer/.gitignore b/packages/renderer/.gitignore new file mode 100644 index 0000000000..49c199b6ab --- /dev/null +++ b/packages/renderer/.gitignore @@ -0,0 +1,3 @@ +lib +es +dist diff --git a/packages/renderer/package.json b/packages/renderer/package.json new file mode 100644 index 0000000000..ed16a0dfb5 --- /dev/null +++ b/packages/renderer/package.json @@ -0,0 +1,36 @@ +{ + "name": "@l7/renderer", + "version": "0.0.1", + "description": "", + "main": "lib/index.js", + "module": "es/index.js", + "types": "es/index.d.ts", + "sideEffects": false, + "files": [ + "lib", + "es", + "README.md" + ], + "scripts": { + "tsc": "tsc --project tsconfig.build.json", + "clean": "rimraf dist; rimraf es; rimraf lib;", + "build": "run-p build:*", + "build:cjs": "BABEL_ENV=cjs babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "build:esm": "BABEL_ENV=esm babel src --root-mode upward --out-dir es --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "watch": "BABEL_ENV=cjs babel src --watch --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments" + }, + "author": "xiaoiver", + "license": "ISC", + "dependencies": { + "@l7/core": "^0.0.1", + "gl": "^4.4.0", + "inversify": "^5.0.1", + "inversify-logging": "^0.2.1", + "reflect-metadata": "^0.1.13", + "regl": "^1.3.11" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/renderer/src/index.ts b/packages/renderer/src/index.ts new file mode 100644 index 0000000000..01b1f9ad66 --- /dev/null +++ b/packages/renderer/src/index.ts @@ -0,0 +1,6 @@ +/** + * + */ +import ReglRendererService from './regl'; + +export { ReglRendererService }; diff --git a/packages/renderer/src/regl/ReglAttribute.ts b/packages/renderer/src/regl/ReglAttribute.ts new file mode 100644 index 0000000000..b91f7e8310 --- /dev/null +++ b/packages/renderer/src/regl/ReglAttribute.ts @@ -0,0 +1,44 @@ +import { IAttribute, IAttributeInitializationOptions, IBuffer } from '@l7/core'; +import regl from 'regl'; +import ReglBuffer from './ReglBuffer'; + +/** + * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#attributes + */ +export default class ReglAttribute implements IAttribute { + private attribute: regl.Attribute; + private buffer: IBuffer; + + constructor(gl: regl.Regl, options: IAttributeInitializationOptions) { + const { buffer, offset, stride, normalized, size, divisor } = options; + this.buffer = buffer; + this.attribute = { + buffer: (buffer as ReglBuffer).get(), + offset: offset || 0, + stride: stride || 0, + normalized: normalized || false, + divisor: divisor || 0, + }; + + if (size) { + this.attribute.size = size; + } + } + + public get() { + return this.attribute; + } + + public updateBuffer(options: { + // 用于替换的数据 + data: number[] | number[][] | Uint8Array | Uint16Array | Uint32Array; + // 原 Buffer 替换位置,单位为 byte + offset: number; + }) { + this.buffer.subData(options); + } + + public destroy() { + this.buffer.destroy(); + } +} diff --git a/packages/renderer/src/regl/ReglBuffer.ts b/packages/renderer/src/regl/ReglBuffer.ts new file mode 100644 index 0000000000..f9d165bd69 --- /dev/null +++ b/packages/renderer/src/regl/ReglBuffer.ts @@ -0,0 +1,39 @@ +import { gl, IBuffer, IBufferInitializationOptions } from '@l7/core'; +import regl from 'regl'; +import { dataTypeMap, usageMap } from './constants'; + +/** + * adaptor for regl.Buffer + * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#buffers + */ +export default class ReglBuffer implements IBuffer { + private buffer: regl.Buffer; + + constructor(reGl: regl.Regl, options: IBufferInitializationOptions) { + const { data, usage, type } = options; + this.buffer = reGl.buffer({ + data, + usage: usageMap[usage || gl.STATIC_DRAW], + type: dataTypeMap[type || gl.UNSIGNED_BYTE], + // length: 0, + }); + } + + public get() { + return this.buffer; + } + + public destroy() { + this.buffer.destroy(); + } + + public subData({ + data, + offset, + }: { + data: number[] | number[][] | Uint8Array | Uint16Array | Uint32Array; + offset: number; + }) { + this.buffer.subdata(data, offset); + } +} diff --git a/packages/renderer/src/regl/ReglElements.ts b/packages/renderer/src/regl/ReglElements.ts new file mode 100644 index 0000000000..72e648ab74 --- /dev/null +++ b/packages/renderer/src/regl/ReglElements.ts @@ -0,0 +1,40 @@ +import { gl, IElements, IElementsInitializationOptions } from '@l7/core'; +import regl from 'regl'; +import { dataTypeMap, usageMap } from './constants'; + +/** + * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#elements + */ +export default class ReglElements implements IElements { + private elements: regl.Elements; + + constructor(reGl: regl.Regl, options: IElementsInitializationOptions) { + const { data, usage, type, count } = options; + + this.elements = reGl.elements({ + data, + usage: usageMap[usage || gl.STATIC_DRAW], + type: dataTypeMap[type || gl.UNSIGNED_BYTE] as + | 'uint8' + | 'uint16' + | 'uint32', + count, + }); + } + + public get() { + return this.elements; + } + + public subData({ + data, + }: { + data: number[] | number[][] | Uint8Array | Uint16Array | Uint32Array; + }) { + this.elements.subdata(data); + } + + public destroy() { + this.elements.destroy(); + } +} diff --git a/packages/renderer/src/regl/ReglFramebuffer.ts b/packages/renderer/src/regl/ReglFramebuffer.ts new file mode 100644 index 0000000000..da430a1b39 --- /dev/null +++ b/packages/renderer/src/regl/ReglFramebuffer.ts @@ -0,0 +1,52 @@ +import { + gl, + IFramebuffer, + IFramebufferInitializationOptions, + IRenderbuffer, + ITexture2D, +} from '@l7/core'; +import regl from 'regl'; +import ReglTexture2D from './ReglTexture2D'; + +/** + * adaptor for regl.Framebuffer + * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#framebuffers + */ +export default class ReglFramebuffer implements IFramebuffer { + private framebuffer: regl.Framebuffer; + + constructor(reGl: regl.Regl, options: IFramebufferInitializationOptions) { + const { width, height, color, colors, depth, stencil } = options; + + const framebufferOptions: regl.FramebufferOptions = { + width, + height, + }; + + if (Array.isArray(colors)) { + framebufferOptions.colors = colors.map((c: ITexture2D | IRenderbuffer) => + (c as ReglTexture2D).get(), + ); + } + + if (color && typeof color !== 'boolean') { + framebufferOptions.color = (color as ReglTexture2D).get(); + } + + // TODO: depth & stencil + + this.framebuffer = reGl.framebuffer(framebufferOptions); + } + + public get() { + return this.framebuffer; + } + + public destroy() { + this.framebuffer.destroy(); + } + + public resize({ width, height }: { width: number; height: number }) { + this.framebuffer.resize(width, height); + } +} diff --git a/packages/renderer/src/regl/ReglModel.ts b/packages/renderer/src/regl/ReglModel.ts new file mode 100644 index 0000000000..661d4f4a79 --- /dev/null +++ b/packages/renderer/src/regl/ReglModel.ts @@ -0,0 +1,249 @@ +import { + gl, + IModel, + IModelDrawOptions, + IModelInitializationOptions, + IUniform, +} from '@l7/core'; +import regl from 'regl'; +import { + blendEquationMap, + blendFuncMap, + cullFaceMap, + depthFuncMap, + primitiveMap, + stencilFuncMap, + stencilOpMap, +} from './constants'; +import ReglAttribute from './ReglAttribute'; +import ReglElements from './ReglElements'; +import ReglFramebuffer from './ReglFramebuffer'; +import ReglTexture2D from './ReglTexture2D'; + +/** + * adaptor for regl.DrawCommand + */ +export default class ReglModel implements IModel { + private reGl: regl.Regl; + private drawCommand: regl.DrawCommand; + private uniforms: { + [key: string]: IUniform; + } = {}; + + constructor(reGl: regl.Regl, options: IModelInitializationOptions) { + this.reGl = reGl; + const { + vs, + fs, + attributes, + uniforms, + primitive, + count, + elements, + depth, + blend, + stencil, + cull, + instances, + } = options; + const reglUniforms: { [key: string]: IUniform } = {}; + if (uniforms) { + this.uniforms = uniforms; + Object.keys(uniforms).forEach((uniformName) => { + // use regl prop API + // @ts-ignore + reglUniforms[uniformName] = reGl.prop(uniformName); + }); + } + + const reglAttributes: { [key: string]: regl.Attribute } = {}; + Object.keys(attributes).forEach((name: string) => { + reglAttributes[name] = (attributes[name] as ReglAttribute).get(); + }); + const drawParams: regl.DrawConfig = { + attributes: reglAttributes, + frag: fs, + uniforms: reglUniforms, + vert: vs, + primitive: + primitiveMap[primitive === undefined ? gl.TRIANGLES : primitive], + }; + if (instances) { + drawParams.instances = instances; + } + + // elements 中可能包含 count,此时不应传入 + if (count) { + drawParams.count = count; + } + + if (elements) { + drawParams.elements = (elements as ReglElements).get(); + } + + this.initDepthDrawParams({ depth }, drawParams); + this.initBlendDrawParams({ blend }, drawParams); + this.initStencilDrawParams({ stencil }, drawParams); + this.initCullDrawParams({ cull }, drawParams); + this.drawCommand = reGl(drawParams); + } + + public addUniforms(uniforms: { [key: string]: IUniform }) { + this.uniforms = { + ...this.uniforms, + ...uniforms, + }; + } + + public draw(options: IModelDrawOptions) { + const uniforms: { + [key: string]: IUniform; + } = { + ...this.uniforms, + ...options.uniforms, + }; + + const reglDrawProps: { + [key: string]: + | regl.Framebuffer + | regl.Texture2D + | number + | number[] + | boolean; + } = {}; + + Object.keys(uniforms).forEach((uniformName: string) => { + const type = typeof uniforms[uniformName]; + if ( + type === 'boolean' || + type === 'number' || + Array.isArray(uniforms[uniformName]) || + // @ts-ignore + uniforms[uniformName].BYTES_PER_ELEMENT + ) { + reglDrawProps[uniformName] = uniforms[uniformName] as + | number + | number[] + | boolean; + } else { + reglDrawProps[uniformName] = (uniforms[uniformName] as + | ReglFramebuffer + | ReglTexture2D).get(); + } + }); + this.drawCommand(reglDrawProps); + } + + public destroy() { + // don't need do anything since we will call `rendererService.cleanup()` + } + + /** + * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#depth-buffer + */ + private initDepthDrawParams( + { depth }: Pick, + drawParams: regl.DrawConfig, + ) { + if (depth) { + drawParams.depth = { + enable: depth.enable === undefined ? true : !!depth.enable, + mask: depth.mask === undefined ? true : !!depth.mask, + func: depthFuncMap[depth.func || gl.LESS], + range: depth.range || [0, 1], + }; + } + } + + /** + * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#blending + */ + private initBlendDrawParams( + { blend }: Pick, + drawParams: regl.DrawConfig, + ) { + if (blend) { + const { enable, func, equation, color = [0, 0, 0, 0] } = blend; + // @ts-ignore + drawParams.blend = { + enable: enable === undefined ? false : !!enable, + func: { + srcRGB: blendFuncMap[(func && func.srcRGB) || gl.SRC_ALPHA], + srcAlpha: blendFuncMap[(func && func.srcAlpha) || gl.SRC_ALPHA], + dstRGB: blendFuncMap[(func && func.dstRGB) || gl.ONE_MINUS_SRC_ALPHA], + dstAlpha: + blendFuncMap[(func && func.dstAlpha) || gl.ONE_MINUS_SRC_ALPHA], + }, + equation: { + rgb: blendEquationMap[(equation && equation.rgb) || gl.FUNC_ADD], + alpha: blendEquationMap[(equation && equation.alpha) || gl.FUNC_ADD], + }, + color, + }; + } + } + + /** + * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#stencil + */ + private initStencilDrawParams( + { stencil }: Pick, + drawParams: regl.DrawConfig, + ) { + if (stencil) { + const { + enable, + mask = -1, + func = { + cmp: gl.ALWAYS, + ref: 0, + mask: -1, + }, + opFront = { + fail: gl.KEEP, + zfail: gl.KEEP, + zpass: gl.KEEP, + }, + opBack = { + fail: gl.KEEP, + zfail: gl.KEEP, + zpass: gl.KEEP, + }, + } = stencil; + drawParams.stencil = { + enable: enable === undefined ? false : !!enable, + mask, + func: { + ...func, + cmp: stencilFuncMap[func.cmp], + }, + opFront: { + fail: stencilOpMap[opFront.fail], + zfail: stencilOpMap[opFront.zfail], + zpass: stencilOpMap[opFront.zpass], + }, + opBack: { + fail: stencilOpMap[opBack.fail], + zfail: stencilOpMap[opBack.zfail], + zpass: stencilOpMap[opBack.zpass], + }, + }; + } + } + + /** + * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#culling + */ + private initCullDrawParams( + { cull }: Pick, + drawParams: regl.DrawConfig, + ) { + if (cull) { + const { enable, face = gl.BACK } = cull; + drawParams.cull = { + enable: enable === undefined ? false : !!enable, + face: cullFaceMap[face], + }; + } + } +} diff --git a/packages/renderer/src/regl/ReglRenderbuffer.ts b/packages/renderer/src/regl/ReglRenderbuffer.ts new file mode 100644 index 0000000000..0040cd9bd9 --- /dev/null +++ b/packages/renderer/src/regl/ReglRenderbuffer.ts @@ -0,0 +1,32 @@ +import { IRenderbuffer, IRenderbufferInitializationOptions } from '@l7/core'; +import regl from 'regl'; +import { formatMap } from './constants'; + +/** + * adaptor for regl.Renderbuffer + * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#renderbuffers + */ +export default class ReglRenderbuffer implements IRenderbuffer { + private renderbuffer: regl.Renderbuffer; + + constructor(reGl: regl.Regl, options: IRenderbufferInitializationOptions) { + const { width, height, format } = options; + this.renderbuffer = reGl.renderbuffer({ + width, + height, + format: formatMap[format] as regl.RenderbufferFormat, + }); + } + + public get() { + return this.renderbuffer; + } + + public destroy() { + this.renderbuffer.destroy(); + } + + public resize({ width, height }: { width: number; height: number }) { + this.renderbuffer.resize(width, height); + } +} diff --git a/packages/renderer/src/regl/ReglTexture2D.ts b/packages/renderer/src/regl/ReglTexture2D.ts new file mode 100644 index 0000000000..6bf4a02b1d --- /dev/null +++ b/packages/renderer/src/regl/ReglTexture2D.ts @@ -0,0 +1,80 @@ +import { gl, ITexture2D, ITexture2DInitializationOptions } from '@l7/core'; +import regl from 'regl'; +import { + colorSpaceMap, + dataTypeMap, + filterMap, + formatMap, + mipmapMap, + wrapModeMap, +} from './constants'; + +/** + * adaptor for regl.Buffer + * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#buffers + */ +export default class ReglTexture2D implements ITexture2D { + private texture: regl.Texture2D; + + constructor(reGl: regl.Regl, options: ITexture2DInitializationOptions) { + const { + data, + type = gl.UNSIGNED_BYTE, + width, + height, + flipY = false, + format = gl.RGBA, + mipmap = false, + wrapS = gl.CLAMP_TO_EDGE, + wrapT = gl.CLAMP_TO_EDGE, + aniso = 0, + alignment = 1, + premultiplyAlpha = false, + mag = gl.NEAREST, + min = gl.NEAREST, + colorSpace = gl.NONE, + } = options; + + const textureOptions: regl.Texture2DOptions = { + width, + height, + // @ts-ignore + type: dataTypeMap[type], + format: formatMap[format], + wrapS: wrapModeMap[wrapS], + wrapT: wrapModeMap[wrapT], + // @ts-ignore + mag: filterMap[mag], + min: filterMap[min], + alignment, + flipY, + colorSpace: colorSpaceMap[colorSpace], + premultiplyAlpha, + aniso, + }; + + if (data) { + textureOptions.data = data; + } + + if (typeof mipmap === 'string') { + textureOptions.mipmap = mipmapMap[mipmap]; + } else if (typeof mipmap === 'boolean') { + textureOptions.mipmap = mipmap; + } + + this.texture = reGl.texture(textureOptions); + } + + public get() { + return this.texture; + } + + public resize({ width, height }: { width: number; height: number }): void { + this.texture.resize(width, height); + } + + public destroy() { + this.texture.destroy(); + } +} diff --git a/packages/renderer/src/regl/__tests__/model.spec.ts b/packages/renderer/src/regl/__tests__/model.spec.ts new file mode 100644 index 0000000000..8f81b4b175 --- /dev/null +++ b/packages/renderer/src/regl/__tests__/model.spec.ts @@ -0,0 +1,76 @@ +import 'reflect-metadata'; +import regl from 'regl'; +import ReglModel from '../ReglModel'; +import createContext from './utils/create-context'; + +describe('ReglModel', () => { + let gl; + let reGL: regl.Regl; + + beforeEach(() => { + gl = createContext(1, 1); + reGL = regl(gl); + }); + + it('should generate model with empty uniforms correctly', () => { + const model = new ReglModel(reGL, { + vs: 'void main() {gl_Position = vec4(0.);}', + fs: 'void main() {gl_FragColor = vec4(0.);}', + attributes: {}, + }); + + // @ts-ignore + expect(model.uniforms).toEqual({}); + }); + + it('should generate model with uniforms correctly', () => { + const model = new ReglModel(reGL, { + vs: 'void main() {gl_Position = vec4(0.);}', + fs: 'void main() {gl_FragColor = vec4(0.);}', + attributes: {}, + uniforms: { + u_1: 1, + u_2: [1, 2], + }, + }); + + // @ts-ignore + expect(model.uniforms.u_1).toEqual(1); + // @ts-ignore + expect(model.uniforms.u_2).toEqual([1, 2]); + }); + + it('should generate model with struct uniforms correctly', () => { + // 支持 struct 结构,例如 'colors[0].r' + // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#uniforms + const model = new ReglModel(reGL, { + vs: 'void main() {gl_Position = vec4(0.);}', + fs: 'void main() {gl_FragColor = vec4(0.);}', + attributes: {}, + // @ts-ignore + uniforms: { + u_Struct: [ + { + a: 1, + b: [1, 2], + }, + { + a: 2, + b: [3, 4], + }, + ], + }, + }); + + expect(model.uniforms['u_Struct[0].a']).toEqual(undefined); + + // // @ts-ignore + // expect(model.uniforms['u_Struct[0].a']).toEqual(1); + // // @ts-ignore + // expect(model.uniforms['u_Struct[0].b']).toEqual([1, 2]); + // // @ts-ignore + // expect(model.uniforms['u_Struct[1].a']).toEqual(2); + // // @ts-ignore + // expect(model.uniforms['u_Struct[1].b']).toEqual([3, 4]); + }); +}); diff --git a/packages/renderer/src/regl/__tests__/utils/create-context.ts b/packages/renderer/src/regl/__tests__/utils/create-context.ts new file mode 100644 index 0000000000..39a7e6104c --- /dev/null +++ b/packages/renderer/src/regl/__tests__/utils/create-context.ts @@ -0,0 +1,21 @@ +import gl from 'gl'; + +// borrow from regl +// @see https://github.com/regl-project/regl/blob/gh-pages/test/util/create-context.js#L28 +const CONTEXT = gl(1, 1, { preserveDrawingBuffer: true }); +const RESIZE = CONTEXT.getExtension('STACKGL_resize_drawingbuffer'); + +export default function(width: number, height: number) { + resize(width, height); + return CONTEXT; +} + +export function resize(width: number, height: number) { + if (RESIZE) { + RESIZE.resize(width, height); + } +} + +export function destroy() { + // +} diff --git a/packages/renderer/src/regl/constants.ts b/packages/renderer/src/regl/constants.ts new file mode 100644 index 0000000000..ba5b7e6a2d --- /dev/null +++ b/packages/renderer/src/regl/constants.ts @@ -0,0 +1,199 @@ +/** + * @desc 由于 regl 使用大量字符串而非 WebGL 常量,因此需要映射 + */ +import { gl } from '@l7/core'; +import regl from 'regl'; + +// @see https://github.com/regl-project/regl/blob/gh-pages/lib/constants/primitives.json +export const primitiveMap: { + [key: string]: + | 'points' + | 'lines' + | 'line loop' + | 'line strip' + | 'triangles' + | 'triangle strip' + | 'triangle fan'; +} = { + [gl.POINTS]: 'points', + [gl.LINES]: 'lines', + [gl.LINE_LOOP]: 'line loop', + [gl.LINE_STRIP]: 'line strip', + [gl.TRIANGLES]: 'triangles', + [gl.TRIANGLE_FAN]: 'triangle fan', + [gl.TRIANGLE_STRIP]: 'triangle strip', +}; + +export const usageMap: { + [key: string]: 'static' | 'dynamic' | 'stream'; +} = { + [gl.STATIC_DRAW]: 'static', + [gl.DYNAMIC_DRAW]: 'dynamic', + [gl.STREAM_DRAW]: 'stream', +}; + +export const dataTypeMap: { + [key: string]: + | 'int8' + | 'int16' + | 'int32' + | 'uint8' + | 'uint16' + | 'uint32' + | 'float'; +} = { + [gl.BYTE]: 'int8', + [gl.UNSIGNED_INT]: 'int16', + [gl.INT]: 'int32', + [gl.UNSIGNED_BYTE]: 'uint8', + [gl.UNSIGNED_SHORT]: 'uint16', + [gl.UNSIGNED_INT]: 'uint32', + [gl.FLOAT]: 'float', +}; + +export const formatMap: { + [key: string]: + | 'alpha' + | 'luminance' + | 'luminance alpha' + | 'rgb' + | 'rgba' + | 'rgba4' + | 'rgb5 a1' + | 'rgb565' + | 'depth' + | 'depth stencil'; +} = { + [gl.ALPHA]: 'alpha', + [gl.LUMINANCE]: 'luminance', + [gl.LUMINANCE_ALPHA]: 'luminance alpha', + [gl.RGB]: 'rgb', + [gl.RGBA]: 'rgba', + [gl.RGBA4]: 'rgba4', + [gl.RGB5_A1]: 'rgb5 a1', + [gl.RGB565]: 'rgb565', + [gl.DEPTH_COMPONENT]: 'depth', + [gl.DEPTH_STENCIL]: 'depth stencil', +}; + +export const mipmapMap: { + [key: string]: 'dont care' | 'nice' | 'fast'; +} = { + [gl.DONT_CARE]: 'dont care', + [gl.NICEST]: 'nice', + [gl.FASTEST]: 'fast', +}; + +export const filterMap: { + [key: string]: + | 'nearest' + | 'linear' + | 'mipmap' + | 'nearest mipmap linear' + | 'linear mipmap nearest' + | 'nearest mipmap nearest'; +} = { + [gl.NEAREST]: 'nearest', + [gl.LINEAR]: 'linear', + [gl.LINEAR_MIPMAP_LINEAR]: 'mipmap', + [gl.NEAREST_MIPMAP_LINEAR]: 'nearest mipmap linear', + [gl.LINEAR_MIPMAP_NEAREST]: 'linear mipmap nearest', + [gl.NEAREST_MIPMAP_NEAREST]: 'nearest mipmap nearest', +}; + +export const wrapModeMap: { + [key: string]: 'repeat' | 'clamp' | 'mirror'; +} = { + [gl.REPEAT]: 'repeat', + [gl.CLAMP_TO_EDGE]: 'clamp', + [gl.MIRRORED_REPEAT]: 'mirror', +}; + +export const colorSpaceMap: { + [key: string]: 'none' | 'browser'; +} = { + [gl.NONE]: 'none', + [gl.BROWSER_DEFAULT_WEBGL]: 'browser', +}; + +export const depthFuncMap: { + [key: string]: + | 'never' + | 'always' + | 'less' + | 'lequal' + | 'greater' + | 'gequal' + | 'equal' + | 'notequal'; +} = { + [gl.NEVER]: 'never', + [gl.ALWAYS]: 'always', + [gl.LESS]: 'less', + [gl.LEQUAL]: 'lequal', + [gl.GREATER]: 'greater', + [gl.GEQUAL]: 'gequal', + [gl.EQUAL]: 'equal', + [gl.NOTEQUAL]: 'notequal', +}; + +export const blendEquationMap: { + [key: string]: regl.BlendingEquation; +} = { + [gl.FUNC_ADD]: 'add', + [gl.FUNC_SUBTRACT]: 'subtract', + [gl.FUNC_REVERSE_SUBTRACT]: 'reverse subtract', +}; + +export const blendFuncMap: { + [key: string]: regl.BlendingFunction; +} = { + [gl.ZERO]: 'zero', + [gl.ONE]: 'one', + [gl.SRC_COLOR]: 'src color', + [gl.ONE_MINUS_SRC_COLOR]: 'one minus src color', + [gl.SRC_ALPHA]: 'src alpha', + [gl.ONE_MINUS_SRC_ALPHA]: 'one minus src alpha', + [gl.DST_COLOR]: 'dst color', + [gl.ONE_MINUS_DST_COLOR]: 'one minus dst color', + [gl.DST_ALPHA]: 'dst alpha', + [gl.ONE_MINUS_DST_ALPHA]: 'one minus dst alpha', + [gl.CONSTANT_COLOR]: 'constant color', + [gl.ONE_MINUS_CONSTANT_COLOR]: 'one minus constant color', + [gl.CONSTANT_ALPHA]: 'constant alpha', + [gl.ONE_MINUS_CONSTANT_ALPHA]: 'one minus constant alpha', + [gl.SRC_ALPHA_SATURATE]: 'src alpha saturate', +}; + +export const stencilFuncMap: { + [key: string]: regl.ComparisonOperatorType; +} = { + [gl.NEVER]: 'never', + [gl.ALWAYS]: 'always', + [gl.LESS]: 'less', + [gl.LEQUAL]: 'lequal', + [gl.GREATER]: 'greater', + [gl.GEQUAL]: 'gequal', + [gl.EQUAL]: 'equal', + [gl.NOTEQUAL]: 'notequal', +}; + +export const stencilOpMap: { + [key: string]: regl.StencilOperationType; +} = { + [gl.ZERO]: 'zero', + [gl.KEEP]: 'keep', + [gl.REPLACE]: 'replace', + [gl.INVERT]: 'invert', + [gl.INCR]: 'increment', + [gl.DECR]: 'decrement', + [gl.INCR_WRAP]: 'increment wrap', + [gl.DECR_WRAP]: 'decrement wrap', +}; + +export const cullFaceMap: { + [key: string]: regl.FaceOrientationType; +} = { + [gl.FRONT]: 'front', + [gl.BACK]: 'back', +}; diff --git a/packages/renderer/src/regl/index.ts b/packages/renderer/src/regl/index.ts new file mode 100644 index 0000000000..d5ab2ec49d --- /dev/null +++ b/packages/renderer/src/regl/index.ts @@ -0,0 +1,168 @@ +/** + * render w/ regl + * @see https://github.com/regl-project/regl/blob/gh-pages/API.md + */ +import { + IAttribute, + IAttributeInitializationOptions, + IBuffer, + IBufferInitializationOptions, + IClearOptions, + IElements, + IElementsInitializationOptions, + IFramebuffer, + IFramebufferInitializationOptions, + IModel, + IModelInitializationOptions, + IReadPixelsOptions, + IRendererService, + ITexture2D, + ITexture2DInitializationOptions, +} from '@l7/core'; +import { injectable } from 'inversify'; +import regl from 'regl'; +import ReglAttribute from './ReglAttribute'; +import ReglBuffer from './ReglBuffer'; +import ReglElements from './ReglElements'; +import ReglFramebuffer from './ReglFramebuffer'; +import ReglModel from './ReglModel'; +import ReglTexture2D from './ReglTexture2D'; + +/** + * regl renderer + */ +@injectable() +export default class ReglRendererService implements IRendererService { + private gl: regl.Regl; + private $container: HTMLDivElement | null; + + public async init($container: HTMLDivElement): Promise { + this.$container = $container; + // tslint:disable-next-line:typedef + this.gl = await new Promise((resolve, reject) => { + regl({ + container: $container, + attributes: { + alpha: true, + // use TAA instead of MSAA + // @see https://www.khronos.org/registry/webgl/specs/1.0/#5.2.1 + antialias: true, + premultipliedAlpha: true, + }, + // TODO: use extensions + extensions: [ + 'OES_element_index_uint', + 'EXT_shader_texture_lod', // IBL + 'OES_standard_derivatives', // wireframe + 'EXT_SRGB', // baseColor emmisive + 'OES_texture_float', // shadow map + 'WEBGL_depth_texture', + 'angle_instanced_arrays', + 'EXT_texture_filter_anisotropic', // VSM shadow map + ], + optionalExtensions: ['oes_texture_float_linear'], + // profile: true, + onDone: (err: Error | null, r?: regl.Regl | undefined): void => { + if (err || !r) { + reject(err); + } + resolve(r); + }, + }); + }); + } + + public createModel = (options: IModelInitializationOptions): IModel => + new ReglModel(this.gl, options); + + public createAttribute = ( + options: IAttributeInitializationOptions, + ): IAttribute => new ReglAttribute(this.gl, options); + + public createBuffer = (options: IBufferInitializationOptions): IBuffer => + new ReglBuffer(this.gl, options); + + public createElements = ( + options: IElementsInitializationOptions, + ): IElements => new ReglElements(this.gl, options); + + public createTexture2D = ( + options: ITexture2DInitializationOptions, + ): ITexture2D => new ReglTexture2D(this.gl, options); + + public createFramebuffer = (options: IFramebufferInitializationOptions) => + new ReglFramebuffer(this.gl, options); + + public useFramebuffer = ( + framebuffer: IFramebuffer | null, + drawCommands: () => void, + ) => { + this.gl({ + framebuffer: framebuffer ? (framebuffer as ReglFramebuffer).get() : null, + })(drawCommands); + }; + + public clear = (options: IClearOptions) => { + // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#clear-the-draw-buffer + const { color, depth, stencil, framebuffer = null } = options; + const reglClearOptions: regl.ClearOptions = { + color, + depth, + stencil, + }; + + reglClearOptions.framebuffer = + framebuffer === null + ? framebuffer + : (framebuffer as ReglFramebuffer).get(); + + this.gl.clear(reglClearOptions); + }; + + public viewport = ({ + x, + y, + width, + height, + }: { + x: number; + y: number; + width: number; + height: number; + }) => { + // use WebGL context directly + // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#unsafe-escape-hatch + this.gl._gl.viewport(x, y, width, height); + this.gl._refresh(); + }; + + public readPixels = (options: IReadPixelsOptions) => { + const { framebuffer, x, y, width, height } = options; + const readPixelsOptions: regl.ReadOptions = { + x, + y, + width, + height, + }; + if (framebuffer) { + readPixelsOptions.framebuffer = (framebuffer as ReglFramebuffer).get(); + } + return this.gl.read(readPixelsOptions); + }; + + public getViewportSize = () => { + return { + width: this.gl._gl.drawingBufferWidth, + height: this.gl._gl.drawingBufferHeight, + }; + }; + + public getContainer = () => { + return this.$container; + }; + + public destroy = () => { + // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#clean-up + this.gl.destroy(); + }; +} diff --git a/packages/renderer/tsconfig.build.json b/packages/renderer/tsconfig.build.json new file mode 100644 index 0000000000..17f6c4525a --- /dev/null +++ b/packages/renderer/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "declarationDir": "./es", + "rootDir": "./src", + "baseUrl": "./" + }, + "include": ["./src"] +} \ No newline at end of file diff --git a/packages/scene/.gitignore b/packages/scene/.gitignore new file mode 100644 index 0000000000..49c199b6ab --- /dev/null +++ b/packages/scene/.gitignore @@ -0,0 +1,3 @@ +lib +es +dist diff --git a/packages/scene/package.json b/packages/scene/package.json new file mode 100644 index 0000000000..e0b53247f3 --- /dev/null +++ b/packages/scene/package.json @@ -0,0 +1,38 @@ +{ + "name": "@l7/scene", + "version": "0.0.1", + "description": "", + "main": "lib/index.js", + "module": "es/index.js", + "types": "es/index.d.ts", + "sideEffects": false, + "files": [ + "lib", + "es", + "README.md" + ], + "scripts": { + "tsc": "tsc --project tsconfig.build.json", + "clean": "rimraf dist; rimraf es; rimraf lib;", + "build": "run-p build:*", + "build:cjs": "BABEL_ENV=cjs babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "build:esm": "BABEL_ENV=esm babel src --root-mode upward --out-dir es --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "watch": "BABEL_ENV=cjs babel src --watch --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments" + }, + "author": "xiaoiver", + "license": "ISC", + "dependencies": { + "@l7/component": "^0.0.1", + "@l7/core": "^0.0.1", + "@l7/maps": "^0.0.1", + "@l7/renderer": "^0.0.1", + "inversify": "^5.0.1", + "inversify-inject-decorators": "^3.1.0", + "mapbox-gl": "^1.2.1", + "reflect-metadata": "^0.1.13" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/scene/src/index.ts b/packages/scene/src/index.ts new file mode 100644 index 0000000000..8cd3bead9f --- /dev/null +++ b/packages/scene/src/index.ts @@ -0,0 +1,276 @@ +import { Logo } from '@l7/component'; +import { + Bounds, + container, + IControl, + IControlService, + IIconService, + IImage, + ILayer, + ILayerService, + ILngLat, + IMapConfig, + IMapService, + IMarker, + IPoint, + IRenderConfig, + IRendererService, + ISceneService, + MapType, + Point, + SceneEventList, + TYPES, +} from '@l7/core'; +import { AMapService, MapboxService } from '@l7/maps'; +import { ReglRendererService } from '@l7/renderer'; +import { interfaces } from 'inversify'; +import { Map } from 'mapbox-gl'; + +// 绑定渲染引擎服务 +container + .bind(TYPES.IRendererService) + .to(ReglRendererService) + .inSingletonScope(); +// // 绑定地图服务 AMap & Mapbox +// container +// .bind(TYPES.IMapService) +// .to(AMapService) +// .whenTargetNamed(MapType.amap) +// .inSingletonScope(); +// container +// .bind(TYPES.IMapService) +// .to(MapboxService) +// .inSingletonScope(); +// // 地图服务工厂,根据 name 返回指定服务 +// container +// .bind>(TYPES.IFactoryMapService) +// .toFactory((context) => { +// return (named: string) => { +// return context.container.getNamed(TYPES.IMapService, named); +// }; +// }); + +// 缓存当前地图类型,便于 DEMO 中切换底图时动态绑定 +let mapType: MapType; + +/** + * 暴露 Scene API + * + * @example + * import { Scene } from '@l7/scene'; + * import { PointLayer } from '@l7/layers'; + * + * const scene = new Scene(); + * const pointLayer = new PointLayer(); + * scene.addLayer(pointLayer); + * scene.render(); + */ +class Scene { + // public map: AMap.Map | Map; + private sceneService: ISceneService; + private mapService: IMapService; + private controlService: IControlService; + private layerService: ILayerService; + + private iconService: IIconService; + + public constructor(config: IMapConfig & IRenderConfig) { + const { type = MapType.amap } = config; + // 根据用户传入参数绑定地图服务 + let mapServiceImpl: new (...args: any[]) => IMapService; + if (type === MapType.mapbox) { + mapServiceImpl = MapboxService; + } else if (type === MapType.amap) { + mapServiceImpl = AMapService; + } else { + throw new Error('不支持的地图服务'); + } + + // DEMO 中切换底图实现时,需要重新绑定底图服务 + // @see https://github.com/inversify/InversifyJS/blob/master/wiki/container_api.md#containerrebindserviceidentifier-serviceidentifier + if (!container.isBound(TYPES.IMapService)) { + container + .bind(TYPES.IMapService) + .to(mapServiceImpl) + .inSingletonScope(); + } else if (type !== mapType) { + container + .rebind(TYPES.IMapService) + .to(mapServiceImpl) + .inSingletonScope(); + } + + // 依赖注入 + this.sceneService = container.get(TYPES.ISceneService); + this.mapService = container.get(TYPES.IMapService); + this.iconService = container.get(TYPES.IIconService); + this.controlService = container.get(TYPES.IControlService); + this.layerService = container.get(TYPES.ILayerService); + mapType = this.mapService.getType(); + + // 初始化 scene + this.sceneService.init(config); + // 初始化组件 + this.initControl(); + } + + public getMapService(): IMapService { + return this.mapService; + // + } + + public get map() { + return this.mapService.map; + } + + public addLayer(layer: ILayer): void { + this.sceneService.addLayer(layer); + } + + public getLayers(): ILayer[] { + return this.layerService.getLayers(); + } + + public getLayer(id: string): ILayer | undefined { + return this.layerService.getLayer(id); + } + + public removeLayer(layer: ILayer): void { + this.layerService.remove(layer); + } + + public render(): void { + this.sceneService.render(); + } + + // asset method + public addImage(id: string, img: IImage) { + this.iconService.addImage(id, img); + } + + public hasImage(id: string) { + this.iconService.hasImage(id); + } + + public removeImage(id: string) { + this.iconService.removeImage(id); + } + + // map control method + public addControl(ctr: IControl) { + if (this.mapService.map) { + this.controlService.addControl(ctr, this.mapService); + } else { + this.mapService.once('mapload', () => { + this.controlService.addControl(ctr, this.mapService); + }); + } + } + + public removeControl(ctr: IControl) { + this.controlService.removeControl(ctr); + } + + // marker + public addMarker(marker: IMarker) { + marker.addTo(this); + } + // map envent; + + public on(type: string, handle: (...args: any[]) => void): void { + SceneEventList.indexOf(type) === -1 + ? this.mapService.on(type, handle) + : this.sceneService.on(type, handle); + } + + public off(type: string, handle: (...args: any[]) => void): void { + SceneEventList.indexOf(type) === -1 + ? this.mapService.off(type, handle) + : this.sceneService.off(type, handle); + } + + // map method + + public getZoom(): number { + return this.mapService.getZoom(); + } + + public getCenter(): ILngLat { + return this.mapService.getCenter(); + } + + public getPitch(): number { + return this.mapService.getPitch(); + } + + public getRotation(): number { + return this.mapService.getRotation(); + } + + public getBounds(): Bounds { + return this.mapService.getBounds(); + } + + // set Map status + + public setRotation(rotation: number): void { + this.mapService.setRotation(rotation); + } + public zoomIn(): void { + this.mapService.zoomIn(); + } + + public zoomOut(): void { + this.mapService.zoomOut(); + } + + public panTo(p: Point): void { + this.mapService.panTo(p); + } + + public panBy(pixel: Point): void { + this.mapService.panTo(pixel); + } + + public fitBounds(bound: Bounds): void { + this.mapService.fitBounds(bound); + } + + public setZoomAndCenter(zoom: number, center: Point): void { + this.mapService.setZoomAndCenter(zoom, center); + } + + public setMapStyle(style: string): void { + this.mapService.setMapStyle(style); + } + + // conversion Method + public pixelToLngLat(pixel: Point): ILngLat { + return this.mapService.pixelToLngLat(pixel); + } + + public lngLatToPixel(lnglat: Point): IPoint { + return this.mapService.lngLatToPixel(lnglat); + } + + public containerToLngLat(pixel: Point): ILngLat { + return this.mapService.containerToLngLat(pixel); + } + + public lngLatToContainer(lnglat: Point): IPoint { + return this.mapService.lngLatToContainer(lnglat); + } + + public destroy() { + this.sceneService.destroy(); + // TODO: 清理其他 Service 例如 IconService + } + + private initControl(): void { + this.addControl(new Logo()); + } + + // 资源管理 +} + +export { Scene }; diff --git a/packages/scene/tsconfig.build.json b/packages/scene/tsconfig.build.json new file mode 100644 index 0000000000..17f6c4525a --- /dev/null +++ b/packages/scene/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "declarationDir": "./es", + "rootDir": "./src", + "baseUrl": "./" + }, + "include": ["./src"] +} \ No newline at end of file diff --git a/packages/source/.gitignore b/packages/source/.gitignore new file mode 100644 index 0000000000..49c199b6ab --- /dev/null +++ b/packages/source/.gitignore @@ -0,0 +1,3 @@ +lib +es +dist diff --git a/packages/source/__tests__/data/csv.ts b/packages/source/__tests__/data/csv.ts new file mode 100644 index 0000000000..544ce107da --- /dev/null +++ b/packages/source/__tests__/data/csv.ts @@ -0,0 +1,24 @@ +const csvData: string = `lat,lng +30.276149,120.134107 +30.282163,120.124196 +30.274328,120.133228 +30.261044,120.129313 +30.275465,120.130145 +30.275899,120.133798 +30.275337,120.133301 +30.267925,120.127693 +30.274128,120.133302 +30.276134,120.133701 +30.271074,120.130644 +30.273078,120.133634 +30.283676,120.135383 +30.274393,120.133392 +30.274166,120.135521 +30.275843,120.133903 +30.276774,120.130388 +30.276638,120.127044 +30.272734,120.133633 +30.276321,120.133722 +30.269838,120.123237`; + +export default csvData; diff --git a/packages/source/__tests__/data/json.ts b/packages/source/__tests__/data/json.ts new file mode 100644 index 0000000000..40e7b2286f --- /dev/null +++ b/packages/source/__tests__/data/json.ts @@ -0,0 +1,24 @@ +import { IJsonData } from '../../src/interface'; +const data1: IJsonData = [ + { + lng: 112.323, + lat: 30.456, + name: 'dog', + }, + { + lng: 112.323, + lat: 30.456, + name: 'cat', + }, +]; +const data2: IJsonData = [ + { + coord: [112.323, 30.456], + name: 'dog', + }, + { + coord: [110.234, 1234], + name: 'cat', + }, +]; +export { data1, data2 }; diff --git a/packages/source/__tests__/data/polygon.ts b/packages/source/__tests__/data/polygon.ts new file mode 100644 index 0000000000..da9f189c0f --- /dev/null +++ b/packages/source/__tests__/data/polygon.ts @@ -0,0 +1,65 @@ +import { FeatureCollection, Geometries, Properties } from '@turf/helpers'; + +const Polygon: FeatureCollection = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + properties: { + name: 'tom', + }, + geometry: { + type: 'Polygon', + coordinates: [ + [ + [114.25077438354492, 30.600093873550072], + [114.26502227783203, 30.600093873550072], + [114.26502227783203, 30.60807236997211], + [114.25077438354492, 30.60807236997211], + [114.25077438354492, 30.600093873550072], + ], + ], + }, + }, + { + type: 'Feature', + properties: { + name: 'joy', + }, + geometry: { + type: 'Polygon', + coordinates: [ + [ + [114.31137084960938, 30.600093873550072], + [114.30656433105469, 30.589602628298536], + [114.31549072265625, 30.571572765814274], + [114.32167053222655, 30.593149091802424], + [114.32424545288086, 30.59965060448085], + [114.31137084960938, 30.600093873550072], + ], + ], + }, + }, + { + type: 'Feature', + properties: { + name: 'dog', + }, + geometry: { + type: 'Polygon', + coordinates: [ + [ + [114.26004409790039, 30.57024256120887], + [114.24373626708983, 30.563886887421297], + [114.25472259521484, 30.555756930350302], + [114.26776885986328, 30.55560910664438], + [114.27618026733398, 30.56832112235078], + [114.26004409790039, 30.57024256120887], + ], + ], + }, + }, + ], +}; + +export default Polygon; diff --git a/packages/source/__tests__/parser/csv.spec.ts b/packages/source/__tests__/parser/csv.spec.ts new file mode 100644 index 0000000000..e591a8cac5 --- /dev/null +++ b/packages/source/__tests__/parser/csv.spec.ts @@ -0,0 +1,12 @@ +import csv from '../../src/parser/csv'; +import csvData from '../data/csv'; +describe('parser.json', () => { + it('parser json x, y ', () => { + const result = csv(csvData, { + type: 'json', + x: 'lng', + y: 'lat', + }); + expect(result.dataArray.length).toEqual(21); + }); +}); diff --git a/packages/source/__tests__/parser/geojson.spec.ts b/packages/source/__tests__/parser/geojson.spec.ts new file mode 100644 index 0000000000..df84f5c0cd --- /dev/null +++ b/packages/source/__tests__/parser/geojson.spec.ts @@ -0,0 +1,22 @@ +import geojson from '../../src/parser/geojson'; +import polygon from '../data/polygon'; + +describe('parser.geojson', () => { + it('parser json', () => { + const result = geojson(polygon); + expect(result.dataArray.length).toEqual(3); + }); + it('parser json hash id ', () => { + const result = geojson(polygon, { + idField: 'name', + }); + expect(result.dataArray.length).toEqual(3); + if (result.featureKeys) { + expect(Object.keys(result.featureKeys)).toEqual([ + '408534', + '410464', + '431974', + ]); + } + }); +}); diff --git a/packages/source/__tests__/parser/json.spec.ts b/packages/source/__tests__/parser/json.spec.ts new file mode 100644 index 0000000000..d4395f332a --- /dev/null +++ b/packages/source/__tests__/parser/json.spec.ts @@ -0,0 +1,19 @@ +import json from '../../src/parser/json'; +import { data1, data2 } from '../data/json'; +describe('parser.json', () => { + it('parser json x, y ', () => { + const result = json(data1, { + type: 'json', + x: 'lng', + y: 'lat', + }); + expect(result.dataArray.length).toEqual(2); + }); + it('parser json coordinate', () => { + const result = json(data2, { + type: 'json', + coordinates: 'coord', + }); + expect(result.dataArray.length).toEqual(2); + }); +}); diff --git a/packages/source/__tests__/source.spec.ts b/packages/source/__tests__/source.spec.ts new file mode 100644 index 0000000000..48086eaca4 --- /dev/null +++ b/packages/source/__tests__/source.spec.ts @@ -0,0 +1,14 @@ +import Source from '../src/source'; +import Polygon from './data/polygon'; + +describe('source constructor', () => { + it('source.constructor', () => { + const source = new Source(Polygon); + expect(source.extent).toEqual([ + 114.24373626708983, + 30.55560910664438, + 114.32424545288086, + 30.60807236997211, + ]); + }); +}); diff --git a/packages/source/package.json b/packages/source/package.json new file mode 100644 index 0000000000..0acdc79e1c --- /dev/null +++ b/packages/source/package.json @@ -0,0 +1,56 @@ +{ + "name": "@l7/source", + "version": "0.0.1", + "description": "", + "main": "lib/index.js", + "module": "es/index.js", + "types": "es/index.d.ts", + "sideEffects": true, + "files": [ + "lib", + "es", + "README.md" + ], + "scripts": { + "tsc": "tsc --project tsconfig.build.json", + "clean": "rimraf dist; rimraf es; rimraf lib;", + "build": "run-p build:*", + "build:cjs": "BABEL_ENV=cjs babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "build:esm": "BABEL_ENV=esm babel src --root-mode upward --out-dir es --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "watch": "BABEL_ENV=cjs babel src --watch --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "lint:ts": "run-p -c lint:ts-*", + "test": "jest" + }, + "author": "lzxue", + "license": "ISC", + "dependencies": { + "@l7/core": "0.0.1", + "@l7/utils": "0.0.1", + "@mapbox/geojson-rewind": "^0.4.0", + "@turf/helpers": "^6.1.4", + "@turf/invariant": "^6.1.2", + "@turf/meta": "^6.0.2", + "d3-dsv": "^1.1.1", + "d3-hexbin": "^0.2.2", + "eventemitter3": "^4.0.0", + "gl-matrix": "^3.1.0", + "inversify": "^5.0.1", + "inversify-inject-decorators": "^3.1.0", + "inversify-logging": "^0.2.1", + "lodash": "^4.17.15", + "reflect-metadata": "^0.1.13", + "supercluster": "^6.0.2", + "tapable": "^2.0.0-beta.8" + }, + "devDependencies": { + "@types/d3-dsv": "^1.0.36", + "@types/d3-hexbin": "^0.2.3", + "@types/gl-matrix": "^2.4.5", + "@types/lodash": "^4.14.138", + "@types/viewport-mercator-project": "^6.1.0" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/source/src/factory.ts b/packages/source/src/factory.ts new file mode 100644 index 0000000000..b7c2b5d644 --- /dev/null +++ b/packages/source/src/factory.ts @@ -0,0 +1,24 @@ +import { IParserCfg, ITransform } from '@l7/core'; +import { IParserData } from './interface'; +type ParserFunction = (data: any, cfg?: any) => IParserData; +type transformFunction = (data: IParserData, cfg?: any) => IParserData; +const TRANSFORMS: { + [type: string]: transformFunction; +} = {}; +const PARSERS: { + [type: string]: ParserFunction; +} = {}; +export const getParser = (type: string) => PARSERS[type]; +export const registerParser = ( + type: string, + parserFunction: ParserFunction, +): void => { + PARSERS[type] = parserFunction; +}; +export const getTransform = (type: string) => TRANSFORMS[type]; +export const registerTransform = ( + type: string, + transFunction: transformFunction, +): void => { + TRANSFORMS[type] = transFunction; +}; diff --git a/packages/source/src/index.ts b/packages/source/src/index.ts new file mode 100644 index 0000000000..b4f693a4ca --- /dev/null +++ b/packages/source/src/index.ts @@ -0,0 +1,27 @@ +import { registerParser, registerTransform } from './factory'; +import csv from './parser/csv'; +import geojson from './parser/geojson'; +import image from './parser/image'; +import json from './parser/json'; +import raster from './parser/raster'; +import Source from './source'; +import { cluster } from './transform/cluster'; +import { aggregatorToGrid } from './transform/grid'; +import { pointToHexbin } from './transform/hexagon'; +export default Source; +registerParser('geojson', geojson); +registerParser('image', image); +registerParser('csv', csv); +registerParser('json', json); +registerParser('raster', raster); +registerTransform('cluster', cluster); +registerTransform('grid', aggregatorToGrid); +registerTransform('hexagon', pointToHexbin); +export { + getTransform, + registerTransform, + getParser, + registerParser, +} from './factory'; + +export * from './interface'; diff --git a/packages/source/src/interface.ts b/packages/source/src/interface.ts new file mode 100644 index 0000000000..fa6612f2ef --- /dev/null +++ b/packages/source/src/interface.ts @@ -0,0 +1,26 @@ +export type DataType = string | object[] | object; +export interface IDictionary { + [key: string]: TValue; +} +export interface IFeatureKey { + [key: string]: { + index: number; + idField: any; + }; +} +// 解析后返回数据类型 +export interface IParseDataItem { + coordinates: any[]; + _id: number; + [key: string]: any; +} +export interface IParserData { + [key: string]: any; + dataArray: IParseDataItem[]; + // 瓦片地图数据字典 + featureKeys?: IFeatureKey; +} +export interface IJsonItem { + [key: string]: any; +} +export type IJsonData = IJsonItem[]; diff --git a/packages/source/src/parser/csv.ts b/packages/source/src/parser/csv.ts new file mode 100644 index 0000000000..90bf9177ab --- /dev/null +++ b/packages/source/src/parser/csv.ts @@ -0,0 +1,7 @@ +import { IJsonData, IParserCfg, IParserData } from '@l7/core'; +import { csvParse } from 'd3-dsv'; +import json from './json'; +export default function csv(data: string, cfg: IParserCfg): IParserData { + const csvData: IJsonData = csvParse(data); + return json(csvData, cfg); +} diff --git a/packages/source/src/parser/geojson.ts b/packages/source/src/parser/geojson.ts new file mode 100644 index 0000000000..67fb42eb4c --- /dev/null +++ b/packages/source/src/parser/geojson.ts @@ -0,0 +1,72 @@ +import { djb2hash } from '@l7/utils'; +// @ts-ignore +import rewind from '@mapbox/geojson-rewind'; +import { + Feature, + FeatureCollection, + Geometries, + Geometry, + Properties, +} from '@turf/helpers'; +import { getCoords } from '@turf/invariant'; +import * as turfMeta from '@turf/meta'; +import { IFeatureKey, IParseDataItem, IParserData } from '../interface'; +interface IGeoJSON { + features: object[]; +} +interface IParserCFG { + idField?: string; + [key: string]: any; +} +export default function geoJSON( + data: FeatureCollection, + cfg?: IParserCFG, +): IParserData { + rewind(data, true); // 设置地理多边形方向 If clockwise is true, the outer ring is clockwise, otherwise it is counterclockwise. + const resultData: IParseDataItem[] = []; + const featureKeys: IFeatureKey = {}; + data.features = data.features.filter((item: Feature) => { + const geometry: Geometry | null = item.geometry as Geometry; + return ( + item != null && + geometry && + geometry.type && + geometry.coordinates && + geometry.coordinates.length > 0 + ); + }); + // 数据为空时处理 + let i = 0; + // multi polygon 拆分 + turfMeta.flattenEach( + data, + (currentFeature: Feature, featureIndex: number) => { + const coord = getCoords(currentFeature); + let id = featureIndex; + // 瓦片数据通过字段hash建立索引 + if ( + cfg && + cfg.idField && + currentFeature.properties && + currentFeature.properties[cfg.idField] + ) { + const value = currentFeature.properties[cfg.idField]; + id = djb2hash(value) % 1000019; + featureKeys[id] = { + index: i++, + idField: value, + }; + } + const dataItem: IParseDataItem = { + ...currentFeature.properties, + coordinates: coord, + _id: id, + }; + resultData.push(dataItem); + }, + ); + return { + dataArray: resultData, + featureKeys, + }; +} diff --git a/packages/source/src/parser/image.ts b/packages/source/src/parser/image.ts new file mode 100644 index 0000000000..966291162f --- /dev/null +++ b/packages/source/src/parser/image.ts @@ -0,0 +1,53 @@ +import { IParserData } from '@l7/core'; +import { getImage } from '@l7/utils'; +interface IImageCfg { + extent: [number, number, number, number]; +} +export default function image( + data: string | string[], + cfg: IImageCfg, +): IParserData { + const { extent } = cfg; + const images = new Promise((resolve) => { + loadData(data, (res: any) => { + resolve(res); + }); + }); + const resultData: IParserData = { + images, + _id: 1, + dataArray: [ + { + _id: 0, + coordinates: [ + [extent[0], extent[1]], + [extent[2], extent[3]], + ], + }, + ], + }; + return resultData; +} +function loadData(data: string | string[], done: any) { + const url = data; + const imageDatas: HTMLImageElement[] = []; + if (typeof url === 'string') { + getImage({ url }, (err: string, img: HTMLImageElement) => { + imageDatas.push(img); + done(imageDatas); + }); + } else { + const imageCount = url.length; + let imageindex = 0; + url.forEach((item) => { + getImage({ url: item }, (err: any, img: HTMLImageElement) => { + imageindex++; + imageDatas.push(img); + if (imageindex === imageCount) { + done(imageDatas); + } + }); + }); + } + return image; +} diff --git a/packages/source/src/parser/index.ts b/packages/source/src/parser/index.ts new file mode 100644 index 0000000000..1b0f067281 --- /dev/null +++ b/packages/source/src/parser/index.ts @@ -0,0 +1 @@ +export { default as geojson } from './geojson'; diff --git a/packages/source/src/parser/json.ts b/packages/source/src/parser/json.ts new file mode 100644 index 0000000000..4cf4088f6a --- /dev/null +++ b/packages/source/src/parser/json.ts @@ -0,0 +1,51 @@ +// @ts-ignore +import { + IJsonData, + IJsonItem, + IParseDataItem, + IParserCfg, + IParserData, +} from '@l7/core'; +// @ts-ignore +import rewind from '@mapbox/geojson-rewind'; +export default function json(data: IJsonData, cfg: IParserCfg): IParserData { + const { x, y, x1, y1, coordinates } = cfg; + const resultData: IParseDataItem[] = []; + data.forEach((col: IJsonItem, featureIndex: number) => { + let coords = []; + if (x && y) { + coords = [parseFloat(col[x]), parseFloat(col[y])]; + } // 点数据 + if (x && y && x1 && y1) { + // 弧线 或者线段 + coords = [ + [parseFloat(col[x]), parseFloat(col[y])], + [parseFloat(col[x1]), parseFloat(col[y1])], + ]; + } + if (coordinates) { + let type = 'Polygon'; + if (!Array.isArray(coordinates[0])) { + type = 'Point'; + } + if (Array.isArray(coordinates[0]) && !Array.isArray(coordinates[0][0])) { + type = 'LineString'; + } + const geometry = { + type, + coordinates: [...col[coordinates]], + }; + rewind(geometry, true); + coords = geometry.coordinates; + } + const dataItem = { + ...col, + _id: featureIndex, + coordinates: coords, + }; + resultData.push(dataItem); + }); + return { + dataArray: resultData, + }; +} diff --git a/packages/source/src/parser/raster.ts b/packages/source/src/parser/raster.ts new file mode 100644 index 0000000000..7c3bf6f1ba --- /dev/null +++ b/packages/source/src/parser/raster.ts @@ -0,0 +1,22 @@ +import { IParserData, IRasterCfg } from '@l7/core'; +export default function raster(data: number[], cfg: IRasterCfg): IParserData { + const { extent, width, height, min, max } = cfg; + const resultData = { + _id: 1, + dataArray: [ + { + _id: 1, + data: Array.from(data), + width, + height, + min, + max, + coordinates: [ + [extent[0], extent[1]], + [extent[2], extent[3]], + ], + }, + ], + }; + return resultData; +} diff --git a/packages/source/src/source.ts b/packages/source/src/source.ts new file mode 100644 index 0000000000..9caa6e2534 --- /dev/null +++ b/packages/source/src/source.ts @@ -0,0 +1,66 @@ +import { IParserCfg, IParserData, ISourceCFG, ITransform } from '@l7/core'; +import { extent } from '@l7/utils'; +import { BBox, FeatureCollection, Geometries, Properties } from '@turf/helpers'; +import { EventEmitter } from 'eventemitter3'; +import { cloneDeep } from 'lodash'; +import { SyncHook } from 'tapable'; +import { getParser, getTransform } from './'; +export default class Source extends EventEmitter { + public data: IParserData; + + // 数据范围 + public extent: BBox; + // 生命周期钩子 + public hooks = { + init: new SyncHook(['source']), + layout: new SyncHook(['source']), + update: new SyncHook(['source']), + }; + public parser: IParserCfg = { type: 'geojson' }; + public transforms: ITransform[] = []; + + // 原始数据 + private originData: any; + constructor(data: any, cfg?: ISourceCFG) { + super(); + this.data = cloneDeep(data); + this.originData = data; + if (cfg) { + if (cfg.parser) { + this.parser = cfg.parser; + } + if (cfg.transforms) { + this.transforms = cfg.transforms; + } + } + this.hooks.init.tap('parser', () => { + this.excuteParser(); + }); + this.hooks.init.tap('transform', () => { + this.executeTrans(); + }); + this.init(); + } + private excuteParser(): void { + const parser = this.parser; + const type: string = parser.type || 'geojson'; + const sourceParser = getParser(type); + this.data = sourceParser(this.originData, parser); + // 计算范围 + this.extent = extent(this.data.dataArray); + } + /** + * 数据统计 + */ + private executeTrans() { + const trans = this.transforms; + trans.forEach((tran: ITransform) => { + const { type } = tran; + const data = getTransform(type)(this.data, tran); + Object.assign(this.data, data); + }); + } + private init() { + this.hooks.init.call(this); + } +} diff --git a/packages/source/src/transform/cluster.ts b/packages/source/src/transform/cluster.ts new file mode 100644 index 0000000000..5ee549286c --- /dev/null +++ b/packages/source/src/transform/cluster.ts @@ -0,0 +1,59 @@ +import { IParserCfg, IParserData, ISourceCFG, ITransform } from '@l7/core'; +import Supercluster from 'supercluster'; +export function cluster(data: IParserData, option: ITransform): IParserData { + const { radius = 80, maxZoom = 18, minZoom = 0, field, zoom = 2 } = option; + if (data.pointIndex) { + const clusterData = data.pointIndex.getClusters(data.extent, zoom); + data.dataArray = formatData(clusterData); + return data; + } + const pointIndex = new Supercluster({ + radius, + minZoom, + maxZoom, + map: (props) => ({ sum: props[field] }), // 根据指定字段求和 + reduce: (accumulated, props) => { + accumulated.sum += props.sum; + }, + }); + const geojson: { + type: string; + features: any[]; + } = { + type: 'FeatureCollection', + features: [], + }; + geojson.features = data.dataArray.map((item) => { + return { + type: 'Feature', + properties: { + [field]: item[field], + }, + geometry: { + type: 'Point', + coordinates: item.coordinates, + }, + }; + }); + pointIndex.load(geojson.features); + const clusterPoint = pointIndex.getClusters(data.extent, zoom); + const resultData = clusterPoint.map((point, index) => { + return { + coordinates: point.geometry.coordinates, + _id: index + 1, + ...point.properties, + }; + }); + data.dataArray = resultData; + data.pointIndex = pointIndex; + return data; +} +export function formatData(clusterPoint: any[]) { + return clusterPoint.map((point, index) => { + return { + coordinates: point.geometry.coordinates, + _id: index + 1, + ...point.properties, + }; + }); +} diff --git a/packages/source/src/transform/grid.ts b/packages/source/src/transform/grid.ts new file mode 100644 index 0000000000..92f47f1ad5 --- /dev/null +++ b/packages/source/src/transform/grid.ts @@ -0,0 +1,113 @@ +/** + * 生成四边形热力图 + */ +import { IParserCfg, IParserData, ISourceCFG, ITransform } from '@l7/core'; +import { aProjectFlat, metersToLngLat } from '@l7/utils'; +import { statMap } from './statistics'; + +interface IGridHash { + [key: string]: any; +} +interface IGridOffset { + yOffset: number; + xOffset: number; +} +const R_EARTH = 6378000; + +export function aggregatorToGrid(data: IParserData, option: ITransform) { + const dataArray = data.dataArray; + const { size = 10 } = option; + const { gridHash, gridOffset } = _pointsGridHash(dataArray, size); + const layerData = _getGridLayerDataFromGridHash(gridHash, gridOffset, option); + return { + yOffset: gridOffset.yOffset / 1.8, + xOffset: gridOffset.xOffset / 1.8, + radius: gridOffset.xOffset, + type: 'grid', + dataArray: layerData, + }; +} + +function _pointsGridHash(dataArray: any[], size: number) { + let latMin = Infinity; + let latMax = -Infinity; + let pLat; + for (const point of dataArray) { + pLat = point.coordinates[1]; + if (Number.isFinite(pLat)) { + latMin = pLat < latMin ? pLat : latMin; + latMax = pLat > latMax ? pLat : latMax; + } + } + // const centerLat = (latMin + latMax) / 2; + const centerLat = 34.54083; + const gridOffset = _calculateGridLatLonOffset(size, centerLat); + if (gridOffset.xOffset <= 0 || gridOffset.yOffset <= 0) { + return { gridHash: {}, gridOffset }; + } + const gridHash: IGridHash = {}; + for (const point of dataArray) { + const lat = point.coordinates[1]; + const lng = point.coordinates[0]; + + if (Number.isFinite(lat) && Number.isFinite(lng)) { + const latIdx = Math.floor((lat + 90) / gridOffset.yOffset); + const lonIdx = Math.floor((lng + 180) / gridOffset.xOffset); + const key = `${latIdx}-${lonIdx}`; + + gridHash[key] = gridHash[key] || { count: 0, points: [] }; + gridHash[key].count += 1; + gridHash[key].points.push(point); + } + } + + return { gridHash, gridOffset }; +} +// 计算网格偏移量 +function _calculateGridLatLonOffset(cellSize: number, latitude: number) { + const yOffset = _calculateLatOffset(cellSize); + const xOffset = _calculateLonOffset(latitude, cellSize); + return { yOffset, xOffset }; +} + +function _calculateLatOffset(dy: number) { + return (dy / R_EARTH) * (180 / Math.PI); +} + +function _calculateLonOffset(lat: number, dx: number) { + return ((dx / R_EARTH) * (180 / Math.PI)) / Math.cos((lat * Math.PI) / 180); +} +function _getGridLayerDataFromGridHash( + gridHash: IGridHash, + gridOffset: IGridOffset, + option: ITransform, +) { + return Object.keys(gridHash).reduce((accu, key, i) => { + const idxs = key.split('-'); + const latIdx = parseInt(idxs[0], 10); + const lonIdx = parseInt(idxs[1], 10); + const item: { + [key: string]: any; + } = {}; + if (option.field && option.method) { + const columns = getColumn(gridHash[key].points, option.field); + item[option.method] = statMap[option.method](columns); + } + Object.assign(item, { + _id: i + 1, + coordinates: [ + -180 + gridOffset.xOffset * lonIdx, + -90 + gridOffset.yOffset * latIdx, + ], + count: gridHash[key].count, + }); + // @ts-ignore + accu.push(item); + return accu; + }, []); +} +function getColumn(data: any[], columnName: string) { + return data.map((item) => { + return item[columnName] * 1; + }); +} diff --git a/packages/source/src/transform/grid2.ts b/packages/source/src/transform/grid2.ts new file mode 100644 index 0000000000..903dfb51cf --- /dev/null +++ b/packages/source/src/transform/grid2.ts @@ -0,0 +1,94 @@ +/** + * 生成四边形热力图 + */ +import { + IParseDataItem, + IParserCfg, + IParserData, + ISourceCFG, + ITransform, +} from '@l7/core'; +import { aProjectFlat, metersToLngLat } from '@l7/utils'; +import { statMap } from './statistics'; + +interface IGridHash { + [key: string]: any; +} +interface IGridOffset { + yOffset: number; + xOffset: number; +} +interface IRawData { + coordinates: [number, number]; + [key: string]: any; +} +const R_EARTH = 6378000; + +export function aggregatorToGrid(data: IParserData, option: ITransform) { + const dataArray = data.dataArray; + const { size = 10 } = option; + const pixlSize = ((size / (2 * Math.PI * R_EARTH)) * (256 << 20)) / 2; + const screenPoints: IRawData[] = dataArray.map((point: IParseDataItem) => { + const [x, y] = aProjectFlat(point.coordinates); + return { + ...point, + coordinates: [parseInt(x.toFixed(0), 10), parseInt(y.toFixed(0), 10)], + }; + }); + const gridHash = _pointsGridHash(screenPoints, pixlSize); + const layerData = _getGridLayerDataFromGridHash(gridHash, pixlSize, option); + return { + yOffset: pixlSize / 2, + xOffset: pixlSize / 2, + dataArray: layerData, + }; +} + +function _pointsGridHash(dataArray: any[], size: number) { + const gridHash: IGridHash = {}; + for (const point of dataArray) { + const x = point.coordinates[0]; + const y = point.coordinates[1]; + const latIdx = Math.floor(y / size); + const lonIdx = Math.floor(x / size); + const key = `${latIdx}-${lonIdx}`; + + gridHash[key] = gridHash[key] || { count: 0, points: [] }; + gridHash[key].count += 1; + gridHash[key].points.push(point); + } + + return gridHash; +} + +function _getGridLayerDataFromGridHash( + gridHash: IGridHash, + size: number, + option: ITransform, +) { + return Object.keys(gridHash).reduce((accu, key, i) => { + const idxs = key.split('-'); + const latIdx = parseInt(idxs[0], 10); + const lonIdx = parseInt(idxs[1], 10); + const item: { + [key: string]: any; + } = {}; + if (option.field && option.method) { + const columns = getColumn(gridHash[key].points, option.field); + item[option.method] = statMap[option.method](columns); + } + Object.assign(item, { + _id: i + 1, + coordinates: [lonIdx * size, latIdx * size], + count: gridHash[key].count, + }); + // @ts-ignore + accu.push(item); + return accu; + }, []); +} +function getColumn(data: any[], columnName: string) { + return data.map((item) => { + return item[columnName] * 1; + }); +} diff --git a/packages/source/src/transform/hexagon.ts b/packages/source/src/transform/hexagon.ts new file mode 100644 index 0000000000..06cdd48d54 --- /dev/null +++ b/packages/source/src/transform/hexagon.ts @@ -0,0 +1,63 @@ +import { aProjectFlat, metersToLngLat } from '@l7/utils'; +import { hexbin } from 'd3-hexbin'; +const R_EARTH = 6378000; +import { + IParseDataItem, + IParserCfg, + IParserData, + ISourceCFG, + ITransform, +} from '@l7/core'; +import { statMap } from './statistics'; +interface IHexBinItem extends Array { + x: number; + y: number; + [key: string]: any; +} +interface IRawData { + coordinates: [number, number]; + [key: string]: any; +} +export function pointToHexbin(data: IParserData, option: ITransform) { + const dataArray = data.dataArray; + const { size = 10 } = option; + const pixlSize = ((size / (2 * Math.PI * R_EARTH)) * (256 << 20)) / 2; + const screenPoints: IRawData[] = dataArray.map((point: IParseDataItem) => { + const [x, y] = aProjectFlat(point.coordinates); + return { + ...point, + coordinates: [x, y], + }; + }); + + const newHexbin = hexbin() + .radius(pixlSize) + .x((d: IRawData) => d.coordinates[0]) + .y((d: IRawData) => d.coordinates[1]); + const hexbinBins = newHexbin(screenPoints); + + const result: IParserData = { + dataArray: hexbinBins.map((hex: IHexBinItem, index: number) => { + if (option.field && option.method) { + const columns = getColumn(hex, option.field); + hex[option.method] = statMap[option.method](columns); + } + return { + [option.method]: hex[option.method], + count: hex.length, + coordinates: [hex.x, hex.y], + _id: index + 1, + }; + }), + radius: pixlSize, + xOffset: pixlSize, + yOffset: pixlSize, + type: 'hexagon', + }; + return result; +} +function getColumn(data: IHexBinItem, columnName: string) { + return data.map((item: IRawData) => { + return item[columnName] * 1; + }); +} diff --git a/packages/source/src/transform/statistics.ts b/packages/source/src/transform/statistics.ts new file mode 100644 index 0000000000..5f2f4f387c --- /dev/null +++ b/packages/source/src/transform/statistics.ts @@ -0,0 +1,77 @@ +function max(x: number[]) { + if (x.length === 0) { + throw new Error('max requires at least one data point'); + } + + let value = x[0]; + for (let i = 1; i < x.length; i++) { + // On the first iteration of this loop, max is + // undefined and is thus made the maximum element in the array + if (x[i] > value) { + value = x[i]; + } + } + return value; +} + +function min(x: number[]) { + if (x.length === 0) { + throw new Error('min requires at least one data point'); + } + + let value = x[0]; + for (let i = 1; i < x.length; i++) { + // On the first iteration of this loop, min is + // undefined and is thus made the minimum element in the array + if (x[i] < value) { + value = x[i]; + } + } + return value; +} + +function sum(x: number[]) { + // If the array is empty, we needn't bother computing its sum + if (x.length === 0) { + return 0; + } + + // Initializing the sum as the first number in the array + let sumNum = x[0]; + + // Keeping track of the floating-point error correction + let correction = 0; + + let transition; + + for (let i = 1; i < x.length; i++) { + transition = sumNum + x[i] * 1; + + // Here we need to update the correction in a different fashion + // if the new absolute value is greater than the absolute sum + if (Math.abs(sumNum) >= Math.abs(x[i])) { + correction += sumNum - transition + x[i]; + } else { + correction += x[i] - transition + sumNum; + } + + sumNum = transition; + } + + // Returning the corrected sum + return sumNum + correction * 1; +} +function mean(x: number[]) { + if (x.length === 0) { + throw new Error('mean requires at least one data point'); + } + return sum(x) / x.length; +} + +export { sum, max, min, mean }; +export const statMap: { [key: string]: any } = { + min, + max, + mean, + sum, +}; diff --git a/packages/source/tsconfig.build.json b/packages/source/tsconfig.build.json new file mode 100644 index 0000000000..17f6c4525a --- /dev/null +++ b/packages/source/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "declarationDir": "./es", + "rootDir": "./src", + "baseUrl": "./" + }, + "include": ["./src"] +} \ No newline at end of file diff --git a/packages/utils/.gitignore b/packages/utils/.gitignore new file mode 100644 index 0000000000..49c199b6ab --- /dev/null +++ b/packages/utils/.gitignore @@ -0,0 +1,3 @@ +lib +es +dist diff --git a/packages/utils/__tests__/geo.spec.ts b/packages/utils/__tests__/geo.spec.ts new file mode 100644 index 0000000000..1e2eb32431 --- /dev/null +++ b/packages/utils/__tests__/geo.spec.ts @@ -0,0 +1,8 @@ +import { aProjectFlat, lngLatToMeters, project } from '../src/geo'; +describe('aProjectFlat', () => { + it('aProjectFlat', () => { + // console.log(aProjectFlat([112, 32])); + // console.log(lngLatToMeters([112, 32])); + // console.log(project([112, 32])); + }); +}); diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 0000000000..35a735ec74 --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,43 @@ +{ + "name": "@l7/utils", + "version": "0.0.1", + "description": "", + "main": "lib/index.js", + "module": "es/index.js", + "types": "es/index.d.ts", + "sideEffects": true, + "files": [ + "lib", + "es", + "README.md" + ], + "scripts": { + "tsc": "tsc --project tsconfig.build.json", + "clean": "rimraf dist; rimraf es; rimraf lib;", + "build": "run-p build:*", + "build:cjs": "BABEL_ENV=cjs babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "build:esm": "BABEL_ENV=esm babel src --root-mode upward --out-dir es --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", + "watch": "BABEL_ENV=cjs babel src --watch --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments" + }, + "author": "lzxue", + "license": "ISC", + "dependencies": { + "@turf/helpers": "^6.1.4", + "eventemitter3": "^4.0.0", + "gl-matrix": "^3.1.0", + "inversify": "^5.0.1", + "inversify-inject-decorators": "^3.1.0", + "inversify-logging": "^0.2.1", + "lodash": "^4.17.15", + "reflect-metadata": "^0.1.13", + "tapable": "^2.0.0-beta.8" + }, + "devDependencies": { + "@types/gl-matrix": "^2.4.5", + "@types/lodash": "^4.14.138" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/utils/src/dom.ts b/packages/utils/src/dom.ts new file mode 100644 index 0000000000..205cd123ab --- /dev/null +++ b/packages/utils/src/dom.ts @@ -0,0 +1,143 @@ +const docStyle = window.document.documentElement.style; +type ELType = HTMLElement | SVGElement; +export function createRendererContainer(domId: string): HTMLDivElement | null { + const $wrapper = document.getElementById(domId); + + if ($wrapper) { + const $container = document.createElement('div'); + $container.style.cssText += ` + position: absolute; + top: 0; + z-index:2; + height: 100%; + width: 100%; + pointer-events: none; + `; + $container.id = 'l7_canvaslayer'; + $wrapper.appendChild($container); + return $container; + } + + return null; +} + +export function trim(str: string) { + return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); +} + +// @function splitWords(str: String): String[] +// Trims and splits the string on whitespace and returns the array of parts. +export function splitWords(str: string) { + return trim(str).split(/\s+/); +} + +function testProp(props: string[]): string { + if (!docStyle) { + return props[0]; + } + for (const i in props) { + if (props[i] && props[i] in docStyle) { + return props[i]; + } + } + + return props[0]; +} +export function create( + tagName: string, + className?: string, + container?: HTMLElement, +) { + const el = document.createElement(tagName); + el.className = className || ''; + + if (container) { + container.appendChild(el); + } + return el; +} +// @function remove(el: HTMLElement) +// Removes `el` from its parent element +export function remove(el: ELType) { + const parent = el.parentNode; + if (parent) { + parent.removeChild(el); + } +} + +// @function addClass(el: HTMLElement, name: String) +// Adds `name` to the element's class attribute. +export function addClass(el: ELType, name: string) { + if (el.classList !== undefined) { + const classes = splitWords(name); + for (let i = 0, len = classes.length; i < len; i++) { + el.classList.add(classes[i]); + } + } else if (!hasClass(el, name)) { + const className = getClass(el); + setClass(el, (className ? className + ' ' : '') + name); + } +} + +// @function removeClass(el: HTMLElement, name: String) +// Removes `name` from the element's class attribute. +export function removeClass(el: ELType, name: string) { + if (el.classList !== undefined) { + el.classList.remove(name); + } else { + setClass( + el, + trim((' ' + getClass(el) + ' ').replace(' ' + name + ' ', ' ')), + ); + } +} + +// @function hasClass(el: HTMLElement, name: String): Boolean +// Returns `true` if the element's class attribute contains `name`. +export function hasClass(el: ELType, name: string) { + if (el.classList !== undefined) { + return el.classList.contains(name); + } + const className = getClass(el); + return ( + className.length > 0 && + new RegExp('(^|\\s)' + name + '(\\s|$)').test(className) + ); +} + +// @function setClass(el: HTMLElement, name: String) +// Sets the element's class. +export function setClass(el: ELType, name: string) { + if (el instanceof HTMLElement) { + el.className = name; + } else { + // in case of SVG element + el.className.baseVal = name; + } +} + +// @function getClass(el: HTMLElement): String +// Returns the element's class. +export function getClass(el: ELType) { + // Check if the element is an SVGElementInstance and use the correspondingElement instead + // (Required for linked SVG elements in IE11.) + if (el instanceof SVGElement) { + el = el.correspondingElement; + } + return el.className.baseVal === undefined + ? el.className + : el.className.baseVal; +} + +export function empty(el: ELType) { + while (el.firstChild) { + el.removeChild(el.firstChild); + } +} + +const transformProp = testProp(['transform', 'WebkitTransform']); + +export function setTransform(el: ELType, value: string) { + // @ts-ignore + el.style[transformProp] = value; +} diff --git a/packages/utils/src/event.ts b/packages/utils/src/event.ts new file mode 100644 index 0000000000..3662f8ebd7 --- /dev/null +++ b/packages/utils/src/event.ts @@ -0,0 +1,8 @@ +export function bindAll(fns: string[], context: any) { + fns.forEach((fn) => { + if (!context[fn]) { + return; + } + context[fn] = context[fn].bind(context); + }); +} diff --git a/packages/utils/src/fetchData.ts b/packages/utils/src/fetchData.ts new file mode 100644 index 0000000000..a4e874fee6 --- /dev/null +++ b/packages/utils/src/fetchData.ts @@ -0,0 +1,125 @@ +class AJAXError extends Error { + private status: number; + private url: string; + + constructor(message: string, status: number, url: string) { + super(message); + this.status = status; + this.url = url; + + // work around for https://github.com/Rich-Harris/buble/issues/40 + this.name = this.constructor.name; + this.message = message; + } + + public toString() { + return `${this.name}: ${this.message} (${this.status}): ${this.url}`; + } +} + +function makeRequest(requestParameters: any) { + const xhr = new XMLHttpRequest(); + + xhr.open('GET', requestParameters.url, true); + for (const k in requestParameters.headers) { + if (requestParameters.headers.hasOwnProperty(k)) { + xhr.setRequestHeader(k, requestParameters.headers[k]); + } + } + xhr.withCredentials = requestParameters.credentials === 'include'; + return xhr; +} + +export const getJSON = (requestParameters: any, callback: any) => { + const xhr = makeRequest(requestParameters); + xhr.setRequestHeader('Accept', 'application/json'); + xhr.onerror = () => { + callback(new Error(xhr.statusText)); + }; + xhr.onload = () => { + if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { + let data; + try { + data = JSON.parse(xhr.response); + } catch (err) { + return callback(err); + } + callback(null, data); + } else { + if (xhr.status === 401) { + callback( + new AJAXError(`${xhr.statusText}`, xhr.status, requestParameters.url), + ); + } else { + callback( + new AJAXError(xhr.statusText, xhr.status, requestParameters.url), + ); + } + } + }; + xhr.send(); + return xhr; +}; + +export const getArrayBuffer = (requestParameters: any, callback: any) => { + const xhr = makeRequest(requestParameters); + xhr.responseType = 'arraybuffer'; + xhr.onerror = () => { + callback(new Error(xhr.statusText)); + }; + xhr.onload = () => { + const response = xhr.response; + if (response.byteLength === 0 && xhr.status === 200) { + return callback(new Error('http status 200 returned without content.')); + } + if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { + callback(null, { + data: response, + cacheControl: xhr.getResponseHeader('Cache-Control'), + expires: xhr.getResponseHeader('Expires'), + }); + } else { + callback( + new AJAXError(xhr.statusText, xhr.status, requestParameters.url), + ); + } + }; + xhr.send(); + return xhr; +}; + +function sameOrigin(url: string) { + const a = window.document.createElement('a'); + a.href = url; + return ( + a.protocol === window.document.location.protocol && + a.host === window.document.location.host + ); +} + +const transparentPngUrl = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII='; + +export const getImage = (requestParameters: any, callback: any) => { + // request the image with XHR to work around caching issues + // see https://github.com/mapbox/mapbox-gl-js/issues/1470 + return getArrayBuffer(requestParameters, (err: string, imgData: any) => { + if (err) { + callback(err); + } else if (imgData) { + const img = new window.Image(); + img.crossOrigin = 'anonymous'; + const URL = window.URL || window.webkitURL; + img.onload = () => { + callback(null, img); + URL.revokeObjectURL(img.src); + }; + const blob = new window.Blob([new Uint8Array(imgData.data)], { + type: 'image/png', + }); + img.src = imgData.data.byteLength + ? URL.createObjectURL(blob) + : transparentPngUrl; + } + }); +}; diff --git a/packages/utils/src/geo.ts b/packages/utils/src/geo.ts new file mode 100644 index 0000000000..61c6ae1778 --- /dev/null +++ b/packages/utils/src/geo.ts @@ -0,0 +1,209 @@ +import { + BBox, + Coord, + degreesToRadians, + isObject, + radiansToLength, + Units, +} from '@turf/helpers'; + +const originShift = (2 * Math.PI * 6378137) / 2.0; +export type Point = number[]; +/** + * 计算地理数据范围 + * @param {dataArray} data 地理坐标数据 + * @return {Array} dataExtent + */ +export function extent(data: any[]): BBox { + const dataExtent: BBox = [Infinity, Infinity, -Infinity, -Infinity]; + data.forEach((item) => { + const { coordinates } = item; + caculExtent(dataExtent, coordinates); + }); + return dataExtent; +} +function caculExtent(dataExtent: BBox, coords: any[]) { + if (Array.isArray(coords[0])) { + coords.forEach((coord) => { + caculExtent(dataExtent, coord); + }); + } else { + if (dataExtent[0] > coords[0]) { + dataExtent[0] = coords[0]; + } + if (dataExtent[1] > coords[1]) { + dataExtent[1] = coords[1]; + } + if (dataExtent[2] < coords[0]) { + dataExtent[2] = coords[0]; + } + if (dataExtent[3] < coords[1]) { + dataExtent[3] = coords[1]; + } + } + return dataExtent; +} + +export function tranfrormCoord(data: any[], cb: (item: any[]) => any) { + return transform(data, cb); +} +function transform(item: any[], cb: (item: any[]) => any): any { + if (Array.isArray(item[0])) { + return item.map((coord) => { + return transform(coord, cb); + }); + } + return cb(item); +} +export function lngLatToMeters(lnglat: Point): Point; +export function lngLatToMeters( + lnglat: Point, + validate: boolean = true, + accuracy = { enable: true, decimal: 1 }, +) { + lnglat = validateLngLat(lnglat, validate); + const lng = lnglat[0]; + const lat = lnglat[1]; + let x = (lng * originShift) / 180.0; + let y = + Math.log(Math.tan(((90 + lat) * Math.PI) / 360.0)) / (Math.PI / 180.0); + y = (y * originShift) / 180.0; + if (accuracy.enable) { + x = Number(x.toFixed(accuracy.decimal)); + y = Number(y.toFixed(accuracy.decimal)); + } + return lnglat.length === 3 ? [x, y, lnglat[2]] : [x, y]; +} + +export function metersToLngLat(meters: Point, decimal = 6) { + const x = meters[0]; + const y = meters[1]; + let lng = (x / originShift) * 180.0; + let lat = (y / originShift) * 180.0; + lat = + (180 / Math.PI) * + (2 * Math.atan(Math.exp((lat * Math.PI) / 180.0)) - Math.PI / 2.0); + if (decimal !== undefined && decimal !== null) { + lng = Number(lng.toFixed(decimal)); + lat = Number(lat.toFixed(decimal)); + } + return meters.length === 3 ? [lng, lat, meters[2]] : [lng, lat]; +} +export function longitude(lng: number) { + if (lng === undefined || lng === null) { + throw new Error('lng is required'); + } + + // lngitudes cannot extends beyond +/-90 degrees + if (lng > 180 || lng < -180) { + lng = lng % 360; + if (lng > 180) { + lng = -360 + lng; + } + if (lng < -180) { + lng = 360 + lng; + } + if (lng === 0) { + lng = 0; + } + } + return lng; +} +export function latitude(lat: number) { + if (lat === undefined || lat === null) { + throw new Error('lat is required'); + } + + if (lat > 90 || lat < -90) { + lat = lat % 180; + if (lat > 90) { + lat = -180 + lat; + } + if (lat < -90) { + lat = 180 + lat; + } + if (lat === 0) { + lat = 0; + } + } + return lat; +} +export function validateLngLat(lnglat: Point, validate: boolean): Point { + if (validate === false) { + return lnglat; + } + + const lng = longitude(lnglat[0]); + let lat = latitude(lnglat[1]); + + // Global Mercator does not support latitudes within 85 to 90 degrees + if (lat > 85) { + lat = 85; + } + if (lat < -85) { + lat = -85; + } + return lnglat.length === 3 ? [lng, lat, lnglat[2]] : [lng, lat]; +} +export function aProjectFlat(lnglat: number[]) { + const maxs = 85.0511287798; + const lat = Math.max(Math.min(maxs, lnglat[1]), -maxs); + const scale = 256 << 20; + let d = Math.PI / 180; + let x = lnglat[0] * d; + let y = lat * d; + y = Math.log(Math.tan(Math.PI / 4 + y / 2)); + + const a = 0.5 / Math.PI; + const b = 0.5; + const c = -0.5 / Math.PI; + d = 0.5; + x = scale * (a * x + b); + y = scale * (c * y + d); + return [parseInt(x.toString(), 10), parseInt(y.toString(), 10)]; +} +export function unProjectFlat(px: number[]): [number, number] { + const a = 0.5 / Math.PI; + const b = 0.5; + const c = -0.5 / Math.PI; + let d = 0.5; + const scale = 256 << 20; + let [x, y] = px; + x = (x / scale - b) / a; + y = (y / scale - d) / c; + y = (Math.atan(Math.pow(Math.E, y)) - Math.PI / 4) * 2; + d = Math.PI / 180; + const lat = y / d; + const lng = x / d; + return [lng, lat]; +} +export function lnglatDistance( + coordinates1: [number, number], + coordinates2: [number, number], + units?: Units, +): number { + const dLat = degreesToRadians(coordinates2[1] - coordinates1[1]); + const dLon = degreesToRadians(coordinates2[0] - coordinates1[0]); + const lat1 = degreesToRadians(coordinates1[1]); + const lat2 = degreesToRadians(coordinates2[1]); + const a = + Math.pow(Math.sin(dLat / 2), 2) + + Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2); + + return radiansToLength( + 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)), + (units = 'meters'), + ); +} + +export function project(lnglat: [number, number]) { + const d = Math.PI / 180; + const max = 85.0511287798; + const earthRadius = 6378137; + const lat = Math.max(Math.min(max, lnglat[1]), -max); + const sin = Math.sin(lat * d); + const x = earthRadius * lnglat[0] * d; + const y = (earthRadius * Math.log((1 + sin) / (1 - sin))) / 2; + + return [x, y]; +} diff --git a/packages/utils/src/hash.ts b/packages/utils/src/hash.ts new file mode 100644 index 0000000000..ace2ff1694 --- /dev/null +++ b/packages/utils/src/hash.ts @@ -0,0 +1,24 @@ +export function BKDRHash(str: string) { + const seed = 131; + const seed2 = 137; + let hash = 0; + str += 'x'; + const MAX_SAFE_INTEGER = Math.floor(9007199254740991 / seed2); + for (let i = 0; i < str.length; i++) { + if (hash > MAX_SAFE_INTEGER) { + hash = Math.floor(hash / seed2); + } + hash = hash * seed + str.charCodeAt(i); + } + return hash; +} +export function djb2hash(str: string) { + str = str.toString(); + let hash = 5381; + let i = str.length; + + while (i) { + hash = (hash * 33) ^ str.charCodeAt(--i); + } + return hash >>> 0; +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 0000000000..d3e73b4277 --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,7 @@ +export { djb2hash, BKDRHash } from './hash'; +import * as DOM from './dom'; +export * from './fetchData'; +export * from './geo'; +export * from './lru_cache'; +export * from './event'; +export { DOM }; diff --git a/packages/utils/src/lru_cache.ts b/packages/utils/src/lru_cache.ts new file mode 100644 index 0000000000..4299f87412 --- /dev/null +++ b/packages/utils/src/lru_cache.ts @@ -0,0 +1,86 @@ +/** + * LRU Cache class with limit + * + * Update order for each get/set operation + * Delete oldest when reach given limit + */ +type callback = (...args: any[]) => void; +interface ICache { + [key: string]: any; +} +export class LRUCache { + private limit: number; + private cache: ICache; + private destroy: (value: any, key: string) => void; + private order: any[]; + constructor(limit = 50, destroy?: callback) { + this.limit = limit; + this.destroy = destroy || this.defaultDestroy; + this.order = []; + this.clear(); + } + + public clear() { + this.order.forEach((key) => { + this.delete(key); + }); + this.cache = {}; + // access/update order, first item is oldest, last item is newest + this.order = []; + } + + public get(key: string) { + const value = this.cache[key]; + if (value) { + // update order + this.deleteOrder(key); + this.appendOrder(key); + } + return value; + } + + public set(key: string, value: any) { + if (!this.cache[key]) { + // if reach limit, delete the oldest + if (Object.keys(this.cache).length === this.limit) { + this.delete(this.order[0]); + } + + this.cache[key] = value; + this.appendOrder(key); + } else { + // if found in cache, delete the old one, insert new one to the first of list + this.delete(key); + + this.cache[key] = value; + this.appendOrder(key); + } + } + + public delete(key: string) { + const value = this.cache[key]; + if (value) { + this.deleteCache(key); + this.deleteOrder(key); + this.destroy(value, key); + } + } + + private deleteCache(key: string) { + delete this.cache[key]; + } + + private deleteOrder(key: string) { + const index = this.order.findIndex((o) => o === key); + if (index >= 0) { + this.order.splice(index, 1); + } + } + + private appendOrder(key: string) { + this.order.push(key); + } + private defaultDestroy(value: any, key: string) { + return null; + } +} diff --git a/packages/utils/tsconfig.build.json b/packages/utils/tsconfig.build.json new file mode 100644 index 0000000000..17f6c4525a --- /dev/null +++ b/packages/utils/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "declarationDir": "./es", + "rootDir": "./src", + "baseUrl": "./" + }, + "include": ["./src"] +} \ No newline at end of file diff --git a/site/css/demo.css b/site/css/demo.css new file mode 100644 index 0000000000..7b6e46e0e3 --- /dev/null +++ b/site/css/demo.css @@ -0,0 +1,21 @@ +.lableclass { + position: absolute; + display: inline; + cursor: pointer; + background: rgb(255, 228, 120); + border: solid 2px #fff; + padding: 4px; + white-space: nowrap; + font: bold 12px/18px arial, sans-serif; + color: #fff; + border-radius: 50%; + width: 40px; + height: 40px; + line-height: 30px; + /* opacity: 0.7; */ + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/site/css/home.css b/site/css/home.css new file mode 100644 index 0000000000..fc6eda07df --- /dev/null +++ b/site/css/home.css @@ -0,0 +1,32 @@ +.home_l7_feature_img { + width:100px; +} +.feature-logo { + height: 100px !important; +} +.cover-image { + margin-top: 60px; + height: 300px; + +} +@media only screen and (max-height: 599) and (max-width: 800px) { + .cover-image { + margin-top: 40px; + margin-left: 260px; + max-height: 400px; + } +} +@media only screen and (min-height: 599px) and (min-width:800px) { + .cover-image { + margin-top: 40px; + margin-left: 10px; + height: 600px; + } +} +@media only screen and (max-height: 599px) and (min-width:800px) { + .cover-image { + margin-top: 40px; + margin-left: 10px; + height: 600px; + } +} diff --git a/site/locale.json b/site/locale.json new file mode 100644 index 0000000000..cc16452ec4 --- /dev/null +++ b/site/locale.json @@ -0,0 +1,18 @@ +{ + "L7 地理空间数据可视分析引擎": "L7 Geospatial Visualization Analysis", + "地理空间数据可视化": "Geospatial Data Visualization Analysis Framework", + "L7 是由蚂蚁金服 AntV 数据可视化团队推出的基于WebGL的开源大规模地理空间数据可视分析开发框架。": "Large-scale WebGL-powered Geospatial data visualization analysis framework", + "架构灵活且自由":"Flexible and Scalable", + "业务专业且通用":"Simple and Universal", + "视觉酷炫且动感":"Cool and Dynamic", + "支持地图底图,渲染引擎,图层自由定制、扩展,组合":"Support many basemap, many rendering engine, and layer free customization, extension, combination", + "以图形符号学地理设计体系理论基础,易用、易理解、专业、专注":"Base on Semiology of Graphics , easy to use, easy to understand, professional, focused", + "支持海量数据,2D、3D,动态,可交互,高性能渲染":"Support multiple basemaps, rendering engines, layers can be customized, expanded and combined freely", + "蚂蚁数据可视化": "AntV", + "继续了解": "More", + "更新": "Update", + "下载使用":"Download", + "浅色色板": "Light Theme", + "深色色板": "Dark Theme", + "一个个真实的地理数据可视化案例,将复杂的地理数据,通过简单,易用的API接口,让用户达到开箱即用的效果。" : "We have summarized a series of story design templates from lots of real geospatial data visualization cases, so that users can use them directly." +} diff --git a/site/pages/index.en.tsx b/site/pages/index.en.tsx new file mode 100644 index 0000000000..4816cd94d3 --- /dev/null +++ b/site/pages/index.en.tsx @@ -0,0 +1,2 @@ +import Index from './index.zh'; +export default Index; diff --git a/site/pages/index.zh.tsx b/site/pages/index.zh.tsx index c4578a2078..81072e05ad 100644 --- a/site/pages/index.zh.tsx +++ b/site/pages/index.zh.tsx @@ -80,7 +80,11 @@ const IndexPage = () => { coverImage={ >>>>>> f40e44f... fix(fix): fix /> } title={t('L7 地理空间数据可视分析引擎')} diff --git a/stories/Animation/Animation.stories.tsx b/stories/Animation/Animation.stories.tsx new file mode 100644 index 0000000000..44b1b9e505 --- /dev/null +++ b/stories/Animation/Animation.stories.tsx @@ -0,0 +1,5 @@ +import { storiesOf } from '@storybook/react'; +import * as React from 'react'; +import Polygon from './components/Polygon'; +// @ts-ignore +storiesOf('动画', module).add('动态更新指定 feature(s)', () => ); diff --git a/stories/Animation/components/Polygon.tsx b/stories/Animation/components/Polygon.tsx new file mode 100644 index 0000000000..3786c27b78 --- /dev/null +++ b/stories/Animation/components/Polygon.tsx @@ -0,0 +1,101 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +function convertRGB2Hex(rgb: number[]) { + return ( + '#' + rgb.map((r) => ('0' + Math.floor(r).toString(16)).slice(-2)).join('') + ); +} + +export default class Mapbox extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + this.scene = scene; + const layer = new PolygonLayer({ + enablePicking: false, + }); + + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.3, + }); + scene.addLayer(layer); + scene.render(); + /*** 运行时修改样式属性 ***/ + const gui = new dat.GUI(); + this.gui = gui; + const styleOptions = { + color: [0, 0, 0], + featureRange: { + startIndex: 0, + endIndex: Infinity, + }, + }; + const pointFolder = gui.addFolder('精确更新 feature'); + pointFolder.add(styleOptions.featureRange, 'startIndex', 0, 100, 1); + pointFolder.add(styleOptions.featureRange, 'endIndex', 0, 100, 1); + pointFolder.addColor(styleOptions, 'color').onChange((color: number[]) => { + layer.color('name', [convertRGB2Hex(color)], { + featureRange: { + startIndex: styleOptions.featureRange.startIndex, + endIndex: styleOptions.featureRange.endIndex, + }, + }); + scene.render(); + }); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/Layers.stories.tsx b/stories/Layers/Layers.stories.tsx new file mode 100644 index 0000000000..1625fe47f2 --- /dev/null +++ b/stories/Layers/Layers.stories.tsx @@ -0,0 +1,27 @@ +import { storiesOf } from '@storybook/react'; +import * as React from 'react'; +import Arc2DLineDemo from './components/Arc2DLine'; +import ArcLineDemo from './components/Arcline'; +import HeatMapDemo from './components/heatMap'; +import GridHeatMap from './components/heatMapgrid'; +import LineLayer from './components/Line'; +import PointDemo from './components/Point'; +import Point3D from './components/Point3D'; +import PointImage from './components/pointImage'; +import Polygon3D from './components/polygon3D'; +import ImageLayerDemo from './components/rasterImage'; +import RasterLayerDemo from './components/RasterLayer'; + +// @ts-ignore +storiesOf('图层', module) + .add('点图层', () => ) + .add('3D点', () => ) + .add('图片标注', () => ) + .add('面3d图层', () => ) + .add('线图层', () => ) + .add('3D弧线', () => ) + .add('2D弧线', () => ) + .add('网格热力图', () => ) + .add('热力图', () => ) + .add('栅格', () => ) + .add('图片', () => ); diff --git a/stories/Layers/components/Arc2DLine.tsx b/stories/Layers/components/Arc2DLine.tsx new file mode 100644 index 0000000000..8629a3f8e8 --- /dev/null +++ b/stories/Layers/components/Arc2DLine.tsx @@ -0,0 +1,56 @@ +import { Arc2DLineLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; + +export default class Arc2DLineDemo extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/rmsportal/UEXQMifxtkQlYfChpPwT.txt', + ); + const scene = new Scene({ + center: [116.2825, 39.9], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/dark-v9', + zoom: 2, + }); + const lineLayer = new Arc2DLineLayer({}) + .source(await response.text(), { + parser: { + type: 'csv', + x: 'lng1', + y: 'lat1', + x1: 'lng2', + y1: 'lat2', + }, + }) + .size(0.5) + .shape('arc') + .color('rgb(13,64,140)'); + scene.addLayer(lineLayer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/components/Arcline.tsx b/stories/Layers/components/Arcline.tsx new file mode 100644 index 0000000000..0ffe2e4439 --- /dev/null +++ b/stories/Layers/components/Arcline.tsx @@ -0,0 +1,56 @@ +import { ArcLineLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; + +export default class ArcLineDemo extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/rmsportal/UEXQMifxtkQlYfChpPwT.txt', + ); + const scene = new Scene({ + center: [116.2825, 39.9], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/dark-v9', + zoom: 2, + }); + const lineLayer = new ArcLineLayer({}) + .source(await response.text(), { + parser: { + type: 'csv', + x: 'lng1', + y: 'lat1', + x1: 'lng2', + y1: 'lat2', + }, + }) + .size(0.5) + .shape('arc') + .color('rgb(13,64,140)'); + scene.addLayer(lineLayer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/components/Line.tsx b/stories/Layers/components/Line.tsx new file mode 100644 index 0000000000..e3542876d2 --- /dev/null +++ b/stories/Layers/components/Line.tsx @@ -0,0 +1,80 @@ +import { LineLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; + +export default class LineDemo extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/rmsportal/ZVfOvhVCzwBkISNsuKCc.json', + ); + const testdata = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + properties: {}, + geometry: { + type: 'LineString', + coordinates: [ + [91.58203125, 34.95799531086792], + [96.767578125, 34.379712580462204], + [99.228515625, 33.7243396617476], + ], + }, + }, + ], + }; + const scene = new Scene({ + center: [102.602992, 23.107329], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/dark-v9', + zoom: 13, + }); + const lineLayer = new LineLayer({}) + .source(await response.json()) + .size(1) + .shape('line') + .color( + 'ELEV', + [ + '#E8FCFF', + '#CFF6FF', + '#A1E9ff', + '#65CEF7', + '#3CB1F0', + '#2894E0', + '#1772c2', + '#105CB3', + '#0D408C', + '#002466', + ].reverse(), + ) + + scene.addLayer(lineLayer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/components/Point.tsx b/stories/Layers/components/Point.tsx new file mode 100644 index 0000000000..303a9217d6 --- /dev/null +++ b/stories/Layers/components/Point.tsx @@ -0,0 +1,81 @@ +import { PointLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; +import data from '../data/data.json'; +export default class Point3D extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public componentDidMount() { + const scene = new Scene({ + center: [120.19382669582967, 30.258134], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + zoom: 1, + }); + const pointLayer = new PointLayer({}); + const p1 = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + properties: {}, + geometry: { + type: 'Point', + coordinates: [83.671875, 44.84029065139799], + }, + }, + ], + }; + pointLayer + .source(data) + .color('name', [ + '#FFF5B8', + '#FFDC7D', + '#FFAB5C', + '#F27049', + '#D42F31', + '#730D1C', + ]) + .shape('subregion',[ + 'circle', + 'triangle', + 'square', + 'pentagon', + 'hexagon', + 'octogon', + 'hexagram', + 'rhombus', + 'vesica', + ]) + .size('scalerank', [5,10]) + .style({ + opacity: 1.0 + }) + ; + scene.addLayer(pointLayer); + console.log(pointLayer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/components/Point3D.tsx b/stories/Layers/components/Point3D.tsx new file mode 100644 index 0000000000..34b8e4315f --- /dev/null +++ b/stories/Layers/components/Point3D.tsx @@ -0,0 +1,59 @@ +import { Point3dLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; +import data from '../data/data.json'; +export default class Point3D extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public componentDidMount() { + const scene = new Scene({ + center: [120.19382669582967, 30.258134], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + zoom: 1, + }); + const pointLayer = new Point3dLayer({}); + const p1 = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + properties: {}, + geometry: { + type: 'Point', + coordinates: [83.671875, 44.84029065139799], + }, + }, + ], + }; + pointLayer + .source(data) + .color('red') + .shape('cylinder') + .size([15, 10]); + scene.addLayer(pointLayer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/components/RasterLayer.tsx b/stories/Layers/components/RasterLayer.tsx new file mode 100644 index 0000000000..e489cdeb2a --- /dev/null +++ b/stories/Layers/components/RasterLayer.tsx @@ -0,0 +1,92 @@ +import { RasterLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +// @ts-ignore +import * as GeoTIFF from 'geotiff/dist/geotiff.bundle.js'; +import * as React from 'react'; + +export default class ImageLayerDemo extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const scene = new Scene({ + center: [121.268, 30.3628], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + zoom: 2, + }); + const tiffdata = await this.getTiffData(); + const layer = new RasterLayer({}); + layer + .source(tiffdata.data, { + parser: { + type: 'raster', + width: tiffdata.width, + height: tiffdata.height, + min: 0, + max: 8000, + extent: [73.482190241, 3.82501784112, 135.106618732, 57.6300459963], + }, + }) + .style({ + opacity: 0.8, + rampColors: { + colors: [ + '#002466', + '#0D408C', + '#105CB3', + '#1A76C7', + '#2894E0', + '#3CB4F0', + '#65CEF7', + '#98E3FA', + '#CFF6FF', + '#E8FCFF', + ], + positions: [0, 0.02, 0.05, 0.1, 0.2, 0.3, 0.5, 0.6, 0.8, 1.0], + }, + }); + scene.addLayer(layer); + console.log(layer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } + private async getTiffData() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/rmsportal/XKgkjjGaAzRyKupCBiYW.dat', + ); + const arrayBuffer = await response.arrayBuffer(); + const tiff = await GeoTIFF.fromArrayBuffer(arrayBuffer); + const image = await tiff.getImage(); + const width = image.getWidth(); + const height = image.getHeight(); + const values = await image.readRasters(); + return { + data: values[0], + width, + height, + min: 0, + max: 8000, + }; + } +} diff --git a/stories/Layers/components/Text.tsx b/stories/Layers/components/Text.tsx new file mode 100644 index 0000000000..00c39467ce --- /dev/null +++ b/stories/Layers/components/Text.tsx @@ -0,0 +1,77 @@ +import { PointLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; +import data from '../data/data.json'; +export default class Point3D extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public componentDidMount() { + const scene = new Scene({ + center: [120.19382669582967, 30.258134], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + zoom: 1, + }); + const pointLayer = new PointLayer({}); + const p1 = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + properties: {}, + geometry: { + type: 'Point', + coordinates: [83.671875, 44.84029065139799], + }, + }, + ], + }; + pointLayer + .source(data) + .color('name', [ + '#FFF5B8', + '#FFDC7D', + '#FFAB5C', + '#F27049', + '#D42F31', + '#730D1C', + ]) + .shape('subregion',[ + 'circle', + 'triangle', + 'square', + 'pentagon', + 'hexagon', + 'octogon', + 'hexagram', + 'rhombus', + 'vesica', + ]) + .size('scalerank', [2, 4, 6, 8, 10]); + scene.addLayer(pointLayer); + console.log(pointLayer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/components/heatMap.tsx b/stories/Layers/components/heatMap.tsx new file mode 100644 index 0000000000..932a838c23 --- /dev/null +++ b/stories/Layers/components/heatMap.tsx @@ -0,0 +1,72 @@ +import { HeatMapLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +// @ts-ignore +import * as React from 'react'; + +export default class HeatMapLayerDemo extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d3564b06-670f-46ea-8edb-842f7010a7c6.json', + ); + const scene = new Scene({ + center: [121.268, 30.3628], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/dark-v10', + zoom: 2, + }); + const layer = new HeatMapLayer({ + enableTAA: false, + }); + layer + .source(await response.json()) + .size('mag', [0, 1]) // weight映射通道 + .style({ + intensity: 2, + radius: 20, + opacity: 0.6, + rampColors: { + colors: [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ], + positions: [0,0.2, 0.4, 0.6, 0.8, 1.0], + }, + }); + scene.addLayer(layer); + console.log(layer); + // requestAnimationFrame(run); + scene.render(); + this.scene = scene; + // function run() { + // scene.render(); + // requestAnimationFrame(run); + // } + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/components/heatMapgrid.tsx b/stories/Layers/components/heatMapgrid.tsx new file mode 100644 index 0000000000..87b94df2c6 --- /dev/null +++ b/stories/Layers/components/heatMapgrid.tsx @@ -0,0 +1,78 @@ +import { HeatmapLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; + +export default class GridHeatMap extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/c3f8bda2-081b-449d-aa9f-9413b779205b.json', + ); + const scene = new Scene({ + center: [116.49434030056, 39.868073421167621], + id: 'map', + pitch: 0, + type: 'amap', + style: 'mapbox://styles/mapbox/streets-v9', + zoom: 16, + }); + const layer = new HeatMapGridLayer({}); + layer + .source(await response.json(), { + parser: { + type: 'json', + x: 'lng', + y: 'lat', + }, + transforms: [ + { + type: 'grid', + size: 50, + field: 'count', + method: 'sum', + }, + ], + }) + .size('sum', (value: number) => { + return value; + }) + .shape('circle') + .style({ + coverage: 0.8, + angle: 0, + }) + .color('count', [ + '#002466', + '#105CB3', + '#2894E0', + '#CFF6FF', + '#FFF5B8', + '#FFAB5C', + '#F27049', + '#730D1C', + ]); + scene.addLayer(layer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/components/pointImage.tsx b/stories/Layers/components/pointImage.tsx new file mode 100644 index 0000000000..1d35687395 --- /dev/null +++ b/stories/Layers/components/pointImage.tsx @@ -0,0 +1,74 @@ +import { PointImageLayer, PointLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; +import data from '../data/data.json'; +export default class PointImage extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/893d1d5f-11d9-45f3-8322-ee9140d288ae.json', + ); + const scene = new Scene({ + center: [121.40, 31.258134], + zoom: 15, + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + }); + scene.addImage( + '00', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*Rq6tQ5b4_JMAAAAAAAAAAABkARQnAQ', + ); + scene.addImage( + '01', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*0D0SQ6AgkRMAAAAAAAAAAABkARQnAQ', + ); + scene.addImage( + '02', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*o16fSIvcKdUAAAAAAAAAAABkARQnAQ', + ); + this.scene = scene; + scene.on('loaded', () => { + run(); + }); + const imageLayer = new PointImageLayer({}) + .source(await response.json(), { + parser: { + type: 'json', + x: 'longitude', + y: 'latitude', + } + }) + .shape('name', ['00', '01', '02']) + .size(60); + scene.addLayer(imageLayer); + + function run() { + scene.render(); + console.log('render'); + requestAnimationFrame(run); + } + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/components/polygon3D.tsx b/stories/Layers/components/polygon3D.tsx new file mode 100644 index 0000000000..852bd170a0 --- /dev/null +++ b/stories/Layers/components/polygon3D.tsx @@ -0,0 +1,76 @@ +// @ts-ignore +import { Polygon3DLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as React from 'react'; + +function convertRGB2Hex(rgb: number[]) { + return ( + '#' + rgb.map((r) => ('0' + Math.floor(r).toString(16)).slice(-2)).join('') + ); +} + +export default class Polygon3D extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + this.scene = scene; + const layer = new Polygon3DLayer({}); + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 1.0, + }); + scene.addLayer(layer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/components/rasterImage.tsx b/stories/Layers/components/rasterImage.tsx new file mode 100644 index 0000000000..330812320a --- /dev/null +++ b/stories/Layers/components/rasterImage.tsx @@ -0,0 +1,50 @@ +import { ImageLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; + +export default class ImageLayerDemo extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public componentDidMount() { + const scene = new Scene({ + center: [121.2680,30.3628], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + zoom: 10, + }); + const layer = new ImageLayer({}); + layer.source( + 'https://gw.alipayobjects.com/zos/rmsportal/FnHFeFklTzKDdUESRNDv.jpg', + { + parser: { + type: 'image', + extent: [121.168, 30.2828, 121.384, 30.4219], + }, + }, + ); + scene.addLayer(layer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Layers/data/data.json b/stories/Layers/data/data.json new file mode 100644 index 0000000000..9a9f830d5c --- /dev/null +++ b/stories/Layers/data/data.json @@ -0,0 +1,4940 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "South West Cape", + "comment": null, + "name_alt": null, + "lat_y": -43.510984, + "long_x": 146.054227, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 146.03379804609568, + -43.5404025683706 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Howe", + "comment": null, + "name_alt": null, + "lat_y": -37.488775, + "long_x": 149.95853, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 149.95838463633373, + -37.48894622188092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Otway", + "comment": null, + "name_alt": null, + "lat_y": -38.857622, + "long_x": 143.565403, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 143.537005108191, + -38.85472383068997 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Jaffa", + "comment": null, + "name_alt": null, + "lat_y": -36.944244, + "long_x": 139.690866, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 139.68061977964746, + -36.95624316107086 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Carnot", + "comment": null, + "name_alt": null, + "lat_y": -34.920233, + "long_x": 135.656027, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 135.65378326897053, + -34.93870859313661 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Byron", + "comment": null, + "name_alt": null, + "lat_y": -28.658282, + "long_x": 153.632849, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 153.62799176015545, + -28.66197417050363 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Manifold", + "comment": null, + "name_alt": null, + "lat_y": -22.702081, + "long_x": 150.811228, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 150.81116783945873, + -22.702080987505923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape York", + "comment": null, + "name_alt": null, + "lat_y": -10.710859, + "long_x": 142.522018, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 142.52173912852123, + -10.710747979693423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Melville", + "comment": null, + "name_alt": null, + "lat_y": -14.163629, + "long_x": 144.506417, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 144.50660240977123, + -14.163506768755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Arnhem", + "comment": null, + "name_alt": null, + "lat_y": -12.337984, + "long_x": 136.952429, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 136.91481885262823, + -12.295662864626316 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "West Cape Howe", + "comment": null, + "name_alt": null, + "lat_y": -35.104301, + "long_x": 117.597011, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 117.59693444102123, + -35.10430266719342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Leeuwin", + "comment": null, + "name_alt": null, + "lat_y": -34.297841, + "long_x": 115.10633, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 115.1280088910596, + -34.328007092559645 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Pasley", + "comment": null, + "name_alt": null, + "lat_y": -33.929054, + "long_x": 123.517283, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 123.51722252695873, + -33.92888762813092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Londonderry", + "comment": null, + "name_alt": null, + "lat_y": -13.713856, + "long_x": 126.964514, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 126.94130045687105, + -13.74290642667802 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Steep Point", + "comment": null, + "name_alt": null, + "lat_y": -26.16822, + "long_x": 113.169959, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 113.14519563289093, + -26.157463616878637 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "North West Cape", + "comment": null, + "name_alt": null, + "lat_y": -21.809776, + "long_x": 114.117534, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 114.16010761213809, + -21.801474697071743 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Lands End", + "comment": null, + "name_alt": null, + "lat_y": 50.069677, + "long_x": -5.668629, + "region": "Europe", + "subregion": "British Isles", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -5.668629523822517, + 50.06970856327533 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Gracias a Dios", + "comment": null, + "name_alt": null, + "lat_y": 14.994242, + "long_x": -83.15866, + "region": "North America", + "subregion": "Central America", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -83.15874182851002, + 14.994208074994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Brewster", + "comment": null, + "name_alt": null, + "lat_y": 70.150754, + "long_x": -22.122616, + "region": "North America", + "subregion": "Greenland", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -22.122731086322517, + 70.15088532108783 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Morris Jesup", + "comment": null, + "name_alt": null, + "lat_y": 83.626331, + "long_x": -32.491541, + "region": "North America", + "subregion": "Greenland", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -32.49150550038502, + 83.62628815311908 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape York", + "comment": null, + "name_alt": null, + "lat_y": 76.218919, + "long_x": -68.218612, + "region": "North America", + "subregion": "Greenland", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -68.21861731679127, + 76.21887848515033 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Nunap Isua", + "comment": null, + "name_alt": "Cape Farewell", + "lat_y": 59.862583, + "long_x": -43.90088, + "region": "North America", + "subregion": "Greenland", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -43.90080725819752, + 59.86267731327533 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Rifstangi", + "comment": null, + "name_alt": null, + "lat_y": 66.530766, + "long_x": -16.126417, + "region": "Europe", + "subregion": "Iceland", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -16.148503201808108, + 66.53076813358783 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Grmsey", + "comment": null, + "name_alt": null, + "lat_y": 66.669359, + "long_x": -18.251096, + "region": "Europe", + "subregion": "Iceland", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -18.251088019916267, + 66.66937897343158 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Surtsey", + "comment": null, + "name_alt": null, + "lat_y": 63.217764, + "long_x": -20.434929, + "region": "Europe", + "subregion": "Iceland", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -20.434803840228767, + 63.21771881718158 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cap Est", + "comment": null, + "name_alt": null, + "lat_y": -15.274849, + "long_x": 50.499889, + "region": "Africa", + "subregion": "Indian Ocean", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 50.49976647227123, + -15.274956964068423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Vohimena", + "comment": null, + "name_alt": null, + "lat_y": -25.546355, + "long_x": 45.158683, + "region": "Africa", + "subregion": "Indian Ocean", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 45.15870201914623, + -25.546319268755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Rodrigues", + "comment": null, + "name_alt": null, + "lat_y": -19.702241, + "long_x": 66.54263, + "region": "Seven seas (open ocean)", + "subregion": "Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 66.54273522227123, + -19.702203057818423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Diego Garcia", + "comment": null, + "name_alt": null, + "lat_y": -19.702241, + "long_x": 66.54263, + "region": "Seven seas (open ocean)", + "subregion": "Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 72.44202721445873, + -7.332207940630923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "I. Clarión", + "comment": null, + "name_alt": null, + "lat_y": 18.345725, + "long_x": -114.749992, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -114.74998938710377, + 18.345770574994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "I. Socorro", + "comment": null, + "name_alt": null, + "lat_y": 18.786694, + "long_x": -110.992912, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -110.99290930897877, + 18.786810614056577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Tikopia", + "comment": null, + "name_alt": null, + "lat_y": -12.28881, + "long_x": 168.833542, + "region": "Oceania", + "subregion": "Melanesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 168.83362877695873, + -12.288750909380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Norfolk I.", + "comment": null, + "name_alt": null, + "lat_y": -29.02416, + "long_x": 167.960052, + "region": "Oceania", + "subregion": "Melanesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 167.96009362070873, + -29.024102471880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Cretin", + "comment": null, + "name_alt": null, + "lat_y": -6.637492, + "long_x": 147.852392, + "region": "Oceania", + "subregion": "Melanesia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 147.85242760508373, + -6.637261651568423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Îles Chesterfield", + "comment": null, + "name_alt": null, + "lat_y": -19.20447, + "long_x": 159.95171, + "region": "Oceania", + "subregion": "Melanesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 159.95167076914623, + -19.204644464068423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Lamotrek", + "comment": null, + "name_alt": null, + "lat_y": 7.509727, + "long_x": 146.333084, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 146.33301842539623, + 7.509711004681577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Kosrae", + "comment": null, + "name_alt": null, + "lat_y": 5.329221, + "long_x": 162.974172, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 162.97413170664623, + 5.329169012494077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Arorea", + "comment": null, + "name_alt": null, + "lat_y": -2.617755, + "long_x": 176.81264, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 176.81263268320873, + -2.617852471880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Pingelap", + "comment": null, + "name_alt": null, + "lat_y": 6.22951, + "long_x": 160.702931, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 160.70289147227123, + 6.229681707806577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Kapingamarangi", + "comment": null, + "name_alt": null, + "lat_y": 1.079429, + "long_x": 154.781328, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 154.78138268320873, + 1.079474188275327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Agrihan", + "comment": null, + "name_alt": null, + "lat_y": 18.777332, + "long_x": 145.670369, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 145.67042076914623, + 18.777411199994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Asuncion", + "comment": null, + "name_alt": null, + "lat_y": 19.688654, + "long_x": 145.40141, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 145.40125573008373, + 19.688666082806577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Wotje", + "comment": null, + "name_alt": null, + "lat_y": 9.451143, + "long_x": 170.012255, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 170.01209557383373, + 9.451300360150327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Bikar", + "comment": null, + "name_alt": null, + "lat_y": 12.243519, + "long_x": 170.120691, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 170.12061608164623, + 12.243597723431577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Pagan", + "comment": null, + "name_alt": null, + "lat_y": 18.119631, + "long_x": 145.785087, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 145.78492272227123, + 18.119635321087827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Wake I.", + "comment": null, + "name_alt": null, + "lat_y": 19.303497, + "long_x": 166.63626, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 166.63624108164623, + 19.303595282025327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Tabiteuea", + "comment": null, + "name_alt": null, + "lat_y": -1.201405, + "long_x": 174.755207, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 174.75513756602123, + -1.201348565630923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Aranuka", + "comment": null, + "name_alt": null, + "lat_y": 0.226766, + "long_x": 173.626286, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 173.62623131602123, + 0.226752020306577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Nauru", + "comment": null, + "name_alt": null, + "lat_y": -0.505856, + "long_x": 166.930778, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 166.93067467539623, + -0.505791925005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ebon", + "comment": null, + "name_alt": null, + "lat_y": 4.59977, + "long_x": 168.736432, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 168.73633873789623, + 4.599798895306577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Jaluit", + "comment": null, + "name_alt": null, + "lat_y": 5.964455, + "long_x": 169.682894, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 169.68299401133373, + 5.964483953900327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Mili", + "comment": null, + "name_alt": null, + "lat_y": 6.107334, + "long_x": 171.725875, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 171.72584069102123, + 6.107489324994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Majuro", + "comment": null, + "name_alt": null, + "lat_y": 7.118009, + "long_x": 171.159743, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 171.15980065195873, + 7.117987371869077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ailinglapalap", + "comment": null, + "name_alt": null, + "lat_y": 7.276392, + "long_x": 168.596926, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 168.59693444102123, + 7.276495672650327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Kwajalein", + "comment": null, + "name_alt": null, + "lat_y": 8.746619, + "long_x": 167.735072, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 167.73511803477123, + 8.746710516400327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Rongelap", + "comment": null, + "name_alt": null, + "lat_y": 11.164329, + "long_x": 166.869876, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 166.86988365977123, + 11.164496160931577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Bikini", + "comment": null, + "name_alt": null, + "lat_y": 11.639231, + "long_x": 165.550698, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 165.55042565195873, + 11.639288641400327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Reinga", + "comment": null, + "name_alt": null, + "lat_y": -34.432767, + "long_x": 172.7285, + "region": "Oceania", + "subregion": "New Zealand", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 172.70558117137455, + -34.42039113947056 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Necker", + "comment": null, + "name_alt": null, + "lat_y": 23.586649, + "long_x": -164.704743, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -164.70470130116627, + 23.586676336712827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Laysan", + "comment": null, + "name_alt": null, + "lat_y": 25.776083, + "long_x": -171.733589, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -171.73363196522877, + 25.776007391400327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Kure Atoll", + "comment": null, + "name_alt": null, + "lat_y": 28.440992, + "long_x": -178.319207, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -178.31920325429127, + 28.440985418744077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Nikumaroro", + "comment": null, + "name_alt": null, + "lat_y": -4.644675, + "long_x": -174.53143, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -174.53142249257252, + -4.644707940630923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Howland I.", + "comment": null, + "name_alt": null, + "lat_y": 0.814266, + "long_x": -176.638313, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -176.63829505116627, + 0.814276434369077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Palmyra Atoll", + "comment": null, + "name_alt": null, + "lat_y": 5.879013, + "long_x": -162.09929, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -162.09923255116627, + 5.879095770306577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Jarvis", + "comment": null, + "name_alt": null, + "lat_y": -0.368919, + "long_x": -160.020814, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -160.02080237538502, + -0.368951104693423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Takutea", + "comment": null, + "name_alt": null, + "lat_y": -19.8026, + "long_x": -158.294405, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -158.29430091054127, + -19.802666925005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Rakahanga", + "comment": null, + "name_alt": null, + "lat_y": -10.022892, + "long_x": -161.081621, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -161.08171546132252, + -10.022881768755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Raroia", + "comment": null, + "name_alt": null, + "lat_y": -16.054416, + "long_x": -142.509609, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -142.50963294179127, + -16.054253839068423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Rapa", + "comment": null, + "name_alt": null, + "lat_y": -27.587603, + "long_x": -144.328315, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -144.32823645741627, + -27.587456964068423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Mangareva", + "comment": null, + "name_alt": null, + "lat_y": -23.102464, + "long_x": -134.985909, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -134.98582923085377, + -23.102593682818423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Henderson I.", + "comment": null, + "name_alt": null, + "lat_y": -24.349847, + "long_x": -128.317479, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -128.31755530507252, + -24.349663995318423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Nanumea", + "comment": null, + "name_alt": null, + "lat_y": -5.67562, + "long_x": 176.137639, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 176.13770592539623, + -5.675591729693423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Niulakita", + "comment": null, + "name_alt": null, + "lat_y": -10.750687, + "long_x": 179.497571, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 179.49756920664623, + -10.750664971880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "The Snares", + "comment": null, + "name_alt": null, + "lat_y": -48.017042, + "long_x": 166.588946, + "region": "Oceania", + "subregion": "New Zealand", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 166.58887780039623, + -48.01690032344342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Kanton", + "comment": null, + "name_alt": null, + "lat_y": -2.757106, + "long_x": -171.71703, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -171.71703040272877, + -2.757134698443423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Tabuaeran", + "comment": null, + "name_alt": "Fanning I.", + "lat_y": 3.866545, + "long_x": -159.326781, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -159.32683264882252, + 3.866705633587827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Malden", + "comment": null, + "name_alt": null, + "lat_y": -4.042491, + "long_x": -154.983478, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -154.98350989491627, + -4.042657159380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Rarotonga", + "comment": null, + "name_alt": null, + "lat_y": -21.201867, + "long_x": -159.797637, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -159.79771887929127, + -21.201836846880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Rangiroa", + "comment": null, + "name_alt": null, + "lat_y": -15.2046, + "long_x": -147.773967, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -147.77403723866627, + -15.204766534380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Funafuti", + "comment": null, + "name_alt": null, + "lat_y": -8.491577, + "long_x": 179.19841, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 179.19837487070873, + -8.491631768755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Vavau", + "comment": null, + "name_alt": null, + "lat_y": -18.590062, + "long_x": -173.976769, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -173.97673499257252, + -18.590020440630923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "I. de Pascua", + "comment": null, + "name_alt": "Easter I.", + "lat_y": -27.102117, + "long_x": -109.367953, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -109.36790930897877, + -27.102227471880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "St. Croix", + "comment": null, + "name_alt": null, + "lat_y": 17.762944, + "long_x": -64.763088, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -64.76317298085377, + 17.763006903119077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Grand Cayman", + "comment": null, + "name_alt": null, + "lat_y": 19.315829, + "long_x": -81.271416, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -81.27159583241627, + 19.315802313275327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "San Salvador", + "comment": null, + "name_alt": null, + "lat_y": 24.052793, + "long_x": -74.492848, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -74.49290930897877, + 24.052801824994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Grenada", + "comment": null, + "name_alt": null, + "lat_y": 12.105978, + "long_x": -61.723079, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.72319495351002, + 12.105963446087827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Barbuda", + "comment": null, + "name_alt": null, + "lat_y": 17.622525, + "long_x": -61.789243, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.78929602772877, + 17.622626043744077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Antigua", + "comment": null, + "name_alt": null, + "lat_y": 17.040441, + "long_x": -61.775982, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.77592932851002, + 17.040594793744077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Guadeloupe", + "comment": null, + "name_alt": null, + "lat_y": 16.180583, + "long_x": -61.656947, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.65703284413502, + 16.180670477337827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Dominica", + "comment": null, + "name_alt": null, + "lat_y": 15.452943, + "long_x": -61.352652, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.35271155507252, + 15.452887274212827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Martinique", + "comment": null, + "name_alt": null, + "lat_y": 14.672462, + "long_x": -61.008715, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.00883948476002, + 14.672491766400327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Saint Lucia", + "comment": null, + "name_alt": null, + "lat_y": 13.918332, + "long_x": -60.982225, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -60.98222815663502, + 13.918280340619077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Saint Vincent", + "comment": null, + "name_alt": null, + "lat_y": 13.270131, + "long_x": -61.207143, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.20720374257252, + 13.270209051556577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Barbados", + "comment": null, + "name_alt": null, + "lat_y": 13.164326, + "long_x": -59.566742, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -59.56682288319752, + 13.164252020306577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Tobago", + "comment": null, + "name_alt": null, + "lat_y": 11.259334, + "long_x": -60.677992, + "region": "South America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -60.67808997304127, + 11.259283758587827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Margarita", + "comment": null, + "name_alt": null, + "lat_y": 10.981467, + "long_x": -64.051401, + "region": "South America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -64.05144202382252, + 10.981512762494077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Curaao", + "comment": null, + "name_alt": null, + "lat_y": 12.185355, + "long_x": -68.999109, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -68.99919593007252, + 12.185309149212827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Aruba", + "comment": null, + "name_alt": null, + "lat_y": 12.502849, + "long_x": -69.96488, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -69.96501624257252, + 12.502752996869077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ra’s Banäs", + "comment": null, + "name_alt": null, + "lat_y": 23.950592, + "long_x": 35.778059, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 35.77808678477123, + 23.950628973431577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta das Salinas", + "comment": null, + "name_alt": null, + "lat_y": -12.832908, + "long_x": 12.928991, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 12.968705086077254, + -12.855718342716505 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta das Palmeirinhas", + "comment": null, + "name_alt": null, + "lat_y": -9.071387, + "long_x": 12.999549, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 13.033811372274608, + -9.099938228394153 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Bojador", + "comment": null, + "name_alt": null, + "lat_y": 26.157836, + "long_x": -14.473111, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -14.473194953510017, + 26.157965399212827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Agulhas", + "comment": null, + "name_alt": null, + "lat_y": -34.801182, + "long_x": 19.993472, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 19.993418816021233, + -34.80108001094342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Gees Gwardafuy", + "comment": null, + "name_alt": null, + "lat_y": 11.812855, + "long_x": 51.235173, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 51.258313644180184, + 11.822028799226407 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Victoria Falls", + "comment": null, + "name_alt": null, + "lat_y": -17.77079, + "long_x": 25.460133, + "region": "Africa", + "subregion": null, + "featureclass": "waterfall" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 25.852793816021233, + -17.928033135943423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Novyy I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -2.811695930072517, + -70.86150481563092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Lyddan I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -20.902027961322517, + -74.11870696406842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Verblyud I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 16.049937370708733, + -69.88189055781842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Coulman I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 169.73536217539623, + -73.50945403438092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Minna Hook", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 167.25318444102123, + -78.63811614375592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Wright I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -116.89262854726002, + -74.06670501094342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Grant I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -131.48540198476002, + -74.48272063594342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Newman I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -145.68681800038502, + -75.59185149531842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Dean I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -127.63438880116627, + -74.50066497188092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Adare", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 170.26734223219574, + -71.33025954578193 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Poinsett", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 113.20496666758373, + -65.78606536250592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Masson I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 96.63392174570873, + -66.15068938594342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Mikhaylov I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 85.60340416758373, + -66.84026458125592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Norvegia", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -12.327320930072517, + -71.37249114375592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Deception I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -60.61430823476002, + -62.95086028438092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Framnes", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -60.59343421132252, + -65.97173430781842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Agassiz", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -62.87468421132252, + -68.45610930781842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Jeremy", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -68.79051673085377, + -69.43328215938092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Comorin", + "comment": null, + "name_alt": null, + "lat_y": 8.143554, + "long_x": 77.471497, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 77.51210506924555, + 8.085338515340696 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Dondra Head", + "comment": null, + "name_alt": null, + "lat_y": 5.947528, + "long_x": 80.616321, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 80.59180925571331, + 5.929580617022318 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Yelizavety", + "comment": null, + "name_alt": null, + "lat_y": 54.416083, + "long_x": 142.720445, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 142.72059166758373, + 54.41620514530658 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Pt. Yuzhnyy", + "comment": null, + "name_alt": null, + "lat_y": 57.733572, + "long_x": 156.796426, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 156.79664147227123, + 57.73346588749408 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Sata", + "comment": null, + "name_alt": null, + "lat_y": 31.026941, + "long_x": 130.695089, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 130.69520104258373, + 31.026922918744077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Aniva", + "comment": null, + "name_alt": null, + "lat_y": 46.081706, + "long_x": 143.43487, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 143.43482506602123, + 46.08179352421283 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Terpeniya", + "comment": null, + "name_alt": null, + "lat_y": 48.66928, + "long_x": 144.712582, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 144.71253502695873, + 48.66937897343158 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Lopatka", + "comment": null, + "name_alt": null, + "lat_y": 50.914155, + "long_x": 156.651536, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 156.65162194102123, + 50.91412994999408 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Ozernoy", + "comment": null, + "name_alt": null, + "lat_y": 57.7708, + "long_x": 163.246685, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 163.24683678477123, + 57.77088043827533 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Olyutorskiy", + "comment": null, + "name_alt": null, + "lat_y": 59.960807, + "long_x": 170.31265, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 170.31287682383373, + 59.96082184452533 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Navarin", + "comment": null, + "name_alt": null, + "lat_y": 62.327239, + "long_x": 179.074225, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 179.07422936289623, + 62.32727692265033 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Lopatka", + "comment": null, + "name_alt": null, + "lat_y": 71.907853, + "long_x": 150.066042, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 150.06592858164623, + 71.90778229374408 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Ince", + "comment": null, + "name_alt": null, + "lat_y": 42.084312, + "long_x": 34.983358, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 34.98328698008373, + 42.08417389530658 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ra’s Fartak", + "comment": null, + "name_alt": null, + "lat_y": 15.677412, + "long_x": 52.229105, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 52.2389696999939, + 15.65795249845498 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ras Sharbatat", + "comment": null, + "name_alt": null, + "lat_y": 18.164534, + "long_x": 56.56827, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 56.558165806017215, + 18.166986171245085 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ra's al Had", + "comment": null, + "name_alt": null, + "lat_y": 22.530158, + "long_x": 59.849134, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 59.7995168175437, + 22.518675327148298 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Hachijjima", + "comment": null, + "name_alt": null, + "lat_y": 33.109796, + "long_x": 139.804903, + "region": "Asia", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 139.80482018320873, + 33.10980866093158 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Plain of Jars", + "comment": null, + "name_alt": null, + "lat_y": 20.550709, + "long_x": 101.890532, + "region": "Asia", + "subregion": null, + "featureclass": "plain" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 101.89063561289623, + 20.550909735150327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Nordkapp", + "comment": null, + "name_alt": null, + "lat_y": 71.18337, + "long_x": 25.662398, + "region": "Europe", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 25.66067519711473, + 71.15450206702127 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo de São Vicentete", + "comment": null, + "name_alt": null, + "lat_y": 37.038304, + "long_x": -8.969391, + "region": "Europe", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -8.969410773822517, + 37.03827545780658 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Fisterra", + "comment": null, + "name_alt": null, + "lat_y": 42.952418, + "long_x": -9.267837, + "region": "Europe", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -9.26996282865152, + 42.92873605781255 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape San Blas", + "comment": null, + "name_alt": null, + "lat_y": 29.713967, + "long_x": -85.270961, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -85.27092444569752, + 29.713995672650327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Sable", + "comment": null, + "name_alt": null, + "lat_y": 43.469097, + "long_x": -65.610769, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -65.61082923085377, + 43.46900055546283 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Bauld", + "comment": null, + "name_alt": null, + "lat_y": 51.568576, + "long_x": -55.430306, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -55.43028723866627, + 51.56848786015033 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Fear", + "comment": null, + "name_alt": null, + "lat_y": 33.867949, + "long_x": -77.990568, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -77.99058997304127, + 33.86798737186908 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "I. Guadalupe", + "comment": null, + "name_alt": null, + "lat_y": 29.052552, + "long_x": -118.317465, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -118.31749426991627, + 29.052496649212827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Miquelon", + "comment": null, + "name_alt": null, + "lat_y": 46.929526, + "long_x": -56.329884, + "region": "North America", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -56.32988440663502, + 46.92938873905658 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cabo Corrientes", + "comment": null, + "name_alt": null, + "lat_y": 20.409471, + "long_x": -105.683581, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -105.67795873874799, + 20.420365114940253 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Pt. Eugenia", + "comment": null, + "name_alt": null, + "lat_y": 27.861925, + "long_x": -115.07629, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -115.04623945046137, + 27.842887092585283 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Point Conception", + "comment": null, + "name_alt": null, + "lat_y": 34.582313, + "long_x": -120.659016, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -120.46360036202867, + 34.46027592467621 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Hatteras", + "comment": null, + "name_alt": null, + "lat_y": 35.437762, + "long_x": -75.450543, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -75.54032952413311, + 35.24475263812895 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Sable", + "comment": null, + "name_alt": null, + "lat_y": 25.124896, + "long_x": -81.090442, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -81.09044348866627, + 25.124762274212827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Hope", + "comment": null, + "name_alt": null, + "lat_y": 68.35638, + "long_x": -166.815582, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -166.81321268769543, + 68.35380207543972 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Point Barrow", + "comment": null, + "name_alt": null, + "lat_y": 71.372637, + "long_x": -156.615894, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -156.4719492091668, + 71.40589128763096 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Canaveral", + "comment": null, + "name_alt": null, + "lat_y": 28.483713, + "long_x": -80.534941, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -80.53625603636821, + 28.473056814472134 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Mendocino", + "comment": null, + "name_alt": null, + "lat_y": 40.350222, + "long_x": -124.323474, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -124.39201745043425, + 40.44222065537283 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cabo San Lucas", + "comment": null, + "name_alt": null, + "lat_y": 22.887711, + "long_x": -109.969843, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -109.96983801991627, + 22.887762762494077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Churchill", + "comment": null, + "name_alt": null, + "lat_y": 58.752014, + "long_x": -93.182023, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -93.18211829335377, + 58.75208161015033 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Cod", + "comment": null, + "name_alt": null, + "lat_y": 41.734867, + "long_x": -69.964865, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -70.03687833567446, + 41.9914589934385 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape May", + "comment": null, + "name_alt": null, + "lat_y": 37.2017, + "long_x": -75.926791, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -74.95121933164988, + 38.92969645987068 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 2, + "name": "Niagara Falls", + "comment": null, + "name_alt": null, + "lat_y": 43.087653, + "long_x": -79.044073, + "region": "North America", + "subregion": null, + "featureclass": "waterfall" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -79.04411780507252, + 43.08771393436908 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "I. Alejandro Selkirk", + "comment": null, + "name_alt": null, + "lat_y": -33.722178, + "long_x": -80.733492, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -80.73350989491627, + -33.72222258906842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "I. San Ambrosio", + "comment": null, + "name_alt": null, + "lat_y": -26.341922, + "long_x": -79.900062, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -79.90001380116627, + -26.341851495318423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "I. Robinson Crusoe", + "comment": null, + "name_alt": null, + "lat_y": -33.589852, + "long_x": -78.872522, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -78.87254798085377, + -33.58965422969342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Orange", + "comment": null, + "name_alt": null, + "lat_y": 4.125735, + "long_x": -51.242144, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -51.26287766987179, + 4.135614177285231 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo de Santa Marta Grande", + "comment": null, + "name_alt": null, + "lat_y": -28.558078, + "long_x": -48.735526, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -48.80338037734664, + -28.57198267323537 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Punta del Este", + "comment": null, + "name_alt": null, + "lat_y": -34.975503, + "long_x": -54.933154, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -54.94628769070382, + -34.96658679840526 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo San Antonio", + "comment": null, + "name_alt": null, + "lat_y": -36.381052, + "long_x": -56.655377, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -56.716792100626165, + -36.40959917438929 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Corrientes", + "comment": null, + "name_alt": null, + "lat_y": -38.135985, + "long_x": -57.546212, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -57.56252349612641, + -38.066376942128464 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Punta Rasa", + "comment": null, + "name_alt": null, + "lat_y": -40.834718, + "long_x": -62.282201, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -62.25911745789756, + -40.72626411656719 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Dos Bahías", + "comment": null, + "name_alt": null, + "lat_y": -44.9887, + "long_x": -65.615952, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -65.5438334451688, + -44.89439847091873 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Punta Negra", + "comment": null, + "name_alt": null, + "lat_y": -5.948875, + "long_x": -81.108252, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -81.10832678944752, + -5.948663018755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Punta Lavapié", + "comment": null, + "name_alt": null, + "lat_y": -37.262867, + "long_x": -73.606377, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -73.60304396243782, + -37.17120002933805 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cabo de Hornos", + "comment": null, + "name_alt": "Cape Horn", + "lat_y": -55.862824, + "long_x": -67.169425, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -67.16942298085377, + -55.86284758906842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 2, + "name": "Salto Angel", + "comment": null, + "name_alt": "Angel Falls", + "lat_y": 5.686836, + "long_x": -62.061848, + "region": "South America", + "subregion": null, + "featureclass": "waterfall" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -62.06181800038502, + 5.686896063275327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 2, + "name": "Iguazu Falls", + "comment": null, + "name_alt": null, + "lat_y": -25.568265, + "long_x": -54.582842, + "region": "South America", + "subregion": null, + "featureclass": "waterfall" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -54.58299719960377, + -25.568291925005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Clipperton I.", + "comment": null, + "name_alt": null, + "lat_y": 10.309933, + "long_x": -109.213284, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -109.2295822833424, + 10.304020508304784 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Île Amsterdam", + "comment": null, + "name_alt": null, + "lat_y": -19.702241, + "long_x": 66.54263, + "region": "Seven seas (open ocean)", + "subregion": "South Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 77.53467858164623, + -37.85796477656842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Île Amsterdam", + "comment": null, + "name_alt": null, + "lat_y": -19.702241, + "long_x": 66.54263, + "region": "Seven seas (open ocean)", + "subregion": "South Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 77.52552330820873, + -38.72014739375592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Île Europa", + "comment": null, + "name_alt": null, + "lat_y": -22.837936, + "long_x": 40.192423, + "region": "Africa", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 40.19239342539623, + -22.837945245318423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Annobón", + "comment": null, + "name_alt": null, + "lat_y": -1.429572, + "long_x": 5.621149, + "region": "Africa", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 5.621104362896233, + -1.429620050005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Ascension", + "comment": null, + "name_alt": null, + "lat_y": -7.925105, + "long_x": -14.362648, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -14.362721320697517, + -7.925225518755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Tristan da Cunha", + "comment": null, + "name_alt": null, + "lat_y": -35.278715, + "long_x": -17.932071, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island group" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -12.265431281635017, + -37.07024505000592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Gough I.", + "comment": null, + "name_alt": null, + "lat_y": -35.278715, + "long_x": -17.932071, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -9.967213508197517, + -40.34014251094342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Bouvet I.", + "comment": null, + "name_alt": null, + "lat_y": -35.278715, + "long_x": -17.932071, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 3.409922722271233, + -54.41655852656842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Colbeck", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -158.25767981679127, + -77.11113860469342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Is. de Fernando de Noronha", + "comment": null, + "name_alt": null, + "lat_y": -3.849881, + "long_x": -32.417053, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -32.41704260976002, + -3.849908135943423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cocos Is.", + "comment": null, + "name_alt": null, + "lat_y": -12.158465, + "long_x": 96.828369, + "region": "Seven seas (open ocean)", + "subregion": "Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 96.82837975352123, + -12.158257745318423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Christmas I.", + "comment": null, + "name_alt": null, + "lat_y": -10.472542, + "long_x": 105.667155, + "region": "Seven seas (open ocean)", + "subregion": "Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 105.66712487070873, + -10.472588800005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Campbell I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 169.12012780039623, + -52.51043059688092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Macquarie I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Seven seas (open ocean)", + "subregion": "South Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 158.89600670664623, + -54.60979583125592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Darnley", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 69.61109459727123, + -67.77349212031842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Ann", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 51.40809166758373, + -66.16106536250592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Peter I I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": "Southern Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -90.56822669179127, + -68.76604583125592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Antipodes Islands", + "comment": null, + "name_alt": null, + "lat_y": -49.649273, + "long_x": 178.773056, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 178.77295983164623, + -49.64934661250592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Bounty Is.", + "comment": null, + "name_alt": null, + "lat_y": -47.688207, + "long_x": 178.89656, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 178.89661705820873, + -47.68828704219342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Balls Pyramid", + "comment": null, + "name_alt": null, + "lat_y": -31.826904, + "long_x": 159.158463, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 159.15833580820873, + -31.826958917193423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Lord Howe I.", + "comment": null, + "name_alt": null, + "lat_y": -31.542569, + "long_x": 159.069307, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 159.06922448008373, + -31.542535089068423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "St. Helena", + "comment": null, + "name_alt": null, + "lat_y": -15.950901, + "long_x": -5.705161, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -5.705128547260017, + -15.950860284380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "I. del Coco", + "comment": null, + "name_alt": null, + "lat_y": 5.539857, + "long_x": -87.092227, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -87.09221350819752, + 5.539923407025327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Sable I.", + "comment": null, + "name_alt": null, + "lat_y": 43.930893, + "long_x": -59.91953, + "region": "Seven seas (open ocean)", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -59.91960608632252, + 43.93097565311908 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Delgado", + "comment": null, + "name_alt": null, + "lat_y": -10.670103, + "long_x": 40.624309, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 40.62440026133373, + -10.670098565630923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta da Barra", + "comment": null, + "name_alt": null, + "lat_y": -23.829888, + "long_x": 35.515696, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 35.51563561289623, + -23.830010675005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta São Sebastio", + "comment": null, + "name_alt": null, + "lat_y": -22.118899, + "long_x": 35.480417, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 35.48023522227123, + -22.118829034380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ras Cantin", + "comment": null, + "name_alt": null, + "lat_y": 32.581636, + "long_x": -9.273918, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -9.273915168353767, + 32.58161041874408 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ra’s Kasr", + "comment": null, + "name_alt": null, + "lat_y": 18.076817, + "long_x": 38.573746, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 38.58027735871919, + 18.075167704493374 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta de Jericoacoara", + "comment": null, + "name_alt": null, + "lat_y": -2.85044, + "long_x": -40.067208, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -39.991649927946355, + -2.851822991583529 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo de São Roque", + "comment": null, + "name_alt": null, + "lat_y": -5.193476, + "long_x": -35.447654, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -35.50994900651512, + -5.156866121305913 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta da Baleia", + "comment": null, + "name_alt": null, + "lat_y": -17.710136, + "long_x": -39.157619, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -39.14557867836578, + -17.678753845220847 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo de São Tomé", + "comment": null, + "name_alt": null, + "lat_y": -21.996382, + "long_x": -41.009692, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -40.98763990313761, + -21.971754611783773 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Frio", + "comment": null, + "name_alt": null, + "lat_y": -22.869501, + "long_x": -41.962188, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -41.89015627474056, + -22.759730815669258 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo San Diego", + "comment": null, + "name_alt": null, + "lat_y": -54.6406, + "long_x": -65.21365, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -65.21361243397877, + -54.64067962031842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Tres Puntas", + "comment": null, + "name_alt": null, + "lat_y": -47.237629, + "long_x": -65.774707, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -65.74439816328368, + -47.328778975372465 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cap Saint André", + "comment": null, + "name_alt": null, + "lat_y": -16.174457, + "long_x": 44.467405, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 44.46729576914623, + -16.174493096880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape St. Lucia", + "comment": null, + "name_alt": null, + "lat_y": -28.552694, + "long_x": 32.367221, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 32.36732018320873, + -28.552666925005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape St. Francis", + "comment": null, + "name_alt": null, + "lat_y": -34.171766, + "long_x": 24.817688, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 24.84143613032799, + -34.18861022316314 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Minamitori-shima", + "comment": null, + "name_alt": "Marcus I.", + "lat_y": 24.319813, + "long_x": 153.958899, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 153.95887291758373, + 24.319769598431577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Is. Martin Vaz", + "comment": null, + "name_alt": null, + "lat_y": -20.559422, + "long_x": -29.338439, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -29.338429328510017, + -20.559502862505923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Rockall", + "comment": null, + "name_alt": null, + "lat_y": 58.163524, + "long_x": -12.408715, + "region": "Seven seas (open ocean)", + "subregion": "North Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -12.408741828510017, + 58.16339752811908 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "I. de Cozumel", + "comment": null, + "name_alt": null, + "lat_y": 20.444687, + "long_x": -86.880555, + "region": "North America", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -86.88060462147877, + 20.444708563275327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Bermuda Islands", + "comment": null, + "name_alt": null, + "lat_y": 32.317339, + "long_x": -64.742895, + "region": "Seven seas (open ocean)", + "subregion": "North Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -64.74290930897877, + 32.31726715702533 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Punta Galera", + "comment": null, + "name_alt": null, + "lat_y": 0.731221, + "long_x": -80.062205, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -80.06212317616627, + 0.731207586712827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cap Lopez", + "comment": null, + "name_alt": null, + "lat_y": -0.604761, + "long_x": 8.726423, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 8.727299789450319, + -0.615086490513119 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Bobaomby", + "comment": null, + "name_alt": null, + "lat_y": -11.966598, + "long_x": 49.262904, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 49.26282799570873, + -11.966485284380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cap Blanc", + "comment": null, + "name_alt": null, + "lat_y": 20.822108, + "long_x": -17.052856, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -17.052906867572517, + 20.822088934369077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape of Good Hope", + "comment": null, + "name_alt": null, + "lat_y": -34.307311, + "long_x": 18.441206, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 18.441294792583733, + -34.30718352656842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Palmas", + "comment": null, + "name_alt": null, + "lat_y": 4.373924, + "long_x": -7.457356, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -7.457386848041267, + 4.373968817181577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Verde", + "comment": null, + "name_alt": null, + "lat_y": 14.732312, + "long_x": -17.471776, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -17.471730109760017, + 14.732489324994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cap Bon", + "comment": null, + "name_alt": null, + "lat_y": 37.073954, + "long_x": 11.024061, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 11.024180534771233, + 37.07398102421283 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Oceanic pole of inaccessibility", + "comment": null, + "name_alt": null, + "lat_y": -48.865032, + "long_x": -123.401986, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "pole" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -123.40202796132252, + -48.86504485469342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "South Magnetic Pole 2005 (est)", + "comment": null, + "name_alt": null, + "lat_y": -48.865032, + "long_x": -123.401986, + "region": "Antarctica", + "subregion": "Southern Ocean", + "featureclass": "pole" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 137.85425865977123, + -64.51824309688092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "North Magnetic Pole 2005 (est)", + "comment": null, + "name_alt": null, + "lat_y": -48.865032, + "long_x": -123.401986, + "region": "Seven seas (open ocean)", + "subregion": "Arctic Ocean", + "featureclass": "pole" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -114.40569007069752, + 82.71008942265033 + ] + } + } + ] +} \ No newline at end of file diff --git a/stories/MapAdaptor/Map.md b/stories/MapAdaptor/Map.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/stories/MapAdaptor/Map.stories.tsx b/stories/MapAdaptor/Map.stories.tsx new file mode 100644 index 0000000000..6571687bec --- /dev/null +++ b/stories/MapAdaptor/Map.stories.tsx @@ -0,0 +1,26 @@ +import { storiesOf } from '@storybook/react'; +import * as React from 'react'; +import AMap from './components/AMap'; +import Mapbox from './components/Mapbox'; +// import Polygon from './components/Polygon'; +// import Point3D from './components/Point3D'; +// import Line from './components/Line'; +// import ImageLayer from './components/Image'; +// import GridHeatMap from './components/GridHeatmap'; +// import PointImage from './components/pointImage'; +// @ts-ignore +import notes from './Map.md'; +// @ts-ignore +storiesOf('地图底图', module) + .add('高德地图', () => , { + notes: { markdown: notes }, + }) + .add('Mapbox', () => , { + notes: { markdown: notes }, + }); +// .add('Polygon', () => ); +// .add('Point3D', () => ) +// .add('Line', () => ) +// .add('GridHeatMap', () => ) +// .add('Image', () => ) +// .add('pointImage', () => ); diff --git a/stories/MapAdaptor/components/AMap.tsx b/stories/MapAdaptor/components/AMap.tsx new file mode 100644 index 0000000000..c66ca5f408 --- /dev/null +++ b/stories/MapAdaptor/components/AMap.tsx @@ -0,0 +1,62 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as React from 'react'; + +export default class AMap extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + center: [110.19382669582967, 50.258134], + id: 'map', + pitch: 0, + style: 'dark', + type: 'amap', + zoom: 3, + }); + const layer = new PolygonLayer({}); + + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + scene.addLayer(layer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MapAdaptor/components/GridHeatmap.tsx b/stories/MapAdaptor/components/GridHeatmap.tsx new file mode 100644 index 0000000000..69ca5a9d42 --- /dev/null +++ b/stories/MapAdaptor/components/GridHeatmap.tsx @@ -0,0 +1,78 @@ +import { HeatMapLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; + +export default class GridHeatMap extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/c3f8bda2-081b-449d-aa9f-9413b779205b.json', + ); + const scene = new Scene({ + center: [116.49434030056, 39.868073421167621], + id: 'map', + pitch: 0, + type: 'amap', + style: 'mapbox://styles/mapbox/streets-v9', + zoom: 16, + }); + const layer = new HeatMapLayer({}); + layer + .source(await response.json(), { + parser: { + type: 'json', + x: 'lng', + y: 'lat', + }, + transforms: [ + { + type: 'grid', + size: 50, + field: 'count', + method: 'sum', + }, + ], + }) + .size('sum', (value: number) => { + return value; + }) + .shape('circle') + .style({ + coverage: 0.5, + angle: 0, + opacity: 1, + }) + .color('count', [ + '#002466', + '#105CB3', + '#2894E0', + '#CFF6FF', + '#FFF5B8', + '#FFAB5C', + '#F27049', + '#730D1C', + ]); + scene.addLayer(layer); + scene.render(); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MapAdaptor/components/Image.tsx b/stories/MapAdaptor/components/Image.tsx new file mode 100644 index 0000000000..abe2bdb95c --- /dev/null +++ b/stories/MapAdaptor/components/Image.tsx @@ -0,0 +1,50 @@ +import { ImageLayer } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; + +export default class ImageLayerDemo extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public componentDidMount() { + const scene = new Scene({ + center: [121.2680, 30.3628], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + zoom: 10, + }); + const layer = new ImageLayer({}); + layer.source( + 'https://gw.alipayobjects.com/zos/rmsportal/FnHFeFklTzKDdUESRNDv.jpg', + { + parser: { + type: 'image', + extent: [121.168, 30.2828, 121.384, 30.4219], + }, + }, + ); + // scene.addLayer(layer); + scene.render(); + console.log(scene); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MapAdaptor/components/Line.tsx b/stories/MapAdaptor/components/Line.tsx new file mode 100644 index 0000000000..590a119418 --- /dev/null +++ b/stories/MapAdaptor/components/Line.tsx @@ -0,0 +1,87 @@ +import { Line } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; + +export default class Point3D extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/rmsportal/ZVfOvhVCzwBkISNsuKCc.json', + ); + const testdata = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + properties: {}, + geometry: { + type: 'LineString', + coordinates: [ + [91.58203125, 34.95799531086792], + [96.767578125, 34.379712580462204], + [99.228515625, 33.7243396617476], + ], + }, + }, + ], + }; + const scene = new Scene({ + center: [102.602992, 23.107329], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/dark-v9', + zoom: 13, + }); + const LineLayer = new Line({}); + + LineLayer.source(await response.json()) + .size(1) + .shape('line') + .color( + 'ELEV', + [ + '#E8FCFF', + '#CFF6FF', + '#A1E9ff', + '#65CEF7', + '#3CB1F0', + '#2894E0', + '#1772c2', + '#105CB3', + '#0D408C', + '#002466', + ].reverse(), + ) + .render(); + scene.addLayer(LineLayer); + // function run() { + // scene.render(); + // requestAnimationFrame(run); + // } + // requestAnimationFrame(run); + scene.render(); + this.scene = scene; + console.log(LineLayer); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MapAdaptor/components/Mapbox.tsx b/stories/MapAdaptor/components/Mapbox.tsx new file mode 100644 index 0000000000..ec32ba3d5e --- /dev/null +++ b/stories/MapAdaptor/components/Mapbox.tsx @@ -0,0 +1,85 @@ +// @ts-ignore +import '!style-loader!css-loader!./css/l7.css'; +import { Marker, Popup, Scale, Zoom } from '@l7/component'; +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as React from 'react'; + +export default class Mapbox extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 30.258134], + pitch: 0, + zoom: 3, + }); + this.scene = scene; + const layer = new PolygonLayer({}); + + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', () => { + return 'yellow'; + }) + .shape('fill') + .style({ + opacity: 0.8, + }); + scene.addLayer(layer); + scene.render(); + scene.on('loaded', () => { + const zoomControl = new Zoom({ + position: 'bottomright', + }); + const scaleControl = new Scale(); + const popup = new Popup({ + offsets: [0, 20], + }) + .setLnglat({ + lng: 120.19382669582967, + lat: 30.258134, + }) + .setText('hello') + .addTo(scene); + + const maker = new Marker(); + maker + .setLnglat({ + lng: 120.19382669582967, + lat: 30.258134, + }) + .addTo(scene); + scene.addControl(zoomControl); + scene.addControl(scaleControl); + // layer.fitBounds(); + }); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MapAdaptor/components/Point3D.tsx b/stories/MapAdaptor/components/Point3D.tsx new file mode 100644 index 0000000000..bbe2a407e7 --- /dev/null +++ b/stories/MapAdaptor/components/Point3D.tsx @@ -0,0 +1,64 @@ +import { Point } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; +import data from './data.json'; + +export default class Point3D extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public componentDidMount() { + const scene = new Scene({ + center: [120.19382669582967, 30.258134], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + zoom: 1, + }); + scene.addImage( + '00', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*kzTMQqS2QdUAAAAAAAAAAABkARQnAQ', + ); + const pointLayer = new Point({}); + const p1 = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + properties: {}, + geometry: { + type: 'Point', + coordinates: [83.671875, 44.84029065139799], + }, + }, + ], + }; + pointLayer + .source(data) + .color('blue') + .shape('scalerank', [ 'triangleColumn', 'squareColumn', 'hexagonColumn' ,'cylinder' ]) + .size([25, 10]); + scene.addLayer(pointLayer); + scene.render(); + + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MapAdaptor/components/Polygon.tsx b/stories/MapAdaptor/components/Polygon.tsx new file mode 100644 index 0000000000..c44abc5a70 --- /dev/null +++ b/stories/MapAdaptor/components/Polygon.tsx @@ -0,0 +1,100 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +function convertRGB2Hex(rgb: number[]) { + return ( + '#' + rgb.map((r) => ('0' + Math.floor(r).toString(16)).slice(-2)).join('') + ); +} + +export default class Mapbox extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + this.scene = scene; + const layer = new PolygonLayer({}); + + // TODO: new GeoJSONSource() + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.2, + }); + scene.addLayer(layer); + scene.render(); + /*** 运行时修改样式属性 ***/ + const gui = new dat.GUI(); + this.gui = gui; + const styleOptions = { + color: [0, 0, 0], + featureRange: { + startIndex: 0, + endIndex: Infinity, + }, + }; + const pointFolder = gui.addFolder('精确更新 feature'); + pointFolder.add(styleOptions.featureRange, 'startIndex', 0, 100, 1); + pointFolder.add(styleOptions.featureRange, 'endIndex', 0, 100, 1); + pointFolder.addColor(styleOptions, 'color').onChange((color: number[]) => { + layer.color('name', [convertRGB2Hex(color)], { + featureRange: { + startIndex: styleOptions.featureRange.startIndex, + endIndex: styleOptions.featureRange.endIndex, + }, + }); + scene.render(); + }); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MapAdaptor/components/css/l7.css b/stories/MapAdaptor/components/css/l7.css new file mode 100644 index 0000000000..1d573ca53b --- /dev/null +++ b/stories/MapAdaptor/components/css/l7.css @@ -0,0 +1,400 @@ +.l7-marker { + position: absolute !important; + top: 0; + left: 0; + z-index: 5; +} +.l7-popup-anchor-top, +.l7-popup-anchor-top-left, +.l7-popup-anchor-top-right { + -webkit-flex-direction: column; + flex-direction: column; +} + +.l7-popup-anchor-bottom, +.l7-popup-anchor-bottom-left, +.l7-popup-anchor-bottom-right { + -webkit-flex-direction: column-reverse; + flex-direction: column-reverse; +} + +.l7-popup-anchor-left { + -webkit-flex-direction: row; + flex-direction: row; +} + +.l7-popup-anchor-right { + -webkit-flex-direction: row-reverse; + flex-direction: row-reverse; +} +.l7-popup { + position: absolute; + top: 0; + left: 0; + display: -webkit-flex; + display: flex; + will-change: transform; + pointer-events: none; + z-index: 5; +} +.l7-popup-tip { + width: 0; + height: 0; + border: 10px solid transparent; + z-index: 1; +} +.l7-popup-anchor-top .l7-popup-tip { + -webkit-align-self: center; + align-self: center; + border-top: none; + border-bottom-color: #fff; +} + +.l7-popup-anchor-top-left .l7-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-top: none; + border-left: none; + border-bottom-color: #fff; +} + +.l7-popup-anchor-top-right .l7-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-top: none; + border-right: none; + border-bottom-color: #fff; +} + +.l7-popup-anchor-bottom .l7-popup-tip { + -webkit-align-self: center; + align-self: center; + border-bottom: none; + border-top-color: #fff; +} + +.l7-popup-anchor-bottom-left .l7-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-bottom: none; + border-left: none; + border-top-color: #fff; +} + +.l7-popup-anchor-bottom-right .l7-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-bottom: none; + border-right: none; + border-top-color: #fff; +} + +.l7-popup-anchor-left .l7-popup-tip { + -webkit-align-self: center; + align-self: center; + border-left: none; + border-right-color: #fff; +} + +.l7-popup-anchor-right .l7-popup-tip { + -webkit-align-self: center; + align-self: center; + border-right: none; + border-left-color: #fff; +} + +.l7-popup-close-button { + position: absolute; + right: 0; + top: 0; + border: 0; + padding: 0; + font-size: 25px; + line-height: 20px; + border-radius: 0 3px 0 0; + cursor: pointer; + background-color: transparent; +} + +.l7-popup-close-button:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.l7-popup-content { + position: relative; + background: #fff; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + padding: 10px 10px 15px; + pointer-events: auto; +} + +.l7-popup-anchor-top-left .l7-popup-content { + border-top-left-radius: 0; +} + +.l7-popup-anchor-top-right .l7-popup-content { + border-top-right-radius: 0; +} + +.l7-popup-anchor-bottom-left .l7-popup-content { + border-bottom-left-radius: 0; +} + +.l7-popup-anchor-bottom-right .l7-popup-content { + border-bottom-right-radius: 0; +} + +.l7-popup-track-pointer { + display: none; +} + +.l7-popup-track-pointer * { + pointer-events: none; + user-select: none; +} + +.l7-map:hover .l7-popup-track-pointer { + display: flex; +} + +.l7-map:active .l7-popup-track-pointer { + display: none; +} + +.l7-popup-close-button { + position: absolute; + right: 0; + top: 0; + border: 0; + border-radius: 0 3px 0 0; + cursor: pointer; + background-color: transparent; +} + +.l7-popup-close-button:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.l7-popup-content { + position: relative; + background: #fff; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + padding: 10px 10px 15px; + pointer-events: auto; +} + +/* general toolbar styles */ + +.l7-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.l7-bar a, +.l7-bar a:hover { + background-color: #fff; + width: 36px; + height: 36px; + line-height: 30px; + font-size: 30px; + display: block; + text-align: center; + text-decoration: none; + color: #8E9DAB; + } +.l7-bar a, +.l7-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.l7-bar a:hover { + background-color: #f4f4f4; + } +.l7-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } +.l7-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; + } +.l7-bar a.l7-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } + + +/* control positioning */ + +.l7-control-container { + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; +} +.l7-control-hide { + display: none; +} +.l7-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } +.l7-top, +.l7-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.l7-top { + top: 0; + } +.l7-right { + right: 0; + } +.l7-bottom { + bottom: 0; + } +.l7-left { + left: 0; + } +.l7-control { + float: left; + clear: both; + } +.l7-right .l7-control { + float: right; + } +.l7-top .l7-control { + margin-top: 10px; + } +.l7-bottom .l7-control { + margin-bottom: 10px; + } +.l7-left .l7-control { + margin-left: 10px; + } +.l7-right .l7-control { + margin-right: 10px; + } + + /* attribution and scale controls */ + +.l7-control-container .l7-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.7); + margin: 0; + } +.l7-control-attribution, +.l7-control-scale-line { + padding: 0 5px; + color: #333; + } +.l7-control-attribution a { + text-decoration: none; + } +.l7-control-attribution a:hover { + text-decoration: underline; + } +.l7-container .l7-control-attribution, +.l7-container .l7-control-scale { + font-size: 11px; + padding: 5px 5px 2px 5px; + background: rgba(255, 255, 255, 0.7); + } +.l7-left .l7-control-scale { + margin-left: 5px; + } +.l7-bottom .l7-control-scale { + margin-bottom: 5px; + } +.l7-control-scale-line { + border: 2px solid #8E9DAB; + border-top: none; + color: #8e9dab; + line-height: 1.1; + padding: 2px 5px 1px; + font-size: 11px; + white-space: nowrap; + overflow: hidden; + -moz-box-sizing: border-box; + box-sizing: border-box; + + background: #fff; + background: rgba(255, 255, 255, 0.8); + } +.l7-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + } +.l7-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.l7-touch .l7-control-attribution, +.l7-touch .l7-control-layers, +.l7-touch .l7-bar { + box-shadow: none; + } +.l7-touch .l7-control-layers, +.l7-touch .l7-bar { + border: 2px solid rgba(0,0,0,0.2); + background-clip: padding-box; + } + + + /* layers control */ + +.l7-control-layers { + box-shadow: 0 1px 5px rgba(0,0,0,0.4); + background: #fff; + border-radius: 5px; + } +.l7-control-layers-toggle { + background-image: url(../images/layers.svg); + width: 36px; + height: 36px; + } +.l7-retina .l7-control-layers-toggle { + background-image: url(../images/layers.svg); + background-size: 26px 26px; + } +.l7-touch .l7-control-layers-toggle { + width: 44px; + height: 44px; + } +.l7-control-layers .l7-control-layers-list, +.l7-control-layers-expanded .l7-control-layers-toggle { + display: none; + } +.l7-control-layers-expanded .l7-control-layers-list { + display: block; + position: relative; + } +.l7-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.l7-control-layers-scrollbar { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 5px; + } +.l7-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.l7-control-layers label { + display: block; + } +.l7-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + diff --git a/stories/MapAdaptor/components/data.json b/stories/MapAdaptor/components/data.json new file mode 100644 index 0000000000..9a9f830d5c --- /dev/null +++ b/stories/MapAdaptor/components/data.json @@ -0,0 +1,4940 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "South West Cape", + "comment": null, + "name_alt": null, + "lat_y": -43.510984, + "long_x": 146.054227, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 146.03379804609568, + -43.5404025683706 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Howe", + "comment": null, + "name_alt": null, + "lat_y": -37.488775, + "long_x": 149.95853, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 149.95838463633373, + -37.48894622188092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Otway", + "comment": null, + "name_alt": null, + "lat_y": -38.857622, + "long_x": 143.565403, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 143.537005108191, + -38.85472383068997 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Jaffa", + "comment": null, + "name_alt": null, + "lat_y": -36.944244, + "long_x": 139.690866, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 139.68061977964746, + -36.95624316107086 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Carnot", + "comment": null, + "name_alt": null, + "lat_y": -34.920233, + "long_x": 135.656027, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 135.65378326897053, + -34.93870859313661 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Byron", + "comment": null, + "name_alt": null, + "lat_y": -28.658282, + "long_x": 153.632849, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 153.62799176015545, + -28.66197417050363 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Manifold", + "comment": null, + "name_alt": null, + "lat_y": -22.702081, + "long_x": 150.811228, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 150.81116783945873, + -22.702080987505923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape York", + "comment": null, + "name_alt": null, + "lat_y": -10.710859, + "long_x": 142.522018, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 142.52173912852123, + -10.710747979693423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Melville", + "comment": null, + "name_alt": null, + "lat_y": -14.163629, + "long_x": 144.506417, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 144.50660240977123, + -14.163506768755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Arnhem", + "comment": null, + "name_alt": null, + "lat_y": -12.337984, + "long_x": 136.952429, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 136.91481885262823, + -12.295662864626316 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "West Cape Howe", + "comment": null, + "name_alt": null, + "lat_y": -35.104301, + "long_x": 117.597011, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 117.59693444102123, + -35.10430266719342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Leeuwin", + "comment": null, + "name_alt": null, + "lat_y": -34.297841, + "long_x": 115.10633, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 115.1280088910596, + -34.328007092559645 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Pasley", + "comment": null, + "name_alt": null, + "lat_y": -33.929054, + "long_x": 123.517283, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 123.51722252695873, + -33.92888762813092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Londonderry", + "comment": null, + "name_alt": null, + "lat_y": -13.713856, + "long_x": 126.964514, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 126.94130045687105, + -13.74290642667802 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Steep Point", + "comment": null, + "name_alt": null, + "lat_y": -26.16822, + "long_x": 113.169959, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 113.14519563289093, + -26.157463616878637 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "North West Cape", + "comment": null, + "name_alt": null, + "lat_y": -21.809776, + "long_x": 114.117534, + "region": "Oceania", + "subregion": "Australia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 114.16010761213809, + -21.801474697071743 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Lands End", + "comment": null, + "name_alt": null, + "lat_y": 50.069677, + "long_x": -5.668629, + "region": "Europe", + "subregion": "British Isles", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -5.668629523822517, + 50.06970856327533 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Gracias a Dios", + "comment": null, + "name_alt": null, + "lat_y": 14.994242, + "long_x": -83.15866, + "region": "North America", + "subregion": "Central America", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -83.15874182851002, + 14.994208074994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Brewster", + "comment": null, + "name_alt": null, + "lat_y": 70.150754, + "long_x": -22.122616, + "region": "North America", + "subregion": "Greenland", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -22.122731086322517, + 70.15088532108783 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Morris Jesup", + "comment": null, + "name_alt": null, + "lat_y": 83.626331, + "long_x": -32.491541, + "region": "North America", + "subregion": "Greenland", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -32.49150550038502, + 83.62628815311908 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape York", + "comment": null, + "name_alt": null, + "lat_y": 76.218919, + "long_x": -68.218612, + "region": "North America", + "subregion": "Greenland", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -68.21861731679127, + 76.21887848515033 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Nunap Isua", + "comment": null, + "name_alt": "Cape Farewell", + "lat_y": 59.862583, + "long_x": -43.90088, + "region": "North America", + "subregion": "Greenland", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -43.90080725819752, + 59.86267731327533 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Rifstangi", + "comment": null, + "name_alt": null, + "lat_y": 66.530766, + "long_x": -16.126417, + "region": "Europe", + "subregion": "Iceland", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -16.148503201808108, + 66.53076813358783 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Grmsey", + "comment": null, + "name_alt": null, + "lat_y": 66.669359, + "long_x": -18.251096, + "region": "Europe", + "subregion": "Iceland", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -18.251088019916267, + 66.66937897343158 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Surtsey", + "comment": null, + "name_alt": null, + "lat_y": 63.217764, + "long_x": -20.434929, + "region": "Europe", + "subregion": "Iceland", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -20.434803840228767, + 63.21771881718158 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cap Est", + "comment": null, + "name_alt": null, + "lat_y": -15.274849, + "long_x": 50.499889, + "region": "Africa", + "subregion": "Indian Ocean", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 50.49976647227123, + -15.274956964068423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Vohimena", + "comment": null, + "name_alt": null, + "lat_y": -25.546355, + "long_x": 45.158683, + "region": "Africa", + "subregion": "Indian Ocean", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 45.15870201914623, + -25.546319268755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Rodrigues", + "comment": null, + "name_alt": null, + "lat_y": -19.702241, + "long_x": 66.54263, + "region": "Seven seas (open ocean)", + "subregion": "Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 66.54273522227123, + -19.702203057818423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Diego Garcia", + "comment": null, + "name_alt": null, + "lat_y": -19.702241, + "long_x": 66.54263, + "region": "Seven seas (open ocean)", + "subregion": "Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 72.44202721445873, + -7.332207940630923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "I. Clarión", + "comment": null, + "name_alt": null, + "lat_y": 18.345725, + "long_x": -114.749992, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -114.74998938710377, + 18.345770574994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "I. Socorro", + "comment": null, + "name_alt": null, + "lat_y": 18.786694, + "long_x": -110.992912, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -110.99290930897877, + 18.786810614056577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Tikopia", + "comment": null, + "name_alt": null, + "lat_y": -12.28881, + "long_x": 168.833542, + "region": "Oceania", + "subregion": "Melanesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 168.83362877695873, + -12.288750909380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Norfolk I.", + "comment": null, + "name_alt": null, + "lat_y": -29.02416, + "long_x": 167.960052, + "region": "Oceania", + "subregion": "Melanesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 167.96009362070873, + -29.024102471880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Cretin", + "comment": null, + "name_alt": null, + "lat_y": -6.637492, + "long_x": 147.852392, + "region": "Oceania", + "subregion": "Melanesia", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 147.85242760508373, + -6.637261651568423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Îles Chesterfield", + "comment": null, + "name_alt": null, + "lat_y": -19.20447, + "long_x": 159.95171, + "region": "Oceania", + "subregion": "Melanesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 159.95167076914623, + -19.204644464068423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Lamotrek", + "comment": null, + "name_alt": null, + "lat_y": 7.509727, + "long_x": 146.333084, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 146.33301842539623, + 7.509711004681577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Kosrae", + "comment": null, + "name_alt": null, + "lat_y": 5.329221, + "long_x": 162.974172, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 162.97413170664623, + 5.329169012494077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Arorea", + "comment": null, + "name_alt": null, + "lat_y": -2.617755, + "long_x": 176.81264, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 176.81263268320873, + -2.617852471880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Pingelap", + "comment": null, + "name_alt": null, + "lat_y": 6.22951, + "long_x": 160.702931, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 160.70289147227123, + 6.229681707806577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Kapingamarangi", + "comment": null, + "name_alt": null, + "lat_y": 1.079429, + "long_x": 154.781328, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 154.78138268320873, + 1.079474188275327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Agrihan", + "comment": null, + "name_alt": null, + "lat_y": 18.777332, + "long_x": 145.670369, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 145.67042076914623, + 18.777411199994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Asuncion", + "comment": null, + "name_alt": null, + "lat_y": 19.688654, + "long_x": 145.40141, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 145.40125573008373, + 19.688666082806577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Wotje", + "comment": null, + "name_alt": null, + "lat_y": 9.451143, + "long_x": 170.012255, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 170.01209557383373, + 9.451300360150327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Bikar", + "comment": null, + "name_alt": null, + "lat_y": 12.243519, + "long_x": 170.120691, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 170.12061608164623, + 12.243597723431577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Pagan", + "comment": null, + "name_alt": null, + "lat_y": 18.119631, + "long_x": 145.785087, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 145.78492272227123, + 18.119635321087827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Wake I.", + "comment": null, + "name_alt": null, + "lat_y": 19.303497, + "long_x": 166.63626, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 166.63624108164623, + 19.303595282025327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Tabiteuea", + "comment": null, + "name_alt": null, + "lat_y": -1.201405, + "long_x": 174.755207, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 174.75513756602123, + -1.201348565630923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Aranuka", + "comment": null, + "name_alt": null, + "lat_y": 0.226766, + "long_x": 173.626286, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 173.62623131602123, + 0.226752020306577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Nauru", + "comment": null, + "name_alt": null, + "lat_y": -0.505856, + "long_x": 166.930778, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 166.93067467539623, + -0.505791925005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ebon", + "comment": null, + "name_alt": null, + "lat_y": 4.59977, + "long_x": 168.736432, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 168.73633873789623, + 4.599798895306577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Jaluit", + "comment": null, + "name_alt": null, + "lat_y": 5.964455, + "long_x": 169.682894, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 169.68299401133373, + 5.964483953900327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Mili", + "comment": null, + "name_alt": null, + "lat_y": 6.107334, + "long_x": 171.725875, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 171.72584069102123, + 6.107489324994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Majuro", + "comment": null, + "name_alt": null, + "lat_y": 7.118009, + "long_x": 171.159743, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 171.15980065195873, + 7.117987371869077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ailinglapalap", + "comment": null, + "name_alt": null, + "lat_y": 7.276392, + "long_x": 168.596926, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 168.59693444102123, + 7.276495672650327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Kwajalein", + "comment": null, + "name_alt": null, + "lat_y": 8.746619, + "long_x": 167.735072, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 167.73511803477123, + 8.746710516400327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Rongelap", + "comment": null, + "name_alt": null, + "lat_y": 11.164329, + "long_x": 166.869876, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 166.86988365977123, + 11.164496160931577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Bikini", + "comment": null, + "name_alt": null, + "lat_y": 11.639231, + "long_x": 165.550698, + "region": "Oceania", + "subregion": "Micronesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 165.55042565195873, + 11.639288641400327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Reinga", + "comment": null, + "name_alt": null, + "lat_y": -34.432767, + "long_x": 172.7285, + "region": "Oceania", + "subregion": "New Zealand", + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 172.70558117137455, + -34.42039113947056 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Necker", + "comment": null, + "name_alt": null, + "lat_y": 23.586649, + "long_x": -164.704743, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -164.70470130116627, + 23.586676336712827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Laysan", + "comment": null, + "name_alt": null, + "lat_y": 25.776083, + "long_x": -171.733589, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -171.73363196522877, + 25.776007391400327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Kure Atoll", + "comment": null, + "name_alt": null, + "lat_y": 28.440992, + "long_x": -178.319207, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -178.31920325429127, + 28.440985418744077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Nikumaroro", + "comment": null, + "name_alt": null, + "lat_y": -4.644675, + "long_x": -174.53143, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -174.53142249257252, + -4.644707940630923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Howland I.", + "comment": null, + "name_alt": null, + "lat_y": 0.814266, + "long_x": -176.638313, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -176.63829505116627, + 0.814276434369077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Palmyra Atoll", + "comment": null, + "name_alt": null, + "lat_y": 5.879013, + "long_x": -162.09929, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -162.09923255116627, + 5.879095770306577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Jarvis", + "comment": null, + "name_alt": null, + "lat_y": -0.368919, + "long_x": -160.020814, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -160.02080237538502, + -0.368951104693423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Takutea", + "comment": null, + "name_alt": null, + "lat_y": -19.8026, + "long_x": -158.294405, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -158.29430091054127, + -19.802666925005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Rakahanga", + "comment": null, + "name_alt": null, + "lat_y": -10.022892, + "long_x": -161.081621, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -161.08171546132252, + -10.022881768755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Raroia", + "comment": null, + "name_alt": null, + "lat_y": -16.054416, + "long_x": -142.509609, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -142.50963294179127, + -16.054253839068423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Rapa", + "comment": null, + "name_alt": null, + "lat_y": -27.587603, + "long_x": -144.328315, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -144.32823645741627, + -27.587456964068423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Mangareva", + "comment": null, + "name_alt": null, + "lat_y": -23.102464, + "long_x": -134.985909, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -134.98582923085377, + -23.102593682818423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Henderson I.", + "comment": null, + "name_alt": null, + "lat_y": -24.349847, + "long_x": -128.317479, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -128.31755530507252, + -24.349663995318423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Nanumea", + "comment": null, + "name_alt": null, + "lat_y": -5.67562, + "long_x": 176.137639, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 176.13770592539623, + -5.675591729693423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Niulakita", + "comment": null, + "name_alt": null, + "lat_y": -10.750687, + "long_x": 179.497571, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 179.49756920664623, + -10.750664971880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "The Snares", + "comment": null, + "name_alt": null, + "lat_y": -48.017042, + "long_x": 166.588946, + "region": "Oceania", + "subregion": "New Zealand", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 166.58887780039623, + -48.01690032344342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Kanton", + "comment": null, + "name_alt": null, + "lat_y": -2.757106, + "long_x": -171.71703, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -171.71703040272877, + -2.757134698443423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Tabuaeran", + "comment": null, + "name_alt": "Fanning I.", + "lat_y": 3.866545, + "long_x": -159.326781, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -159.32683264882252, + 3.866705633587827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Malden", + "comment": null, + "name_alt": null, + "lat_y": -4.042491, + "long_x": -154.983478, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -154.98350989491627, + -4.042657159380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Rarotonga", + "comment": null, + "name_alt": null, + "lat_y": -21.201867, + "long_x": -159.797637, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -159.79771887929127, + -21.201836846880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Rangiroa", + "comment": null, + "name_alt": null, + "lat_y": -15.2046, + "long_x": -147.773967, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -147.77403723866627, + -15.204766534380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Funafuti", + "comment": null, + "name_alt": null, + "lat_y": -8.491577, + "long_x": 179.19841, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 179.19837487070873, + -8.491631768755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Vavau", + "comment": null, + "name_alt": null, + "lat_y": -18.590062, + "long_x": -173.976769, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -173.97673499257252, + -18.590020440630923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "I. de Pascua", + "comment": null, + "name_alt": "Easter I.", + "lat_y": -27.102117, + "long_x": -109.367953, + "region": "Oceania", + "subregion": "Polynesia", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -109.36790930897877, + -27.102227471880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "St. Croix", + "comment": null, + "name_alt": null, + "lat_y": 17.762944, + "long_x": -64.763088, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -64.76317298085377, + 17.763006903119077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Grand Cayman", + "comment": null, + "name_alt": null, + "lat_y": 19.315829, + "long_x": -81.271416, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -81.27159583241627, + 19.315802313275327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "San Salvador", + "comment": null, + "name_alt": null, + "lat_y": 24.052793, + "long_x": -74.492848, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -74.49290930897877, + 24.052801824994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Grenada", + "comment": null, + "name_alt": null, + "lat_y": 12.105978, + "long_x": -61.723079, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.72319495351002, + 12.105963446087827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Barbuda", + "comment": null, + "name_alt": null, + "lat_y": 17.622525, + "long_x": -61.789243, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.78929602772877, + 17.622626043744077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Antigua", + "comment": null, + "name_alt": null, + "lat_y": 17.040441, + "long_x": -61.775982, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.77592932851002, + 17.040594793744077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Guadeloupe", + "comment": null, + "name_alt": null, + "lat_y": 16.180583, + "long_x": -61.656947, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.65703284413502, + 16.180670477337827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Dominica", + "comment": null, + "name_alt": null, + "lat_y": 15.452943, + "long_x": -61.352652, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.35271155507252, + 15.452887274212827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Martinique", + "comment": null, + "name_alt": null, + "lat_y": 14.672462, + "long_x": -61.008715, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.00883948476002, + 14.672491766400327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Saint Lucia", + "comment": null, + "name_alt": null, + "lat_y": 13.918332, + "long_x": -60.982225, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -60.98222815663502, + 13.918280340619077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Saint Vincent", + "comment": null, + "name_alt": null, + "lat_y": 13.270131, + "long_x": -61.207143, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -61.20720374257252, + 13.270209051556577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Barbados", + "comment": null, + "name_alt": null, + "lat_y": 13.164326, + "long_x": -59.566742, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -59.56682288319752, + 13.164252020306577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Tobago", + "comment": null, + "name_alt": null, + "lat_y": 11.259334, + "long_x": -60.677992, + "region": "South America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -60.67808997304127, + 11.259283758587827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Margarita", + "comment": null, + "name_alt": null, + "lat_y": 10.981467, + "long_x": -64.051401, + "region": "South America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -64.05144202382252, + 10.981512762494077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Curaao", + "comment": null, + "name_alt": null, + "lat_y": 12.185355, + "long_x": -68.999109, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -68.99919593007252, + 12.185309149212827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Aruba", + "comment": null, + "name_alt": null, + "lat_y": 12.502849, + "long_x": -69.96488, + "region": "North America", + "subregion": "West Indies", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -69.96501624257252, + 12.502752996869077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ra’s Banäs", + "comment": null, + "name_alt": null, + "lat_y": 23.950592, + "long_x": 35.778059, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 35.77808678477123, + 23.950628973431577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta das Salinas", + "comment": null, + "name_alt": null, + "lat_y": -12.832908, + "long_x": 12.928991, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 12.968705086077254, + -12.855718342716505 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta das Palmeirinhas", + "comment": null, + "name_alt": null, + "lat_y": -9.071387, + "long_x": 12.999549, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 13.033811372274608, + -9.099938228394153 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Bojador", + "comment": null, + "name_alt": null, + "lat_y": 26.157836, + "long_x": -14.473111, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -14.473194953510017, + 26.157965399212827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Agulhas", + "comment": null, + "name_alt": null, + "lat_y": -34.801182, + "long_x": 19.993472, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 19.993418816021233, + -34.80108001094342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Gees Gwardafuy", + "comment": null, + "name_alt": null, + "lat_y": 11.812855, + "long_x": 51.235173, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 51.258313644180184, + 11.822028799226407 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Victoria Falls", + "comment": null, + "name_alt": null, + "lat_y": -17.77079, + "long_x": 25.460133, + "region": "Africa", + "subregion": null, + "featureclass": "waterfall" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 25.852793816021233, + -17.928033135943423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Novyy I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -2.811695930072517, + -70.86150481563092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Lyddan I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -20.902027961322517, + -74.11870696406842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Verblyud I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 16.049937370708733, + -69.88189055781842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Coulman I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 169.73536217539623, + -73.50945403438092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Minna Hook", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 167.25318444102123, + -78.63811614375592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Wright I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -116.89262854726002, + -74.06670501094342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Grant I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -131.48540198476002, + -74.48272063594342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Newman I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -145.68681800038502, + -75.59185149531842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Dean I.", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -127.63438880116627, + -74.50066497188092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Adare", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 170.26734223219574, + -71.33025954578193 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Poinsett", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 113.20496666758373, + -65.78606536250592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Masson I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 96.63392174570873, + -66.15068938594342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Mikhaylov I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 85.60340416758373, + -66.84026458125592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Norvegia", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -12.327320930072517, + -71.37249114375592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Deception I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -60.61430823476002, + -62.95086028438092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Framnes", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -60.59343421132252, + -65.97173430781842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Agassiz", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -62.87468421132252, + -68.45610930781842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Jeremy", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -68.79051673085377, + -69.43328215938092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Comorin", + "comment": null, + "name_alt": null, + "lat_y": 8.143554, + "long_x": 77.471497, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 77.51210506924555, + 8.085338515340696 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Dondra Head", + "comment": null, + "name_alt": null, + "lat_y": 5.947528, + "long_x": 80.616321, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 80.59180925571331, + 5.929580617022318 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Yelizavety", + "comment": null, + "name_alt": null, + "lat_y": 54.416083, + "long_x": 142.720445, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 142.72059166758373, + 54.41620514530658 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Pt. Yuzhnyy", + "comment": null, + "name_alt": null, + "lat_y": 57.733572, + "long_x": 156.796426, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 156.79664147227123, + 57.73346588749408 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Sata", + "comment": null, + "name_alt": null, + "lat_y": 31.026941, + "long_x": 130.695089, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 130.69520104258373, + 31.026922918744077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Aniva", + "comment": null, + "name_alt": null, + "lat_y": 46.081706, + "long_x": 143.43487, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 143.43482506602123, + 46.08179352421283 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Terpeniya", + "comment": null, + "name_alt": null, + "lat_y": 48.66928, + "long_x": 144.712582, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 144.71253502695873, + 48.66937897343158 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Lopatka", + "comment": null, + "name_alt": null, + "lat_y": 50.914155, + "long_x": 156.651536, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 156.65162194102123, + 50.91412994999408 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Ozernoy", + "comment": null, + "name_alt": null, + "lat_y": 57.7708, + "long_x": 163.246685, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 163.24683678477123, + 57.77088043827533 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Olyutorskiy", + "comment": null, + "name_alt": null, + "lat_y": 59.960807, + "long_x": 170.31265, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 170.31287682383373, + 59.96082184452533 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Navarin", + "comment": null, + "name_alt": null, + "lat_y": 62.327239, + "long_x": 179.074225, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 179.07422936289623, + 62.32727692265033 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Lopatka", + "comment": null, + "name_alt": null, + "lat_y": 71.907853, + "long_x": 150.066042, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 150.06592858164623, + 71.90778229374408 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Ince", + "comment": null, + "name_alt": null, + "lat_y": 42.084312, + "long_x": 34.983358, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 34.98328698008373, + 42.08417389530658 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ra’s Fartak", + "comment": null, + "name_alt": null, + "lat_y": 15.677412, + "long_x": 52.229105, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 52.2389696999939, + 15.65795249845498 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ras Sharbatat", + "comment": null, + "name_alt": null, + "lat_y": 18.164534, + "long_x": 56.56827, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 56.558165806017215, + 18.166986171245085 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ra's al Had", + "comment": null, + "name_alt": null, + "lat_y": 22.530158, + "long_x": 59.849134, + "region": "Asia", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 59.7995168175437, + 22.518675327148298 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Hachijjima", + "comment": null, + "name_alt": null, + "lat_y": 33.109796, + "long_x": 139.804903, + "region": "Asia", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 139.80482018320873, + 33.10980866093158 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Plain of Jars", + "comment": null, + "name_alt": null, + "lat_y": 20.550709, + "long_x": 101.890532, + "region": "Asia", + "subregion": null, + "featureclass": "plain" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 101.89063561289623, + 20.550909735150327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Nordkapp", + "comment": null, + "name_alt": null, + "lat_y": 71.18337, + "long_x": 25.662398, + "region": "Europe", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 25.66067519711473, + 71.15450206702127 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo de São Vicentete", + "comment": null, + "name_alt": null, + "lat_y": 37.038304, + "long_x": -8.969391, + "region": "Europe", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -8.969410773822517, + 37.03827545780658 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Fisterra", + "comment": null, + "name_alt": null, + "lat_y": 42.952418, + "long_x": -9.267837, + "region": "Europe", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -9.26996282865152, + 42.92873605781255 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape San Blas", + "comment": null, + "name_alt": null, + "lat_y": 29.713967, + "long_x": -85.270961, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -85.27092444569752, + 29.713995672650327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Sable", + "comment": null, + "name_alt": null, + "lat_y": 43.469097, + "long_x": -65.610769, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -65.61082923085377, + 43.46900055546283 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Bauld", + "comment": null, + "name_alt": null, + "lat_y": 51.568576, + "long_x": -55.430306, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -55.43028723866627, + 51.56848786015033 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape Fear", + "comment": null, + "name_alt": null, + "lat_y": 33.867949, + "long_x": -77.990568, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -77.99058997304127, + 33.86798737186908 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "I. Guadalupe", + "comment": null, + "name_alt": null, + "lat_y": 29.052552, + "long_x": -118.317465, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -118.31749426991627, + 29.052496649212827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Miquelon", + "comment": null, + "name_alt": null, + "lat_y": 46.929526, + "long_x": -56.329884, + "region": "North America", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -56.32988440663502, + 46.92938873905658 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cabo Corrientes", + "comment": null, + "name_alt": null, + "lat_y": 20.409471, + "long_x": -105.683581, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -105.67795873874799, + 20.420365114940253 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Pt. Eugenia", + "comment": null, + "name_alt": null, + "lat_y": 27.861925, + "long_x": -115.07629, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -115.04623945046137, + 27.842887092585283 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Point Conception", + "comment": null, + "name_alt": null, + "lat_y": 34.582313, + "long_x": -120.659016, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -120.46360036202867, + 34.46027592467621 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Hatteras", + "comment": null, + "name_alt": null, + "lat_y": 35.437762, + "long_x": -75.450543, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -75.54032952413311, + 35.24475263812895 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Sable", + "comment": null, + "name_alt": null, + "lat_y": 25.124896, + "long_x": -81.090442, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -81.09044348866627, + 25.124762274212827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Hope", + "comment": null, + "name_alt": null, + "lat_y": 68.35638, + "long_x": -166.815582, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -166.81321268769543, + 68.35380207543972 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Point Barrow", + "comment": null, + "name_alt": null, + "lat_y": 71.372637, + "long_x": -156.615894, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -156.4719492091668, + 71.40589128763096 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Canaveral", + "comment": null, + "name_alt": null, + "lat_y": 28.483713, + "long_x": -80.534941, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -80.53625603636821, + 28.473056814472134 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Mendocino", + "comment": null, + "name_alt": null, + "lat_y": 40.350222, + "long_x": -124.323474, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -124.39201745043425, + 40.44222065537283 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cabo San Lucas", + "comment": null, + "name_alt": null, + "lat_y": 22.887711, + "long_x": -109.969843, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -109.96983801991627, + 22.887762762494077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Churchill", + "comment": null, + "name_alt": null, + "lat_y": 58.752014, + "long_x": -93.182023, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -93.18211829335377, + 58.75208161015033 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Cod", + "comment": null, + "name_alt": null, + "lat_y": 41.734867, + "long_x": -69.964865, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -70.03687833567446, + 41.9914589934385 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape May", + "comment": null, + "name_alt": null, + "lat_y": 37.2017, + "long_x": -75.926791, + "region": "North America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -74.95121933164988, + 38.92969645987068 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 2, + "name": "Niagara Falls", + "comment": null, + "name_alt": null, + "lat_y": 43.087653, + "long_x": -79.044073, + "region": "North America", + "subregion": null, + "featureclass": "waterfall" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -79.04411780507252, + 43.08771393436908 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "I. Alejandro Selkirk", + "comment": null, + "name_alt": null, + "lat_y": -33.722178, + "long_x": -80.733492, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -80.73350989491627, + -33.72222258906842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "I. San Ambrosio", + "comment": null, + "name_alt": null, + "lat_y": -26.341922, + "long_x": -79.900062, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -79.90001380116627, + -26.341851495318423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "I. Robinson Crusoe", + "comment": null, + "name_alt": null, + "lat_y": -33.589852, + "long_x": -78.872522, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -78.87254798085377, + -33.58965422969342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Orange", + "comment": null, + "name_alt": null, + "lat_y": 4.125735, + "long_x": -51.242144, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -51.26287766987179, + 4.135614177285231 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo de Santa Marta Grande", + "comment": null, + "name_alt": null, + "lat_y": -28.558078, + "long_x": -48.735526, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -48.80338037734664, + -28.57198267323537 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Punta del Este", + "comment": null, + "name_alt": null, + "lat_y": -34.975503, + "long_x": -54.933154, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -54.94628769070382, + -34.96658679840526 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo San Antonio", + "comment": null, + "name_alt": null, + "lat_y": -36.381052, + "long_x": -56.655377, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -56.716792100626165, + -36.40959917438929 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Corrientes", + "comment": null, + "name_alt": null, + "lat_y": -38.135985, + "long_x": -57.546212, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -57.56252349612641, + -38.066376942128464 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Punta Rasa", + "comment": null, + "name_alt": null, + "lat_y": -40.834718, + "long_x": -62.282201, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -62.25911745789756, + -40.72626411656719 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Dos Bahías", + "comment": null, + "name_alt": null, + "lat_y": -44.9887, + "long_x": -65.615952, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -65.5438334451688, + -44.89439847091873 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Punta Negra", + "comment": null, + "name_alt": null, + "lat_y": -5.948875, + "long_x": -81.108252, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -81.10832678944752, + -5.948663018755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Punta Lavapié", + "comment": null, + "name_alt": null, + "lat_y": -37.262867, + "long_x": -73.606377, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -73.60304396243782, + -37.17120002933805 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cabo de Hornos", + "comment": null, + "name_alt": "Cape Horn", + "lat_y": -55.862824, + "long_x": -67.169425, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -67.16942298085377, + -55.86284758906842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 2, + "name": "Salto Angel", + "comment": null, + "name_alt": "Angel Falls", + "lat_y": 5.686836, + "long_x": -62.061848, + "region": "South America", + "subregion": null, + "featureclass": "waterfall" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -62.06181800038502, + 5.686896063275327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 2, + "name": "Iguazu Falls", + "comment": null, + "name_alt": null, + "lat_y": -25.568265, + "long_x": -54.582842, + "region": "South America", + "subregion": null, + "featureclass": "waterfall" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -54.58299719960377, + -25.568291925005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Clipperton I.", + "comment": null, + "name_alt": null, + "lat_y": 10.309933, + "long_x": -109.213284, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -109.2295822833424, + 10.304020508304784 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Île Amsterdam", + "comment": null, + "name_alt": null, + "lat_y": -19.702241, + "long_x": 66.54263, + "region": "Seven seas (open ocean)", + "subregion": "South Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 77.53467858164623, + -37.85796477656842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Île Amsterdam", + "comment": null, + "name_alt": null, + "lat_y": -19.702241, + "long_x": 66.54263, + "region": "Seven seas (open ocean)", + "subregion": "South Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 77.52552330820873, + -38.72014739375592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Île Europa", + "comment": null, + "name_alt": null, + "lat_y": -22.837936, + "long_x": 40.192423, + "region": "Africa", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 40.19239342539623, + -22.837945245318423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Annobón", + "comment": null, + "name_alt": null, + "lat_y": -1.429572, + "long_x": 5.621149, + "region": "Africa", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 5.621104362896233, + -1.429620050005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Ascension", + "comment": null, + "name_alt": null, + "lat_y": -7.925105, + "long_x": -14.362648, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -14.362721320697517, + -7.925225518755923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Tristan da Cunha", + "comment": null, + "name_alt": null, + "lat_y": -35.278715, + "long_x": -17.932071, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island group" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -12.265431281635017, + -37.07024505000592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Gough I.", + "comment": null, + "name_alt": null, + "lat_y": -35.278715, + "long_x": -17.932071, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -9.967213508197517, + -40.34014251094342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 7, + "name": "Bouvet I.", + "comment": null, + "name_alt": null, + "lat_y": -35.278715, + "long_x": -17.932071, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 3.409922722271233, + -54.41655852656842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Colbeck", + "comment": null, + "name_alt": null, + "lat_y": -50.959168, + "long_x": -72.995002, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -158.25767981679127, + -77.11113860469342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Is. de Fernando de Noronha", + "comment": null, + "name_alt": null, + "lat_y": -3.849881, + "long_x": -32.417053, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -32.41704260976002, + -3.849908135943423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cocos Is.", + "comment": null, + "name_alt": null, + "lat_y": -12.158465, + "long_x": 96.828369, + "region": "Seven seas (open ocean)", + "subregion": "Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 96.82837975352123, + -12.158257745318423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Christmas I.", + "comment": null, + "name_alt": null, + "lat_y": -10.472542, + "long_x": 105.667155, + "region": "Seven seas (open ocean)", + "subregion": "Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 105.66712487070873, + -10.472588800005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Campbell I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 169.12012780039623, + -52.51043059688092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Macquarie I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Seven seas (open ocean)", + "subregion": "South Indian Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 158.89600670664623, + -54.60979583125592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Darnley", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 69.61109459727123, + -67.77349212031842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Cape Ann", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 51.40809166758373, + -66.16106536250592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Peter I I.", + "comment": null, + "name_alt": null, + "lat_y": -52.510412, + "long_x": 169.120166, + "region": "Antarctica", + "subregion": "Southern Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -90.56822669179127, + -68.76604583125592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Antipodes Islands", + "comment": null, + "name_alt": null, + "lat_y": -49.649273, + "long_x": 178.773056, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 178.77295983164623, + -49.64934661250592 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Bounty Is.", + "comment": null, + "name_alt": null, + "lat_y": -47.688207, + "long_x": 178.89656, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 178.89661705820873, + -47.68828704219342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Balls Pyramid", + "comment": null, + "name_alt": null, + "lat_y": -31.826904, + "long_x": 159.158463, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 159.15833580820873, + -31.826958917193423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Lord Howe I.", + "comment": null, + "name_alt": null, + "lat_y": -31.542569, + "long_x": 159.069307, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 159.06922448008373, + -31.542535089068423 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "St. Helena", + "comment": null, + "name_alt": null, + "lat_y": -15.950901, + "long_x": -5.705161, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -5.705128547260017, + -15.950860284380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "I. del Coco", + "comment": null, + "name_alt": null, + "lat_y": 5.539857, + "long_x": -87.092227, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -87.09221350819752, + 5.539923407025327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 6, + "name": "Sable I.", + "comment": null, + "name_alt": null, + "lat_y": 43.930893, + "long_x": -59.91953, + "region": "Seven seas (open ocean)", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -59.91960608632252, + 43.93097565311908 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Delgado", + "comment": null, + "name_alt": null, + "lat_y": -10.670103, + "long_x": 40.624309, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 40.62440026133373, + -10.670098565630923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta da Barra", + "comment": null, + "name_alt": null, + "lat_y": -23.829888, + "long_x": 35.515696, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 35.51563561289623, + -23.830010675005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta São Sebastio", + "comment": null, + "name_alt": null, + "lat_y": -22.118899, + "long_x": 35.480417, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 35.48023522227123, + -22.118829034380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ras Cantin", + "comment": null, + "name_alt": null, + "lat_y": 32.581636, + "long_x": -9.273918, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -9.273915168353767, + 32.58161041874408 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ra’s Kasr", + "comment": null, + "name_alt": null, + "lat_y": 18.076817, + "long_x": 38.573746, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 38.58027735871919, + 18.075167704493374 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta de Jericoacoara", + "comment": null, + "name_alt": null, + "lat_y": -2.85044, + "long_x": -40.067208, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -39.991649927946355, + -2.851822991583529 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo de São Roque", + "comment": null, + "name_alt": null, + "lat_y": -5.193476, + "long_x": -35.447654, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -35.50994900651512, + -5.156866121305913 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Ponta da Baleia", + "comment": null, + "name_alt": null, + "lat_y": -17.710136, + "long_x": -39.157619, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -39.14557867836578, + -17.678753845220847 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo de São Tomé", + "comment": null, + "name_alt": null, + "lat_y": -21.996382, + "long_x": -41.009692, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -40.98763990313761, + -21.971754611783773 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Frio", + "comment": null, + "name_alt": null, + "lat_y": -22.869501, + "long_x": -41.962188, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -41.89015627474056, + -22.759730815669258 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo San Diego", + "comment": null, + "name_alt": null, + "lat_y": -54.6406, + "long_x": -65.21365, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -65.21361243397877, + -54.64067962031842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cabo Tres Puntas", + "comment": null, + "name_alt": null, + "lat_y": -47.237629, + "long_x": -65.774707, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -65.74439816328368, + -47.328778975372465 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cap Saint André", + "comment": null, + "name_alt": null, + "lat_y": -16.174457, + "long_x": 44.467405, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 44.46729576914623, + -16.174493096880923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape St. Lucia", + "comment": null, + "name_alt": null, + "lat_y": -28.552694, + "long_x": 32.367221, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 32.36732018320873, + -28.552666925005923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Cape St. Francis", + "comment": null, + "name_alt": null, + "lat_y": -34.171766, + "long_x": 24.817688, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 24.84143613032799, + -34.18861022316314 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Minamitori-shima", + "comment": null, + "name_alt": "Marcus I.", + "lat_y": 24.319813, + "long_x": 153.958899, + "region": "Seven seas (open ocean)", + "subregion": "North Pacific Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 153.95887291758373, + 24.319769598431577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Is. Martin Vaz", + "comment": null, + "name_alt": null, + "lat_y": -20.559422, + "long_x": -29.338439, + "region": "Seven seas (open ocean)", + "subregion": "Southern Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -29.338429328510017, + -20.559502862505923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Rockall", + "comment": null, + "name_alt": null, + "lat_y": 58.163524, + "long_x": -12.408715, + "region": "Seven seas (open ocean)", + "subregion": "North Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -12.408741828510017, + 58.16339752811908 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "I. de Cozumel", + "comment": null, + "name_alt": null, + "lat_y": 20.444687, + "long_x": -86.880555, + "region": "North America", + "subregion": null, + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -86.88060462147877, + 20.444708563275327 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 5, + "name": "Bermuda Islands", + "comment": null, + "name_alt": null, + "lat_y": 32.317339, + "long_x": -64.742895, + "region": "Seven seas (open ocean)", + "subregion": "North Atlantic Ocean", + "featureclass": "island" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -64.74290930897877, + 32.31726715702533 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Punta Galera", + "comment": null, + "name_alt": null, + "lat_y": 0.731221, + "long_x": -80.062205, + "region": "South America", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -80.06212317616627, + 0.731207586712827 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cap Lopez", + "comment": null, + "name_alt": null, + "lat_y": -0.604761, + "long_x": 8.726423, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 8.727299789450319, + -0.615086490513119 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cape Bobaomby", + "comment": null, + "name_alt": null, + "lat_y": -11.966598, + "long_x": 49.262904, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 49.26282799570873, + -11.966485284380923 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 4, + "name": "Cap Blanc", + "comment": null, + "name_alt": null, + "lat_y": 20.822108, + "long_x": -17.052856, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -17.052906867572517, + 20.822088934369077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape of Good Hope", + "comment": null, + "name_alt": null, + "lat_y": -34.307311, + "long_x": 18.441206, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 18.441294792583733, + -34.30718352656842 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Palmas", + "comment": null, + "name_alt": null, + "lat_y": 4.373924, + "long_x": -7.457356, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -7.457386848041267, + 4.373968817181577 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cape Verde", + "comment": null, + "name_alt": null, + "lat_y": 14.732312, + "long_x": -17.471776, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -17.471730109760017, + 14.732489324994077 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Cap Bon", + "comment": null, + "name_alt": null, + "lat_y": 37.073954, + "long_x": 11.024061, + "region": "Africa", + "subregion": null, + "featureclass": "cape" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 11.024180534771233, + 37.07398102421283 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "Oceanic pole of inaccessibility", + "comment": null, + "name_alt": null, + "lat_y": -48.865032, + "long_x": -123.401986, + "region": "Seven seas (open ocean)", + "subregion": "South Pacific Ocean", + "featureclass": "pole" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -123.40202796132252, + -48.86504485469342 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "South Magnetic Pole 2005 (est)", + "comment": null, + "name_alt": null, + "lat_y": -48.865032, + "long_x": -123.401986, + "region": "Antarctica", + "subregion": "Southern Ocean", + "featureclass": "pole" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 137.85425865977123, + -64.51824309688092 + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "name": "North Magnetic Pole 2005 (est)", + "comment": null, + "name_alt": null, + "lat_y": -48.865032, + "long_x": -123.401986, + "region": "Seven seas (open ocean)", + "subregion": "Arctic Ocean", + "featureclass": "pole" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -114.40569007069752, + 82.71008942265033 + ] + } + } + ] +} \ No newline at end of file diff --git a/stories/MapAdaptor/components/data2.json b/stories/MapAdaptor/components/data2.json new file mode 100644 index 0000000000..79e85caedc --- /dev/null +++ b/stories/MapAdaptor/components/data2.json @@ -0,0 +1,6113 @@ +{ + "type": "FeatureCollection", + "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, + "features": [ + { "type": "Feature", "properties": { "id": "ak16994521", "mag": 2.3, "time": 1507425650893, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5129, 63.1016, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16994519", "mag": 1.7, "time": 1507425289659, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4048, 63.1224, 105.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16994517", "mag": 1.6, "time": 1507424832518, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3597, 63.0781, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38021336", "mag": 1.42, "time": 1507423898710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.497, 34.299667, 7.64 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2nn", "mag": 4.2, "time": 1507422626990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.6901, 12.0623, 46.41 ] } }, + { "type": "Feature", "properties": { "id": "ak16994510", "mag": 1.6, "time": 1507422449194, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5053, 63.0719, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2nb", "mag": 4.6, "time": 1507420784440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4576, -20.2873, 614.26 ] } }, + { "type": "Feature", "properties": { "id": "ak16994298", "mag": 2.4, "time": 1507419370097, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.789, 63.1725, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72905861", "mag": 1.39, "time": 1507418785100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.993164, 36.421833, 6.37 ] } }, + { "type": "Feature", "properties": { "id": "ci38021304", "mag": 1.11, "time": 1507418426010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0155, 33.656333, 12.37 ] } }, + { "type": "Feature", "properties": { "id": "ak16994293", "mag": 1.5, "time": 1507417256497, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.512, 63.0879, 10.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16994287", "mag": 2.0, "time": 1507413903714, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4378, 63.0933, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16994285", "mag": 1.5, "time": 1507413670029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6538, 63.2272, 96.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16994283", "mag": 1.4, "time": 1507413587442, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5325, 63.0844, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16994280", "mag": 1.3, "time": 1507413266231, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4752, 61.8518, 54.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16994278", "mag": 1.8, "time": 1507413195076, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8597, 61.6214, 50.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16994274", "mag": 1.9, "time": 1507412827617, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7142, 62.9656, 93.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16994273", "mag": 1.2, "time": 1507411925999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2484, 61.2705, 69.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16994270", "mag": 2.0, "time": 1507411814209, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0732, 65.5942, 14.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2ly", "mag": 4.1, "time": 1507411448780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.5445, 13.5146, 54.36 ] } }, + { "type": "Feature", "properties": { "id": "nc72905841", "mag": 1.38, "time": 1507411214450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819504, 37.605499, 4.14 ] } }, + { "type": "Feature", "properties": { "id": "nc72905836", "mag": 1.4, "time": 1507410206440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.930168, 37.636833, -0.71 ] } }, + { "type": "Feature", "properties": { "id": "ci38021272", "mag": 1.34, "time": 1507408122250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.509167, 34.1555, 16.34 ] } }, + { "type": "Feature", "properties": { "id": "ci38021264", "mag": 1.0, "time": 1507407938100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792167, 33.5115, 5.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16993963", "mag": 1.4, "time": 1507407100665, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9126, 63.1812, 150.4 ] } }, + { "type": "Feature", "properties": { "id": "hv61936851", "mag": 2.55, "time": 1507406278360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.078659, 19.374167, 2.15 ] } }, + { "type": "Feature", "properties": { "id": "ak16993960", "mag": 1.4, "time": 1507405129739, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3106, 61.5726, 26.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16993952", "mag": 1.7, "time": 1507403679922, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5846, 60.2607, 34.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38021224", "mag": 1.04, "time": 1507401391710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.929, 34.254833, 18.27 ] } }, + { "type": "Feature", "properties": { "id": "ak16993752", "mag": 1.3, "time": 1507401212982, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5065, 63.0847, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16993746", "mag": 1.3, "time": 1507399350671, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8929, 63.5257, 3.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2jk", "mag": 4.6, "time": 1507398878400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.7258, -18.9821, 195.22 ] } }, + { "type": "Feature", "properties": { "id": "ak16993741", "mag": 1.6, "time": 1507398797233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3473, 63.0775, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72905766", "mag": 2.64, "time": 1507397278960, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.137497, 36.579834, 7.72 ] } }, + { "type": "Feature", "properties": { "id": "ak16993738", "mag": 1.4, "time": 1507396778206, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1075, 61.8312, 71.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16993736", "mag": 1.2, "time": 1507396542471, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3769, 63.0621, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2ii", "mag": 4.3, "time": 1507395765330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8319, 16.7195, 58.84 ] } }, + { "type": "Feature", "properties": { "id": "uw61339006", "mag": 1.91, "time": 1507395622730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.689833, 47.049167, 5.38 ] } }, + { "type": "Feature", "properties": { "id": "ak16993732", "mag": 1.7, "time": 1507395602456, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5283, 63.0785, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16993720", "mag": 2.5, "time": 1507394741482, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6683, 60.7696, 67.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16993714", "mag": 1.6, "time": 1507394402896, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7591, 61.6478, 30.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16993710", "mag": 1.5, "time": 1507393418705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3458, 63.0633, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16993699", "mag": 1.6, "time": 1507392875390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4669, 63.0675, 3.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16993695", "mag": 1.3, "time": 1507392837463, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5169, 63.083, 1.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16993692", "mag": 2.3, "time": 1507392657193, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4771, 63.0742, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16993486", "mag": 4.2, "time": 1507392435159, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.458, 63.1276, 14.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2hz", "mag": 4.3, "time": 1507392287310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9686, 16.6087, 69.65 ] } }, + { "type": "Feature", "properties": { "id": "nc72905751", "mag": 1.21, "time": 1507391530870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.023666, 37.605335, 1.97 ] } }, + { "type": "Feature", "properties": { "id": "ci38021056", "mag": 1.95, "time": 1507390783500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793833, 33.493, 3.65 ] } }, + { "type": "Feature", "properties": { "id": "ci38021048", "mag": 1.02, "time": 1507388708760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.225, 34.0335, 0.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16993303", "mag": 1.9, "time": 1507385638408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0033, 63.2623, 0.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2hc", "mag": 4.9, "time": 1507385606770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.3179, -30.4302, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16993301", "mag": 2.1, "time": 1507383291943, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1913, 58.5727, 85.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60251607", "mag": 3.09, "time": 1507383200950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.140503, 38.030666, 7.29 ] } }, + { "type": "Feature", "properties": { "id": "nc72905716", "mag": 1.07, "time": 1507382878240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.765663, 38.789166, 2.09 ] } }, + { "type": "Feature", "properties": { "id": "nc72905711", "mag": 1.17, "time": 1507382428800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.678001, 37.621498, 4.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16993140", "mag": 1.9, "time": 1507381096302, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8813, 63.1738, 75.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16993128", "mag": 1.6, "time": 1507378828395, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.531, 61.7978, 14.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61936621", "mag": 1.98, "time": 1507378497820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.423492, 19.223499, 34.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16993119", "mag": 1.5, "time": 1507378014192, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.8317, 59.7754, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72905681", "mag": 1.39, "time": 1507377675100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793999, 38.8255, 2.24 ] } }, + { "type": "Feature", "properties": { "id": "hv61936531", "mag": 2.66, "time": 1507377140600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.32016, 19.338667, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16992960", "mag": 1.9, "time": 1507376759252, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.4264, 67.7636, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16992953", "mag": 2.1, "time": 1507376626801, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5725, 59.8372, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2fz", "mag": 4.1, "time": 1507372645200, "felt": 103, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.7814, -32.4981, 23.29 ] } }, + { "type": "Feature", "properties": { "id": "nn00608370", "mag": 1.3, "time": 1507370926907, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9711, 36.3094, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16992628", "mag": 1.5, "time": 1507369548317, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.8046, 65.9499, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16992625", "mag": 1.4, "time": 1507369466929, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8309, 63.376, 82.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72905641", "mag": 1.22, "time": 1507368529650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.724167, 38.760334, 1.16 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2fc", "mag": 5.1, "time": 1507368374110, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.9778, -1.6647, 147.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16992611", "mag": 2.1, "time": 1507366872675, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3324, 62.9966, 88.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16992607", "mag": 1.8, "time": 1507366536698, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4858, 64.7593, 11.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2et", "mag": 4.9, "time": 1507365487800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.7469, -33.0092, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16992603", "mag": 2.2, "time": 1507364931625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8133, 59.8473, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38020960", "mag": 1.0, "time": 1507363084310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.673833, 33.904333, 35.76 ] } }, + { "type": "Feature", "properties": { "id": "hv61936261", "mag": 1.72, "time": 1507362853030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.382172, 19.23, 34.41 ] } }, + { "type": "Feature", "properties": { "id": "ak16992451", "mag": 1.8, "time": 1507362228460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.427, 66.3947, 5.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38020944", "mag": 1.0, "time": 1507362158010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.457667, 34.326, 2.73 ] } }, + { "type": "Feature", "properties": { "id": "mb80259564", "mag": 1.03, "time": 1507361004730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529833, 46.865833, 9.91 ] } }, + { "type": "Feature", "properties": { "id": "nc72905606", "mag": 1.19, "time": 1507358854330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.791832, 38.834835, 1.65 ] } }, + { "type": "Feature", "properties": { "id": "nn00608387", "mag": 1.0, "time": 1507358249243, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9071, 38.405, 11.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38020896", "mag": 1.89, "time": 1507358144340, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793833, 33.486833, 4.21 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2dx", "mag": 4.5, "time": 1507357181260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.1291, -6.3628, 156.49 ] } }, + { "type": "Feature", "properties": { "id": "se60208171", "mag": 2.4, "time": 1507353902490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -83.749833, 36.150333, 14.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72905576", "mag": 1.77, "time": 1507352706600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.900833, 36.327168, 6.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16992147", "mag": 1.4, "time": 1507351430424, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0276, 62.5667, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16992146", "mag": 1.8, "time": 1507351047849, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.5063, 59.957, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72905556", "mag": 1.77, "time": 1507350586140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.792, 38.834835, 1.77 ] } }, + { "type": "Feature", "properties": { "id": "mb80259559", "mag": 1.46, "time": 1507350177430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.530833, 46.869333, 10.71 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2d1", "mag": 4.7, "time": 1507347862040, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.504, -16.7961, 178.13 ] } }, + { "type": "Feature", "properties": { "id": "nc72905531", "mag": 1.48, "time": 1507346675870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.831169, 37.4585, 2.53 ] } }, + { "type": "Feature", "properties": { "id": "mb80259549", "mag": 1.08, "time": 1507345321240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.516333, 46.8755, 11.43 ] } }, + { "type": "Feature", "properties": { "id": "nc72905521", "mag": 1.46, "time": 1507345267910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.816666, 37.603832, 4.04 ] } }, + { "type": "Feature", "properties": { "id": "ci38020824", "mag": 2.12, "time": 1507344823940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.655333, 34.632, 5.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16991857", "mag": 2.3, "time": 1507344587124, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.8808, 51.3254, 31.7 ] } }, + { "type": "Feature", "properties": { "id": "nn00608359", "mag": 1.1, "time": 1507344387447, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1285, 37.4041, 0.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72905511", "mag": 1.27, "time": 1507344302520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.817169, 37.604168, 4.02 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2cx", "mag": 4.9, "time": 1507343887900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 69.1471, -23.7671, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72905496", "mag": 1.94, "time": 1507341324260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.101166, 40.842499, 6.01 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2cc", "mag": 5.0, "time": 1507340745260, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 132.668, 1.1151, 7.01 ] } }, + { "type": "Feature", "properties": { "id": "ci38020800", "mag": 1.46, "time": 1507340726000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.462667, 33.466333, 5.78 ] } }, + { "type": "Feature", "properties": { "id": "ak16991706", "mag": 1.7, "time": 1507339655320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2596, 60.2328, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16991711", "mag": 1.6, "time": 1507339653625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2013, 60.2021, 10.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16991704", "mag": 1.7, "time": 1507338343941, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7575, 62.4396, 50.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16991697", "mag": 2.1, "time": 1507336466527, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3178, 60.5797, 88.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38020768", "mag": 1.56, "time": 1507336119080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.460167, 34.3335, 2.89 ] } }, + { "type": "Feature", "properties": { "id": "ci38020760", "mag": 1.22, "time": 1507335982510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.468167, 34.333167, 2.87 ] } }, + { "type": "Feature", "properties": { "id": "ci38020752", "mag": 1.81, "time": 1507335765850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793, 33.490333, 4.58 ] } }, + { "type": "Feature", "properties": { "id": "ci38020744", "mag": 1.76, "time": 1507335646140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.566333, 35.339667, 7.86 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2c0", "mag": 5.3, "time": 1507335391250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3171, -33.0297, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72905461", "mag": 1.16, "time": 1507333007350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.795998, 38.826, 2.32 ] } }, + { "type": "Feature", "properties": { "id": "nn00608334", "mag": 1.1, "time": 1507331333919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1247, 37.3789, 8.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16991557", "mag": 1.4, "time": 1507331263084, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2293, 64.9749, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2ba", "mag": 4.4, "time": 1507331102840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.3636, -10.0109, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2b9", "mag": 4.2, "time": 1507331091160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 73.3529, 39.6124, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16991437", "mag": 2.0, "time": 1507330383962, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4583, 60.3395, 72.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2av", "mag": 4.3, "time": 1507329021540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 138.9649, 43.0121, 217.94 ] } }, + { "type": "Feature", "properties": { "id": "nn00608329", "mag": 1.3, "time": 1507328136999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1198, 37.3861, 8.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38020720", "mag": 1.45, "time": 1507327306610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.955667, 34.34, -0.29 ] } }, + { "type": "Feature", "properties": { "id": "uw61338531", "mag": 1.37, "time": 1507326914640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.991667, 46.572333, -0.3 ] } }, + { "type": "Feature", "properties": { "id": "nn00608354", "mag": 1.0, "time": 1507326343697, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.747, 39.8477, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72905451", "mag": 1.47, "time": 1507326329600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.753833, 39.8485, 6.72 ] } }, + { "type": "Feature", "properties": { "id": "nc72905441", "mag": 1.23, "time": 1507325408690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.127, 36.566667, 9.16 ] } }, + { "type": "Feature", "properties": { "id": "us2000b29t", "mag": 4.5, "time": 1507325144410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.6471, 17.7456, 196.33 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2ab", "mag": 2.6, "time": 1507324395860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.8949, 32.7663, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72905436", "mag": 1.41, "time": 1507323505830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.155667, 36.5565, 6.94 ] } }, + { "type": "Feature", "properties": { "id": "ci38020712", "mag": 1.19, "time": 1507323492150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.991, 32.578667, 2.62 ] } }, + { "type": "Feature", "properties": { "id": "us2000b289", "mag": 2.4, "time": 1507321230800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7321, 36.481, 5.37 ] } }, + { "type": "Feature", "properties": { "id": "nc72905431", "mag": 1.0, "time": 1507321021480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.178833, 38.107, -0.02 ] } }, + { "type": "Feature", "properties": { "id": "ak16991182", "mag": 1.0, "time": 1507320721326, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1644, 62.2007, 15.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16991178", "mag": 1.8, "time": 1507320357991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5804, 63.1717, 121.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72905426", "mag": 1.24, "time": 1507320241050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.688667, 37.5335, 6.91 ] } }, + { "type": "Feature", "properties": { "id": "ci38020680", "mag": 1.5, "time": 1507320090270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.516, 33.860833, 0.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16991069", "mag": 1.8, "time": 1507318145350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6965, 59.7754, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b27a", "mag": 2.4, "time": 1507317641850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.2269, 36.6265, 5.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16991058", "mag": 2.6, "time": 1507317554328, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3172, 63.6837, 3.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38020656", "mag": 1.03, "time": 1507317548410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.646667, 36.148333, 0.93 ] } }, + { "type": "Feature", "properties": { "id": "ci38020648", "mag": 1.08, "time": 1507317476900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.1915, 35.0025, -0.87 ] } }, + { "type": "Feature", "properties": { "id": "nc72905416", "mag": 1.19, "time": 1507317386760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.803333, 37.457667, -0.31 ] } }, + { "type": "Feature", "properties": { "id": "uw61338426", "mag": 1.65, "time": 1507316609360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.7105, 43.553333, 7.02 ] } }, + { "type": "Feature", "properties": { "id": "mb80259489", "mag": 1.66, "time": 1507316359200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.477167, 45.9945, -2.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38020624", "mag": 1.22, "time": 1507316271630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.362, 32.941333, 10.15 ] } }, + { "type": "Feature", "properties": { "id": "ak16991011", "mag": 2.0, "time": 1507315584886, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9279, 62.7834, 4.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000b26p", "mag": 4.7, "time": 1507315424010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 68.9568, -49.2119, 13.54 ] } }, + { "type": "Feature", "properties": { "id": "uu60251447", "mag": 2.18, "time": 1507314096180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.457, 42.633167, 4.91 ] } }, + { "type": "Feature", "properties": { "id": "nc72905411", "mag": 1.24, "time": 1507313481610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.962333, 37.920333, -0.33 ] } }, + { "type": "Feature", "properties": { "id": "us2000b260", "mag": 4.4, "time": 1507311862190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 86.7487, 30.0165, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38020552", "mag": 1.28, "time": 1507311788210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.351667, 35.052833, -1.01 ] } }, + { "type": "Feature", "properties": { "id": "us2000b25h", "mag": 5.5, "time": 1507311683180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -15.5503, -35.3171, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16990870", "mag": 1.8, "time": 1507310931075, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9372, 62.1214, 48.9 ] } }, + { "type": "Feature", "properties": { "id": "nn00608306", "mag": 1.9, "time": 1507310059424, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.6177, 38.5802, 5.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000b24c", "mag": 4.6, "time": 1507309684550, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.7841, 37.4191, 31.5 ] } }, + { "type": "Feature", "properties": { "id": "mb80259479", "mag": 1.25, "time": 1507309316470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5305, 46.867167, 12.62 ] } }, + { "type": "Feature", "properties": { "id": "uu60251412", "mag": 2.1, "time": 1507308318150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.460333, 42.602667, 6.75 ] } }, + { "type": "Feature", "properties": { "id": "nc72905346", "mag": 2.33, "time": 1507308237260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.803333, 37.457333, 0.99 ] } }, + { "type": "Feature", "properties": { "id": "ci38020512", "mag": 1.61, "time": 1507308155060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2815, 35.633833, 6.15 ] } }, + { "type": "Feature", "properties": { "id": "ci38020480", "mag": 1.04, "time": 1507307612510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.314167, 34.0145, 2.75 ] } }, + { "type": "Feature", "properties": { "id": "ak16990671", "mag": 1.6, "time": 1507307067130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0099, 66.2332, 1.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72905326", "mag": 1.17, "time": 1507305678060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.706, 38.783667, 2.5 ] } }, + { "type": "Feature", "properties": { "id": "mb80259459", "mag": 0.95, "time": 1507305300890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5315, 46.8575, 12.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38020408", "mag": 1.2, "time": 1507302977930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.019833, 33.876, -0.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16990501", "mag": 2.8, "time": 1507302735109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2441, 60.1679, 148.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000b20f", "mag": 5.4, "time": 1507301800580, "felt": 169, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.1969, 37.0997, 47.42 ] } }, + { "type": "Feature", "properties": { "id": "ak16990465", "mag": 1.7, "time": 1507301707708, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.519, 67.5663, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38020392", "mag": 2.6, "time": 1507301676460, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.894167, 31.614, 5.89 ] } }, + { "type": "Feature", "properties": { "id": "ak16990463", "mag": 1.6, "time": 1507300956103, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1925, 59.8037, 20.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60251397", "mag": 1.18, "time": 1507300478100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.436333, 42.554833, 9.68 ] } }, + { "type": "Feature", "properties": { "id": "nn00608296", "mag": 1.1, "time": 1507299948387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.9267, 39.4223, 8.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38020376", "mag": 1.4, "time": 1507299919340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.476667, 35.752167, 2.24 ] } }, + { "type": "Feature", "properties": { "id": "nn00608295", "mag": 2.0, "time": 1507298898804, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9217, 38.4131, 8.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1zv", "mag": 5.1, "time": 1507298433140, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 95.0977, 12.0039, 21.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16990379", "mag": 2.0, "time": 1507296668722, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4456, 63.3167, 112.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16990317", "mag": 2.4, "time": 1507295355033, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6485, 60.9026, 21.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72905256", "mag": 1.69, "time": 1507295344860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7755, 38.805167, 0.72 ] } }, + { "type": "Feature", "properties": { "id": "ci38020296", "mag": 0.98, "time": 1507294899000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.445, 34.226167, 12.35 ] } }, + { "type": "Feature", "properties": { "id": "nc72905246", "mag": 1.14, "time": 1507294685610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.797333, 38.813499, 2.36 ] } }, + { "type": "Feature", "properties": { "id": "nc72905241", "mag": 1.27, "time": 1507294429860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.806167, 38.822333, 1.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16990306", "mag": 1.6, "time": 1507293337500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.164, 63.5211, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72905231", "mag": 1.31, "time": 1507293268040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.600333, 38.771667, 0.05 ] } }, + { "type": "Feature", "properties": { "id": "mb80259449", "mag": 1.29, "time": 1507293189490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.557667, 46.894167, 9.91 ] } }, + { "type": "Feature", "properties": { "id": "nc72905226", "mag": 1.25, "time": 1507291334810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.798333, 37.565333, -0.35 ] } }, + { "type": "Feature", "properties": { "id": "ci38020256", "mag": 2.0, "time": 1507290973570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.757833, 34.172833, 6.62 ] } }, + { "type": "Feature", "properties": { "id": "ci38020240", "mag": 1.05, "time": 1507290356170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.355667, 35.822833, 16.75 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1xz", "mag": 5.2, "time": 1507289341850, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 155.9405, -6.8684, 106.51 ] } }, + { "type": "Feature", "properties": { "id": "uw61338256", "mag": 1.22, "time": 1507287741010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.509333, 45.6895, 9.57 ] } }, + { "type": "Feature", "properties": { "id": "ci38020232", "mag": 1.4, "time": 1507287412090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8455, 34.000333, 9.47 ] } }, + { "type": "Feature", "properties": { "id": "mb80259444", "mag": 1.6, "time": 1507286758530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.5795, 44.259167, 3.88 ] } }, + { "type": "Feature", "properties": { "id": "mb80259434", "mag": 1.18, "time": 1507286693390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.322167, 43.681333, 9.95 ] } }, + { "type": "Feature", "properties": { "id": "ak16990167", "mag": 3.0, "time": 1507285562299, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.2949, 51.2318, 28.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16990162", "mag": 3.2, "time": 1507285408267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.0402, 65.2966, 0.1 ] } }, + { "type": "Feature", "properties": { "id": "hv61935226", "mag": 1.78, "time": 1507284229580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.42366, 19.2805, 7.76 ] } }, + { "type": "Feature", "properties": { "id": "hv61935131", "mag": 1.67, "time": 1507283791470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.248833, 18.876833, 12.183 ] } }, + { "type": "Feature", "properties": { "id": "ak16990109", "mag": 1.9, "time": 1507282869514, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1519, 63.251, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1xd", "mag": 4.4, "time": 1507281825250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 119.9639, -0.4925, 44.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16990102", "mag": 1.6, "time": 1507281420124, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7545, 61.5105, 70.6 ] } }, + { "type": "Feature", "properties": { "id": "hv61935091", "mag": 2.94, "time": 1507279304370, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.2205, 19.380333, 14.051 ] } }, + { "type": "Feature", "properties": { "id": "nn00608291", "mag": 1.6, "time": 1507279195578, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.2224, 39.4096, 5.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72905186", "mag": 0.99, "time": 1507278858510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8245, 37.483833, 5.31 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1v8", "mag": 6.0, "time": 1507276773110, "felt": 108, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.9537, 37.485, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60251377", "mag": 1.43, "time": 1507274976970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.444, 42.660667, 5.95 ] } }, + { "type": "Feature", "properties": { "id": "ak16989976", "mag": 3.1, "time": 1507274375943, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7235, 59.8808, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80259414", "mag": 1.86, "time": 1507273645130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.997833, 47.455667, 1.73 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1v0", "mag": 4.7, "time": 1507273552100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.6145, 13.8504, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989973", "mag": 1.3, "time": 1507272833815, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7833, 64.8537, 19.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000b2dh", "mag": 3.3, "time": 1507270603000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.92, 49.06, 22.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989967", "mag": 1.9, "time": 1507270303410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3206, 61.7195, 41.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38020152", "mag": 1.08, "time": 1507270230410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.557333, 32.948833, 3.78 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1um", "mag": 2.7, "time": 1507269804040, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4493, 42.6517, 7.67 ] } }, + { "type": "Feature", "properties": { "id": "nc72905156", "mag": 1.79, "time": 1507269478010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.801167, 38.822, 2.67 ] } }, + { "type": "Feature", "properties": { "id": "nc71107634", "mag": 1.13, "time": 1507269413290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.478167, 38.6015, 12.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1un", "mag": 4.3, "time": 1507269388630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.4985, 51.6139, 71.76 ] } }, + { "type": "Feature", "properties": { "id": "uu60251357", "mag": 1.47, "time": 1507268672130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.455333, 42.652833, 2.92 ] } }, + { "type": "Feature", "properties": { "id": "ak16989960", "mag": 1.1, "time": 1507268319981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2116, 64.2744, 14.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61935031", "mag": 1.75, "time": 1507267817920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.428833, 19.329, 10.185 ] } }, + { "type": "Feature", "properties": { "id": "nc72905151", "mag": 1.08, "time": 1507267299070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823167, 37.607, 4.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80259404", "mag": 1.03, "time": 1507266753410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.532167, 46.873, 11.23 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1u8", "mag": 4.6, "time": 1507265974560, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -64.1261, -17.5702, 36.33 ] } }, + { "type": "Feature", "properties": { "id": "ci38020112", "mag": 1.06, "time": 1507265623210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.434833, 33.0315, 3.46 ] } }, + { "type": "Feature", "properties": { "id": "nc72905146", "mag": 1.56, "time": 1507265461960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7915, 38.8195, 1.42 ] } }, + { "type": "Feature", "properties": { "id": "uw61338091", "mag": 1.62, "time": 1507265317630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.2, 47.583333, 23.03 ] } }, + { "type": "Feature", "properties": { "id": "uw61338086", "mag": 1.33, "time": 1507265080940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.200333, 47.583833, 23.12 ] } }, + { "type": "Feature", "properties": { "id": "uu60251347", "mag": 1.61, "time": 1507264823080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.494833, 42.639667, 0.79 ] } }, + { "type": "Feature", "properties": { "id": "nc71107639", "mag": 1.32, "time": 1507263429870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9235, 39.599833, 20.91 ] } }, + { "type": "Feature", "properties": { "id": "nc72905131", "mag": 1.06, "time": 1507263391130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.831, 37.5295, 5.95 ] } }, + { "type": "Feature", "properties": { "id": "nc72905121", "mag": 1.41, "time": 1507263129660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.403, 38.364167, 8.42 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1tr", "mag": 4.8, "time": 1507262599510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 151.9528, -10.3953, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989915", "mag": 1.5, "time": 1507260314998, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3718, 63.0764, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61338061", "mag": 1.26, "time": 1507260032120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.744833, 47.490167, 16.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16989910", "mag": 2.1, "time": 1507259762026, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6057, 63.4194, 106.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72905106", "mag": 1.0, "time": 1507258246340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.822, 38.814833, 1.61 ] } }, + { "type": "Feature", "properties": { "id": "nc72905101", "mag": 2.97, "time": 1507257072490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -125.777167, 41.2375, 7.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16989906", "mag": 1.6, "time": 1507256091995, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.063, 65.8813, 12.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38020032", "mag": 1.89, "time": 1507255962830, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7975, 33.5, 5.36 ] } }, + { "type": "Feature", "properties": { "id": "ci38020024", "mag": 1.53, "time": 1507255628970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.875167, 33.957, 3.47 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1t0", "mag": 4.8, "time": 1507255428530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -25.496, 0.9934, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1sv", "mag": 4.6, "time": 1507253577740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.1867, -9.9486, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60251342", "mag": 1.12, "time": 1507252828550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.414167, 42.5485, 6.65 ] } }, + { "type": "Feature", "properties": { "id": "nc72905066", "mag": 0.98, "time": 1507251331760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9395, 37.636, 5.66 ] } }, + { "type": "Feature", "properties": { "id": "nn00608277", "mag": 1.5, "time": 1507251023072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.857, 37.3396, 3.9 ] } }, + { "type": "Feature", "properties": { "id": "uu60251327", "mag": 1.16, "time": 1507250350380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.672333, 39.4485, 12.04 ] } }, + { "type": "Feature", "properties": { "id": "ak16989868", "mag": 1.6, "time": 1507249990990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6081, 61.1327, 14.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38019984", "mag": 1.38, "time": 1507249506910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.598667, 33.450667, 7.77 ] } }, + { "type": "Feature", "properties": { "id": "nn00608273", "mag": 1.0, "time": 1507249499810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0539, 37.1082, 8.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38019976", "mag": 1.92, "time": 1507249308880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.377167, 34.427, 9.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1s9", "mag": 4.0, "time": 1507248914000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.348, -29.925, 48.8 ] } }, + { "type": "Feature", "properties": { "id": "uw61337986", "mag": 1.12, "time": 1507245979370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.395167, 45.685667, -0.74 ] } }, + { "type": "Feature", "properties": { "id": "nc72905011", "mag": 2.81, "time": 1507244867710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8105, 37.472, 6.12 ] } }, + { "type": "Feature", "properties": { "id": "nc72905016", "mag": 1.36, "time": 1507244847860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7825, 38.7915, 0.56 ] } }, + { "type": "Feature", "properties": { "id": "mb80259379", "mag": 0.99, "time": 1507244598420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529, 46.871167, 12.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16989827", "mag": 1.4, "time": 1507244539965, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2289, 64.9761, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989825", "mag": 1.8, "time": 1507243916881, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1245, 62.4971, 81.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72905001", "mag": 1.65, "time": 1507243472580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.808, 38.822, 1.64 ] } }, + { "type": "Feature", "properties": { "id": "nc72904996", "mag": 2.14, "time": 1507243164460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.588667, 40.652333, 25.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989822", "mag": 1.5, "time": 1507242888109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.857, 61.9122, 45.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1rh", "mag": 4.6, "time": 1507242807430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.6063, 21.8848, 100.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16989815", "mag": 2.5, "time": 1507240652193, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.192, 61.0044, 106.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989811", "mag": 1.8, "time": 1507240498324, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.939, 62.7658, 79.9 ] } }, + { "type": "Feature", "properties": { "id": "uu60251317", "mag": 1.66, "time": 1507240484300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.418167, 42.544333, 6.24 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1px", "mag": 2.6, "time": 1507239146260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4355, 42.5495, 8.32 ] } }, + { "type": "Feature", "properties": { "id": "mb80259359", "mag": 1.17, "time": 1507238290040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.965, 43.357333, 5.92 ] } }, + { "type": "Feature", "properties": { "id": "uw61337951", "mag": 2.3, "time": 1507238213550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.549833, 49.328833, -0.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16989718", "mag": 1.4, "time": 1507237904044, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.5289, 61.2012, 0.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16989717", "mag": 1.9, "time": 1507237796189, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.701, 59.032, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61337946", "mag": 2.27, "time": 1507237659430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.817167, 47.392167, -0.46 ] } }, + { "type": "Feature", "properties": { "id": "nc72904961", "mag": 0.97, "time": 1507237420050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8365, 37.482833, 1.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16989714", "mag": 1.7, "time": 1507235850265, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0124, 65.8954, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38019864", "mag": 1.0, "time": 1507235571440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.794167, 33.508667, 6.47 ] } }, + { "type": "Feature", "properties": { "id": "mb80259334", "mag": 1.45, "time": 1507235042560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525667, 46.872833, 11.13 ] } }, + { "type": "Feature", "properties": { "id": "ak16989709", "mag": 1.6, "time": 1507234798667, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.3071, 63.3209, 6.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16989702", "mag": 2.5, "time": 1507234198600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.414, 63.3343, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989701", "mag": 1.8, "time": 1507234162044, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0004, 65.8966, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989699", "mag": 1.7, "time": 1507234036518, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6575, 60.1339, 106.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72904941", "mag": 1.63, "time": 1507233857390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810167, 38.8205, 2.04 ] } }, + { "type": "Feature", "properties": { "id": "nc72904936", "mag": 3.14, "time": 1507233758820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.192, 40.163167, 11.62 ] } }, + { "type": "Feature", "properties": { "id": "hv61934246", "mag": 1.02, "time": 1507233403750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.289833, 19.374, 1.772 ] } }, + { "type": "Feature", "properties": { "id": "ak16989698", "mag": 1.7, "time": 1507233388591, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0126, 65.8742, 0.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989695", "mag": 1.9, "time": 1507232812188, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9865, 65.9098, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72904926", "mag": 1.29, "time": 1507232594330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.837167, 37.504167, 0.07 ] } }, + { "type": "Feature", "properties": { "id": "ci38019816", "mag": 1.31, "time": 1507231819600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.491, 33.846167, -0.48 ] } }, + { "type": "Feature", "properties": { "id": "nc72904891", "mag": 1.41, "time": 1507229918140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.104833, 37.324833, -0.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16989694", "mag": 1.5, "time": 1507229700025, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7663, 63.5209, 14.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72904886", "mag": 2.03, "time": 1507229279930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.3835, 40.709833, 19.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16989692", "mag": 1.6, "time": 1507228866480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0051, 65.8735, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72904881", "mag": 1.48, "time": 1507228723050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.194667, 40.598333, 15.65 ] } }, + { "type": "Feature", "properties": { "id": "ci38019744", "mag": 1.44, "time": 1507226134710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.072333, 33.020667, -0.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16989683", "mag": 2.4, "time": 1507225956631, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.785, 60.8774, 34.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38019728", "mag": 1.0, "time": 1507225418070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.720667, 36.004, 2.64 ] } }, + { "type": "Feature", "properties": { "id": "nc72904846", "mag": 1.87, "time": 1507224165330, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8105, 38.821167, 1.64 ] } }, + { "type": "Feature", "properties": { "id": "hv61934126", "mag": 1.58, "time": 1507223732510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.252167, 18.903833, 12.692 ] } }, + { "type": "Feature", "properties": { "id": "ak16989680", "mag": 2.5, "time": 1507223654781, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.5871, 67.3896, 1.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16989626", "mag": 1.5, "time": 1507223506919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1613, 62.9421, 105.5 ] } }, + { "type": "Feature", "properties": { "id": "uu60251267", "mag": 1.3, "time": 1507222702710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.711, 37.088833, 8.72 ] } }, + { "type": "Feature", "properties": { "id": "uu60251262", "mag": 2.09, "time": 1507221444340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.413167, 42.600333, 6.09 ] } }, + { "type": "Feature", "properties": { "id": "hv61934021", "mag": 1.71, "time": 1507221215150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.600174, 19.477667, 2.61 ] } }, + { "type": "Feature", "properties": { "id": "mb80259309", "mag": 0.99, "time": 1507220291830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.4755, 46.855833, 10.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72904766", "mag": 1.2, "time": 1507219571830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.817667, 37.607833, 4.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1ip", "mag": 4.3, "time": 1507219416430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.6953, -3.0506, 46.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16989556", "mag": 1.8, "time": 1507219027423, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1068, 64.723, 3.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72904761", "mag": 1.28, "time": 1507218469040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.786667, 35.167, 4.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16989554", "mag": 1.8, "time": 1507217831958, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.9487, 67.1103, 6.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38019560", "mag": 1.18, "time": 1507217071900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.2355, 35.399833, 11.83 ] } }, + { "type": "Feature", "properties": { "id": "ld60143826", "mag": 1.25, "time": 1507215008870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -75.237833, 44.094, 4.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72904741", "mag": 1.17, "time": 1507213799120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.883667, 37.539333, 2.63 ] } }, + { "type": "Feature", "properties": { "id": "uw61314897", "mag": 1.26, "time": 1507213038640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.924167, 46.832167, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "hv61933821", "mag": 2.22, "time": 1507211808310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.427667, 19.767167, 23.499 ] } }, + { "type": "Feature", "properties": { "id": "mb80259289", "mag": 1.11, "time": 1507209951340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.482833, 46.8195, 2.22 ] } }, + { "type": "Feature", "properties": { "id": "ci38019464", "mag": 2.55, "time": 1507209518050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.010667, 33.179667, 8.09 ] } }, + { "type": "Feature", "properties": { "id": "uu60251247", "mag": 1.23, "time": 1507208707300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.086833, 44.772167, 11.73 ] } }, + { "type": "Feature", "properties": { "id": "ak16989517", "mag": 1.3, "time": 1507208506436, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3491, 63.087, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38019448", "mag": 1.15, "time": 1507207944620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.294333, 34.679333, 2.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16989485", "mag": 1.9, "time": 1507207780001, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.6654, 67.5326, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72904706", "mag": 1.66, "time": 1507207659710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.798167, 38.793833, 3.66 ] } }, + { "type": "Feature", "properties": { "id": "ak16989482", "mag": 1.4, "time": 1507206716138, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4807, 64.7367, 8.7 ] } }, + { "type": "Feature", "properties": { "id": "uw61314867", "mag": 1.16, "time": 1507206461330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.192333, 47.183667, 14.42 ] } }, + { "type": "Feature", "properties": { "id": "ak16989481", "mag": 2.6, "time": 1507206068023, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.1435, 51.4576, 12.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72904681", "mag": 2.64, "time": 1507204013350, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8035, 38.791333, 3.29 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1f7", "mag": 5.0, "time": 1507202248310, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 126.4874, 7.3643, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80259279", "mag": 1.25, "time": 1507201170830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.476333, 44.006167, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989448", "mag": 1.0, "time": 1507200035021, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9384, 64.5888, 18.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1dj", "mag": 4.7, "time": 1507198268580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 49.1899, 31.277, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80259274", "mag": 1.3, "time": 1507198163850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.318333, 46.1425, 12.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80259269", "mag": 2.63, "time": 1507197824690, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.317333, 46.126333, 14.98 ] } }, + { "type": "Feature", "properties": { "id": "ci38019328", "mag": 2.0, "time": 1507197738510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.290167, 34.678, 2.65 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1da", "mag": 4.5, "time": 1507196589420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.5051, -25.068, 564.41 ] } }, + { "type": "Feature", "properties": { "id": "ci38019312", "mag": 1.27, "time": 1507196570560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.412333, 35.621833, 7.71 ] } }, + { "type": "Feature", "properties": { "id": "mb80259264", "mag": 1.58, "time": 1507195834720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.989667, 43.0535, 5.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16989416", "mag": 1.9, "time": 1507192569868, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8165, 59.7884, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80259259", "mag": 1.73, "time": 1507192054540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.3, 46.1355, 13.17 ] } }, + { "type": "Feature", "properties": { "id": "ak16989388", "mag": 2.2, "time": 1507191783280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8358, 59.8781, 1.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1c3", "mag": 5.4, "time": 1507191096920, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.5742, -22.4118, 112.87 ] } }, + { "type": "Feature", "properties": { "id": "nc72904646", "mag": 2.52, "time": 1507190856940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.472, 40.616833, 21.52 ] } }, + { "type": "Feature", "properties": { "id": "ak16989386", "mag": 1.8, "time": 1507190760834, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.611, 63.1832, 11.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37167708", "mag": 1.38, "time": 1507190349370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.7095, 33.2065, 10.46 ] } }, + { "type": "Feature", "properties": { "id": "hv61933706", "mag": 1.21, "time": 1507190060680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2125, 19.363, 1.776 ] } }, + { "type": "Feature", "properties": { "id": "nc72904641", "mag": 1.23, "time": 1507189755650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.236667, 37.334333, 8.36 ] } }, + { "type": "Feature", "properties": { "id": "ci38019264", "mag": 1.99, "time": 1507188934660, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2315, 32.416667, 18.41 ] } }, + { "type": "Feature", "properties": { "id": "uu60251227", "mag": 1.34, "time": 1507188766440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.442667, 42.578833, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "mb80259244", "mag": 1.28, "time": 1507188159830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527833, 46.866167, 12.04 ] } }, + { "type": "Feature", "properties": { "id": "hv61933701", "mag": 2.09, "time": 1507187842930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.470673, 19.211, 37.73 ] } }, + { "type": "Feature", "properties": { "id": "nc72904626", "mag": 0.96, "time": 1507187453970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.572333, 39.013167, -0.67 ] } }, + { "type": "Feature", "properties": { "id": "uu60251207", "mag": 1.35, "time": 1507187087800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.301167, 39.1075, 2.75 ] } }, + { "type": "Feature", "properties": { "id": "ci38019256", "mag": 2.06, "time": 1507186145760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.372167, 33.358833, 11.42 ] } }, + { "type": "Feature", "properties": { "id": "ci38019248", "mag": 1.49, "time": 1507186142240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.366, 33.357667, 11.67 ] } }, + { "type": "Feature", "properties": { "id": "uw61314807", "mag": 1.16, "time": 1507185870880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.191167, 47.179833, 15.66 ] } }, + { "type": "Feature", "properties": { "id": "se60045413", "mag": 1.81, "time": 1507185703120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -83.742167, 35.985167, 18.08 ] } }, + { "type": "Feature", "properties": { "id": "nc72904601", "mag": 0.95, "time": 1507185126040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819, 37.603333, 3.65 ] } }, + { "type": "Feature", "properties": { "id": "ci38019240", "mag": 1.25, "time": 1507185093960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.394, 35.618833, 8.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16989380", "mag": 1.9, "time": 1507184561453, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3822, 60.6535, 53.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989379", "mag": 1.0, "time": 1507183395241, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2677, 63.314, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38019200", "mag": 1.99, "time": 1507181070780, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.806833, 36.043833, 1.22 ] } }, + { "type": "Feature", "properties": { "id": "ci38019192", "mag": 1.69, "time": 1507180426220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.807333, 36.043167, 1.21 ] } }, + { "type": "Feature", "properties": { "id": "nc72904556", "mag": 1.22, "time": 1507178909260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7625, 38.821667, 1.49 ] } }, + { "type": "Feature", "properties": { "id": "ci38019184", "mag": 1.33, "time": 1507178811140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.319833, 33.886333, 15.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16989373", "mag": 2.2, "time": 1507178319160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0253, 59.7752, 99.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16989370", "mag": 2.0, "time": 1507178108703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9621, 62.3999, 67.6 ] } }, + { "type": "Feature", "properties": { "id": "nc71107619", "mag": 2.37, "time": 1507175814060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793167, 38.814333, 3.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72904521", "mag": 2.61, "time": 1507175806240, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.792, 38.813833, 3.02 ] } }, + { "type": "Feature", "properties": { "id": "ak16989344", "mag": 1.8, "time": 1507174164228, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5816, 59.9877, 48.6 ] } }, + { "type": "Feature", "properties": { "id": "uw61314692", "mag": 1.1, "time": 1507174062970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.048833, 48.836333, 3.53 ] } }, + { "type": "Feature", "properties": { "id": "mb80259229", "mag": 1.6, "time": 1507174016680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526667, 46.874333, 12.15 ] } }, + { "type": "Feature", "properties": { "id": "uu60251182", "mag": 2.38, "time": 1507172461010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.415167, 42.5495, 8.84 ] } }, + { "type": "Feature", "properties": { "id": "ci38019104", "mag": 1.08, "time": 1507172395710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.846167, 33.711167, 14.99 ] } }, + { "type": "Feature", "properties": { "id": "uw61314677", "mag": 1.65, "time": 1507171780320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.027667, 48.845833, 0.9 ] } }, + { "type": "Feature", "properties": { "id": "uu60251177", "mag": 1.51, "time": 1507171597620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.880667, 37.041, 17.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72904476", "mag": 1.12, "time": 1507171050970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7565, 38.782501, 0.82 ] } }, + { "type": "Feature", "properties": { "id": "nc72904471", "mag": 1.34, "time": 1507170987390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.753167, 38.775667, 1.61 ] } }, + { "type": "Feature", "properties": { "id": "ak16989336", "mag": 1.2, "time": 1507169863981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2568, 63.5162, 8.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72904466", "mag": 1.16, "time": 1507169797040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.808667, 37.467667, 1.31 ] } }, + { "type": "Feature", "properties": { "id": "ci37167548", "mag": 1.21, "time": 1507169669520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3645, 33.350667, 11.33 ] } }, + { "type": "Feature", "properties": { "id": "ci38019080", "mag": 1.35, "time": 1507169663590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3545, 33.3525, 12.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16989295", "mag": 4.3, "time": 1507169038804, "felt": 3, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -152.901, 58.3623, 46.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38019056", "mag": 2.12, "time": 1507167035520, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.805167, 36.042, 1.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16989291", "mag": 1.7, "time": 1507165460879, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1162, 61.3056, 37.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00608181", "mag": 1.2, "time": 1507165236408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7192, 37.7977, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b190", "mag": 2.6, "time": 1507164698800, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7663, 36.4461, 6.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16989285", "mag": 2.3, "time": 1507164594638, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5337, 60.8331, 35.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38018992", "mag": 1.21, "time": 1507164594280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.435667, 33.033167, 6.13 ] } }, + { "type": "Feature", "properties": { "id": "nc72905406", "mag": 1.37, "time": 1507163603630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.975, 40.912333, 6.11 ] } }, + { "type": "Feature", "properties": { "id": "ak16989282", "mag": 2.6, "time": 1507162971426, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.8816, 53.7666, 69.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000b185", "mag": 3.4, "time": 1507162321850, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.755, 36.45, 7.23 ] } }, + { "type": "Feature", "properties": { "id": "ci38018976", "mag": 1.34, "time": 1507162296820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.6665, 33.961333, 15.54 ] } }, + { "type": "Feature", "properties": { "id": "nc72904421", "mag": 1.81, "time": 1507162198800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.311667, 40.594833, 17.71 ] } }, + { "type": "Feature", "properties": { "id": "ak16989280", "mag": 2.0, "time": 1507162092700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.2549, 67.5542, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80259214", "mag": 1.11, "time": 1507161815690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529, 46.873667, 10.6 ] } }, + { "type": "Feature", "properties": { "id": "nn00608178", "mag": 1.2, "time": 1507161066465, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.8195, 37.303, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38018944", "mag": 1.13, "time": 1507160279190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.801333, 36.0425, 0.57 ] } }, + { "type": "Feature", "properties": { "id": "ci38018936", "mag": 1.06, "time": 1507160033160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.352833, 33.1335, 7.01 ] } }, + { "type": "Feature", "properties": { "id": "ci38018928", "mag": 0.95, "time": 1507159919230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.758833, 33.67, 13.89 ] } }, + { "type": "Feature", "properties": { "id": "ak16989265", "mag": 2.4, "time": 1507159550480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7536, 62.8345, 98.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989262", "mag": 1.2, "time": 1507158170981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4466, 64.9696, 1.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16989256", "mag": 2.1, "time": 1507157336866, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3316, 62.6072, 87.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000b16h", "mag": 4.5, "time": 1507156394080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.7169, -23.9861, 195.32 ] } }, + { "type": "Feature", "properties": { "id": "mb80259199", "mag": 1.02, "time": 1507156049410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.531, 46.862667, 9.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16989147", "mag": 1.8, "time": 1507155523233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2126, 62.1419, 50.6 ] } }, + { "type": "Feature", "properties": { "id": "mb80259194", "mag": 2.1, "time": 1507155343850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.326833, 46.116, 15.12 ] } }, + { "type": "Feature", "properties": { "id": "us2000b15z", "mag": 3.5, "time": 1507154804460, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7425, 36.4507, 4.85 ] } }, + { "type": "Feature", "properties": { "id": "ak16989143", "mag": 1.6, "time": 1507154781579, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2414, 61.1185, 60.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38018808", "mag": 0.95, "time": 1507153541570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.803667, 36.042, 1.12 ] } }, + { "type": "Feature", "properties": { "id": "mb80259184", "mag": 2.43, "time": 1507153540560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529, 46.875, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38018800", "mag": 1.11, "time": 1507153075770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.805667, 36.044667, 1.33 ] } }, + { "type": "Feature", "properties": { "id": "nc72904366", "mag": 2.17, "time": 1507152989540, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821833, 37.603167, 4.37 ] } }, + { "type": "Feature", "properties": { "id": "nc72904361", "mag": 2.03, "time": 1507152804460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802, 38.819667, 3.31 ] } }, + { "type": "Feature", "properties": { "id": "ci38018776", "mag": 1.23, "time": 1507152409830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.796667, 33.506833, 4.99 ] } }, + { "type": "Feature", "properties": { "id": "ci38018760", "mag": 1.23, "time": 1507152333150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.805333, 36.044167, 1.08 ] } }, + { "type": "Feature", "properties": { "id": "ci38018752", "mag": 1.02, "time": 1507152229710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.803833, 36.0435, 1.58 ] } }, + { "type": "Feature", "properties": { "id": "nc72904356", "mag": 1.39, "time": 1507151361960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.986333, 37.451833, 11.44 ] } }, + { "type": "Feature", "properties": { "id": "us2000b152", "mag": 4.2, "time": 1507151144560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5193, 15.6807, 43.81 ] } }, + { "type": "Feature", "properties": { "id": "mb80259179", "mag": 1.09, "time": 1507150593920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.249667, 45.922167, -2.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00608141", "mag": 1.4, "time": 1507150245096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.5709, 37.2677, 5.8 ] } }, + { "type": "Feature", "properties": { "id": "uw61314607", "mag": 2.13, "time": 1507149876900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.029167, 48.8415, 0.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16989132", "mag": 3.2, "time": 1507149758758, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.904, 54.6732, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38018704", "mag": 1.42, "time": 1507149228410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.937167, 32.9105, -0.2 ] } }, + { "type": "Feature", "properties": { "id": "hv61932706", "mag": 2.34, "time": 1507148766410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0805, 19.384667, 3.233 ] } }, + { "type": "Feature", "properties": { "id": "ci38018696", "mag": 1.43, "time": 1507148649160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.469333, 33.481, 7.42 ] } }, + { "type": "Feature", "properties": { "id": "ci38018688", "mag": 1.23, "time": 1507148125030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.7775, 34.859167, -1.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16989124", "mag": 2.3, "time": 1507147085613, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9048, 62.8046, 5.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16989120", "mag": 1.9, "time": 1507146960353, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3904, 61.7684, 33.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72904326", "mag": 1.4, "time": 1507146844270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835, 37.6255, 3.28 ] } }, + { "type": "Feature", "properties": { "id": "ci38018648", "mag": 1.34, "time": 1507146046240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.282833, 33.307, 10.02 ] } }, + { "type": "Feature", "properties": { "id": "us2000b12w", "mag": 4.1, "time": 1507145834470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.5682, 23.7468, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61314577", "mag": 2.31, "time": 1507145284260, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.101667, 47.519667, 24.66 ] } }, + { "type": "Feature", "properties": { "id": "ak16989116", "mag": 2.0, "time": 1507144999479, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9792, 59.2967, 30.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72904301", "mag": 1.44, "time": 1507144400690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.590333, 37.9535, 3.71 ] } }, + { "type": "Feature", "properties": { "id": "nc72904291", "mag": 0.97, "time": 1507144116270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.807335, 38.823166, 0.51 ] } }, + { "type": "Feature", "properties": { "id": "ci38018592", "mag": 0.98, "time": 1507144088190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.191, 34.995667, -0.84 ] } }, + { "type": "Feature", "properties": { "id": "nc71107609", "mag": 1.42, "time": 1507143933230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8315, 37.459167, 2.81 ] } }, + { "type": "Feature", "properties": { "id": "nc72904286", "mag": 2.01, "time": 1507143903920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.127667, 36.540667, 3.02 ] } }, + { "type": "Feature", "properties": { "id": "mb80259164", "mag": 1.54, "time": 1507143801870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.466667, 46.003833, -2.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989114", "mag": 1.5, "time": 1507143799499, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2987, 62.9001, 136.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72904276", "mag": 2.19, "time": 1507143670520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.125833, 36.539667, 3.42 ] } }, + { "type": "Feature", "properties": { "id": "ak16989112", "mag": 1.5, "time": 1507143346025, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9517, 60.4284, 76.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989109", "mag": 1.6, "time": 1507142888288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4575, 68.4924, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us1000alvi", "mag": 4.8, "time": 1507142880510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 69.2314, -22.7343, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b11q", "mag": 4.3, "time": 1507142721780, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0179, 16.6332, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00608130", "mag": 2.0, "time": 1507142028227, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6247, 38.6437, 2.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38018568", "mag": 1.17, "time": 1507141815580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.480167, 33.8245, -0.64 ] } }, + { "type": "Feature", "properties": { "id": "nc72904241", "mag": 1.13, "time": 1507141805960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.843333, 37.550333, -1.19 ] } }, + { "type": "Feature", "properties": { "id": "nc71107614", "mag": 1.26, "time": 1507141794500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9105, 37.975, 2.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72904226", "mag": 1.44, "time": 1507141566380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.839167, 37.554167, -0.37 ] } }, + { "type": "Feature", "properties": { "id": "nc72904231", "mag": 0.95, "time": 1507141526700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.848, 37.565167, -0.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16989106", "mag": 1.6, "time": 1507141095901, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5043, 63.2003, 100.7 ] } }, + { "type": "Feature", "properties": { "id": "nn00608125", "mag": 1.1, "time": 1507140434096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0698, 39.2152, 9.9 ] } }, + { "type": "Feature", "properties": { "id": "uu60251107", "mag": 2.02, "time": 1507140276970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.438667, 42.623, -0.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16989101", "mag": 1.7, "time": 1507139784743, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7521, 62.788, 15.0 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70236238", "mag": 1.83, "time": 1507139648960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.036, 37.001167, 5.77 ] } }, + { "type": "Feature", "properties": { "id": "ci38018464", "mag": 0.95, "time": 1507138418030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.469667, 34.0245, -0.75 ] } }, + { "type": "Feature", "properties": { "id": "nc72904196", "mag": 1.0, "time": 1507136805190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.407833, 36.764667, 10.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16989095", "mag": 1.5, "time": 1507135541282, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2816, 62.4313, 44.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38018408", "mag": 1.57, "time": 1507134824880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797167, 33.499, 4.25 ] } }, + { "type": "Feature", "properties": { "id": "nn00608107", "mag": 2.1, "time": 1507134616795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9268, 38.3958, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72904171", "mag": 1.38, "time": 1507133031670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.614333, 36.881, 6.94 ] } }, + { "type": "Feature", "properties": { "id": "nc72904166", "mag": 2.71, "time": 1507132718170, "felt": 28, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.609333, 36.8815, 6.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16989087", "mag": 1.4, "time": 1507131238883, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.032, 63.5134, 6.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0yw", "mag": 4.4, "time": 1507130270240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7831, 15.8774, 9.59 ] } }, + { "type": "Feature", "properties": { "id": "ak16989083", "mag": 2.0, "time": 1507129786603, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5468, 62.9914, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989080", "mag": 1.7, "time": 1507129070012, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8528, 63.1143, 130.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000b14r", "mag": 2.9, "time": 1507127377130, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -78.3466, -0.2479, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00608088", "mag": 1.1, "time": 1507126739396, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.8623, 39.6344, 5.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0xy", "mag": 4.3, "time": 1507120048520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.219, 14.9246, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38018272", "mag": 1.04, "time": 1507119983420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.979333, 33.952, 16.95 ] } }, + { "type": "Feature", "properties": { "id": "ci38018264", "mag": 1.21, "time": 1507118298180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.153667, 33.576, 12.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16988954", "mag": 1.4, "time": 1507117165370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.0651, 59.0371, 113.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16988951", "mag": 1.7, "time": 1507117164179, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7431, 61.7579, 50.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16988955", "mag": 1.2, "time": 1507117137925, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2404, 63.315, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38018256", "mag": 1.97, "time": 1507116401470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.047667, 33.9995, 14.99 ] } }, + { "type": "Feature", "properties": { "id": "ak16988947", "mag": 1.3, "time": 1507116091533, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.038, 61.8748, 115.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16988943", "mag": 2.6, "time": 1507115904863, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.3287, 60.8439, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80259149", "mag": 1.42, "time": 1507115359390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.520833, 46.866833, 12.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16988941", "mag": 2.0, "time": 1507115138670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7265, 59.549, 35.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16988937", "mag": 1.7, "time": 1507114508883, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.561, 63.6903, 125.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72904051", "mag": 1.09, "time": 1507113834280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793, 38.8355, 1.85 ] } }, + { "type": "Feature", "properties": { "id": "ci38018224", "mag": 1.17, "time": 1507113370200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.608833, 33.080833, 11.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72904041", "mag": 1.12, "time": 1507113327750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.942, 36.506, 4.31 ] } }, + { "type": "Feature", "properties": { "id": "uu60251097", "mag": 2.09, "time": 1507111719760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.414333, 42.55, 7.34 ] } }, + { "type": "Feature", "properties": { "id": "nc72904031", "mag": 0.97, "time": 1507110773350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.365667, 36.7845, 3.47 ] } }, + { "type": "Feature", "properties": { "id": "mb80259134", "mag": 2.46, "time": 1507108546600, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527833, 46.867833, 13.28 ] } }, + { "type": "Feature", "properties": { "id": "ci38018200", "mag": 1.17, "time": 1507108523230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.5975, 34.0275, 11.16 ] } }, + { "type": "Feature", "properties": { "id": "nc72904011", "mag": 1.65, "time": 1507108226290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.59, 39.034, 1.81 ] } }, + { "type": "Feature", "properties": { "id": "ak16988931", "mag": 1.6, "time": 1507107916290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4053, 65.8348, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38018192", "mag": 1.04, "time": 1507107119810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.243833, 34.561167, 7.55 ] } }, + { "type": "Feature", "properties": { "id": "uw61337191", "mag": 1.11, "time": 1507106498380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.3995, 47.466167, 20.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16988930", "mag": 1.5, "time": 1507105167087, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3314, 63.0932, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72903991", "mag": 1.0, "time": 1507105008930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.831667, 37.479167, 7.18 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0vg", "mag": 4.8, "time": 1507102453200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0265, 15.081, 39.52 ] } }, + { "type": "Feature", "properties": { "id": "uu60251092", "mag": 1.15, "time": 1507102301120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.109167, 37.453, 7.33 ] } }, + { "type": "Feature", "properties": { "id": "nc72903961", "mag": 0.99, "time": 1507102290690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.886, 37.634, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72903951", "mag": 1.13, "time": 1507102067530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.873, 37.655, 2.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16988890", "mag": 2.1, "time": 1507101218109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6853, 59.7843, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72903941", "mag": 1.93, "time": 1507099899370, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.174833, 36.7355, 8.83 ] } }, + { "type": "Feature", "properties": { "id": "ak16988888", "mag": 2.1, "time": 1507099796449, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.599, 58.1927, 18.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16988886", "mag": 1.1, "time": 1507099794659, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1044, 65.1213, 20.9 ] } }, + { "type": "Feature", "properties": { "id": "hv61932126", "mag": 2.54, "time": 1507098254160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.471, 19.958167, 34.056 ] } }, + { "type": "Feature", "properties": { "id": "ci38018128", "mag": 1.48, "time": 1507095935630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.237333, 33.3585, 9.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16988874", "mag": 2.0, "time": 1507095643589, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4213, 59.0929, 75.6 ] } }, + { "type": "Feature", "properties": { "id": "mb80259124", "mag": 1.12, "time": 1507094472670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5195, 46.889167, 10.71 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0ue", "mag": 4.7, "time": 1507093737820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.7448, 18.3756, 172.11 ] } }, + { "type": "Feature", "properties": { "id": "hv61932021", "mag": 1.47, "time": 1507093555340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7645, 19.608333, 19.406 ] } }, + { "type": "Feature", "properties": { "id": "uu60251087", "mag": 1.84, "time": 1507092267430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.456667, 42.600833, 1.84 ] } }, + { "type": "Feature", "properties": { "id": "ak16988835", "mag": 1.4, "time": 1507091990426, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8997, 62.5624, 2.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16988834", "mag": 2.0, "time": 1507091511196, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6239, 61.9391, 35.9 ] } }, + { "type": "Feature", "properties": { "id": "hv61931981", "mag": 2.06, "time": 1507091217900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6845, 18.778833, 34.132 ] } }, + { "type": "Feature", "properties": { "id": "ak16988831", "mag": 1.7, "time": 1507090320674, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0205, 61.3011, 30.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16988828", "mag": 1.6, "time": 1507090167802, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1141, 63.8125, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38018104", "mag": 0.97, "time": 1507089080620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.364, 33.395667, 5.23 ] } }, + { "type": "Feature", "properties": { "id": "ci38018096", "mag": 1.15, "time": 1507088756230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.118, 33.743333, 14.37 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0th", "mag": 5.0, "time": 1507087351060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.1517, -31.5827, 35.55 ] } }, + { "type": "Feature", "properties": { "id": "nc72903886", "mag": 1.89, "time": 1507087145860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.157333, 36.593167, 6.68 ] } }, + { "type": "Feature", "properties": { "id": "nc72903881", "mag": 1.09, "time": 1507086787130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.718666, 38.771667, 2.16 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0t5", "mag": 5.2, "time": 1507086128100, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.1988, -23.1056, 126.96 ] } }, + { "type": "Feature", "properties": { "id": "nn00608095", "mag": 1.8, "time": 1507085141975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.2313, 37.1571, 11.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16988758", "mag": 1.7, "time": 1507084302637, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3056, 61.634, 42.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72903856", "mag": 1.42, "time": 1507084182620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.847167, 37.6515, 3.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16988756", "mag": 1.9, "time": 1507083972695, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8168, 61.2547, 28.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38018048", "mag": 1.01, "time": 1507081338310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.112167, 34.101167, 8.93 ] } }, + { "type": "Feature", "properties": { "id": "mb80259119", "mag": 1.6, "time": 1507080820140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521833, 46.872833, 10.74 ] } }, + { "type": "Feature", "properties": { "id": "mb80259154", "mag": 1.65, "time": 1507080779330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5265, 46.876167, 11.17 ] } }, + { "type": "Feature", "properties": { "id": "ak16988720", "mag": 2.3, "time": 1507079042841, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4064, 60.3952, 12.4 ] } }, + { "type": "Feature", "properties": { "id": "nn00608069", "mag": 1.7, "time": 1507077765338, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.5495, 40.2609, 8.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16988717", "mag": 1.6, "time": 1507077365759, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3311, 63.2608, 0.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61931706", "mag": 1.47, "time": 1507077049100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6385, 19.553667, 11.424 ] } }, + { "type": "Feature", "properties": { "id": "ci38018040", "mag": 0.98, "time": 1507076389190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.269, 34.0685, 15.7 ] } }, + { "type": "Feature", "properties": { "id": "uw61337006", "mag": 0.96, "time": 1507074699210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.751333, 47.996333, 14.52 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0rt", "mag": 4.2, "time": 1507074238890, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.7745, 8.5663, 30.59 ] } }, + { "type": "Feature", "properties": { "id": "ci38018024", "mag": 1.57, "time": 1507073295750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.681, 35.0345, -0.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16988594", "mag": 2.0, "time": 1507073162743, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2617, 62.1345, 75.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16988588", "mag": 1.3, "time": 1507072732101, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2839, 61.0371, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61336986", "mag": 1.86, "time": 1507072508440, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.616667, 48.275333, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "uw61336981", "mag": 1.89, "time": 1507072212820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.6095, 48.259, 5.47 ] } }, + { "type": "Feature", "properties": { "id": "ak16988584", "mag": 1.0, "time": 1507071678363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3354, 64.9934, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72903836", "mag": 1.12, "time": 1507071527650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.805, 38.822667, 2.85 ] } }, + { "type": "Feature", "properties": { "id": "nc72903831", "mag": 1.06, "time": 1507071133930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.808998, 38.823166, 1.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16994062", "mag": 1.2, "time": 1507071050929, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8464, 63.0394, 121.6 ] } }, + { "type": "Feature", "properties": { "id": "nn00608062", "mag": 1.5, "time": 1507069440991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.445, 37.5469, 5.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72903806", "mag": 1.23, "time": 1507069427950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.739333, 38.805667, 1.44 ] } }, + { "type": "Feature", "properties": { "id": "uw61336956", "mag": 1.0, "time": 1507069356480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.319167, 46.078167, -1.11 ] } }, + { "type": "Feature", "properties": { "id": "ak16988555", "mag": 2.0, "time": 1507069258013, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.1558, 67.7665, 10.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16988552", "mag": 1.6, "time": 1507069137803, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3107, 61.1448, 20.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0q2", "mag": 4.2, "time": 1507068153470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2992, 15.6198, 60.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38018000", "mag": 1.69, "time": 1507067212670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.446333, 34.153333, 6.34 ] } }, + { "type": "Feature", "properties": { "id": "mb80259099", "mag": 1.07, "time": 1507067005720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.4045, 43.682, 5.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16988545", "mag": 1.7, "time": 1507066676846, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6733, 65.2302, 8.7 ] } }, + { "type": "Feature", "properties": { "id": "nn00608050", "mag": 1.7, "time": 1507066159273, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0874, 39.024, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38017984", "mag": 1.71, "time": 1507065949300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.347667, 33.392, 3.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60251062", "mag": 1.76, "time": 1507065772640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.412333, 42.583667, 5.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16988519", "mag": 2.6, "time": 1507065657270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.2687, 57.0749, 82.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16988491", "mag": 1.6, "time": 1507065428977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.3929, 65.0131, 16.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16988489", "mag": 1.2, "time": 1507065333200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.6212, 63.3407, 7.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16988484", "mag": 2.3, "time": 1507065014972, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0452, 62.216, 67.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72905396", "mag": 1.11, "time": 1507064824530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.4595, 41.531833, 2.93 ] } }, + { "type": "Feature", "properties": { "id": "uu60251057", "mag": 2.05, "time": 1507064724100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.399, 42.521333, 8.16 ] } }, + { "type": "Feature", "properties": { "id": "ci38017976", "mag": 1.59, "time": 1507064335800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.445833, 34.1535, 6.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72903776", "mag": 1.19, "time": 1507063701570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8805, 37.529167, 1.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0nr", "mag": 5.7, "time": 1507063144760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -49.3194, 13.4552, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72903771", "mag": 2.49, "time": 1507062907080, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.767, 38.799167, 0.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16988466", "mag": 1.3, "time": 1507062241011, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5134, 62.1795, 23.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16988439", "mag": 2.2, "time": 1507061510846, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8761, 60.5934, 142.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0n8", "mag": 4.5, "time": 1507061510710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 166.7231, 55.3488, 28.06 ] } }, + { "type": "Feature", "properties": { "id": "ci38017952", "mag": 1.07, "time": 1507061299680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.4405, 34.156167, 8.27 ] } }, + { "type": "Feature", "properties": { "id": "ak16988437", "mag": 1.3, "time": 1507061230777, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0856, 61.3457, 14.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16988435", "mag": 1.5, "time": 1507060035702, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9837, 61.6046, 61.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72903741", "mag": 1.18, "time": 1507059288800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764831, 38.788502, -0.61 ] } }, + { "type": "Feature", "properties": { "id": "ci38017936", "mag": 1.69, "time": 1507059189120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7955, 33.4895, 4.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16994048", "mag": 1.6, "time": 1507059099655, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6496, 59.6816, 88.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16994047", "mag": 1.4, "time": 1507058879703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6613, 58.3127, 61.4 ] } }, + { "type": "Feature", "properties": { "id": "nn00608048", "mag": 1.1, "time": 1507058710135, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.9271, 40.1731, 13.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38017912", "mag": 1.43, "time": 1507058424320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.440833, 34.1545, 6.88 ] } }, + { "type": "Feature", "properties": { "id": "ci38017904", "mag": 1.19, "time": 1507057846620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.1795, 35.002, -0.83 ] } }, + { "type": "Feature", "properties": { "id": "ci38017896", "mag": 1.26, "time": 1507057788590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.941667, 32.908, -0.33 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0lw", "mag": 5.2, "time": 1507057466210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -28.8364, -55.2702, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80259069", "mag": 1.71, "time": 1507056294930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.503, 46.830333, 12.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16988418", "mag": 1.8, "time": 1507056127213, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6502, 57.4998, 47.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72903726", "mag": 1.14, "time": 1507056074240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.84, 37.503833, 0.26 ] } }, + { "type": "Feature", "properties": { "id": "ak16988415", "mag": 1.4, "time": 1507055512017, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8175, 61.6607, 28.4 ] } }, + { "type": "Feature", "properties": { "id": "hv61931361", "mag": 2.65, "time": 1507055057800, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.324, 19.406667, 7.018 ] } }, + { "type": "Feature", "properties": { "id": "ci38017848", "mag": 1.04, "time": 1507054498390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.44, 34.157667, 8.94 ] } }, + { "type": "Feature", "properties": { "id": "uu60251037", "mag": 1.12, "time": 1507053937840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424333, 42.592167, 6.15 ] } }, + { "type": "Feature", "properties": { "id": "hv61931346", "mag": 2.16, "time": 1507053691890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.373667, 20.034833, 13.532 ] } }, + { "type": "Feature", "properties": { "id": "mb80259064", "mag": 1.12, "time": 1507053599620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.609167, 46.334833, -2.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16988394", "mag": 1.6, "time": 1507052715999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9718, 60.8946, 14.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16988390", "mag": 1.9, "time": 1507052122028, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3579, 61.0247, 111.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72903716", "mag": 2.07, "time": 1507052014050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.787667, 37.598833, 5.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16994042", "mag": 2.0, "time": 1507051700735, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4244, 59.8428, 129.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0jm", "mag": 4.6, "time": 1507050191000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.1126, -2.5625, 21.57 ] } }, + { "type": "Feature", "properties": { "id": "ci38017808", "mag": 1.9, "time": 1507049580810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.445167, 33.264333, 2.22 ] } }, + { "type": "Feature", "properties": { "id": "nn00608002", "mag": 1.2, "time": 1507049448566, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.2901, 37.8049, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "uu60251027", "mag": 1.41, "time": 1507048713320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.760333, 39.998667, 8.73 ] } }, + { "type": "Feature", "properties": { "id": "ak16988364", "mag": 1.1, "time": 1507048704427, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9116, 61.1262, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16988361", "mag": 1.8, "time": 1507048669896, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1084, 64.9183, 18.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38017800", "mag": 0.98, "time": 1507048261760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.446833, 34.154333, 7.94 ] } }, + { "type": "Feature", "properties": { "id": "nc72903676", "mag": 1.69, "time": 1507047264490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8285, 37.455833, 2.67 ] } }, + { "type": "Feature", "properties": { "id": "nc72903671", "mag": 1.3, "time": 1507047173830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.5795, 37.287833, 7.31 ] } }, + { "type": "Feature", "properties": { "id": "ci38017744", "mag": 1.05, "time": 1507046707770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.136833, 34.054167, 9.74 ] } }, + { "type": "Feature", "properties": { "id": "nc72903666", "mag": 2.58, "time": 1507046582120, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.464333, 36.750833, 7.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16988359", "mag": 1.4, "time": 1507045972022, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1249, 62.9454, 112.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16988358", "mag": 1.6, "time": 1507045690910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2536, 60.0003, 13.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16994035", "mag": 1.7, "time": 1507044159018, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6674, 59.3569, 72.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16988345", "mag": 2.7, "time": 1507043705635, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0117, 59.5043, 89.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72903631", "mag": 1.33, "time": 1507043277890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800667, 38.820167, 3.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16994033", "mag": 1.6, "time": 1507043019584, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3814, 58.3192, 13.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16988343", "mag": 2.7, "time": 1507042999732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3915, 51.6134, 9.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16994031", "mag": 1.7, "time": 1507042763401, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1107, 59.3023, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16994030", "mag": 1.3, "time": 1507042659104, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9147, 62.9235, 104.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16994029", "mag": 1.6, "time": 1507042166290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0354, 59.6428, 85.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0gv", "mag": 2.1, "time": 1507041358070, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.8228, 36.4458, 4.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16988332", "mag": 1.4, "time": 1507041247450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2842, 62.1118, 75.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38017688", "mag": 1.7, "time": 1507041034810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.665167, 35.975833, 2.12 ] } }, + { "type": "Feature", "properties": { "id": "hv61931251", "mag": 2.87, "time": 1507040757870, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.370833, 20.027333, 12.259 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0gr", "mag": 4.6, "time": 1507040383740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 175.9616, -39.6706, 78.62 ] } }, + { "type": "Feature", "properties": { "id": "nc72903611", "mag": 1.04, "time": 1507039230370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.979333, 37.537333, 3.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16988330", "mag": 1.8, "time": 1507038947118, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.8047, 53.5035, 24.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0k7", "mag": 2.6, "time": 1507038712390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.1971, 51.3674, 18.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0gm", "mag": 4.5, "time": 1507038514350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 94.7848, 25.0488, 74.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16988328", "mag": 1.3, "time": 1507038483396, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5284, 62.2253, 16.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16994023", "mag": 1.9, "time": 1507038160436, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.9795, 54.3692, 39.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16994021", "mag": 1.3, "time": 1507037424410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3659, 61.871, 45.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38017640", "mag": 0.99, "time": 1507035054330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.962167, 34.044333, 11.19 ] } }, + { "type": "Feature", "properties": { "id": "ak16994019", "mag": 2.4, "time": 1507034930692, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.8074, 51.67, 77.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16988323", "mag": 2.5, "time": 1507033401817, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.3851, 54.2478, 11.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16988320", "mag": 1.8, "time": 1507033125169, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8594, 61.9955, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72903576", "mag": 1.25, "time": 1507033081250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.496833, 35.946833, 9.32 ] } }, + { "type": "Feature", "properties": { "id": "ak16988318", "mag": 1.5, "time": 1507032487878, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.705, 62.0401, 40.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72903571", "mag": 1.19, "time": 1507032219730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.973167, 37.635667, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16988315", "mag": 1.6, "time": 1507031200996, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1077, 57.8662, 5.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72903561", "mag": 1.07, "time": 1507031172540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802002, 38.825832, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16988314", "mag": 1.7, "time": 1507031152426, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0389, 60.0214, 78.4 ] } }, + { "type": "Feature", "properties": { "id": "mb80259049", "mag": 2.51, "time": 1507030950500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.353833, 43.520167, 3.75 ] } }, + { "type": "Feature", "properties": { "id": "nc72903556", "mag": 1.59, "time": 1507030601280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.887667, 37.630333, 6.72 ] } }, + { "type": "Feature", "properties": { "id": "ci38017616", "mag": 1.23, "time": 1507030424420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.812833, 34.096833, 13.63 ] } }, + { "type": "Feature", "properties": { "id": "ci38017608", "mag": 1.47, "time": 1507030255050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.808167, 34.092333, 14.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72903546", "mag": 1.09, "time": 1507029639750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.82267, 38.807835, 1.84 ] } }, + { "type": "Feature", "properties": { "id": "ak16988306", "mag": 2.7, "time": 1507027595732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4068, 51.6479, 12.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72903531", "mag": 1.14, "time": 1507027098870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.763168, 38.789001, 0.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16988304", "mag": 1.4, "time": 1507026885090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5708, 61.3679, 26.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16994008", "mag": 1.6, "time": 1507025162686, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.958, 61.2532, 105.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16994007", "mag": 1.2, "time": 1507024176706, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1195, 62.8909, 99.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16988295", "mag": 2.1, "time": 1507023250156, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3958, 51.6323, 10.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16988294", "mag": 1.3, "time": 1507023225669, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7855, 61.7554, 59.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16988292", "mag": 2.6, "time": 1507022763592, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7772, 53.1343, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16988287", "mag": 1.2, "time": 1507022053291, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.872, 64.5325, 18.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16988284", "mag": 1.3, "time": 1507021950836, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.929, 64.5216, 18.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16988282", "mag": 1.4, "time": 1507021938525, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.8923, 58.4847, 8.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38017544", "mag": 1.28, "time": 1507021318130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.791333, 33.687167, 16.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16988279", "mag": 2.0, "time": 1507020554043, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2158, 61.698, 77.3 ] } }, + { "type": "Feature", "properties": { "id": "mb80259034", "mag": 1.18, "time": 1507020432130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521333, 46.873, 11.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0fa", "mag": 4.2, "time": 1507019233190, "felt": 43, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.0212, -33.014, 17.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16988271", "mag": 1.8, "time": 1507019136375, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1655, 60.4739, 86.3 ] } }, + { "type": "Feature", "properties": { "id": "uu60250997", "mag": 1.69, "time": 1507019083210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.137833, 42.522333, -0.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16993998", "mag": 1.8, "time": 1507018712322, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0756, 60.1685, 13.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72903491", "mag": 1.22, "time": 1507017869360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.486, 36.378, 5.97 ] } }, + { "type": "Feature", "properties": { "id": "ci38017536", "mag": 1.46, "time": 1507016252180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.479, 32.737333, 7.83 ] } }, + { "type": "Feature", "properties": { "id": "ak16988268", "mag": 1.4, "time": 1507015945802, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0368, 61.1636, 0.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16988267", "mag": 1.2, "time": 1507015806607, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4998, 63.1031, 5.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38017504", "mag": 1.41, "time": 1507014429310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.363333, 34.832, 3.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16988254", "mag": 4.1, "time": 1507013968245, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.3923, 54.6037, 20.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16988252", "mag": 1.7, "time": 1507013732258, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7964, 59.8936, 15.8 ] } }, + { "type": "Feature", "properties": { "id": "mb80259004", "mag": 1.07, "time": 1507013501160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523, 46.877333, 10.49 ] } }, + { "type": "Feature", "properties": { "id": "nn00607998", "mag": 1.1, "time": 1507013301155, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.3199, 37.7813, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16993990", "mag": 1.4, "time": 1507012650027, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.264, 62.5244, 86.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16988247", "mag": 2.1, "time": 1507012115547, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4061, 51.6742, 14.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16988245", "mag": 1.0, "time": 1507011961646, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.539, 63.1068, 11.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38017496", "mag": 1.24, "time": 1507011934810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.013833, 33.662167, 11.95 ] } }, + { "type": "Feature", "properties": { "id": "ci38017488", "mag": 1.25, "time": 1507011688900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.047333, 33.171, 5.29 ] } }, + { "type": "Feature", "properties": { "id": "ak16993987", "mag": 1.9, "time": 1507011535768, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.4878, 51.73, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16993986", "mag": 2.3, "time": 1507011386112, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3903, 51.6732, 5.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38017472", "mag": 1.5, "time": 1507010945840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.936833, 33.147, 7.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16988244", "mag": 1.2, "time": 1507010895307, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.6337, 63.3262, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38017464", "mag": 1.4, "time": 1507008876900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.4845, 32.748667, 13.78 ] } }, + { "type": "Feature", "properties": { "id": "ci38017456", "mag": 1.19, "time": 1507008741980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.783833, 33.267833, 11.48 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0ef", "mag": 4.9, "time": 1507008633680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9398, 15.4089, 62.32 ] } }, + { "type": "Feature", "properties": { "id": "mb80258984", "mag": 1.01, "time": 1507006889790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.430667, 43.6785, 7.63 ] } }, + { "type": "Feature", "properties": { "id": "mb80258979", "mag": 1.31, "time": 1507006468040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5225, 46.871167, 10.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16988238", "mag": 2.4, "time": 1507005858917, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.1659, 51.8129, 90.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16993983", "mag": 1.4, "time": 1507004701069, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7077, 62.778, 79.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38017432", "mag": 1.1, "time": 1507003677250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.790667, 33.485333, 4.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16988237", "mag": 1.5, "time": 1507003090709, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0237, 61.1529, 7.4 ] } }, + { "type": "Feature", "properties": { "id": "mb80258949", "mag": 1.2, "time": 1507002724530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529833, 46.869, 10.38 ] } }, + { "type": "Feature", "properties": { "id": "ak16988235", "mag": 2.7, "time": 1507001740915, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.6571, 52.9982, 32.2 ] } }, + { "type": "Feature", "properties": { "id": "nn00607958", "mag": 1.2, "time": 1507001239948, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3057, 38.4484, 5.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16988229", "mag": 1.6, "time": 1506999699601, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3039, 62.7285, 79.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16988225", "mag": 1.7, "time": 1506999179710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.178, 66.888, 7.7 ] } }, + { "type": "Feature", "properties": { "id": "mb80258939", "mag": 1.1, "time": 1506998768510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528833, 46.860333, 12.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16988222", "mag": 2.7, "time": 1506998450736, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.4948, 53.5386, 57.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16988221", "mag": 1.2, "time": 1506998296606, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3526, 63.268, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16988218", "mag": 1.0, "time": 1506997994823, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.5335, 53.8446, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16988217", "mag": 2.2, "time": 1506997972933, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6125, 58.9289, 125.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72903391", "mag": 1.03, "time": 1506997840780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.847336, 38.829834, 1.06 ] } }, + { "type": "Feature", "properties": { "id": "nc72903396", "mag": 1.23, "time": 1506997715100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.315667, 37.487833, 3.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38017400", "mag": 1.05, "time": 1506997467730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.334333, 33.346333, 9.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16993974", "mag": 1.4, "time": 1506996608838, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2536, 62.5803, 93.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16988215", "mag": 1.6, "time": 1506996320652, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.155, 61.9755, 70.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16993972", "mag": 1.6, "time": 1506995513010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7768, 60.1335, 76.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16993971", "mag": 1.2, "time": 1506995387104, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6738, 61.6682, 50.5 ] } }, + { "type": "Feature", "properties": { "id": "hv61930601", "mag": 2.1, "time": 1506994522010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.565506, 19.795834, 15.58 ] } }, + { "type": "Feature", "properties": { "id": "ak16993970", "mag": 1.1, "time": 1506994269143, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0156, 64.7374, 10.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72903381", "mag": 1.16, "time": 1506991878630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.803169, 38.824001, 2.33 ] } }, + { "type": "Feature", "properties": { "id": "ci38017368", "mag": 1.36, "time": 1506989712460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.168667, 34.0055, 13.99 ] } }, + { "type": "Feature", "properties": { "id": "uw61336686", "mag": 1.47, "time": 1506988725560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.044167, 49.145, -1.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16988200", "mag": 2.8, "time": 1506988653897, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6324, 61.3885, 39.1 ] } }, + { "type": "Feature", "properties": { "id": "nm60207781", "mag": 1.99, "time": 1506988371180, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.444833, 36.088167, 13.18 ] } }, + { "type": "Feature", "properties": { "id": "us2000az70", "mag": 4.7, "time": 1506987102640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 91.8995, 12.8626, 27.25 ] } }, + { "type": "Feature", "properties": { "id": "ci38017360", "mag": 1.72, "time": 1506986970860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.674, 35.035333, -0.82 ] } }, + { "type": "Feature", "properties": { "id": "us2000azc7", "mag": 2.4, "time": 1506986577400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.6124, 36.8167, 5.123 ] } }, + { "type": "Feature", "properties": { "id": "nm60207771", "mag": 1.11, "time": 1506984309110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.517167, 36.232667, 8.34 ] } }, + { "type": "Feature", "properties": { "id": "ci38017336", "mag": 1.0, "time": 1506984123180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2705, 33.975833, 4.84 ] } }, + { "type": "Feature", "properties": { "id": "nc72903356", "mag": 1.77, "time": 1506983102870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.991833, 40.153833, 4.17 ] } }, + { "type": "Feature", "properties": { "id": "uw61336646", "mag": 1.36, "time": 1506982150130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.4015, 46.173833, -0.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000ayh7", "mag": 4.4, "time": 1506982074330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.7039, -22.2431, 108.4 ] } }, + { "type": "Feature", "properties": { "id": "uw61336631", "mag": 1.27, "time": 1506980575160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.930333, 48.1035, -1.28 ] } }, + { "type": "Feature", "properties": { "id": "us2000aya0", "mag": 5.3, "time": 1506980277150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 167.7345, -19.4817, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72903316", "mag": 1.65, "time": 1506979898940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802, 38.824833, 2.33 ] } }, + { "type": "Feature", "properties": { "id": "nc72903311", "mag": 1.09, "time": 1506979301540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.531667, 37.139833, 8.93 ] } }, + { "type": "Feature", "properties": { "id": "nc72903306", "mag": 1.08, "time": 1506978484410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.444667, 36.959667, 6.72 ] } }, + { "type": "Feature", "properties": { "id": "nc72903301", "mag": 1.46, "time": 1506978005870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.351667, 39.5165, 4.32 ] } }, + { "type": "Feature", "properties": { "id": "mb80258889", "mag": 2.36, "time": 1506975888040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.9055, 47.358667, 13.73 ] } }, + { "type": "Feature", "properties": { "id": "nc72903286", "mag": 0.97, "time": 1506975385450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.946833, 37.590333, 0.28 ] } }, + { "type": "Feature", "properties": { "id": "ci38017200", "mag": 0.96, "time": 1506974805670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.503167, 33.8695, -0.36 ] } }, + { "type": "Feature", "properties": { "id": "us2000axzc", "mag": 2.8, "time": 1506974101570, "felt": 18, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -102.3612, 35.5909, 5.45 ] } }, + { "type": "Feature", "properties": { "id": "nc72903271", "mag": 2.25, "time": 1506973045100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.609167, 36.880667, 6.31 ] } }, + { "type": "Feature", "properties": { "id": "mb80258884", "mag": 1.4, "time": 1506972979050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5355, 46.8805, 12.28 ] } }, + { "type": "Feature", "properties": { "id": "nc72903261", "mag": 1.85, "time": 1506971674240, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.831833, 37.455667, 1.78 ] } }, + { "type": "Feature", "properties": { "id": "ci38017136", "mag": 1.08, "time": 1506971129830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.192, 34.993167, -0.84 ] } }, + { "type": "Feature", "properties": { "id": "mb80258874", "mag": 1.49, "time": 1506970982010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.4715, 45.995667, -2.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38017120", "mag": 0.99, "time": 1506970881590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.649167, 35.932833, 2.94 ] } }, + { "type": "Feature", "properties": { "id": "nc72903251", "mag": 1.78, "time": 1506970847010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.308833, 40.750667, -0.79 ] } }, + { "type": "Feature", "properties": { "id": "nc72903246", "mag": 1.41, "time": 1506970631190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.932667, 35.639, 4.96 ] } }, + { "type": "Feature", "properties": { "id": "nc72903241", "mag": 1.21, "time": 1506970286520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.679167, 38.533833, 5.88 ] } }, + { "type": "Feature", "properties": { "id": "ci38017104", "mag": 1.66, "time": 1506970188840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.133167, 34.279, 6.09 ] } }, + { "type": "Feature", "properties": { "id": "us2000axxi", "mag": 4.6, "time": 1506969995010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 102.3915, -7.056, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80258869", "mag": 1.46, "time": 1506969854670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523167, 46.87, 10.71 ] } }, + { "type": "Feature", "properties": { "id": "ci38017064", "mag": 1.26, "time": 1506968962060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.623333, 33.912167, 10.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72903226", "mag": 0.96, "time": 1506968036980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880333, 37.530667, 2.11 ] } }, + { "type": "Feature", "properties": { "id": "us2000axwl", "mag": 4.6, "time": 1506968031500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 94.5291, 21.4218, 96.74 ] } }, + { "type": "Feature", "properties": { "id": "nc72904986", "mag": 1.14, "time": 1506968001000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.718167, 40.935167, 12.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16988088", "mag": 2.2, "time": 1506967247502, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9366, 59.642, 98.9 ] } }, + { "type": "Feature", "properties": { "id": "nn00607868", "mag": 1.0, "time": 1506966403731, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.4944, 37.2386, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72903211", "mag": 0.98, "time": 1506965951300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.833, 37.457667, 1.76 ] } }, + { "type": "Feature", "properties": { "id": "ci37167228", "mag": 1.57, "time": 1506964185870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.4615, 34.328667, 3.74 ] } }, + { "type": "Feature", "properties": { "id": "ci38016984", "mag": 1.25, "time": 1506964183390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.466833, 34.3255, 4.39 ] } }, + { "type": "Feature", "properties": { "id": "nc72903196", "mag": 1.36, "time": 1506963756010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.827833, 37.456667, 2.57 ] } }, + { "type": "Feature", "properties": { "id": "mb80258854", "mag": 1.03, "time": 1506962682500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528667, 46.8625, 13.48 ] } }, + { "type": "Feature", "properties": { "id": "nc72903176", "mag": 1.21, "time": 1506962394170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.827833, 37.457167, 2.28 ] } }, + { "type": "Feature", "properties": { "id": "nc72903166", "mag": 1.88, "time": 1506961834060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.827167, 37.4555, 1.91 ] } }, + { "type": "Feature", "properties": { "id": "nc72903156", "mag": 1.69, "time": 1506961396620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8265, 37.456333, 2.16 ] } }, + { "type": "Feature", "properties": { "id": "nc72903146", "mag": 3.02, "time": 1506961086740, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.829, 37.453667, 2.61 ] } }, + { "type": "Feature", "properties": { "id": "ci38016888", "mag": 1.17, "time": 1506960224640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0325, 33.879333, -0.97 ] } }, + { "type": "Feature", "properties": { "id": "nc72903131", "mag": 1.08, "time": 1506959715450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.371333, 35.706833, 1.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16988071", "mag": 1.4, "time": 1506959208997, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.9837, 67.1697, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00607854", "mag": 1.7, "time": 1506958960926, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.8425, 36.5559, 8.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60250907", "mag": 2.05, "time": 1506957621760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4145, 42.546333, 7.87 ] } }, + { "type": "Feature", "properties": { "id": "nc72903111", "mag": 1.41, "time": 1506957279300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.997333, 36.462667, 5.69 ] } }, + { "type": "Feature", "properties": { "id": "nm60207666", "mag": 2.19, "time": 1506957159610, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.8025, 36.5505, 12.47 ] } }, + { "type": "Feature", "properties": { "id": "ak16988065", "mag": 2.7, "time": 1506956391417, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8151, 61.2492, 19.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80258839", "mag": 1.19, "time": 1506955175250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526167, 46.870333, 10.04 ] } }, + { "type": "Feature", "properties": { "id": "us2000axtv", "mag": 4.7, "time": 1506953290020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.1289, 2.6798, 25.66 ] } }, + { "type": "Feature", "properties": { "id": "nc72903096", "mag": 1.04, "time": 1506952925800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822667, 37.513833, 8.22 ] } }, + { "type": "Feature", "properties": { "id": "ak16987055", "mag": 1.1, "time": 1506952513029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2609, 64.6409, 14.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72903081", "mag": 1.18, "time": 1506950851670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.751663, 38.832832, 0.68 ] } }, + { "type": "Feature", "properties": { "id": "us2000axtl", "mag": 4.7, "time": 1506950716850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 51.6372, 28.6895, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80258829", "mag": 1.08, "time": 1506950613020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.524667, 46.868167, 9.75 ] } }, + { "type": "Feature", "properties": { "id": "mb80258824", "mag": 1.16, "time": 1506950147300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523333, 46.866667, 11.08 ] } }, + { "type": "Feature", "properties": { "id": "uu60250902", "mag": 1.34, "time": 1506949268120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.084, 44.7795, 11.23 ] } }, + { "type": "Feature", "properties": { "id": "mb80258814", "mag": 1.19, "time": 1506949148400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527333, 46.855833, 14.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61929981", "mag": 2.4, "time": 1506948942340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.592667, 19.465333, 0.033 ] } }, + { "type": "Feature", "properties": { "id": "us2000axsh", "mag": 2.6, "time": 1506947996150, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5037, 36.2851, 3.93 ] } }, + { "type": "Feature", "properties": { "id": "mb80258799", "mag": 1.69, "time": 1506947507620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527833, 46.869833, 10.17 ] } }, + { "type": "Feature", "properties": { "id": "ak16987046", "mag": 1.5, "time": 1506947130357, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1189, 63.1205, 16.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72903071", "mag": 1.5, "time": 1506946592080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.885667, 36.3165, 6.48 ] } }, + { "type": "Feature", "properties": { "id": "us2000axs4", "mag": 4.3, "time": 1506946114440, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -61.2682, 13.209, 136.91 ] } }, + { "type": "Feature", "properties": { "id": "us2000axsa", "mag": 4.3, "time": 1506945001990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 176.4854, -37.3176, 354.86 ] } }, + { "type": "Feature", "properties": { "id": "mb80258789", "mag": 2.2, "time": 1506944699010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.533, 46.869833, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "uu60250897", "mag": 1.6, "time": 1506943796070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.218667, 42.571667, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16986042", "mag": 1.3, "time": 1506943225411, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.912, 63.0196, 66.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16986039", "mag": 1.4, "time": 1506941366267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.3257, 63.3321, 6.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38016776", "mag": 1.44, "time": 1506940900650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.510667, 34.2985, 9.93 ] } }, + { "type": "Feature", "properties": { "id": "hv61929926", "mag": 2.13, "time": 1506940825170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.524002, 19.919001, 20.11 ] } }, + { "type": "Feature", "properties": { "id": "mb80258769", "mag": 1.48, "time": 1506940203900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.33, 46.119833, 6.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000axrm", "mag": 4.9, "time": 1506939736050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -88.2184, 12.3486, 35.55 ] } }, + { "type": "Feature", "properties": { "id": "ci38016768", "mag": 1.12, "time": 1506938746370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.067167, 34.208333, 2.04 ] } }, + { "type": "Feature", "properties": { "id": "ci38016760", "mag": 1.75, "time": 1506938502900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.064833, 34.207833, 2.06 ] } }, + { "type": "Feature", "properties": { "id": "nc72903041", "mag": 1.87, "time": 1506938425810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.908833, 36.368667, 8.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16985035", "mag": 1.7, "time": 1506938303105, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1495, 63.1057, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38016752", "mag": 1.08, "time": 1506938024070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.448833, 33.481, 8.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16985032", "mag": 1.1, "time": 1506937259442, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8806, 64.6842, 6.7 ] } }, + { "type": "Feature", "properties": { "id": "nm60207636", "mag": 1.71, "time": 1506936707930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.1365, 35.88, 10.55 ] } }, + { "type": "Feature", "properties": { "id": "uu60250892", "mag": 1.5, "time": 1506936161680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.480833, 42.384833, 5.67 ] } }, + { "type": "Feature", "properties": { "id": "mb80258764", "mag": 2.37, "time": 1506936112630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.534333, 46.8675, 13.36 ] } }, + { "type": "Feature", "properties": { "id": "mb80258759", "mag": 3.08, "time": 1506934838560, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529167, 46.872333, 11.44 ] } }, + { "type": "Feature", "properties": { "id": "ci38016728", "mag": 1.01, "time": 1506934828760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.065667, 34.2065, 1.91 ] } }, + { "type": "Feature", "properties": { "id": "us2000axr0", "mag": 4.3, "time": 1506933668380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8824, 16.708, 65.53 ] } }, + { "type": "Feature", "properties": { "id": "ci37398445", "mag": 0.97, "time": 1506933339570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.460667, 34.332333, 5.88 ] } }, + { "type": "Feature", "properties": { "id": "nc72903031", "mag": 1.45, "time": 1506933218670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.812667, 38.805, 2.29 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0e8", "mag": 1.4, "time": 1506931958320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.32, 43.6653, 7.15 ] } }, + { "type": "Feature", "properties": { "id": "uu60250882", "mag": 1.44, "time": 1506931830720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4165, 42.520333, 8.15 ] } }, + { "type": "Feature", "properties": { "id": "uu60250877", "mag": 1.13, "time": 1506930804620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.414333, 42.544333, 7.62 ] } }, + { "type": "Feature", "properties": { "id": "ci38016688", "mag": 1.28, "time": 1506929655950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.003333, 33.1775, 4.99 ] } }, + { "type": "Feature", "properties": { "id": "ak16985021", "mag": 2.3, "time": 1506927665686, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5448, 63.1998, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16985020", "mag": 1.7, "time": 1506927499500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4204, 67.3068, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80258749", "mag": 1.94, "time": 1506926930660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523333, 46.874, 11.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16985018", "mag": 1.1, "time": 1506926698712, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.829, 65.5759, 9.2 ] } }, + { "type": "Feature", "properties": { "id": "hv61929841", "mag": 1.98, "time": 1506926298850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.412338, 19.245501, 33.84 ] } }, + { "type": "Feature", "properties": { "id": "se60045313", "mag": 1.9, "time": 1506925923790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.894667, 34.9895, 0.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16984019", "mag": 1.1, "time": 1506925731082, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5467, 65.155, 3.8 ] } }, + { "type": "Feature", "properties": { "id": "mb80258744", "mag": 1.32, "time": 1506925562230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528833, 46.867167, 11.58 ] } }, + { "type": "Feature", "properties": { "id": "ci38016672", "mag": 0.97, "time": 1506925004450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.422833, 33.04, 10.21 ] } }, + { "type": "Feature", "properties": { "id": "ak16984018", "mag": 1.4, "time": 1506924871383, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2817, 61.9608, 23.3 ] } }, + { "type": "Feature", "properties": { "id": "uu60250872", "mag": 1.58, "time": 1506924776930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.033833, 38.600333, 7.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16984009", "mag": 3.0, "time": 1506924381290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1032, 58.7701, 99.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60250867", "mag": 1.58, "time": 1506924167170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.409667, 42.562167, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000axq4", "mag": 4.2, "time": 1506924037060, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 174.3565, -41.7636, 24.13 ] } }, + { "type": "Feature", "properties": { "id": "ci38016664", "mag": 1.49, "time": 1506923205850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.589167, 32.780833, 12.71 ] } }, + { "type": "Feature", "properties": { "id": "ci38016656", "mag": 2.39, "time": 1506923145240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.009833, 33.179833, 9.12 ] } }, + { "type": "Feature", "properties": { "id": "us2000axq3", "mag": 4.7, "time": 1506923126070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.4587, -21.8514, 582.95 ] } }, + { "type": "Feature", "properties": { "id": "ci38016648", "mag": 2.46, "time": 1506922959220, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.010167, 33.179, 8.89 ] } }, + { "type": "Feature", "properties": { "id": "uw61336471", "mag": 3.25, "time": 1506922219710, "felt": 66, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8935, 47.887833, 54.22 ] } }, + { "type": "Feature", "properties": { "id": "nm60207631", "mag": 1.51, "time": 1506922179830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.527833, 36.243667, 7.74 ] } }, + { "type": "Feature", "properties": { "id": "nn00607885", "mag": 1.0, "time": 1506921346217, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0518, 37.0814, 8.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000axpv", "mag": 4.8, "time": 1506921205270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 72.4324, 38.1132, 115.18 ] } }, + { "type": "Feature", "properties": { "id": "ak16983007", "mag": 1.4, "time": 1506919945331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5212, 66.5767, 2.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72902986", "mag": 1.91, "time": 1506919685230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.524833, 35.967333, 10.71 ] } }, + { "type": "Feature", "properties": { "id": "us2000axpm", "mag": 2.2, "time": 1506919604410, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5118, 36.9048, 4.52 ] } }, + { "type": "Feature", "properties": { "id": "uw61336446", "mag": 1.27, "time": 1506919122930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.245667, 46.345833, 7.97 ] } }, + { "type": "Feature", "properties": { "id": "ci38016584", "mag": 2.31, "time": 1506918555650, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7985, 33.500167, 5.3 ] } }, + { "type": "Feature", "properties": { "id": "uu60250862", "mag": 1.41, "time": 1506917347110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.411167, 42.640167, -1.04 ] } }, + { "type": "Feature", "properties": { "id": "ci38016576", "mag": 1.0, "time": 1506916919110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.43, 33.028833, 3.21 ] } }, + { "type": "Feature", "properties": { "id": "ci38016568", "mag": 1.08, "time": 1506916645840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.048333, 33.2415, 5.47 ] } }, + { "type": "Feature", "properties": { "id": "uu60250857", "mag": 1.42, "time": 1506916237980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.446167, 42.608333, 6.68 ] } }, + { "type": "Feature", "properties": { "id": "ci38016552", "mag": 1.32, "time": 1506915577280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.482167, 35.754, 3.27 ] } }, + { "type": "Feature", "properties": { "id": "hv61929701", "mag": 2.26, "time": 1506915466040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.021835, 19.397499, 0.02 ] } }, + { "type": "Feature", "properties": { "id": "us2000axp9", "mag": 2.5, "time": 1506915178660, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5196, 36.2819, 4.38 ] } }, + { "type": "Feature", "properties": { "id": "ak16982006", "mag": 3.4, "time": 1506913363596, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9176, 55.7636, 20.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000axp5", "mag": 2.7, "time": 1506913350820, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5073, 46.8582, 10.64 ] } }, + { "type": "Feature", "properties": { "id": "mb80258724", "mag": 1.27, "time": 1506912496350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.017333, 44.484667, 7.23 ] } }, + { "type": "Feature", "properties": { "id": "nc72902956", "mag": 1.67, "time": 1506912463450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.4705, 40.704167, 17.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60250847", "mag": 1.01, "time": 1506911908120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.418333, 42.516667, 6.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16982001", "mag": 1.1, "time": 1506909373983, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8167, 61.2439, 26.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60250837", "mag": 1.18, "time": 1506909364560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.411833, 42.520667, 7.35 ] } }, + { "type": "Feature", "properties": { "id": "mb80258714", "mag": 1.56, "time": 1506908562340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523167, 46.872833, 12.04 ] } }, + { "type": "Feature", "properties": { "id": "ak16981996", "mag": 1.3, "time": 1506908205944, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5285, 63.1691, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16982000", "mag": 1.4, "time": 1506908156528, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6012, 59.5948, 56.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000axnx", "mag": 2.6, "time": 1506907742490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4159, 42.5178, 6.97 ] } }, + { "type": "Feature", "properties": { "id": "ak16981992", "mag": 1.8, "time": 1506907678571, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2312, 63.3329, 7.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72902936", "mag": 1.52, "time": 1506905787330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.426, 38.404, 7.4 ] } }, + { "type": "Feature", "properties": { "id": "uu60250827", "mag": 1.35, "time": 1506905780190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4175, 42.518833, 6.5 ] } }, + { "type": "Feature", "properties": { "id": "uu60250822", "mag": 1.43, "time": 1506905571670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.422333, 42.512667, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61929496", "mag": 1.71, "time": 1506905364520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.584503, 19.484333, 2.03 ] } }, + { "type": "Feature", "properties": { "id": "ak16981986", "mag": 1.5, "time": 1506903663272, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7914, 61.5177, 34.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38016496", "mag": 1.6, "time": 1506903468250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793667, 33.502333, 5.16 ] } }, + { "type": "Feature", "properties": { "id": "ci38016488", "mag": 1.3, "time": 1506903227250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.5175, 34.2865, 7.02 ] } }, + { "type": "Feature", "properties": { "id": "nn00607841", "mag": 2.5, "time": 1506901760242, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.7954, 37.1971, 7.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72902911", "mag": 2.66, "time": 1506901676700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.506167, 40.3085, 21.45 ] } }, + { "type": "Feature", "properties": { "id": "ak16981979", "mag": 2.0, "time": 1506901404559, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6022, 63.105, 120.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16990868", "mag": 2.0, "time": 1506900397361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1198, 58.9916, 108.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16980981", "mag": 1.3, "time": 1506899671796, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.1479, 60.8928, 4.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38016456", "mag": 1.6, "time": 1506899253540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2755, 33.976333, 5.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72902901", "mag": 1.02, "time": 1506898875730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810165, 38.816834, 1.1 ] } }, + { "type": "Feature", "properties": { "id": "mb80258679", "mag": 1.05, "time": 1506897817900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525833, 46.891833, 12.84 ] } }, + { "type": "Feature", "properties": { "id": "ak16980976", "mag": 1.1, "time": 1506897164997, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.9167, 60.5402, 8.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16980971", "mag": 1.8, "time": 1506896659586, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1362, 61.9345, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16980968", "mag": 2.0, "time": 1506896402168, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9985, 65.5166, 15.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16980965", "mag": 1.5, "time": 1506895579977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.6538, 59.9364, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38016448", "mag": 1.52, "time": 1506895319020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.830833, 33.712, 16.9 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70236163", "mag": 2.36, "time": 1506894257160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.905833, 36.996333, 9.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16990861", "mag": 1.1, "time": 1506893923115, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3425, 61.0789, 57.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00607826", "mag": 1.4, "time": 1506893733690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6519, 39.1963, 5.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16980964", "mag": 1.2, "time": 1506892711109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8709, 61.4311, 46.5 ] } }, + { "type": "Feature", "properties": { "id": "uw61336341", "mag": 1.82, "time": 1506892129610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.567667, 49.3235, -1.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16990859", "mag": 1.9, "time": 1506891719402, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8509, 57.8862, 54.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16980963", "mag": 1.2, "time": 1506891059795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5477, 60.1976, 34.8 ] } }, + { "type": "Feature", "properties": { "id": "mb80258669", "mag": 1.06, "time": 1506890613170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.515667, 46.8785, 11.55 ] } }, + { "type": "Feature", "properties": { "id": "ak16980956", "mag": 2.1, "time": 1506890459542, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.2618, 53.748, 49.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16980945", "mag": 1.5, "time": 1506890359030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5485, 59.782, 2.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16980939", "mag": 2.7, "time": 1506890337968, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2691, 59.2151, 55.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16980943", "mag": 2.0, "time": 1506890332904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1083, 61.5648, 11.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000axlg", "mag": 2.5, "time": 1506890067740, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.7952, 35.9855, 3.13 ] } }, + { "type": "Feature", "properties": { "id": "nc72902871", "mag": 1.2, "time": 1506890044550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.619333, 36.969667, 5.21 ] } }, + { "type": "Feature", "properties": { "id": "ak16980936", "mag": 1.3, "time": 1506889965804, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4052, 62.336, 46.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16980933", "mag": 1.6, "time": 1506888599699, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.5246, 51.8512, 19.4 ] } }, + { "type": "Feature", "properties": { "id": "mb80258664", "mag": 1.08, "time": 1506888514540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525167, 46.889833, 12.19 ] } }, + { "type": "Feature", "properties": { "id": "nc72902866", "mag": 1.72, "time": 1506888000180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.3795, 40.710333, 18.86 ] } }, + { "type": "Feature", "properties": { "id": "us2000axkq", "mag": 3.3, "time": 1506887023210, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.4467, 36.1992, 5.42 ] } }, + { "type": "Feature", "properties": { "id": "us2000axkh", "mag": 4.4, "time": 1506885748640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3923, 15.6065, 68.63 ] } }, + { "type": "Feature", "properties": { "id": "us2000axkg", "mag": 4.7, "time": 1506885628670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 131.0709, 30.4016, 52.09 ] } }, + { "type": "Feature", "properties": { "id": "nc72902851", "mag": 1.6, "time": 1506885379850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.806167, 38.816833, 2.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16979941", "mag": 1.1, "time": 1506885213719, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2184, 62.3649, 80.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72902846", "mag": 1.16, "time": 1506883965960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.676, 37.612, 3.61 ] } }, + { "type": "Feature", "properties": { "id": "nn00607803", "mag": 1.2, "time": 1506883429003, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7983, 37.0626, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16990850", "mag": 1.4, "time": 1506881346159, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4695, 60.2829, 104.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72902836", "mag": 1.01, "time": 1506881205680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800835, 38.831833, 1.97 ] } }, + { "type": "Feature", "properties": { "id": "ak16979936", "mag": 1.1, "time": 1506880968876, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7414, 62.1039, 54.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00607807", "mag": 1.1, "time": 1506880810251, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1156, 38.2725, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "hv61928951", "mag": 2.13, "time": 1506880210700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.408493, 19.198166, 32.85 ] } }, + { "type": "Feature", "properties": { "id": "nn00607796", "mag": 1.4, "time": 1506880150990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7769, 37.082, 5.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16979932", "mag": 1.3, "time": 1506879650012, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5344, 59.9497, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16979928", "mag": 1.4, "time": 1506878561352, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7881, 59.4532, 86.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000axj4", "mag": 4.9, "time": 1506877281250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6588, -24.2867, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61336301", "mag": 1.08, "time": 1506877137600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.289333, 46.525667, 12.49 ] } }, + { "type": "Feature", "properties": { "id": "us2000axiu", "mag": 4.8, "time": 1506876485410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -76.1816, -45.7692, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72902831", "mag": 2.39, "time": 1506876142050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8365, 37.5015, 0.38 ] } }, + { "type": "Feature", "properties": { "id": "ak16978937", "mag": 1.2, "time": 1506875682364, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0123, 63.225, 1.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16990844", "mag": 1.0, "time": 1506875638383, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3476, 60.399, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16978936", "mag": 1.3, "time": 1506875438694, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1025, 62.0191, 64.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16990842", "mag": 1.6, "time": 1506873845866, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.7815, 51.9812, 27.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16977948", "mag": 2.0, "time": 1506871550948, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.142, 60.236, 132.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000axi9", "mag": 4.2, "time": 1506870604300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.8183, -18.2769, 600.28 ] } }, + { "type": "Feature", "properties": { "id": "nc72902801", "mag": 1.08, "time": 1506869234490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.736333, 37.427833, 11.17 ] } }, + { "type": "Feature", "properties": { "id": "nc72902796", "mag": 0.97, "time": 1506869005720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.80983, 38.822666, 2.38 ] } }, + { "type": "Feature", "properties": { "id": "nc72902791", "mag": 1.02, "time": 1506868646100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.018, 37.4345, 4.76 ] } }, + { "type": "Feature", "properties": { "id": "us2000axi8", "mag": 4.5, "time": 1506868536330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 92.3426, 12.898, 30.37 ] } }, + { "type": "Feature", "properties": { "id": "nc72902781", "mag": 1.48, "time": 1506867941180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.033833, 37.4125, 0.87 ] } }, + { "type": "Feature", "properties": { "id": "us2000axhz", "mag": 4.5, "time": 1506867628470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.306, 40.1598, 57.26 ] } }, + { "type": "Feature", "properties": { "id": "uw61336271", "mag": 1.68, "time": 1506867619960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.078833, 44.103667, -0.53 ] } }, + { "type": "Feature", "properties": { "id": "ak16990839", "mag": 1.7, "time": 1506867169462, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.3848, 56.4945, 79.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000axhv", "mag": 5.0, "time": 1506866880330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.5287, -22.8028, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16976960", "mag": 1.2, "time": 1506866784677, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7487, 60.0824, 8.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60250707", "mag": 2.06, "time": 1506866738590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.447833, 42.650333, 2.93 ] } }, + { "type": "Feature", "properties": { "id": "mb80258644", "mag": 1.07, "time": 1506866437550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525833, 46.866, 11.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61928751", "mag": 1.73, "time": 1506865813980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.633499, 19.408501, 4.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16976951", "mag": 1.0, "time": 1506864160172, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.909, 58.2689, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16976949", "mag": 1.0, "time": 1506864011046, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.6138, 60.5977, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16990832", "mag": 1.4, "time": 1506863730810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1725, 60.1804, 135.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16975974", "mag": 1.1, "time": 1506862307453, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3672, 61.3015, 47.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000axhf", "mag": 4.6, "time": 1506862144080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 91.9129, 12.7332, 25.97 ] } }, + { "type": "Feature", "properties": { "id": "ak16975970", "mag": 1.3, "time": 1506861392092, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.0328, 59.3749, 6.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16975965", "mag": 1.4, "time": 1506860447567, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3802, 59.7999, 122.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16975961", "mag": 1.9, "time": 1506860241377, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.3702, 58.1855, 1.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38016296", "mag": 0.97, "time": 1506860065660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.200333, 33.034167, 6.74 ] } }, + { "type": "Feature", "properties": { "id": "nc72902736", "mag": 1.01, "time": 1506859858880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793999, 38.812668, 3.13 ] } }, + { "type": "Feature", "properties": { "id": "ak16975960", "mag": 2.0, "time": 1506859830456, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.5366, 51.4282, 50.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16974988", "mag": 1.1, "time": 1506859403703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7216, 57.888, 61.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00607763", "mag": 2.0, "time": 1506858283945, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6834, 40.0949, 13.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16974986", "mag": 1.5, "time": 1506857978595, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6219, 59.7494, 10.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38016272", "mag": 1.31, "time": 1506857701950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.46, 34.330833, 3.08 ] } }, + { "type": "Feature", "properties": { "id": "mb80258619", "mag": 1.22, "time": 1506857080460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.509667, 46.908167, 15.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16974980", "mag": 2.0, "time": 1506856935435, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4679, 51.6302, 13.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16974977", "mag": 1.7, "time": 1506856591674, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.0171, 58.9928, 112.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16990818", "mag": 1.6, "time": 1506856352544, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6069, 60.035, 157.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72902701", "mag": 1.04, "time": 1506856284600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.718, 38.742333, 1.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16974975", "mag": 1.2, "time": 1506856083450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5011, 64.299, 14.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16974972", "mag": 1.5, "time": 1506855936313, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5182, 59.9216, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38016224", "mag": 1.28, "time": 1506855241040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.731167, 33.649, 12.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16990815", "mag": 2.8, "time": 1506854643419, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.4705, 51.8814, 165.3 ] } }, + { "type": "Feature", "properties": { "id": "hv61928636", "mag": 2.82, "time": 1506854300970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.485667, 20.355333, 14.282 ] } }, + { "type": "Feature", "properties": { "id": "ak16974969", "mag": 1.4, "time": 1506854297360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6332, 59.9863, 7.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72902676", "mag": 1.69, "time": 1506853476410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.984, 37.5295, 2.12 ] } }, + { "type": "Feature", "properties": { "id": "ak16973994", "mag": 1.0, "time": 1506853292474, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0636, 62.2825, 41.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00607794", "mag": 1.1, "time": 1506852962371, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9213, 38.3646, 5.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38016200", "mag": 1.06, "time": 1506852815200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.791833, 33.502167, 4.66 ] } }, + { "type": "Feature", "properties": { "id": "us2000axgb", "mag": 5.1, "time": 1506852415110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.6916, -24.4751, 87.71 ] } }, + { "type": "Feature", "properties": { "id": "ci38016192", "mag": 1.27, "time": 1506852211900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.464167, 36.311167, 0.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16990809", "mag": 1.3, "time": 1506851397558, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4428, 58.7981, 124.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16973987", "mag": 1.3, "time": 1506850332700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1498, 59.6631, 104.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72902646", "mag": 1.37, "time": 1506850223860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.452, 37.402167, 4.64 ] } }, + { "type": "Feature", "properties": { "id": "us2000axfz", "mag": 4.0, "time": 1506849733290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8612, 14.9405, 53.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16973981", "mag": 1.6, "time": 1506849720561, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2003, 60.1713, 129.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16973012", "mag": 1.1, "time": 1506849332753, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7558, 59.8604, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000axfu", "mag": 4.4, "time": 1506848263400, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.7814, 18.4858, 79.09 ] } }, + { "type": "Feature", "properties": { "id": "ci38016176", "mag": 1.75, "time": 1506848220800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.651333, 35.934333, 2.81 ] } }, + { "type": "Feature", "properties": { "id": "ci38016160", "mag": 1.37, "time": 1506846375610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.908333, 35.5955, 1.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16990805", "mag": 2.5, "time": 1506845582617, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.7071, 51.7987, 13.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16972044", "mag": 1.1, "time": 1506843571095, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4859, 61.0501, 21.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000axfi", "mag": 4.1, "time": 1506843463030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.5019, -1.5006, 197.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16972038", "mag": 1.5, "time": 1506842124989, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6539, 62.7976, 71.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16972036", "mag": 1.2, "time": 1506841940900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8258, 61.6968, 61.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80258604", "mag": 1.59, "time": 1506841735050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.459167, 46.866, 10.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38016112", "mag": 1.44, "time": 1506840801230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2085, 34.452833, 11.88 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70236143", "mag": 1.72, "time": 1506840567300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7785, 37.328333, 4.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16990799", "mag": 1.1, "time": 1506840419377, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7218, 59.2315, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16971064", "mag": 2.6, "time": 1506838204059, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5055, 59.3191, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000axek", "mag": 3.2, "time": 1506836917300, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7711, 36.4532, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16970116", "mag": 2.7, "time": 1506836847043, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9474, 62.6019, 6.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72902586", "mag": 1.42, "time": 1506836822020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8205, 37.604, 4.13 ] } }, + { "type": "Feature", "properties": { "id": "nc72902581", "mag": 1.71, "time": 1506836766960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8205, 37.604333, 4.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61928476", "mag": 1.81, "time": 1506836276760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.631836, 19.188999, 0.89 ] } }, + { "type": "Feature", "properties": { "id": "ak16970114", "mag": 1.3, "time": 1506835946408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.345, 60.1863, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60250622", "mag": 2.13, "time": 1506835247610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.578, 38.7305, -0.01 ] } }, + { "type": "Feature", "properties": { "id": "us2000axe4", "mag": 4.2, "time": 1506834536440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.1269, -6.2836, 59.98 ] } }, + { "type": "Feature", "properties": { "id": "us2000axdz", "mag": 4.1, "time": 1506833874150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -85.5987, 9.126, 39.13 ] } }, + { "type": "Feature", "properties": { "id": "ak16970083", "mag": 2.0, "time": 1506833288717, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6914, 61.3678, 29.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16969148", "mag": 1.9, "time": 1506832174570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.9412, 51.6192, 50.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16969146", "mag": 1.0, "time": 1506831622152, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.577, 62.7735, 79.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38016048", "mag": 1.04, "time": 1506831472900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.833167, 33.669167, 16.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38016040", "mag": 1.1, "time": 1506831149410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.485, 36.3695, 1.6 ] } }, + { "type": "Feature", "properties": { "id": "mb80258549", "mag": 1.59, "time": 1506830710300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5235, 46.889833, 13.14 ] } }, + { "type": "Feature", "properties": { "id": "hv61928346", "mag": 2.95, "time": 1506829826670, "felt": 21, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.095333, 19.715167, 33.794 ] } }, + { "type": "Feature", "properties": { "id": "ak16990790", "mag": 1.0, "time": 1506829471423, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2898, 60.1429, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72902546", "mag": 1.45, "time": 1506828244030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.157167, 36.626, 8.14 ] } }, + { "type": "Feature", "properties": { "id": "mb80258544", "mag": 1.11, "time": 1506828010380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526333, 46.871, 10.92 ] } }, + { "type": "Feature", "properties": { "id": "nc72902531", "mag": 1.44, "time": 1506827498200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.228833, 36.619333, 4.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16968180", "mag": 2.0, "time": 1506827492404, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.739, 61.1833, 86.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000axpk", "mag": 1.6, "time": 1506827393900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -70.9053, 41.6481, 6.51 ] } }, + { "type": "Feature", "properties": { "id": "ci38015992", "mag": 1.15, "time": 1506827015230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3845, 35.111667, 5.93 ] } }, + { "type": "Feature", "properties": { "id": "hv61928261", "mag": 2.05, "time": 1506825377030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.476502, 19.216, 37.47 ] } }, + { "type": "Feature", "properties": { "id": "ak16990784", "mag": 1.4, "time": 1506825243899, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.2232, 51.7576, 46.6 ] } }, + { "type": "Feature", "properties": { "id": "uw61336131", "mag": 1.16, "time": 1506825168050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9095, 48.316167, 1.09 ] } }, + { "type": "Feature", "properties": { "id": "mb80258539", "mag": 1.53, "time": 1506824807150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528833, 46.877, 11.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16967237", "mag": 1.8, "time": 1506824784256, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7866, 53.1332, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16990782", "mag": 2.0, "time": 1506823956350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.6834, 51.2465, 35.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16990781", "mag": 1.3, "time": 1506823856677, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.521, 59.9658, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72902506", "mag": 1.22, "time": 1506821920520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.7125, 37.351167, 7.83 ] } }, + { "type": "Feature", "properties": { "id": "us2000axct", "mag": 5.1, "time": 1506821726490, "felt": 125, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -73.1491, 7.5135, 142.73 ] } }, + { "type": "Feature", "properties": { "id": "ci38015920", "mag": 1.75, "time": 1506821149880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.354833, 33.961167, 5.95 ] } }, + { "type": "Feature", "properties": { "id": "us2000axcn", "mag": 4.9, "time": 1506821107970, "felt": 24, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.5685, 36.9167, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16990780", "mag": 2.5, "time": 1506821107760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.8117, 51.8357, 61.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38015912", "mag": 1.0, "time": 1506820492420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.119167, 33.9365, 14.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16990779", "mag": 1.3, "time": 1506819992776, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8841, 57.2184, 46.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16990778", "mag": 1.0, "time": 1506819499573, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4019, 63.1122, 97.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72902491", "mag": 1.79, "time": 1506819103020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.939, 37.635333, 5.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16966268", "mag": 1.8, "time": 1506818601975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9252, 60.1498, 112.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16966264", "mag": 1.5, "time": 1506818511725, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4432, 51.7288, 13.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16966263", "mag": 2.1, "time": 1506818242272, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7041, 52.7581, 14.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16990774", "mag": 1.5, "time": 1506818099252, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4546, 51.7076, 6.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16990772", "mag": 2.7, "time": 1506817440647, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.6939, 51.8802, 15.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000axc3", "mag": 4.5, "time": 1506817163710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 126.9456, 7.2071, 68.13 ] } }, + { "type": "Feature", "properties": { "id": "ak16965336", "mag": 1.9, "time": 1506816635445, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9899, 60.0896, 71.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16965329", "mag": 1.2, "time": 1506816385660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3486, 64.9885, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000axbx", "mag": 4.3, "time": 1506816328880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.9474, 51.9828, 27.38 ] } }, + { "type": "Feature", "properties": { "id": "hv61928136", "mag": 2.02, "time": 1506816129630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.123672, 19.313999, 2.22 ] } }, + { "type": "Feature", "properties": { "id": "uu60250512", "mag": 2.38, "time": 1506814998100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.459167, 42.663667, 2.14 ] } }, + { "type": "Feature", "properties": { "id": "us2000axbj", "mag": 3.2, "time": 1506814776660, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4566, 42.652, 6.15 ] } }, + { "type": "Feature", "properties": { "id": "us2000axba", "mag": 2.8, "time": 1506814745510, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4606, 42.6545, 4.98 ] } }, + { "type": "Feature", "properties": { "id": "us2000axb6", "mag": 2.7, "time": 1506814557760, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.473, 42.6754, 3.19 ] } }, + { "type": "Feature", "properties": { "id": "ak16964389", "mag": 1.2, "time": 1506813911112, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5092, 62.3699, 51.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38015880", "mag": 1.87, "time": 1506813831910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.455333, 34.324167, 2.96 ] } }, + { "type": "Feature", "properties": { "id": "us2000axas", "mag": 5.5, "time": 1506813329570, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 128.5426, 3.9405, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16964388", "mag": 1.6, "time": 1506812976279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5291, 59.2674, 85.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16989805", "mag": 1.4, "time": 1506812398891, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7509, 60.014, 105.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16964387", "mag": 1.0, "time": 1506812112182, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1116, 62.3522, 7.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16964380", "mag": 1.0, "time": 1506811899089, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6933, 62.6659, 6.2 ] } }, + { "type": "Feature", "properties": { "id": "nn00607730", "mag": 1.0, "time": 1506811774166, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9049, 37.2915, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00607738", "mag": 1.0, "time": 1506811292528, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.8999, 37.2878, 3.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00607737", "mag": 1.1, "time": 1506811240125, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9056, 37.279, 6.4 ] } }, + { "type": "Feature", "properties": { "id": "nn00607728", "mag": 1.1, "time": 1506811230164, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9061, 37.2885, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60250442", "mag": 2.43, "time": 1506810599500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4515, 42.661, 2.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16963468", "mag": 1.2, "time": 1506810291866, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5204, 63.352, 8.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00607721", "mag": 1.4, "time": 1506807445148, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6755, 40.2201, 8.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16963443", "mag": 1.1, "time": 1506806484011, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3476, 61.4217, 25.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16963413", "mag": 2.3, "time": 1506806152613, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.0067, 60.9307, 14.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16962501", "mag": 4.2, "time": 1506806106026, "felt": 17, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -152.2422, 59.621, 83.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16989798", "mag": 1.1, "time": 1506805696616, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7955, 61.7318, 98.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax9r", "mag": 4.7, "time": 1506805651800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 139.9751, 27.653, 485.8 ] } }, + { "type": "Feature", "properties": { "id": "uw61335981", "mag": 1.82, "time": 1506805100680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.056833, 48.412333, 50.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72902471", "mag": 2.5, "time": 1506804691550, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.2745, 38.558167, 6.21 ] } }, + { "type": "Feature", "properties": { "id": "nc71107604", "mag": 0.96, "time": 1506804690650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.780167, 35.5105, 3.92 ] } }, + { "type": "Feature", "properties": { "id": "ci38015856", "mag": 1.0, "time": 1506804008820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.791, 33.512, 6.24 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax9d", "mag": 4.1, "time": 1506803686610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.7108, -8.0939, 216.64 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax9h", "mag": 3.5, "time": 1506803627030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.5125, 17.7855, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61927906", "mag": 3.49, "time": 1506803617560, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.469, 19.209667, 35.947 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax99", "mag": 4.7, "time": 1506802488710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.8145, 21.6564, 64.59 ] } }, + { "type": "Feature", "properties": { "id": "ci38015848", "mag": 1.38, "time": 1506802371860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.363167, 33.357333, 10.38 ] } }, + { "type": "Feature", "properties": { "id": "nc72902466", "mag": 1.77, "time": 1506801988210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.781, 38.796667, 3.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16962490", "mag": 1.1, "time": 1506800090127, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1783, 59.7871, 69.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16962484", "mag": 1.5, "time": 1506799366659, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6852, 63.5864, 3.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00607710", "mag": 1.2, "time": 1506799171022, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.1362, 38.2888, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16962480", "mag": 3.0, "time": 1506798820424, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.1572, 55.8639, 11.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16989794", "mag": 1.9, "time": 1506798785904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.2132, 52.0688, 7.4 ] } }, + { "type": "Feature", "properties": { "id": "mb80258414", "mag": 1.87, "time": 1506798465250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525333, 46.872833, 11.78 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax8b", "mag": 2.5, "time": 1506797682590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4618, 42.6659, 3.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16962476", "mag": 1.4, "time": 1506797627539, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5093, 61.3123, 6.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16961588", "mag": 1.1, "time": 1506797036668, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7901, 63.2441, 12.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0d3", "mag": 4.1, "time": 1506796297940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8027, 15.4984, 19.41 ] } }, + { "type": "Feature", "properties": { "id": "ci38015776", "mag": 1.28, "time": 1506796206280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.89, 34.349167, 2.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16961586", "mag": 2.0, "time": 1506795961720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.8619, 51.4801, 41.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16961585", "mag": 1.1, "time": 1506795458511, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5581, 61.5616, 72.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38015752", "mag": 1.52, "time": 1506795424490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.160667, 34.4365, 4.43 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax7s", "mag": 4.8, "time": 1506795349220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9189, 16.1602, 51.93 ] } }, + { "type": "Feature", "properties": { "id": "nc72904876", "mag": 1.25, "time": 1506795206390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.484167, 40.699167, 11.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16961582", "mag": 1.1, "time": 1506794436503, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.6079, 60.1354, 9.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16961580", "mag": 1.1, "time": 1506794299451, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.5942, 60.1565, 7.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16961575", "mag": 1.6, "time": 1506793157002, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.119, 51.4689, 25.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax76", "mag": 4.9, "time": 1506789944160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.9767, 1.0533, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72902376", "mag": 1.84, "time": 1506788771420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8085, 38.817833, 3.12 ] } }, + { "type": "Feature", "properties": { "id": "nc72902381", "mag": 1.19, "time": 1506788628860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.3415, 37.8225, -0.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16960680", "mag": 2.9, "time": 1506788491228, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.9778, 51.4147, 57.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16989782", "mag": 1.1, "time": 1506788345464, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.7866, 57.4545, 53.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72902371", "mag": 1.16, "time": 1506786770930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.691, 38.7405, 1.44 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax6w", "mag": 2.6, "time": 1506785489440, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5446, 36.2305, 5.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16959801", "mag": 1.0, "time": 1506785312713, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7001, 61.542, 58.2 ] } }, + { "type": "Feature", "properties": { "id": "mb80258389", "mag": 1.27, "time": 1506783781070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.531167, 46.8685, 11.42 ] } }, + { "type": "Feature", "properties": { "id": "ci38015696", "mag": 2.28, "time": 1506783542670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.492667, 34.216, 5.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16959795", "mag": 1.6, "time": 1506783111232, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5985, 59.916, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72902346", "mag": 1.53, "time": 1506782817930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.249667, 37.864833, 5.03 ] } }, + { "type": "Feature", "properties": { "id": "nc72902336", "mag": 1.34, "time": 1506782106540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819833, 37.603833, 4.12 ] } }, + { "type": "Feature", "properties": { "id": "ci38015672", "mag": 1.46, "time": 1506781658250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.2715, 34.059333, 15.26 ] } }, + { "type": "Feature", "properties": { "id": "uw61335861", "mag": 1.05, "time": 1506780581040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.452333, 48.382667, 22.31 ] } }, + { "type": "Feature", "properties": { "id": "hv61927751", "mag": 2.29, "time": 1506780487200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.627833, 19.405333, 3.602 ] } }, + { "type": "Feature", "properties": { "id": "ak16958915", "mag": 1.1, "time": 1506779690755, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.5599, 60.3017, 2.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16958913", "mag": 1.2, "time": 1506779388174, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6949, 63.8592, 1.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16989774", "mag": 1.1, "time": 1506778517082, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4836, 62.981, 94.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38015648", "mag": 1.53, "time": 1506777358020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.461667, 34.329167, 3.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16958909", "mag": 1.8, "time": 1506777347886, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.2124, 67.8158, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38015640", "mag": 2.0, "time": 1506777335770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.658167, 31.867, 1.78 ] } }, + { "type": "Feature", "properties": { "id": "ci38015616", "mag": 1.28, "time": 1506776191250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.768833, 33.326833, 12.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16958907", "mag": 1.2, "time": 1506775842000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4069, 62.3275, 86.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72902306", "mag": 1.41, "time": 1506775748110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.82, 37.605333, 4.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16958905", "mag": 2.0, "time": 1506775349934, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.7202, 67.3687, 4.2 ] } }, + { "type": "Feature", "properties": { "id": "nn00607651", "mag": 1.2, "time": 1506775034180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8976, 38.3688, 7.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16958026", "mag": 2.8, "time": 1506774114627, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.7286, 67.3815, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "uu60250312", "mag": 2.59, "time": 1506774047790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.635, 37.764167, 13.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16958023", "mag": 1.6, "time": 1506773722633, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6494, 63.1022, 115.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16989768", "mag": 1.6, "time": 1506773709105, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8697, 59.0106, 105.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72902286", "mag": 1.55, "time": 1506773378420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.898833, 37.522667, 12.57 ] } }, + { "type": "Feature", "properties": { "id": "ld60143701", "mag": 0.98, "time": 1506773153350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.5095, 40.809333, 11.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16958020", "mag": 1.2, "time": 1506771142867, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0654, 62.1893, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16957154", "mag": 1.4, "time": 1506770413805, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3117, 61.0872, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38015552", "mag": 1.58, "time": 1506769732230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.155, 34.5615, 2.13 ] } }, + { "type": "Feature", "properties": { "id": "ak16989763", "mag": 1.5, "time": 1506768979985, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1722, 60.0493, 117.8 ] } }, + { "type": "Feature", "properties": { "id": "uu60250297", "mag": 1.97, "time": 1506768169440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4255, 42.547, 7.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16957134", "mag": 1.5, "time": 1506768169245, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9682, 61.4708, 39.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax5m", "mag": 5.2, "time": 1506767402460, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 128.7797, 1.8973, 37.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16989760", "mag": 1.1, "time": 1506766077754, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8184, 60.0072, 67.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72902251", "mag": 1.22, "time": 1506766057090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800833, 38.792667, 2.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16956252", "mag": 1.6, "time": 1506765146662, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3164, 61.6465, 25.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax55", "mag": 4.4, "time": 1506764918800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0971, 15.3765, 35.53 ] } }, + { "type": "Feature", "properties": { "id": "ak16956250", "mag": 3.1, "time": 1506764602367, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3876, 51.6362, 13.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60250277", "mag": 1.1, "time": 1506764348800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.411333, 38.962833, -1.36 ] } }, + { "type": "Feature", "properties": { "id": "nc72902211", "mag": 2.24, "time": 1506763678540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.1355, 37.688333, 25.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16955383", "mag": 2.0, "time": 1506763079790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7222, 59.2509, 16.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16955380", "mag": 1.1, "time": 1506762584802, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0664, 61.8814, 35.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72902196", "mag": 1.37, "time": 1506761418100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7435, 38.788, 0.74 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax4r", "mag": 2.5, "time": 1506761330980, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5543, 36.2286, 1.38 ] } }, + { "type": "Feature", "properties": { "id": "ci38015488", "mag": 1.48, "time": 1506761301510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3055, 33.255167, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38015480", "mag": 1.54, "time": 1506760683740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.638333, 33.165167, 2.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16955371", "mag": 2.5, "time": 1506760322340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.9144, 51.2732, 19.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72902186", "mag": 1.08, "time": 1506759358360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.750832, 38.806835, 0.69 ] } }, + { "type": "Feature", "properties": { "id": "nc72902176", "mag": 1.52, "time": 1506758934270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.270833, 39.463167, 6.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16955365", "mag": 2.3, "time": 1506758896299, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.4581, 50.7723, 29.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16955363", "mag": 1.2, "time": 1506758873795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2563, 61.2042, 65.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72902161", "mag": 1.43, "time": 1506758269830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820833, 37.604167, 3.89 ] } }, + { "type": "Feature", "properties": { "id": "nc72902151", "mag": 1.08, "time": 1506757752200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.095167, 36.564333, 8.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16954507", "mag": 1.7, "time": 1506757551919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.4734, 51.7808, 63.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16954502", "mag": 1.5, "time": 1506757337943, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7203, 60.1564, 96.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16954501", "mag": 1.2, "time": 1506757146790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0463, 62.4859, 12.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16954494", "mag": 1.2, "time": 1506755657374, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4986, 59.9398, 15.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16989746", "mag": 1.4, "time": 1506755147399, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.4214, 51.6622, 47.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72902146", "mag": 1.49, "time": 1506754443300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7965, 38.821167, 2.97 ] } }, + { "type": "Feature", "properties": { "id": "ak16953640", "mag": 1.8, "time": 1506754020475, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3389, 63.5229, 14.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38015432", "mag": 1.45, "time": 1506753848290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.784, 34.512167, 18.77 ] } }, + { "type": "Feature", "properties": { "id": "nc72902141", "mag": 1.71, "time": 1506753528720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9575, 37.590333, -0.13 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax3z", "mag": 5.0, "time": 1506753276470, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.7893, -37.146, 51.02 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax3x", "mag": 4.0, "time": 1506752562800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1802, 15.1606, 44.16 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax3v", "mag": 5.5, "time": 1506752076970, "felt": 45, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 105.0015, 32.3196, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72902116", "mag": 1.62, "time": 1506750865330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.599667, 37.407833, 9.53 ] } }, + { "type": "Feature", "properties": { "id": "ci38015368", "mag": 1.67, "time": 1506750508810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.076333, 36.188833, 2.55 ] } }, + { "type": "Feature", "properties": { "id": "mb80258359", "mag": 1.02, "time": 1506750398880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.9725, 47.5955, 16.81 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax3j", "mag": 2.7, "time": 1506750040910, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.2913, 46.8038, 7.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16952767", "mag": 1.8, "time": 1506749904921, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3454, 60.3536, 81.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16952766", "mag": 2.3, "time": 1506749189648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.3954, 52.6671, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax39", "mag": 4.5, "time": 1506748759440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.5825, -6.071, 46.79 ] } }, + { "type": "Feature", "properties": { "id": "nc72902081", "mag": 1.59, "time": 1506748525170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.82, 37.603833, 3.81 ] } }, + { "type": "Feature", "properties": { "id": "ak16989740", "mag": 1.2, "time": 1506747601510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7455, 63.2374, 127.9 ] } }, + { "type": "Feature", "properties": { "id": "uu60250227", "mag": 1.55, "time": 1506747254170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.416167, 42.576, 7.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16989738", "mag": 2.1, "time": 1506746345789, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.3938, 52.2402, 166.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax2y", "mag": 2.0, "time": 1506744973730, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -103.5373, 31.4264, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax2z", "mag": 4.2, "time": 1506744770640, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 56.8179, 27.8699, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16951924", "mag": 1.9, "time": 1506744732618, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0884, 59.736, 45.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72902041", "mag": 1.11, "time": 1506744250250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.833, 37.493667, -0.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16989735", "mag": 1.2, "time": 1506741220731, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9578, 61.9828, 69.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16951083", "mag": 2.6, "time": 1506741030111, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6653, 59.3044, 110.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16989733", "mag": 1.9, "time": 1506739580500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7167, 57.5293, 92.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax2n", "mag": 4.5, "time": 1506739554570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 136.7409, -3.3243, 53.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16951081", "mag": 1.2, "time": 1506738073140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.643, 59.7863, 2.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38015232", "mag": 1.78, "time": 1506737478680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.242833, 34.689, 2.49 ] } }, + { "type": "Feature", "properties": { "id": "nm60207556", "mag": 1.6, "time": 1506737274410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.540333, 36.441167, 8.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16951079", "mag": 1.0, "time": 1506737168134, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6248, 59.7789, 3.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16989730", "mag": 1.0, "time": 1506736917340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3855, 61.2392, 35.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16951077", "mag": 2.7, "time": 1506736523109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.4182, 51.6603, 65.4 ] } }, + { "type": "Feature", "properties": { "id": "nn00607629", "mag": 1.3, "time": 1506736488217, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.2269, 38.6102, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16989728", "mag": 1.8, "time": 1506734962617, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4354, 59.672, 120.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax2c", "mag": 4.2, "time": 1506734849800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1267, 15.2552, 35.18 ] } }, + { "type": "Feature", "properties": { "id": "ci38015192", "mag": 1.59, "time": 1506734841110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.231333, 34.69, 2.26 ] } }, + { "type": "Feature", "properties": { "id": "nc72901986", "mag": 1.53, "time": 1506733264430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820667, 37.604833, 4.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16950243", "mag": 1.5, "time": 1506732735872, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8027, 59.8685, 4.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989726", "mag": 1.2, "time": 1506732275435, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7993, 62.6213, 100.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000b217", "mag": 4.4, "time": 1506731641840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5238, -17.429, 578.55 ] } }, + { "type": "Feature", "properties": { "id": "nc72901976", "mag": 1.18, "time": 1506731621270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821, 37.608667, 4.18 ] } }, + { "type": "Feature", "properties": { "id": "ak16950242", "mag": 1.2, "time": 1506731391196, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6362, 63.7125, 120.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16989723", "mag": 1.7, "time": 1506730448510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6879, 60.1242, 106.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38015160", "mag": 1.92, "time": 1506730343820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.0465, 33.1715, 3.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16950224", "mag": 2.7, "time": 1506729701559, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9689, 62.8827, 10.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38015152", "mag": 2.71, "time": 1506729570740, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.046167, 33.172833, 9.13 ] } }, + { "type": "Feature", "properties": { "id": "ak16989254", "mag": 1.6, "time": 1506729481572, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.2839, 51.9212, 67.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16950219", "mag": 1.3, "time": 1506729013003, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.9672, 64.4141, 9.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16950216", "mag": 1.6, "time": 1506728300228, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1933, 61.9028, 3.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax17", "mag": 4.7, "time": 1506727132760, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 120.696, 13.6996, 135.75 ] } }, + { "type": "Feature", "properties": { "id": "ak16949390", "mag": 2.0, "time": 1506727039137, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6767, 61.5138, 15.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16949386", "mag": 1.2, "time": 1506726713734, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3628, 64.9795, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72901936", "mag": 1.7, "time": 1506726391160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822, 37.604667, 4.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38015128", "mag": 1.14, "time": 1506725917420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.794167, 33.499833, 4.55 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax0h", "mag": 4.3, "time": 1506725523560, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.9693, 6.7514, 162.39 ] } }, + { "type": "Feature", "properties": { "id": "nc72901926", "mag": 1.27, "time": 1506725219450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819667, 37.6045, 3.92 ] } }, + { "type": "Feature", "properties": { "id": "ak16989247", "mag": 1.4, "time": 1506725194385, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2194, 60.3483, 70.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72901921", "mag": 1.68, "time": 1506724972140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.7985, 38.0515, 10.15 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0b0", "mag": 4.2, "time": 1506724750370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.7775, 14.8225, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000awzq", "mag": 4.2, "time": 1506724590080, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.1967, -31.7027, 34.99 ] } }, + { "type": "Feature", "properties": { "id": "uu60250212", "mag": 1.71, "time": 1506723678770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.33, 44.419, 8.43 ] } }, + { "type": "Feature", "properties": { "id": "ak16948452", "mag": 1.0, "time": 1506723638356, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5236, 61.0736, 4.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60250207", "mag": 0.97, "time": 1506723591620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.331, 44.419667, 7.85 ] } }, + { "type": "Feature", "properties": { "id": "ak16948450", "mag": 2.2, "time": 1506723243356, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3899, 51.6225, 6.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16989243", "mag": 1.8, "time": 1506723039650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6224, 58.8526, 127.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38015088", "mag": 2.26, "time": 1506722552150, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2355, 34.1175, 22.24 ] } }, + { "type": "Feature", "properties": { "id": "us2000awz1", "mag": 4.9, "time": 1506721850800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0878, 15.2008, 58.14 ] } }, + { "type": "Feature", "properties": { "id": "us2000awyk", "mag": 3.0, "time": 1506721368710, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.71, 43.4329, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000awyj", "mag": 2.5, "time": 1506721170670, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8727, 36.4662, 8.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16948433", "mag": 1.1, "time": 1506720878279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3481, 63.5145, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38015064", "mag": 1.38, "time": 1506720751740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9775, 33.998333, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72901896", "mag": 1.79, "time": 1506720632350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822, 37.604667, 3.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16948427", "mag": 2.1, "time": 1506720336314, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3588, 61.6517, 20.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72901891", "mag": 2.87, "time": 1506720104700, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.352667, 38.643167, 5.77 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax7e", "mag": 2.5, "time": 1506719402880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.5572, 49.4225, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000awxt", "mag": 4.4, "time": 1506718802820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8406, 16.1453, 55.29 ] } }, + { "type": "Feature", "properties": { "id": "nc72901871", "mag": 1.92, "time": 1506717945880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.878667, 37.535, 2.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38015016", "mag": 1.05, "time": 1506717237070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.142333, 33.336167, -0.44 ] } }, + { "type": "Feature", "properties": { "id": "us2000awx6", "mag": 4.7, "time": 1506717060150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3377, 14.7629, 21.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72901856", "mag": 1.02, "time": 1506716541140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.722, 38.777668, 1.65 ] } }, + { "type": "Feature", "properties": { "id": "mb80258329", "mag": 1.68, "time": 1506716143860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.210167, 46.588333, 0.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16989238", "mag": 1.6, "time": 1506715318085, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.6762, 51.2251, 46.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38015000", "mag": 1.05, "time": 1506715194050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.174667, 33.223167, -0.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16989237", "mag": 1.3, "time": 1506715107803, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4109, 51.6654, 14.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16989236", "mag": 1.8, "time": 1506714300796, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.0656, 51.6073, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16946778", "mag": 1.8, "time": 1506713921345, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0358, 59.8156, 103.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000awvi", "mag": 4.7, "time": 1506713408290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8244, 14.6951, 25.26 ] } }, + { "type": "Feature", "properties": { "id": "us2000awvc", "mag": 5.3, "time": 1506713101350, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 160.0808, 53.2159, 47.81 ] } }, + { "type": "Feature", "properties": { "id": "nc72901811", "mag": 1.13, "time": 1506712684050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.839833, 37.5695, 1.15 ] } }, + { "type": "Feature", "properties": { "id": "ci38014936", "mag": 1.22, "time": 1506711284740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.962833, 36.582167, 5.17 ] } }, + { "type": "Feature", "properties": { "id": "ak16945947", "mag": 1.1, "time": 1506711226973, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7372, 61.7159, 11.2 ] } }, + { "type": "Feature", "properties": { "id": "uw61335536", "mag": 1.21, "time": 1506711131520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.5445, 46.492667, -1.15 ] } }, + { "type": "Feature", "properties": { "id": "nc72901801", "mag": 1.03, "time": 1506711093580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.840332, 38.841, 1.28 ] } }, + { "type": "Feature", "properties": { "id": "ci38014904", "mag": 1.27, "time": 1506710840540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.351833, 35.050333, -1.01 ] } }, + { "type": "Feature", "properties": { "id": "nc72901786", "mag": 1.25, "time": 1506710565410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.638, 38.771, 3.08 ] } }, + { "type": "Feature", "properties": { "id": "nc72901781", "mag": 1.14, "time": 1506710562310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.813333, 37.477, 10.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax1j", "mag": 2.6, "time": 1506708957540, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.9812, 40.4991, 10.41 ] } }, + { "type": "Feature", "properties": { "id": "uu60250167", "mag": 1.43, "time": 1506708811550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.408333, 42.627833, 0.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16945940", "mag": 2.2, "time": 1506708598408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1805, 65.8694, 11.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000awu0", "mag": 4.4, "time": 1506708535930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.7041, -29.9428, 24.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16989230", "mag": 1.2, "time": 1506708266694, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5133, 51.924, 29.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72901741", "mag": 0.97, "time": 1506707146210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823167, 37.608833, 3.97 ] } }, + { "type": "Feature", "properties": { "id": "ak16945938", "mag": 1.3, "time": 1506706984307, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.5563, 65.3108, 1.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16945133", "mag": 1.4, "time": 1506706312872, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5157, 60.0338, 76.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16945129", "mag": 1.8, "time": 1506705516485, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4094, 62.2086, 43.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72901691", "mag": 1.19, "time": 1506705001740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819833, 37.604, 4.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16945122", "mag": 2.7, "time": 1506704480054, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3979, 51.6138, 9.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16945116", "mag": 1.6, "time": 1506703818483, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7333, 62.8722, 95.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72901686", "mag": 1.37, "time": 1506703671060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.763167, 38.815, 1.59 ] } }, + { "type": "Feature", "properties": { "id": "ak16989222", "mag": 1.3, "time": 1506703480244, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.9223, 60.0784, 5.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000aws4", "mag": 4.2, "time": 1506703454020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2978, -24.5018, 178.46 ] } }, + { "type": "Feature", "properties": { "id": "ak16945111", "mag": 1.4, "time": 1506703443591, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3415, 60.1469, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aws9", "mag": 2.8, "time": 1506703434610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.561, 46.8309, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16945098", "mag": 2.9, "time": 1506703414975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.2265, 52.0599, 4.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72901676", "mag": 1.08, "time": 1506702827030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8685, 37.573667, 2.96 ] } }, + { "type": "Feature", "properties": { "id": "ci38014752", "mag": 1.38, "time": 1506702364640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9525, 33.161667, 8.71 ] } }, + { "type": "Feature", "properties": { "id": "nc72901666", "mag": 2.1, "time": 1506702098440, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822, 37.604167, 4.23 ] } }, + { "type": "Feature", "properties": { "id": "hv61926636", "mag": 2.18, "time": 1506702014920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.601833, 20.052667, 34.47 ] } }, + { "type": "Feature", "properties": { "id": "ak16944301", "mag": 1.2, "time": 1506702004530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4859, 61.9357, 38.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000awn9", "mag": 4.6, "time": 1506701320270, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 30.6565, 36.9513, 89.38 ] } }, + { "type": "Feature", "properties": { "id": "nc72901651", "mag": 1.66, "time": 1506701302480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.628333, 36.892667, -0.13 ] } }, + { "type": "Feature", "properties": { "id": "us2000awp8", "mag": 5.0, "time": 1506701291670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.8294, 21.3911, 69.37 ] } }, + { "type": "Feature", "properties": { "id": "ak16944298", "mag": 1.9, "time": 1506700558070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3591, 59.6184, 107.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16944296", "mag": 1.5, "time": 1506699999652, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.347, 60.6887, 39.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16944295", "mag": 2.3, "time": 1506699741265, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.4266, 51.6803, 2.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16944283", "mag": 3.0, "time": 1506699614700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.523, 51.6975, 12.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989214", "mag": 1.4, "time": 1506699333969, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5572, 51.8006, 17.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16944280", "mag": 1.6, "time": 1506699330322, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4554, 63.4968, 4.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000awju", "mag": 4.4, "time": 1506698634990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.674, 15.7931, 74.04 ] } }, + { "type": "Feature", "properties": { "id": "nc72901616", "mag": 1.45, "time": 1506698546300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.190833, 36.066, 9.01 ] } }, + { "type": "Feature", "properties": { "id": "nc72901611", "mag": 1.16, "time": 1506698374110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820167, 37.606167, 4.24 ] } }, + { "type": "Feature", "properties": { "id": "uu60250142", "mag": 1.31, "time": 1506698139210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.502167, 42.0255, -0.68 ] } }, + { "type": "Feature", "properties": { "id": "ak16989212", "mag": 1.5, "time": 1506697780188, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1692, 61.0412, 92.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72901601", "mag": 1.58, "time": 1506697356900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8215, 37.603833, 3.81 ] } }, + { "type": "Feature", "properties": { "id": "ak16944278", "mag": 1.3, "time": 1506696524699, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2498, 63.4064, 80.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16943485", "mag": 1.7, "time": 1506695993154, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7332, 58.8106, 5.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16943478", "mag": 1.7, "time": 1506695477590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7502, 58.8134, 7.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000awj3", "mag": 2.5, "time": 1506695343600, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.0981, 36.3324, 6.543 ] } }, + { "type": "Feature", "properties": { "id": "ak16943471", "mag": 2.5, "time": 1506695221683, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.9597, 58.9824, 104.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60250137", "mag": 1.65, "time": 1506694436450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.506667, 42.031167, 2.68 ] } }, + { "type": "Feature", "properties": { "id": "ak16943466", "mag": 1.3, "time": 1506694161233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3879, 63.5817, 1.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989205", "mag": 2.0, "time": 1506693991548, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.2136, 52.0676, 4.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72901566", "mag": 2.08, "time": 1506693960730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.862333, 37.5625, 4.47 ] } }, + { "type": "Feature", "properties": { "id": "ak16943439", "mag": 1.3, "time": 1506693558920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0206, 61.729, 33.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38014568", "mag": 2.51, "time": 1506693023860, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.270167, 33.67, 4.47 ] } }, + { "type": "Feature", "properties": { "id": "us2000awib", "mag": 5.0, "time": 1506692997440, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 67.9437, 39.8728, 20.04 ] } }, + { "type": "Feature", "properties": { "id": "nc72901551", "mag": 1.74, "time": 1506692955010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821167, 37.605667, 4.05 ] } }, + { "type": "Feature", "properties": { "id": "nc72901546", "mag": 2.76, "time": 1506692724780, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822, 37.606167, 4.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16942648", "mag": 1.5, "time": 1506692473989, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3697, 60.1847, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60250132", "mag": 1.79, "time": 1506692243980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.431, 42.543833, 7.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80258279", "mag": 1.06, "time": 1506691959070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.531833, 46.8625, 13.38 ] } }, + { "type": "Feature", "properties": { "id": "nc72901536", "mag": 1.82, "time": 1506691724930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821, 37.605667, 4.02 ] } }, + { "type": "Feature", "properties": { "id": "nn00607504", "mag": 1.8, "time": 1506690215490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7002, 37.7048, 16.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16942645", "mag": 2.8, "time": 1506689890335, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.2102, 52.0495, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61926461", "mag": 1.62, "time": 1506689375520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.457667, 19.1075, 28.777 ] } }, + { "type": "Feature", "properties": { "id": "ci38014488", "mag": 1.71, "time": 1506688966950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.030167, 36.589833, 2.83 ] } }, + { "type": "Feature", "properties": { "id": "uu60250122", "mag": 1.68, "time": 1506688495310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.410833, 42.548333, 8.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38014464", "mag": 1.51, "time": 1506688363340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.292833, 33.924, 11.12 ] } }, + { "type": "Feature", "properties": { "id": "uu60250117", "mag": 1.2, "time": 1506688147640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.451, 42.651167, 3.75 ] } }, + { "type": "Feature", "properties": { "id": "nn00607501", "mag": 1.5, "time": 1506687351344, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1244, 38.2711, 14.1 ] } }, + { "type": "Feature", "properties": { "id": "mb80258269", "mag": 1.01, "time": 1506686927230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.712667, 47.670333, 12.54 ] } }, + { "type": "Feature", "properties": { "id": "hv61926436", "mag": 2.78, "time": 1506686302190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.030667, 19.839833, 12.705 ] } }, + { "type": "Feature", "properties": { "id": "ak16941853", "mag": 1.9, "time": 1506685697166, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2959, 57.1271, 73.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000awh4", "mag": 4.5, "time": 1506685520260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0117, 15.1312, 54.94 ] } }, + { "type": "Feature", "properties": { "id": "ak16941849", "mag": 1.4, "time": 1506685238756, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2101, 65.8679, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000awh2", "mag": 3.2, "time": 1506684953300, "felt": 21, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -105.3739, 35.8708, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72901446", "mag": 1.81, "time": 1506683864270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8685, 37.5745, 2.94 ] } }, + { "type": "Feature", "properties": { "id": "ak16989195", "mag": 2.8, "time": 1506683238639, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.2168, 53.4134, 215.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16941846", "mag": 2.8, "time": 1506683013276, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4342, 51.6411, 13.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38014408", "mag": 1.09, "time": 1506682934740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.248167, 34.684167, 3.67 ] } }, + { "type": "Feature", "properties": { "id": "ci38014400", "mag": 1.41, "time": 1506682423780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.6475, 32.295833, 17.59 ] } }, + { "type": "Feature", "properties": { "id": "uw61335391", "mag": 1.31, "time": 1506682259150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.713833, 45.779, 4.47 ] } }, + { "type": "Feature", "properties": { "id": "nn00607493", "mag": 1.3, "time": 1506681999912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1157, 38.2921, 8.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000awgp", "mag": 4.0, "time": 1506681630910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.1308, 51.5953, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38014376", "mag": 2.27, "time": 1506680323320, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.236167, 34.686333, 2.51 ] } }, + { "type": "Feature", "properties": { "id": "nc72901411", "mag": 1.72, "time": 1506679482310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821833, 37.606833, 4.18 ] } }, + { "type": "Feature", "properties": { "id": "uu60250092", "mag": 1.5, "time": 1506678952480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.408833, 42.556667, 7.57 ] } }, + { "type": "Feature", "properties": { "id": "nc72901396", "mag": 1.23, "time": 1506677982920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.0275, 36.556333, 6.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38014304", "mag": 1.52, "time": 1506677845800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.798333, 33.502667, 4.26 ] } }, + { "type": "Feature", "properties": { "id": "uu60250087", "mag": 1.18, "time": 1506677776470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.772667, 41.2685, 12.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000awgf", "mag": 4.7, "time": 1506677102490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.7467, 21.3618, 39.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16989192", "mag": 1.2, "time": 1506676690210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7405, 63.338, 95.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38014288", "mag": 1.53, "time": 1506676635710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.671, 33.215333, 3.29 ] } }, + { "type": "Feature", "properties": { "id": "nc72901376", "mag": 1.15, "time": 1506676399250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.721832, 38.776001, 1.56 ] } }, + { "type": "Feature", "properties": { "id": "nc72901366", "mag": 1.25, "time": 1506676178310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.838167, 37.489833, 1.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00607489", "mag": 1.9, "time": 1506676166910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2245, 38.4923, 40.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989191", "mag": 1.8, "time": 1506675279572, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.0102, 58.492, 85.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989190", "mag": 1.3, "time": 1506674952846, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1298, 60.9057, 47.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000awfl", "mag": 4.4, "time": 1506674809710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.929, 14.9856, 43.22 ] } }, + { "type": "Feature", "properties": { "id": "uu60250082", "mag": 1.77, "time": 1506674053050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.7785, 38.186667, 4.92 ] } }, + { "type": "Feature", "properties": { "id": "ak16989188", "mag": 1.8, "time": 1506673945397, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.291, 51.5518, 1.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16940268", "mag": 1.1, "time": 1506673847917, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1687, 63.2488, 4.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72901291", "mag": 1.25, "time": 1506673221590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.898667, 37.523167, 12.92 ] } }, + { "type": "Feature", "properties": { "id": "ak16940267", "mag": 1.0, "time": 1506672847451, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5017, 66.1069, 17.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38014192", "mag": 1.18, "time": 1506671965070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.4335, 34.163833, 7.61 ] } }, + { "type": "Feature", "properties": { "id": "us2000awf5", "mag": 4.2, "time": 1506671826720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 90.3467, 33.9272, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00607584", "mag": 1.4, "time": 1506671521193, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1177, 38.2758, 11.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38014184", "mag": 2.46, "time": 1506671466000, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.978833, 33.994167, 4.88 ] } }, + { "type": "Feature", "properties": { "id": "nn00607484", "mag": 1.8, "time": 1506671441804, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1188, 38.2704, 11.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72901256", "mag": 1.15, "time": 1506670814700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8105, 38.808833, 0.67 ] } }, + { "type": "Feature", "properties": { "id": "nc72901241", "mag": 1.25, "time": 1506670284580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.989667, 36.427667, 2.31 ] } }, + { "type": "Feature", "properties": { "id": "nc72901231", "mag": 1.07, "time": 1506669441060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.540833, 37.406667, 8.01 ] } }, + { "type": "Feature", "properties": { "id": "uw61335361", "mag": 1.94, "time": 1506668594230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.733667, 47.824, 24.16 ] } }, + { "type": "Feature", "properties": { "id": "us2000awej", "mag": 4.2, "time": 1506668295660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 55.3123, 28.2886, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72901196", "mag": 0.96, "time": 1506668052570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.571833, 36.012667, 3.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16940266", "mag": 1.2, "time": 1506668048758, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5877, 62.1976, 22.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72901186", "mag": 1.14, "time": 1506667805720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.848167, 37.6535, 2.83 ] } }, + { "type": "Feature", "properties": { "id": "nc72901176", "mag": 1.25, "time": 1506667100210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.838333, 37.506167, 0.64 ] } }, + { "type": "Feature", "properties": { "id": "nc72901171", "mag": 2.27, "time": 1506666779210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835333, 37.507167, -1.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16940265", "mag": 1.4, "time": 1506666562961, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3945, 61.6303, 33.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16940263", "mag": 1.0, "time": 1506666497414, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1712, 62.2695, 52.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72901166", "mag": 1.28, "time": 1506666202970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834167, 37.5065, 0.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000awe6", "mag": 2.6, "time": 1506666160200, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.6816, 35.8653, 6.569 ] } }, + { "type": "Feature", "properties": { "id": "nn00607469", "mag": 1.0, "time": 1506665961601, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.5308, 38.52, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38014104", "mag": 1.28, "time": 1506665954550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.982833, 33.1725, 3.45 ] } }, + { "type": "Feature", "properties": { "id": "ak16989182", "mag": 1.1, "time": 1506665936336, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.485, 62.1641, 22.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72901156", "mag": 2.23, "time": 1506665326530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8385, 37.505167, 1.37 ] } }, + { "type": "Feature", "properties": { "id": "nc72901146", "mag": 3.34, "time": 1506665130490, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8355, 37.5055, 1.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16989181", "mag": 1.9, "time": 1506664620963, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.5107, 52.4839, 24.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72901116", "mag": 1.16, "time": 1506664498090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.824833, 37.605667, 4.02 ] } }, + { "type": "Feature", "properties": { "id": "ak16939483", "mag": 1.1, "time": 1506663985990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9358, 61.1521, 6.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72901106", "mag": 1.19, "time": 1506663736480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.78717, 38.829334, 1.02 ] } }, + { "type": "Feature", "properties": { "id": "nm60207436", "mag": 1.74, "time": 1506663708600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.653833, 36.539667, 9.66 ] } }, + { "type": "Feature", "properties": { "id": "us2000awdv", "mag": 4.5, "time": 1506663030100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.5233, -24.0812, 546.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16939475", "mag": 1.7, "time": 1506662432885, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8708, 60.1234, 43.7 ] } }, + { "type": "Feature", "properties": { "id": "uu60250077", "mag": 1.14, "time": 1506662404800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.55, 41.1085, 19.56 ] } }, + { "type": "Feature", "properties": { "id": "nc72901046", "mag": 1.46, "time": 1506661869950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.846833, 37.647833, 3.02 ] } }, + { "type": "Feature", "properties": { "id": "ci38013856", "mag": 2.0, "time": 1506660542280, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.978, 33.995, 4.89 ] } }, + { "type": "Feature", "properties": { "id": "ak16989177", "mag": 1.2, "time": 1506660008320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4686, 63.102, 104.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16945113", "mag": 2.3, "time": 1506659927913, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0654, 53.6407, 46.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000awd5", "mag": 5.0, "time": 1506659595610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1021, 14.8894, 24.04 ] } }, + { "type": "Feature", "properties": { "id": "nc72901021", "mag": 1.62, "time": 1506659436560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.826833, 38.814, 1.76 ] } }, + { "type": "Feature", "properties": { "id": "us2000awd1", "mag": 3.0, "time": 1506658713990, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.6968, 35.8549, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80258249", "mag": 2.26, "time": 1506658662520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.514, 46.840833, 13.41 ] } }, + { "type": "Feature", "properties": { "id": "ci38013816", "mag": 1.03, "time": 1506658457830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.02, 34.015, 13.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16938672", "mag": 1.1, "time": 1506657671332, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.311, 64.8546, 17.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000awcv", "mag": 5.6, "time": 1506657622320, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0465, 14.9039, 21.66 ] } }, + { "type": "Feature", "properties": { "id": "ak16945097", "mag": 2.0, "time": 1506657417279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.3696, 53.5031, 41.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72900986", "mag": 1.05, "time": 1506657208460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835833, 37.502333, -0.01 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235973", "mag": 1.64, "time": 1506657154290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.887333, 37.201833, 5.03 ] } }, + { "type": "Feature", "properties": { "id": "nc72900981", "mag": 1.98, "time": 1506656801880, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8045, 38.832333, 1.64 ] } }, + { "type": "Feature", "properties": { "id": "nc72900976", "mag": 1.12, "time": 1506656629400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.758667, 38.793499, 0.77 ] } }, + { "type": "Feature", "properties": { "id": "ci38013768", "mag": 1.6, "time": 1506656062720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.976, 33.995833, 3.45 ] } }, + { "type": "Feature", "properties": { "id": "ak16937888", "mag": 1.8, "time": 1506653782695, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9369, 62.1991, 64.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16989171", "mag": 1.9, "time": 1506653188688, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.5129, 51.845, 110.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61925851", "mag": 0.95, "time": 1506653113010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.463667, 19.481, 6.56 ] } }, + { "type": "Feature", "properties": { "id": "ci38013744", "mag": 1.0, "time": 1506653104110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.302333, 34.099, 15.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000awce", "mag": 4.4, "time": 1506652310280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.7803, 35.9821, 42.36 ] } }, + { "type": "Feature", "properties": { "id": "ci38013736", "mag": 2.07, "time": 1506652304260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.259833, 32.454333, 2.17 ] } }, + { "type": "Feature", "properties": { "id": "ci38013720", "mag": 2.39, "time": 1506651375080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.569, 31.324, 4.82 ] } }, + { "type": "Feature", "properties": { "id": "ci38013712", "mag": 1.12, "time": 1506651359620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.924833, 33.976167, 6.34 ] } }, + { "type": "Feature", "properties": { "id": "nn00607452", "mag": 1.0, "time": 1506651336185, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.1923, 35.5727, 11.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38013704", "mag": 0.97, "time": 1506651243970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7885, 33.494833, 5.39 ] } }, + { "type": "Feature", "properties": { "id": "ci38013688", "mag": 1.05, "time": 1506650990920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.791167, 33.5105, 6.09 ] } }, + { "type": "Feature", "properties": { "id": "ak16937883", "mag": 2.4, "time": 1506650514315, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.9834, 51.7396, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72900931", "mag": 1.16, "time": 1506649983200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.720497, 38.775501, 1.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16937869", "mag": 2.6, "time": 1506649468698, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8838, 61.8075, 66.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60013219", "mag": 1.32, "time": 1506648472160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.687, 41.150667, 12.61 ] } }, + { "type": "Feature", "properties": { "id": "uu60250062", "mag": 2.53, "time": 1506648435990, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.936667, 38.921333, 10.59 ] } }, + { "type": "Feature", "properties": { "id": "us2000awbw", "mag": 4.5, "time": 1506648405500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.976, 52.0498, 29.97 ] } }, + { "type": "Feature", "properties": { "id": "us2000awbq", "mag": 4.9, "time": 1506648161110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.1717, 52.3421, 33.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16937823", "mag": 1.0, "time": 1506648034498, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0631, 63.4906, 4.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16989160", "mag": 1.6, "time": 1506646713769, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.579, 51.7059, 15.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72900911", "mag": 1.15, "time": 1506646505210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834333, 37.504, -0.73 ] } }, + { "type": "Feature", "properties": { "id": "ci38013672", "mag": 2.61, "time": 1506646378780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.570333, 31.324667, 4.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16937047", "mag": 1.0, "time": 1506646107258, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4881, 63.0417, 2.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16937045", "mag": 1.9, "time": 1506646058692, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.135, 67.8468, 16.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72900906", "mag": 1.03, "time": 1506645880090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.876831, 38.8405, 2.17 ] } }, + { "type": "Feature", "properties": { "id": "nc72900886", "mag": 1.63, "time": 1506645570060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818333, 38.816667, 2.21 ] } }, + { "type": "Feature", "properties": { "id": "ci38013656", "mag": 2.24, "time": 1506645489800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.313, 34.094167, 17.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38013632", "mag": 1.51, "time": 1506645195410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7955, 33.502667, 3.76 ] } }, + { "type": "Feature", "properties": { "id": "nc72900876", "mag": 1.03, "time": 1506644780060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818, 37.470667, 1.87 ] } }, + { "type": "Feature", "properties": { "id": "nc72900871", "mag": 1.62, "time": 1506644672730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.585667, 37.234667, 6.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16937041", "mag": 1.3, "time": 1506644621941, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3267, 62.8222, 57.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16937039", "mag": 1.7, "time": 1506644576562, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.2144, 60.0462, 13.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16937037", "mag": 1.1, "time": 1506644052798, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.3512, 58.196, 2.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16989154", "mag": 1.6, "time": 1506643362489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3692, 51.6466, 12.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16937036", "mag": 1.4, "time": 1506643250597, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7379, 61.4006, 18.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000awbb", "mag": 4.9, "time": 1506643017480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.7489, 19.052, 30.59 ] } }, + { "type": "Feature", "properties": { "id": "ak16989677", "mag": 1.5, "time": 1506642839250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8862, 61.8988, 105.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16936268", "mag": 1.2, "time": 1506642106483, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9604, 62.3327, 42.9 ] } }, + { "type": "Feature", "properties": { "id": "nn00607431", "mag": 1.9, "time": 1506641437450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.5187, 36.978, 7.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72900841", "mag": 1.93, "time": 1506641348540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821, 37.606667, 4.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72900846", "mag": 1.13, "time": 1506641325970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818833, 37.608333, 4.24 ] } }, + { "type": "Feature", "properties": { "id": "nc72904266", "mag": 0.96, "time": 1506641269180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0985, 41.357, -1.69 ] } }, + { "type": "Feature", "properties": { "id": "ak16989674", "mag": 1.6, "time": 1506641141934, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9034, 59.5213, 94.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000awa2", "mag": 4.4, "time": 1506640604400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.6403, 51.5228, 41.23 ] } }, + { "type": "Feature", "properties": { "id": "nn00607821", "mag": 1.1, "time": 1506640364409, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9062, 38.3722, 8.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aw9p", "mag": 5.4, "time": 1506640275740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.7911, -24.8725, 440.96 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1wl", "mag": 4.8, "time": 1506639694670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.5676, 1.0849, 4.38 ] } }, + { "type": "Feature", "properties": { "id": "us2000aw9e", "mag": 4.7, "time": 1506639688220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 133.3331, 2.9053, 15.04 ] } }, + { "type": "Feature", "properties": { "id": "ak16989671", "mag": 1.7, "time": 1506639639127, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3134, 59.6717, 111.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16936241", "mag": 2.5, "time": 1506639635527, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1768, 68.4586, 17.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72900821", "mag": 1.1, "time": 1506639127150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834833, 37.500333, -1.77 ] } }, + { "type": "Feature", "properties": { "id": "us2000aw90", "mag": 5.1, "time": 1506638831750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5949, -34.0499, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aw8l", "mag": 4.3, "time": 1506638537770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.4998, -6.5326, 108.74 ] } }, + { "type": "Feature", "properties": { "id": "nc72900811", "mag": 2.32, "time": 1506638416610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.1135, 35.6885, 5.91 ] } }, + { "type": "Feature", "properties": { "id": "nc72900806", "mag": 1.35, "time": 1506638081190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.878833, 37.534, 2.41 ] } }, + { "type": "Feature", "properties": { "id": "uw61335056", "mag": 1.84, "time": 1506638058160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.417833, 45.624333, -1.28 ] } }, + { "type": "Feature", "properties": { "id": "mb80258209", "mag": 1.37, "time": 1506637878310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521333, 46.910833, 10.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16935473", "mag": 1.9, "time": 1506637576311, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.5454, 67.5431, 1.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16935469", "mag": 2.0, "time": 1506637236181, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4826, 58.8115, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16989667", "mag": 2.0, "time": 1506636836791, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4008, 59.8707, 143.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16989666", "mag": 1.1, "time": 1506636594038, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2636, 62.56, 91.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72900796", "mag": 1.35, "time": 1506636488490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.710833, 38.743, 2.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16935467", "mag": 1.1, "time": 1506635722873, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2148, 64.8337, 24.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16989663", "mag": 1.2, "time": 1506634878192, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0761, 62.868, 105.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000aw7x", "mag": 3.3, "time": 1506634428280, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 19.9413, 39.9063, 10.29 ] } }, + { "type": "Feature", "properties": { "id": "ak16989662", "mag": 1.3, "time": 1506634090975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8044, 63.1677, 125.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1wj", "mag": 4.0, "time": 1506633989680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 150.778, 49.1768, 363.15 ] } }, + { "type": "Feature", "properties": { "id": "ak16935454", "mag": 2.6, "time": 1506633516577, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9288, 61.8846, 49.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16935459", "mag": 2.8, "time": 1506633516034, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7041, 61.8689, 59.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00607410", "mag": 2.0, "time": 1506633382650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9234, 38.4032, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16935451", "mag": 1.7, "time": 1506632963331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.6029, 62.2054, 19.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38013352", "mag": 1.79, "time": 1506632691350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.990833, 33.765333, 14.42 ] } }, + { "type": "Feature", "properties": { "id": "nn00607723", "mag": 1.0, "time": 1506632347835, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1182, 38.2802, 11.5 ] } }, + { "type": "Feature", "properties": { "id": "hv61925221", "mag": 1.37, "time": 1506631999030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.430333, 19.4155, 3.336 ] } }, + { "type": "Feature", "properties": { "id": "ak16935443", "mag": 2.3, "time": 1506631969817, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.484, 61.7831, 31.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000aw54", "mag": 2.4, "time": 1506631716330, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.3897, 35.6755, 5.86 ] } }, + { "type": "Feature", "properties": { "id": "us2000aw51", "mag": 4.7, "time": 1506631326570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.2381, -7.2814, 142.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16989658", "mag": 1.3, "time": 1506630830832, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5815, 63.2958, 125.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16935439", "mag": 1.8, "time": 1506629924653, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1989, 60.9639, 35.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38013336", "mag": 1.94, "time": 1506629828900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.131167, 32.218833, 17.71 ] } }, + { "type": "Feature", "properties": { "id": "ak16989656", "mag": 1.2, "time": 1506629660078, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0033, 63.1036, 120.6 ] } }, + { "type": "Feature", "properties": { "id": "mb80258194", "mag": 1.36, "time": 1506628850530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525833, 46.870167, 10.85 ] } }, + { "type": "Feature", "properties": { "id": "ak16989655", "mag": 1.6, "time": 1506628609513, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2274, 59.9548, 119.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989654", "mag": 1.5, "time": 1506627145969, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4925, 59.606, 72.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72900741", "mag": 1.19, "time": 1506626419400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.631667, 36.039167, 2.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16989653", "mag": 1.4, "time": 1506626367074, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3296, 60.9023, 42.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000aw2q", "mag": 4.9, "time": 1506625864960, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -84.1381, 3.222, 33.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60249967", "mag": 1.41, "time": 1506625553170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.457167, 42.614667, 6.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16933835", "mag": 2.9, "time": 1506625397763, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -171.0327, 52.1592, 53.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38013288", "mag": 1.11, "time": 1506625160340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.118167, 33.2435, 12.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16989651", "mag": 1.3, "time": 1506624662212, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6565, 62.7268, 75.5 ] } }, + { "type": "Feature", "properties": { "id": "nn00607390", "mag": 1.2, "time": 1506624316884, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.0954, 35.994, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16933797", "mag": 2.1, "time": 1506623643983, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.596, 60.994, 73.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16933794", "mag": 1.9, "time": 1506623613173, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8361, 62.7886, 1.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38013264", "mag": 1.24, "time": 1506622262550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.530333, 35.347, 5.41 ] } }, + { "type": "Feature", "properties": { "id": "ak16989648", "mag": 1.6, "time": 1506621791811, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5986, 59.752, 76.2 ] } }, + { "type": "Feature", "properties": { "id": "hv61924821", "mag": 2.4, "time": 1506621499160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.122167, 19.331, 7.032 ] } }, + { "type": "Feature", "properties": { "id": "ak16933793", "mag": 1.6, "time": 1506621344909, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8725, 59.9048, 16.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72900701", "mag": 1.21, "time": 1506621263930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.129833, 36.62, 9.54 ] } }, + { "type": "Feature", "properties": { "id": "mb80258169", "mag": 1.95, "time": 1506620957630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.495833, 46.896167, 10.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16989646", "mag": 1.2, "time": 1506620810224, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5002, 61.5482, 31.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72900691", "mag": 1.44, "time": 1506620029980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.995833, 39.427167, 0.18 ] } }, + { "type": "Feature", "properties": { "id": "ak16989645", "mag": 1.5, "time": 1506619134173, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0379, 60.1776, 121.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38013232", "mag": 1.17, "time": 1506618737450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792167, 33.506833, 5.73 ] } }, + { "type": "Feature", "properties": { "id": "us2000avzh", "mag": 4.6, "time": 1506618485320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.5691, 2.1483, 97.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000avzb", "mag": 4.9, "time": 1506617586500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 120.0401, 6.0164, 50.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16933018", "mag": 1.2, "time": 1506617374262, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7645, 61.7278, 64.1 ] } }, + { "type": "Feature", "properties": { "id": "hv61924676", "mag": 1.37, "time": 1506617124930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.142167, 19.3215, 5.152 ] } }, + { "type": "Feature", "properties": { "id": "ak16989643", "mag": 1.6, "time": 1506616564611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8062, 60.4189, 2.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16989642", "mag": 1.4, "time": 1506615776447, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9273, 61.5228, 95.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989641", "mag": 1.3, "time": 1506615666771, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3551, 60.8947, 43.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000avyw", "mag": 2.7, "time": 1506615478140, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4394, 42.5767, 8.98 ] } }, + { "type": "Feature", "properties": { "id": "nc72900646", "mag": 1.38, "time": 1506615468050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.0045, 36.4415, 0.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16989640", "mag": 1.3, "time": 1506615161794, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0408, 63.589, 132.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16989639", "mag": 1.2, "time": 1506615119980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3231, 63.0526, 91.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16933017", "mag": 2.0, "time": 1506614678900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.3488, 68.1439, 6.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16989637", "mag": 2.0, "time": 1506614163379, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1177, 57.8245, 115.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72900616", "mag": 1.97, "time": 1506613917930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.833833, 37.506167, 0.46 ] } }, + { "type": "Feature", "properties": { "id": "ak16933016", "mag": 1.5, "time": 1506613537003, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1247, 62.197, 80.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72900606", "mag": 1.53, "time": 1506612805340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.996667, 39.425333, 0.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16989634", "mag": 1.6, "time": 1506612409300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4495, 58.785, 109.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989633", "mag": 1.3, "time": 1506612360069, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6854, 61.515, 2.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000avy5", "mag": 2.4, "time": 1506612136390, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.1391, 37.351, 10.96 ] } }, + { "type": "Feature", "properties": { "id": "ak16932254", "mag": 1.6, "time": 1506612041072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9819, 62.3692, 40.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000avxu", "mag": 2.3, "time": 1506611699680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.3926, 36.3885, 15.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16932252", "mag": 1.4, "time": 1506611616543, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7975, 61.8375, 20.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72900586", "mag": 1.03, "time": 1506611392120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.821335, 38.808834, 2.14 ] } }, + { "type": "Feature", "properties": { "id": "nc72900581", "mag": 1.68, "time": 1506611003850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.995167, 39.428167, 0.76 ] } }, + { "type": "Feature", "properties": { "id": "nc72900571", "mag": 3.21, "time": 1506610414710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.1635, 40.137833, 15.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16932251", "mag": 2.9, "time": 1506610104421, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.9091, 51.7632, 40.8 ] } }, + { "type": "Feature", "properties": { "id": "uu60249947", "mag": 1.1, "time": 1506608975840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.421333, 42.593667, 5.84 ] } }, + { "type": "Feature", "properties": { "id": "nc72900556", "mag": 1.09, "time": 1506608575910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821333, 37.6065, 3.9 ] } }, + { "type": "Feature", "properties": { "id": "uu60249942", "mag": 1.52, "time": 1506608341480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.415667, 42.591167, 5.46 ] } }, + { "type": "Feature", "properties": { "id": "ak16932247", "mag": 2.1, "time": 1506608150712, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4995, 59.282, 98.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16989627", "mag": 1.2, "time": 1506607597338, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5495, 63.4604, 104.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16989625", "mag": 1.6, "time": 1506607488149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3463, 61.0393, 106.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16932246", "mag": 1.4, "time": 1506606933995, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1075, 61.1056, 49.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16932241", "mag": 2.4, "time": 1506606217414, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3566, 59.8225, 132.2 ] } }, + { "type": "Feature", "properties": { "id": "nn00607373", "mag": 1.4, "time": 1506605920785, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.4887, 38.6992, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989622", "mag": 1.0, "time": 1506605668248, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.09, 62.8911, 77.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16932239", "mag": 1.5, "time": 1506605540122, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5382, 63.0052, 72.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72900531", "mag": 1.45, "time": 1506605237980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.023333, 37.519667, 2.73 ] } }, + { "type": "Feature", "properties": { "id": "uw61334636", "mag": 1.41, "time": 1506604992060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.905, 48.235833, 11.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16989620", "mag": 1.1, "time": 1506604766781, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9752, 64.7557, 17.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72900521", "mag": 1.23, "time": 1506604242090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.078, 37.663333, 7.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16989619", "mag": 1.3, "time": 1506603071727, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.42, 61.0462, 108.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60249937", "mag": 2.05, "time": 1506602964450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.440333, 42.584, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16931481", "mag": 1.0, "time": 1506601991313, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.596, 66.821, 3.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16989616", "mag": 1.3, "time": 1506601744056, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1565, 57.9069, 53.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16989615", "mag": 1.2, "time": 1506601651411, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3908, 68.9058, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16931479", "mag": 1.4, "time": 1506601472327, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4079, 61.6728, 40.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16931477", "mag": 1.1, "time": 1506601302752, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8998, 65.8646, 6.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72900496", "mag": 1.36, "time": 1506601178090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.88, 37.535, 2.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16931475", "mag": 1.2, "time": 1506600842484, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.174, 61.7151, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72900446", "mag": 2.75, "time": 1506598677940, "felt": 11, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.825333, 38.840167, 1.73 ] } }, + { "type": "Feature", "properties": { "id": "ak16930710", "mag": 2.2, "time": 1506598490657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4189, 62.1612, 87.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000avvw", "mag": 5.3, "time": 1506598185690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.558, 28.7786, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16989610", "mag": 1.2, "time": 1506597726479, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1805, 63.0271, 90.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72900431", "mag": 1.92, "time": 1506596753080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.485667, 38.5015, 5.55 ] } }, + { "type": "Feature", "properties": { "id": "ak16989609", "mag": 1.5, "time": 1506596722964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.1313, 51.5863, 44.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16930709", "mag": 1.4, "time": 1506596180091, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9834, 61.0931, 56.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16930708", "mag": 3.1, "time": 1506595515294, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 176.7195, 51.6195, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16989606", "mag": 1.5, "time": 1506595427986, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.5238, 51.5739, 68.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72900416", "mag": 1.17, "time": 1506594935360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.096, 36.553167, 9.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16930706", "mag": 1.2, "time": 1506593895889, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.338, 63.1851, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38012984", "mag": 1.12, "time": 1506593315340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6855, 35.838833, 4.14 ] } }, + { "type": "Feature", "properties": { "id": "nc72900391", "mag": 1.49, "time": 1506592222290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823333, 37.607, 4.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16930705", "mag": 1.1, "time": 1506591630653, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3689, 61.3755, 23.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38012952", "mag": 1.31, "time": 1506591135600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.834333, 32.734667, 5.37 ] } }, + { "type": "Feature", "properties": { "id": "hv61924526", "mag": 1.45, "time": 1506590418070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.421333, 19.392167, 9.534 ] } }, + { "type": "Feature", "properties": { "id": "nc72900381", "mag": 1.63, "time": 1506590284210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.2205, 38.063167, 9.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000avu4", "mag": 4.4, "time": 1506589563580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.6261, -23.7242, 196.73 ] } }, + { "type": "Feature", "properties": { "id": "ak16989602", "mag": 2.7, "time": 1506589434755, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.4192, 52.1877, 22.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38012928", "mag": 1.18, "time": 1506589107820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7675, 33.325167, 12.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16989601", "mag": 1.5, "time": 1506589104993, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4957, 51.6758, 15.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16929945", "mag": 2.3, "time": 1506588754779, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7058, 62.131, 34.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16929940", "mag": 2.6, "time": 1506588542400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.6191, 66.8364, 10.5 ] } }, + { "type": "Feature", "properties": { "id": "nn00607351", "mag": 1.4, "time": 1506588343442, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9118, 38.3801, 6.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16929936", "mag": 2.0, "time": 1506587984225, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4437, 61.9903, 29.6 ] } }, + { "type": "Feature", "properties": { "id": "mb80258129", "mag": 1.62, "time": 1506587784100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525167, 46.868167, 10.62 ] } }, + { "type": "Feature", "properties": { "id": "nc72900351", "mag": 1.19, "time": 1506586386820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880833, 37.536333, 3.07 ] } }, + { "type": "Feature", "properties": { "id": "us2000avte", "mag": 4.7, "time": 1506586379850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 117.1706, -10.7291, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000avtg", "mag": 5.3, "time": 1506586316130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.2449, 20.2657, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16929174", "mag": 2.3, "time": 1506586272361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7694, 61.6101, 47.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72900346", "mag": 1.18, "time": 1506586053100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823, 37.610167, 4.21 ] } }, + { "type": "Feature", "properties": { "id": "uw61334586", "mag": 2.19, "time": 1506585933680, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.6315, 48.074, -0.77 ] } }, + { "type": "Feature", "properties": { "id": "nn00607345", "mag": 1.8, "time": 1506585602623, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6237, 38.7874, 8.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16929171", "mag": 1.6, "time": 1506585414754, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1681, 58.2365, 0.7 ] } }, + { "type": "Feature", "properties": { "id": "hv61924441", "mag": 1.7, "time": 1506585350220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.865167, 19.430333, 13.243 ] } }, + { "type": "Feature", "properties": { "id": "nc72900326", "mag": 1.41, "time": 1506585322460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.751, 38.783, 2.58 ] } }, + { "type": "Feature", "properties": { "id": "ak16929167", "mag": 2.4, "time": 1506585219017, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.0108, 65.3932, 8.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16929164", "mag": 1.6, "time": 1506585151006, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7632, 61.6155, 48.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00607342", "mag": 1.4, "time": 1506584922597, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6325, 38.7911, 6.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16929162", "mag": 1.5, "time": 1506584839080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6957, 59.8727, 1.2 ] } }, + { "type": "Feature", "properties": { "id": "mb80258114", "mag": 1.59, "time": 1506584469140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525167, 46.867333, 10.81 ] } }, + { "type": "Feature", "properties": { "id": "mb80258109", "mag": 1.16, "time": 1506584073450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.53, 46.878167, 13.02 ] } }, + { "type": "Feature", "properties": { "id": "ci38012872", "mag": 1.17, "time": 1506583959450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.817833, 34.8665, 6.68 ] } }, + { "type": "Feature", "properties": { "id": "ak16989588", "mag": 1.8, "time": 1506583466047, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2642, 60.2053, 132.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000awdi", "mag": 1.5, "time": 1506583342200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.1659, 45.241, 4.82 ] } }, + { "type": "Feature", "properties": { "id": "us2000avsq", "mag": 4.8, "time": 1506582689240, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.4054, 37.4649, 44.08 ] } }, + { "type": "Feature", "properties": { "id": "ak16928412", "mag": 1.8, "time": 1506582059678, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.6189, 67.5652, 16.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16928397", "mag": 2.0, "time": 1506580602424, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1188, 61.1485, 13.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16928399", "mag": 1.1, "time": 1506580596261, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8057, 66.0421, 6.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72900281", "mag": 1.14, "time": 1506579131440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.88, 37.5365, 3.19 ] } }, + { "type": "Feature", "properties": { "id": "ak16928394", "mag": 1.6, "time": 1506578908430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0895, 61.7515, 17.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38012840", "mag": 0.96, "time": 1506578825230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.767667, 36.025167, 1.05 ] } }, + { "type": "Feature", "properties": { "id": "ci38012832", "mag": 1.0, "time": 1506578679490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.884833, 33.846833, 11.18 ] } }, + { "type": "Feature", "properties": { "id": "uu60249902", "mag": 1.26, "time": 1506578472190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.285833, 41.514167, 1.58 ] } }, + { "type": "Feature", "properties": { "id": "uu60249897", "mag": 1.56, "time": 1506578161990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4205, 42.5195, 5.83 ] } }, + { "type": "Feature", "properties": { "id": "ak16989578", "mag": 1.2, "time": 1506577617968, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0285, 60.9615, 99.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16927642", "mag": 2.5, "time": 1506576956542, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4519, 60.4702, 49.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16927639", "mag": 1.1, "time": 1506575989243, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9371, 64.4345, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000avrg", "mag": 4.2, "time": 1506575321430, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9228, 16.6784, 58.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16927634", "mag": 1.4, "time": 1506574806948, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9601, 61.6771, 57.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000avr9", "mag": 3.0, "time": 1506574593800, "felt": 16, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8025, 35.9915, 5.225 ] } }, + { "type": "Feature", "properties": { "id": "nc72900251", "mag": 1.08, "time": 1506573201460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.876833, 37.531833, 2.55 ] } }, + { "type": "Feature", "properties": { "id": "ak16989573", "mag": 1.0, "time": 1506573124099, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1846, 68.5953, 17.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72900241", "mag": 2.37, "time": 1506572664450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8255, 37.454833, 2.13 ] } }, + { "type": "Feature", "properties": { "id": "nc72900236", "mag": 1.11, "time": 1506572038110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.088333, 36.5915, 6.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16927631", "mag": 2.2, "time": 1506572029624, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6248, 51.535, 13.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16989570", "mag": 1.3, "time": 1506571605724, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1124, 61.418, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000avr1", "mag": 2.8, "time": 1506571358890, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.1712, 37.3741, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000avqw", "mag": 3.2, "time": 1506571014630, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.1535, 37.3739, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000avr2", "mag": 4.9, "time": 1506570988200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 151.8102, -5.2471, 64.55 ] } }, + { "type": "Feature", "properties": { "id": "nc72900206", "mag": 1.12, "time": 1506569953990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.878833, 37.5315, 2.34 ] } }, + { "type": "Feature", "properties": { "id": "nc72900201", "mag": 1.78, "time": 1506569868050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.191167, 36.174833, 16.31 ] } }, + { "type": "Feature", "properties": { "id": "mb80258089", "mag": 0.96, "time": 1506568483250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5215, 46.872833, 14.45 ] } }, + { "type": "Feature", "properties": { "id": "nc72900166", "mag": 1.94, "time": 1506568350160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.970833, 36.399167, 0.33 ] } }, + { "type": "Feature", "properties": { "id": "nc72900156", "mag": 1.95, "time": 1506567041430, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8805, 37.535167, 2.92 ] } }, + { "type": "Feature", "properties": { "id": "nn00607321", "mag": 1.0, "time": 1506566989487, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0173, 39.5809, 8.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38012696", "mag": 1.54, "time": 1506566359150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3855, 33.309667, 7.18 ] } }, + { "type": "Feature", "properties": { "id": "ak16926883", "mag": 1.4, "time": 1506564828219, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7449, 64.3314, 9.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16926881", "mag": 1.6, "time": 1506563449576, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7299, 60.5992, 21.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000avqf", "mag": 3.5, "time": 1506563003590, "felt": 11, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -1.5206, 47.8948, 7.47 ] } }, + { "type": "Feature", "properties": { "id": "us2000avq4", "mag": 3.4, "time": 1506562916490, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -83.8862, 9.972, 12.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16926876", "mag": 1.5, "time": 1506562750811, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2038, 62.3276, 80.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16989563", "mag": 2.4, "time": 1506562282380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.5433, 52.3165, 175.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38012648", "mag": 1.44, "time": 1506561221540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9255, 33.975833, 5.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16989561", "mag": 1.2, "time": 1506560682030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3529, 60.5442, 7.3 ] } }, + { "type": "Feature", "properties": { "id": "uu60249877", "mag": 2.9, "time": 1506560508370, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.946, 38.905, 8.36 ] } }, + { "type": "Feature", "properties": { "id": "ci38012624", "mag": 1.0, "time": 1506559691050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.812, 36.016833, 1.28 ] } }, + { "type": "Feature", "properties": { "id": "ci38012616", "mag": 1.66, "time": 1506559333880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.939667, 33.686667, 9.17 ] } }, + { "type": "Feature", "properties": { "id": "ak16926874", "mag": 1.3, "time": 1506559196699, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5701, 61.4562, 64.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72900121", "mag": 1.32, "time": 1506558055260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.2635, 39.396667, 0.45 ] } }, + { "type": "Feature", "properties": { "id": "ak16989559", "mag": 1.0, "time": 1506557933118, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9128, 61.7015, 46.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38012608", "mag": 1.47, "time": 1506557437030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.089667, 35.6985, 2.41 ] } }, + { "type": "Feature", "properties": { "id": "nc72900106", "mag": 1.15, "time": 1506556889810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.794, 38.821167, 2.63 ] } }, + { "type": "Feature", "properties": { "id": "nn00607313", "mag": 1.3, "time": 1506556883650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1041, 37.378, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "mb80258084", "mag": 1.57, "time": 1506556538250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526333, 46.874833, 14.66 ] } }, + { "type": "Feature", "properties": { "id": "nn00607310", "mag": 1.6, "time": 1506556172753, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.059, 37.1112, 7.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16926873", "mag": 1.3, "time": 1506556116361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.4042, 53.8015, 12.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72900096", "mag": 1.12, "time": 1506556022400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.731667, 38.760166, 1.18 ] } }, + { "type": "Feature", "properties": { "id": "ak16988195", "mag": 1.9, "time": 1506555035171, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0633, 60.0089, 114.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000avn9", "mag": 4.2, "time": 1506555004800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 119.4365, -8.2451, 154.02 ] } }, + { "type": "Feature", "properties": { "id": "nc72900086", "mag": 1.16, "time": 1506554882180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.738335, 38.755333, 0.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16926134", "mag": 1.1, "time": 1506554881350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.2845, 60.8545, 21.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16988193", "mag": 1.0, "time": 1506554670593, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1097, 62.4437, 13.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16926036", "mag": 1.3, "time": 1506554241873, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6125, 61.555, 35.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72900081", "mag": 1.22, "time": 1506554024900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.832, 37.5385, 4.78 ] } }, + { "type": "Feature", "properties": { "id": "ci38012576", "mag": 1.27, "time": 1506553539380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.392833, 34.878667, 4.66 ] } }, + { "type": "Feature", "properties": { "id": "ak16926028", "mag": 1.6, "time": 1506553116940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.5885, 67.5732, 17.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38012568", "mag": 1.61, "time": 1506552976740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.758833, 33.666667, 13.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16926026", "mag": 1.6, "time": 1506552344260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6143, 63.0496, 5.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16988188", "mag": 1.0, "time": 1506552342400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0102, 64.7419, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16926025", "mag": 1.7, "time": 1506551886678, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4287, 51.666, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "uu60249842", "mag": 1.14, "time": 1506551770950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.297667, 41.517833, 3.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16926021", "mag": 1.0, "time": 1506550963839, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7318, 63.2463, 16.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38012528", "mag": 1.36, "time": 1506549674520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792167, 33.505667, 5.04 ] } }, + { "type": "Feature", "properties": { "id": "us2000avlw", "mag": 4.5, "time": 1506549399140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 123.4716, 24.998, 125.83 ] } }, + { "type": "Feature", "properties": { "id": "ak16988184", "mag": 1.9, "time": 1506549387020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.4366, 51.4823, 54.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72900041", "mag": 1.15, "time": 1506549261590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.745331, 38.788502, 0.88 ] } }, + { "type": "Feature", "properties": { "id": "uu60249832", "mag": 1.22, "time": 1506548944800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.294333, 41.516333, 2.01 ] } }, + { "type": "Feature", "properties": { "id": "us2000avm6", "mag": 4.7, "time": 1506548861390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.5824, 28.7476, 33.11 ] } }, + { "type": "Feature", "properties": { "id": "hv61923721", "mag": 1.68, "time": 1506548248460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.233167, 19.411667, 26.335 ] } }, + { "type": "Feature", "properties": { "id": "ak16988183", "mag": 1.1, "time": 1506547027410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5065, 62.8856, 85.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16988182", "mag": 1.3, "time": 1506546817449, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3499, 60.4052, 65.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000avkb", "mag": 4.8, "time": 1506546638200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.5529, 28.769, 38.59 ] } }, + { "type": "Feature", "properties": { "id": "us2000avk0", "mag": 4.4, "time": 1506545901120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -73.9242, -10.8691, 104.23 ] } }, + { "type": "Feature", "properties": { "id": "nc72900011", "mag": 1.24, "time": 1506545494440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7435, 38.775167, 0.33 ] } }, + { "type": "Feature", "properties": { "id": "mb80258059", "mag": 1.99, "time": 1506545099310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.533833, 46.865333, 12.52 ] } }, + { "type": "Feature", "properties": { "id": "ak16988181", "mag": 1.9, "time": 1506544970602, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5993, 58.8739, 125.1 ] } }, + { "type": "Feature", "properties": { "id": "nc71107599", "mag": 1.73, "time": 1506544649060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.852333, 36.770333, 5.22 ] } }, + { "type": "Feature", "properties": { "id": "nc72900001", "mag": 1.02, "time": 1506544641500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.307333, 35.890833, 9.61 ] } }, + { "type": "Feature", "properties": { "id": "uw61334351", "mag": 1.62, "time": 1506543856900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.103667, 46.818167, -0.37 ] } }, + { "type": "Feature", "properties": { "id": "us2000avim", "mag": 4.5, "time": 1506542712990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.6095, -15.1614, 131.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16924547", "mag": 1.3, "time": 1506542654107, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6538, 61.2784, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72899976", "mag": 1.46, "time": 1506542639270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.024, 37.520333, 2.59 ] } }, + { "type": "Feature", "properties": { "id": "ak16988179", "mag": 1.4, "time": 1506542327610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9637, 61.5729, 96.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16988178", "mag": 1.2, "time": 1506541938004, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1366, 60.2787, 53.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16924544", "mag": 1.5, "time": 1506541523210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.1298, 59.8511, 15.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16924540", "mag": 3.0, "time": 1506540667871, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.8525, 51.0507, 13.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16924539", "mag": 1.3, "time": 1506540652841, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.178, 61.5488, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38012400", "mag": 0.98, "time": 1506540581720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.481833, 33.471167, 13.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16988174", "mag": 1.1, "time": 1506540333948, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.501, 61.2429, 47.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38012384", "mag": 1.3, "time": 1506539422810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.197, 34.992, -0.84 ] } }, + { "type": "Feature", "properties": { "id": "mb80258049", "mag": 1.59, "time": 1506539240620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.472833, 46.002167, -2.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72899931", "mag": 1.55, "time": 1506538588360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.4435, 38.569833, 7.29 ] } }, + { "type": "Feature", "properties": { "id": "ci38012368", "mag": 1.32, "time": 1506538425860, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.193167, 34.018167, 9.75 ] } }, + { "type": "Feature", "properties": { "id": "ci38012360", "mag": 1.78, "time": 1506537986730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.929, 33.395, 16.07 ] } }, + { "type": "Feature", "properties": { "id": "mb80258044", "mag": 1.34, "time": 1506537974910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.524833, 46.870667, 11.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80258039", "mag": 1.67, "time": 1506537644220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525, 46.873167, 11.84 ] } }, + { "type": "Feature", "properties": { "id": "ci38012352", "mag": 1.26, "time": 1506537396500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.313333, 35.0755, -0.97 ] } }, + { "type": "Feature", "properties": { "id": "ak16988173", "mag": 2.5, "time": 1506536259670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2174, 55.267, 28.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16923724", "mag": 1.8, "time": 1506535852212, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.5095, 57.4219, 64.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38012280", "mag": 1.04, "time": 1506535593850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.8595, 37.1805, -1.52 ] } }, + { "type": "Feature", "properties": { "id": "mb80258024", "mag": 1.14, "time": 1506535428310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.542833, 46.867, 15.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16923723", "mag": 1.8, "time": 1506535251777, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8081, 59.8933, 18.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72899896", "mag": 1.43, "time": 1506534720980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.1055, 37.325167, -0.31 ] } }, + { "type": "Feature", "properties": { "id": "nn00607242", "mag": 1.3, "time": 1506533616061, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.8105, 37.3086, 1.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16922991", "mag": 1.3, "time": 1506533488405, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0074, 62.0045, 73.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16922987", "mag": 1.8, "time": 1506533174170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1276, 62.1421, 107.7 ] } }, + { "type": "Feature", "properties": { "id": "mb80258019", "mag": 1.36, "time": 1506533071220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.9895, 46.553167, -2.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38012256", "mag": 1.4, "time": 1506532727840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.796333, 33.501667, 4.58 ] } }, + { "type": "Feature", "properties": { "id": "ak16922978", "mag": 3.9, "time": 1506532451736, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.5261, 52.9317, 19.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16922973", "mag": 1.3, "time": 1506532279574, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0546, 62.1579, 12.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16922968", "mag": 2.2, "time": 1506532267245, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0431, 59.4743, 92.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16922975", "mag": 1.9, "time": 1506532266486, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1368, 59.6598, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16922963", "mag": 1.1, "time": 1506530768012, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1018, 64.1209, 3.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16924550", "mag": 2.4, "time": 1506530256430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.6494, 52.9731, 12.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000avec", "mag": 2.6, "time": 1506529974600, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.0737, 44.3257, 12.14 ] } }, + { "type": "Feature", "properties": { "id": "nc72899871", "mag": 1.08, "time": 1506529473980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.836, 37.569167, 1.23 ] } }, + { "type": "Feature", "properties": { "id": "ci38012176", "mag": 1.03, "time": 1506529247980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.795833, 33.502, 4.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16922238", "mag": 1.6, "time": 1506529055903, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.7065, 67.422, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72899866", "mag": 1.85, "time": 1506528932600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.995833, 39.432667, 3.11 ] } }, + { "type": "Feature", "properties": { "id": "us2000ave0", "mag": 4.1, "time": 1506528488760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 119.9926, -7.5373, 611.74 ] } }, + { "type": "Feature", "properties": { "id": "us2000avdr", "mag": 4.1, "time": 1506527126210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.0234, -7.2935, 121.06 ] } }, + { "type": "Feature", "properties": { "id": "nc72899831", "mag": 1.23, "time": 1506526130580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.231667, 35.611, 3.55 ] } }, + { "type": "Feature", "properties": { "id": "ak16988160", "mag": 1.6, "time": 1506525379416, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9254, 58.9648, 66.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80257999", "mag": 1.8, "time": 1506524825390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.533333, 46.866, 13.41 ] } }, + { "type": "Feature", "properties": { "id": "nc72899816", "mag": 1.11, "time": 1506524218360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.989167, 37.558167, 1.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16988159", "mag": 1.2, "time": 1506524092965, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7404, 58.8609, 4.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38012112", "mag": 1.73, "time": 1506523530510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.417833, 34.440833, 0.65 ] } }, + { "type": "Feature", "properties": { "id": "nc72899796", "mag": 0.95, "time": 1506523499180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8715, 37.492667, 3.48 ] } }, + { "type": "Feature", "properties": { "id": "ak16921504", "mag": 1.8, "time": 1506522635679, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3466, 59.8103, 47.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16988157", "mag": 1.5, "time": 1506522267480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.561, 57.6875, 76.6 ] } }, + { "type": "Feature", "properties": { "id": "uw61311512", "mag": 1.06, "time": 1506522173600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.941333, 47.1825, 15.72 ] } }, + { "type": "Feature", "properties": { "id": "ak16920785", "mag": 2.4, "time": 1506522058371, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.3316, 56.7652, 41.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16920784", "mag": 1.4, "time": 1506521703637, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.533, 60.0761, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61923421", "mag": 1.78, "time": 1506521436470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.401167, 19.199167, 32.961 ] } }, + { "type": "Feature", "properties": { "id": "ak16920775", "mag": 2.0, "time": 1506520826084, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.649, 61.9693, 57.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16920772", "mag": 2.0, "time": 1506520439615, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2196, 59.6108, 85.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16920758", "mag": 2.9, "time": 1506520230887, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3755, 61.9643, 42.4 ] } }, + { "type": "Feature", "properties": { "id": "mb80257989", "mag": 1.28, "time": 1506520220400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5215, 46.870167, 11.81 ] } }, + { "type": "Feature", "properties": { "id": "ak16920757", "mag": 1.0, "time": 1506520046138, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5503, 65.1678, 11.6 ] } }, + { "type": "Feature", "properties": { "id": "nn00607209", "mag": 1.5, "time": 1506519994705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7233, 40.1708, 10.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38012040", "mag": 1.13, "time": 1506519953180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.935333, 34.4565, 9.26 ] } }, + { "type": "Feature", "properties": { "id": "nc72899776", "mag": 1.01, "time": 1506519567480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.840667, 37.5315, -1.51 ] } }, + { "type": "Feature", "properties": { "id": "nc72899766", "mag": 1.77, "time": 1506519075660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.243667, 39.398333, 12.87 ] } }, + { "type": "Feature", "properties": { "id": "nc72899761", "mag": 1.35, "time": 1506518981970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.745833, 38.784333, 1.01 ] } }, + { "type": "Feature", "properties": { "id": "us2000avce", "mag": 2.7, "time": 1506518011840, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.555, 46.8463, 8.48 ] } }, + { "type": "Feature", "properties": { "id": "ak16920754", "mag": 2.5, "time": 1506517941863, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.4288, 51.3519, 42.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16920753", "mag": 1.2, "time": 1506517783977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.1318, 60.4494, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16920743", "mag": 2.6, "time": 1506516302533, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0235, 61.6238, 41.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16988145", "mag": 1.2, "time": 1506515748862, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9213, 61.1389, 61.5 ] } }, + { "type": "Feature", "properties": { "id": "mb80257979", "mag": 1.95, "time": 1506514222430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528667, 46.869667, 13.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16920741", "mag": 1.4, "time": 1506513863630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4582, 62.4107, 39.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16920740", "mag": 2.1, "time": 1506513265227, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.2773, 65.177, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16920737", "mag": 1.4, "time": 1506513028050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1779, 58.0206, 30.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16920020", "mag": 1.9, "time": 1506512934355, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.4027, 59.1963, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16920019", "mag": 1.3, "time": 1506511124207, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9174, 59.9564, 76.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38011952", "mag": 1.07, "time": 1506511069520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.789667, 33.489167, 5.35 ] } }, + { "type": "Feature", "properties": { "id": "mb80257974", "mag": 1.33, "time": 1506510967360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526833, 46.881, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000avaw", "mag": 2.7, "time": 1506509852090, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -103.2764, 31.1697, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72899726", "mag": 1.29, "time": 1506508915160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.809, 38.828833, 0.37 ] } }, + { "type": "Feature", "properties": { "id": "nc72899721", "mag": 1.52, "time": 1506508865060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.074167, 36.490333, 6.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16920017", "mag": 1.5, "time": 1506508671618, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.664, 59.7325, 12.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72899716", "mag": 1.33, "time": 1506507368050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.621833, 36.9715, 5.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16988138", "mag": 1.5, "time": 1506506488102, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3194, 60.198, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72899711", "mag": 1.1, "time": 1506506346060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.830667, 37.480333, -1.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16920009", "mag": 1.7, "time": 1506506054796, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8154, 59.9932, 104.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16988136", "mag": 1.4, "time": 1506505999692, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1528, 59.8387, 71.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16920005", "mag": 1.7, "time": 1506505194635, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0126, 61.1428, 12.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16920003", "mag": 1.3, "time": 1506504555844, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.6373, 60.4592, 9.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61923186", "mag": 1.49, "time": 1506503971290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2035, 19.597167, 24.581 ] } }, + { "type": "Feature", "properties": { "id": "nn00607200", "mag": 1.3, "time": 1506503935311, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.2622, 38.0846, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000av9q", "mag": 3.0, "time": 1506503712310, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -103.2693, 31.1511, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72899701", "mag": 1.06, "time": 1506503394340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819167, 37.604333, 4.32 ] } }, + { "type": "Feature", "properties": { "id": "mb80257964", "mag": 1.06, "time": 1506503136100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529667, 46.8705, 10.5 ] } }, + { "type": "Feature", "properties": { "id": "uu60249807", "mag": 1.65, "time": 1506503101030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.067, 42.665833, 6.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38011904", "mag": 1.21, "time": 1506502961890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.0485, 33.171333, 5.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000av9i", "mag": 4.2, "time": 1506502867800, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.3374, -29.45, 38.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16919291", "mag": 2.0, "time": 1506502630723, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.4344, 59.1851, 6.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60249797", "mag": 1.72, "time": 1506502497570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.061667, 42.664667, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38011896", "mag": 1.37, "time": 1506502201400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.052, 33.172, 6.03 ] } }, + { "type": "Feature", "properties": { "id": "ci38011880", "mag": 1.16, "time": 1506501606110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.542667, 32.944667, 6.67 ] } }, + { "type": "Feature", "properties": { "id": "us2000av94", "mag": 4.6, "time": 1506500888720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 54.1871, 28.1091, 45.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16919288", "mag": 1.0, "time": 1506500817789, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4269, 65.2147, 15.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16988130", "mag": 2.0, "time": 1506500078029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.5053, 51.0555, 12.3 ] } }, + { "type": "Feature", "properties": { "id": "nc71107564", "mag": 1.29, "time": 1506499044330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.570833, 38.927167, 9.62 ] } }, + { "type": "Feature", "properties": { "id": "us2000av8z", "mag": 4.3, "time": 1506498944880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.1801, -21.2747, 610.22 ] } }, + { "type": "Feature", "properties": { "id": "nc72899666", "mag": 1.1, "time": 1506498551180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8395, 37.568167, 1.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16918579", "mag": 1.9, "time": 1506498372082, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5535, 59.8103, 129.5 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235883", "mag": 1.79, "time": 1506498339870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.776167, 37.332333, 4.84 ] } }, + { "type": "Feature", "properties": { "id": "nc72899656", "mag": 1.07, "time": 1506497879900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818169, 38.816334, 2.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16988128", "mag": 1.7, "time": 1506497626569, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5074, 58.9707, 125.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00607194", "mag": 1.4, "time": 1506496907372, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0035, 38.4922, 2.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16918577", "mag": 2.4, "time": 1506495198173, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.3064, 51.5599, 38.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00607192", "mag": 1.3, "time": 1506495045147, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1202, 38.2811, 9.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16917880", "mag": 1.4, "time": 1506494125518, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4062, 59.5783, 46.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38011824", "mag": 2.15, "time": 1506493452570, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.377, 34.425667, 6.94 ] } }, + { "type": "Feature", "properties": { "id": "ak16917877", "mag": 1.0, "time": 1506493181446, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.74, 66.8722, 13.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16988124", "mag": 2.0, "time": 1506492309885, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.6222, 51.5723, 70.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16917874", "mag": 1.0, "time": 1506491782705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3009, 62.1686, 20.4 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235878", "mag": 1.72, "time": 1506491740260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.966167, 37.277667, 3.84 ] } }, + { "type": "Feature", "properties": { "id": "ak16917871", "mag": 2.2, "time": 1506491690990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.227, 67.4203, 2.2 ] } }, + { "type": "Feature", "properties": { "id": "mb80257949", "mag": 1.15, "time": 1506491507770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.53, 46.8695, 10.41 ] } }, + { "type": "Feature", "properties": { "id": "ak16917866", "mag": 2.4, "time": 1506491501818, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2772, 62.1792, 19.3 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235873", "mag": 2.14, "time": 1506491075330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.886, 37.201833, 5.78 ] } }, + { "type": "Feature", "properties": { "id": "mb80257939", "mag": 1.58, "time": 1506490489800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.536833, 46.867667, 13.76 ] } }, + { "type": "Feature", "properties": { "id": "nn00607189", "mag": 1.5, "time": 1506490367737, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.114, 38.2859, 6.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38011800", "mag": 2.36, "time": 1506490230430, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3735, 34.4205, 2.68 ] } }, + { "type": "Feature", "properties": { "id": "ci38011808", "mag": 1.19, "time": 1506490229680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.296833, 33.257333, 11.15 ] } }, + { "type": "Feature", "properties": { "id": "nc72899631", "mag": 1.3, "time": 1506489660140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.492333, 37.643167, 10.59 ] } }, + { "type": "Feature", "properties": { "id": "ci38011776", "mag": 1.48, "time": 1506489097510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.050333, 33.1715, 3.79 ] } }, + { "type": "Feature", "properties": { "id": "ci38011760", "mag": 1.09, "time": 1506488442000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1045, 34.032667, 6.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16917162", "mag": 1.2, "time": 1506488287570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7916, 59.8749, 12.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16917160", "mag": 1.7, "time": 1506488119627, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8594, 59.8596, 52.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38011736", "mag": 1.35, "time": 1506488015210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.011667, 33.275333, 2.98 ] } }, + { "type": "Feature", "properties": { "id": "ci38011728", "mag": 1.28, "time": 1506487875520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.796667, 33.492, 4.46 ] } }, + { "type": "Feature", "properties": { "id": "ci38011720", "mag": 2.62, "time": 1506487715700, "felt": 25, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.372333, 34.4215, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60249762", "mag": 1.11, "time": 1506487228770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.7735, 44.765667, 7.75 ] } }, + { "type": "Feature", "properties": { "id": "nc72899586", "mag": 2.03, "time": 1506485795570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.784333, 38.836667, 1.36 ] } }, + { "type": "Feature", "properties": { "id": "us2000av7z", "mag": 5.3, "time": 1506485581610, "felt": 2, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 139.7504, -3.5926, 60.39 ] } }, + { "type": "Feature", "properties": { "id": "nn00607179", "mag": 1.2, "time": 1506485505469, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6245, 38.788, 6.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000av80", "mag": 5.0, "time": 1506485392430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -43.5388, 28.7234, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000av7x", "mag": 2.7, "time": 1506485373140, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -103.2078, 31.1233, 1.49 ] } }, + { "type": "Feature", "properties": { "id": "nc72899571", "mag": 1.02, "time": 1506485084470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.004333, 37.796167, 1.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16988118", "mag": 1.8, "time": 1506483937222, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.399, 51.7067, 17.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16916451", "mag": 1.9, "time": 1506483073029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0454, 59.6347, 103.9 ] } }, + { "type": "Feature", "properties": { "id": "uw61311302", "mag": 2.23, "time": 1506482912030, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.555, 44.547167, 12.72 ] } }, + { "type": "Feature", "properties": { "id": "uw61311297", "mag": 1.11, "time": 1506482481740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.683, 45.372667, -1.63 ] } }, + { "type": "Feature", "properties": { "id": "ci38011704", "mag": 1.57, "time": 1506482455900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.519833, 32.888, 10.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16988116", "mag": 2.0, "time": 1506482397355, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3801, 51.6434, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72899551", "mag": 1.76, "time": 1506481720510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.880667, 38.659333, 5.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16915757", "mag": 1.4, "time": 1506480400030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.6852, 64.9151, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "nn00607173", "mag": 1.2, "time": 1506479979561, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.4858, 38.7006, 5.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000av7a", "mag": 2.7, "time": 1506479406560, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.8806, 37.2184, 2.69 ] } }, + { "type": "Feature", "properties": { "id": "ak16988114", "mag": 1.6, "time": 1506479371570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.3827, 51.4303, 27.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38011664", "mag": 1.8, "time": 1506478585030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.628167, 35.076167, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16915754", "mag": 2.0, "time": 1506478364486, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3878, 61.6649, 31.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16915750", "mag": 1.2, "time": 1506477958824, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6683, 62.8518, 73.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16915745", "mag": 1.8, "time": 1506477442438, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.6565, 53.4796, 20.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000av70", "mag": 4.7, "time": 1506476740040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.4332, -21.409, 120.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16915060", "mag": 1.3, "time": 1506476367132, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7491, 63.2266, 126.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000av6x", "mag": 4.7, "time": 1506475551840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 126.6287, 4.6053, 83.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16915057", "mag": 2.4, "time": 1506475504238, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2738, 57.0675, 69.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38011648", "mag": 2.25, "time": 1506474971480, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7765, 33.325667, 11.63 ] } }, + { "type": "Feature", "properties": { "id": "nm60207341", "mag": 1.82, "time": 1506473928680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.549667, 36.4815, 9.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16988107", "mag": 1.9, "time": 1506471772798, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4471, 51.7337, 16.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16988106", "mag": 1.6, "time": 1506471697831, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0762, 58.2594, 21.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000b1dn", "mag": 4.3, "time": 1506471581400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.4161, 40.39, 49.52 ] } }, + { "type": "Feature", "properties": { "id": "ak16915048", "mag": 1.6, "time": 1506471507429, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7558, 60.1282, 31.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16914368", "mag": 1.9, "time": 1506469962223, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0546, 60.9937, 12.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000av6e", "mag": 4.8, "time": 1506469452030, "felt": 11, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.0971, 14.1324, 113.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16914364", "mag": 1.0, "time": 1506469276260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0231, 64.8914, 16.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38011608", "mag": 1.21, "time": 1506468838030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792667, 33.506, 6.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16949369", "mag": 1.0, "time": 1506468623879, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2412, 61.8508, 14.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72899501", "mag": 0.98, "time": 1506468157640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.873833, 37.624833, 2.99 ] } }, + { "type": "Feature", "properties": { "id": "ci38011600", "mag": 1.67, "time": 1506468079690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.679333, 35.033667, -0.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000b02y", "mag": 4.2, "time": 1506467949880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2432, 15.0466, 41.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16914361", "mag": 1.9, "time": 1506467622189, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6178, 65.1477, 10.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80257914", "mag": 1.23, "time": 1506467597640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.632, 46.8715, 5.29 ] } }, + { "type": "Feature", "properties": { "id": "ak16914358", "mag": 1.0, "time": 1506466926514, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3996, 64.9811, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16914359", "mag": 1.0, "time": 1506466913331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0673, 63.4886, 10.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72899481", "mag": 1.12, "time": 1506466887280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.808502, 38.832001, 1.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16949365", "mag": 1.7, "time": 1506466403289, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9009, 59.9001, 97.4 ] } }, + { "type": "Feature", "properties": { "id": "nn00607152", "mag": 1.1, "time": 1506466364846, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6252, 38.7877, 5.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000av5w", "mag": 4.8, "time": 1506465046570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -11.6494, -2.0113, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61311237", "mag": 2.77, "time": 1506464518680, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.953167, 44.251833, 24.14 ] } }, + { "type": "Feature", "properties": { "id": "ci38011536", "mag": 1.75, "time": 1506464439110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.304167, 33.253667, 10.84 ] } }, + { "type": "Feature", "properties": { "id": "ci38011520", "mag": 1.59, "time": 1506463692350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.216, 33.010333, 6.85 ] } }, + { "type": "Feature", "properties": { "id": "us2000av56", "mag": 4.2, "time": 1506463598300, "felt": 37, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.2376, -31.7843, 7.09 ] } }, + { "type": "Feature", "properties": { "id": "nn00607136", "mag": 2.8, "time": 1506462799119, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6217, 38.7826, 6.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38011488", "mag": 1.81, "time": 1506462726380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.750667, 33.516333, 3.18 ] } }, + { "type": "Feature", "properties": { "id": "nc72899441", "mag": 2.97, "time": 1506462683270, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.0155, 40.263833, 11.96 ] } }, + { "type": "Feature", "properties": { "id": "ak16949362", "mag": 1.6, "time": 1506462418457, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0128, 59.6612, 95.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16949359", "mag": 1.6, "time": 1506461654966, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3493, 59.8886, 123.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000av40", "mag": 5.4, "time": 1506461346270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.9476, -23.5856, 538.01 ] } }, + { "type": "Feature", "properties": { "id": "nc72899416", "mag": 1.3, "time": 1506461324290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810333, 38.8215, 0.97 ] } }, + { "type": "Feature", "properties": { "id": "mb80257904", "mag": 0.95, "time": 1506461125950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.496, 46.8605, 16.29 ] } }, + { "type": "Feature", "properties": { "id": "ak16913020", "mag": 1.1, "time": 1506460729533, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0111, 65.8632, 12.1 ] } }, + { "type": "Feature", "properties": { "id": "mb80257894", "mag": 1.08, "time": 1506460594630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.515167, 43.545833, 12.83 ] } }, + { "type": "Feature", "properties": { "id": "ak16913017", "mag": 1.8, "time": 1506459899986, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.56, 59.8031, 16.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16913011", "mag": 1.9, "time": 1506459063460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6788, 61.3357, 16.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72899391", "mag": 1.35, "time": 1506458512440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.735333, 38.789833, 1.23 ] } }, + { "type": "Feature", "properties": { "id": "hv61922451", "mag": 1.7, "time": 1506458350950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.471167, 19.227667, 34.865 ] } }, + { "type": "Feature", "properties": { "id": "nc72899386", "mag": 1.89, "time": 1506458341570, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.609667, 36.888333, 1.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000av31", "mag": 5.8, "time": 1506457331560, "felt": 45, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.4059, 40.3206, 36.04 ] } }, + { "type": "Feature", "properties": { "id": "ak16949355", "mag": 1.3, "time": 1506457099270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1826, 62.1538, 80.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000av2y", "mag": 2.6, "time": 1506456843780, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9668, 37.2773, 4.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16912327", "mag": 2.1, "time": 1506456421978, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8619, 59.5574, 79.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16912325", "mag": 1.6, "time": 1506456406002, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0714, 61.2493, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16912323", "mag": 1.4, "time": 1506455786083, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6417, 63.0711, 110.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72899366", "mag": 1.19, "time": 1506455697960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.989167, 35.677333, -0.35 ] } }, + { "type": "Feature", "properties": { "id": "mb80257869", "mag": 1.78, "time": 1506455523560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.4975, 46.900667, 11.16 ] } }, + { "type": "Feature", "properties": { "id": "nc72899361", "mag": 1.14, "time": 1506455417130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.6625, 36.100833, 0.94 ] } }, + { "type": "Feature", "properties": { "id": "uw61311182", "mag": 1.51, "time": 1506454723910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.398833, 46.488167, 17.99 ] } }, + { "type": "Feature", "properties": { "id": "ci38011384", "mag": 1.37, "time": 1506454231340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.897333, 32.7725, -0.37 ] } }, + { "type": "Feature", "properties": { "id": "mb80257864", "mag": 1.46, "time": 1506454190410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.413167, 45.912833, -2.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38011376", "mag": 1.05, "time": 1506454146060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797167, 33.509, 6.71 ] } }, + { "type": "Feature", "properties": { "id": "nn00607108", "mag": 1.0, "time": 1506454067433, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.4885, 38.5144, 10.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16912305", "mag": 1.2, "time": 1506453243306, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4352, 61.6115, 33.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000av22", "mag": 5.4, "time": 1506452898220, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 132.7412, 1.2169, 17.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72899341", "mag": 0.98, "time": 1506452133100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.783165, 38.837833, 0.59 ] } }, + { "type": "Feature", "properties": { "id": "us2000av1t", "mag": 4.3, "time": 1506452028320, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6352, 16.5993, 104.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16911656", "mag": 1.1, "time": 1506451444842, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9798, 65.8633, 10.8 ] } }, + { "type": "Feature", "properties": { "id": "mb80257849", "mag": 1.17, "time": 1506451369960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.531667, 46.869333, 10.26 ] } }, + { "type": "Feature", "properties": { "id": "ak16911652", "mag": 1.7, "time": 1506451256386, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2303, 62.9438, 64.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72899331", "mag": 1.39, "time": 1506451169180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.46, 37.983333, -0.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16949348", "mag": 1.2, "time": 1506450622498, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9789, 62.4498, 80.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72899311", "mag": 1.66, "time": 1506450429900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811, 38.812, 2.48 ] } }, + { "type": "Feature", "properties": { "id": "ci38011328", "mag": 1.82, "time": 1506450379870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7965, 33.5035, 6.49 ] } }, + { "type": "Feature", "properties": { "id": "ci38011320", "mag": 1.66, "time": 1506450370460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.948, 35.292167, 17.31 ] } }, + { "type": "Feature", "properties": { "id": "hv61922336", "mag": 3.25, "time": 1506450097970, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.231, 19.290833, 8.96 ] } }, + { "type": "Feature", "properties": { "id": "ak16949347", "mag": 1.4, "time": 1506449901001, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1914, 59.4295, 70.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38011304", "mag": 1.2, "time": 1506449584430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.813667, 36.025833, 1.31 ] } }, + { "type": "Feature", "properties": { "id": "ci38011296", "mag": 0.98, "time": 1506449444340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.8115, 36.028167, 0.41 ] } }, + { "type": "Feature", "properties": { "id": "ak16911638", "mag": 2.2, "time": 1506449441975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1385, 62.9479, 63.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80257844", "mag": 1.11, "time": 1506448956940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.532, 46.8605, 12.58 ] } }, + { "type": "Feature", "properties": { "id": "ak16949345", "mag": 1.5, "time": 1506448347584, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8207, 61.1514, 89.2 ] } }, + { "type": "Feature", "properties": { "id": "uw61311142", "mag": 1.41, "time": 1506448094510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.884, 43.419667, -0.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72899291", "mag": 1.2, "time": 1506447644460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.291667, 36.660333, 3.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16949344", "mag": 2.0, "time": 1506446368069, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.7955, 55.6327, 123.4 ] } }, + { "type": "Feature", "properties": { "id": "mb80257839", "mag": 1.6, "time": 1506446229250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.530333, 46.872167, 11.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16949343", "mag": 1.8, "time": 1506445879278, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0092, 56.5802, 60.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16910871", "mag": 2.2, "time": 1506445763160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3757, 60.912, 119.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16910870", "mag": 1.2, "time": 1506445355025, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.837, 62.5503, 9.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16949340", "mag": 1.4, "time": 1506445236601, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4629, 59.6817, 72.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16910864", "mag": 1.6, "time": 1506444383456, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3694, 61.142, 20.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16910865", "mag": 1.1, "time": 1506444338515, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0798, 62.3953, 8.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16910858", "mag": 2.0, "time": 1506443746387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5248, 63.5317, 72.7 ] } }, + { "type": "Feature", "properties": { "id": "uu60249707", "mag": 1.38, "time": 1506443129640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.442, 42.558833, 7.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38011192", "mag": 1.03, "time": 1506442702510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.823833, 33.4855, 7.53 ] } }, + { "type": "Feature", "properties": { "id": "nc72899266", "mag": 1.49, "time": 1506442696750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.809833, 37.472833, 3.95 ] } }, + { "type": "Feature", "properties": { "id": "mb80257829", "mag": 1.46, "time": 1506441830940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.498, 46.901167, 10.66 ] } }, + { "type": "Feature", "properties": { "id": "nc72903841", "mag": 1.48, "time": 1506440751200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.182167, 40.8515, 3.06 ] } }, + { "type": "Feature", "properties": { "id": "uu60249692", "mag": 1.82, "time": 1506439249930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.139833, 42.7365, 4.13 ] } }, + { "type": "Feature", "properties": { "id": "ci38011112", "mag": 2.13, "time": 1506439108770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.289833, 33.302833, 10.93 ] } }, + { "type": "Feature", "properties": { "id": "us2000auyd", "mag": 2.6, "time": 1506439089180, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4364, 42.61, 9.35 ] } }, + { "type": "Feature", "properties": { "id": "nc72899236", "mag": 2.73, "time": 1506439073310, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821, 37.6035, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "hv61922126", "mag": 1.89, "time": 1506438530250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.504837, 19.188499, 37.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16910217", "mag": 1.3, "time": 1506438468368, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3857, 61.4705, 26.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60249677", "mag": 1.01, "time": 1506437975140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.090667, 41.940333, 4.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16909586", "mag": 1.8, "time": 1506436541694, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9329, 61.1528, 1.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16909585", "mag": 1.5, "time": 1506436508165, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.6533, 59.6178, 1.5 ] } }, + { "type": "Feature", "properties": { "id": "uu60249672", "mag": 1.15, "time": 1506436401660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.9865, 44.768833, 6.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16949332", "mag": 2.7, "time": 1506436259231, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 177.8212, 50.3055, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16949331", "mag": 1.5, "time": 1506435973793, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.5906, 57.0801, 1.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61922056", "mag": 1.6, "time": 1506435671030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.617667, 19.403833, 11.352 ] } }, + { "type": "Feature", "properties": { "id": "nc72899211", "mag": 1.32, "time": 1506435393920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.617833, 36.045, 5.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16949330", "mag": 2.3, "time": 1506435252977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.7207, 53.0759, 5.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000auxj", "mag": 4.2, "time": 1506434841590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.3743, -28.3432, 19.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16909580", "mag": 1.0, "time": 1506433271780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9281, 62.7345, 65.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38011056", "mag": 2.34, "time": 1506433147890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.097167, 32.109167, 21.13 ] } }, + { "type": "Feature", "properties": { "id": "ci38011048", "mag": 1.64, "time": 1506433002700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.275333, 33.9755, 2.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16909574", "mag": 2.4, "time": 1506432197049, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1982, 63.4664, 63.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72899196", "mag": 2.34, "time": 1506431642070, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.2285, 36.1555, 11.25 ] } }, + { "type": "Feature", "properties": { "id": "ci38011032", "mag": 1.31, "time": 1506431195640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.599833, 33.196, 3.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16949325", "mag": 1.3, "time": 1506430179945, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5507, 57.5978, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16908944", "mag": 1.5, "time": 1506430094548, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7286, 62.9807, 109.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16949323", "mag": 1.4, "time": 1506429667875, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -132.545, 57.8313, 1.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16908941", "mag": 1.9, "time": 1506428870068, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9939, 51.4819, 42.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16949321", "mag": 2.3, "time": 1506428515529, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.9246, 51.994, 156.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000auwv", "mag": 4.8, "time": 1506428086930, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.1449, -37.4108, 11.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16949320", "mag": 1.7, "time": 1506428031233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.8671, 57.0274, 77.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72899171", "mag": 1.37, "time": 1506428015870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.786167, 37.594333, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16949319", "mag": 1.6, "time": 1506427960144, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0976, 58.7839, 68.4 ] } }, + { "type": "Feature", "properties": { "id": "hv61921941", "mag": 1.75, "time": 1506427855790, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.293667, 19.364833, 29.473 ] } }, + { "type": "Feature", "properties": { "id": "mb80257779", "mag": 1.22, "time": 1506426612780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.524667, 46.871167, 11.47 ] } }, + { "type": "Feature", "properties": { "id": "ak16908309", "mag": 2.6, "time": 1506426273590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0017, 63.0698, 125.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16908307", "mag": 1.4, "time": 1506425656703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0459, 60.021, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72899161", "mag": 1.33, "time": 1506425143350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.737833, 38.803333, 1.75 ] } }, + { "type": "Feature", "properties": { "id": "us2000auwh", "mag": 4.6, "time": 1506424969320, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 168.1159, -17.1048, 50.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16908306", "mag": 1.2, "time": 1506424570466, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.412, 53.8051, 14.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16908302", "mag": 1.9, "time": 1506424147684, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7411, 59.5065, 69.7 ] } }, + { "type": "Feature", "properties": { "id": "uu60249657", "mag": 1.69, "time": 1506424086980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.4815, 38.756167, 9.29 ] } }, + { "type": "Feature", "properties": { "id": "mb80257774", "mag": 1.11, "time": 1506422972160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.387167, 44.8185, 11.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16908296", "mag": 1.6, "time": 1506420872410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9572, 61.1571, 5.2 ] } }, + { "type": "Feature", "properties": { "id": "nn00607058", "mag": 1.0, "time": 1506420232880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8963, 38.401, 10.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16949310", "mag": 1.6, "time": 1506419827018, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2644, 60.0718, 129.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72899136", "mag": 1.49, "time": 1506419498990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.041333, 37.633667, -1.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16908294", "mag": 1.4, "time": 1506419088568, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8181, 63.4737, 2.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16949308", "mag": 1.7, "time": 1506418915220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9641, 60.3111, 134.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38010936", "mag": 1.35, "time": 1506418490150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.104333, 34.0325, 5.61 ] } }, + { "type": "Feature", "properties": { "id": "nc72899131", "mag": 1.28, "time": 1506417966210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.931833, 37.595833, 0.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16908292", "mag": 1.7, "time": 1506417940616, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8017, 59.9121, 74.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16908290", "mag": 1.7, "time": 1506417796960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.402, 60.1704, 11.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16949304", "mag": 1.7, "time": 1506416080631, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.871, 57.3937, 48.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16949303", "mag": 1.2, "time": 1506415360742, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6564, 63.2669, 130.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00607053", "mag": 3.4, "time": 1506415206305, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8949, 38.3653, 6.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72899106", "mag": 1.38, "time": 1506414957350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.0225, 37.5205, 2.13 ] } }, + { "type": "Feature", "properties": { "id": "us2000auvr", "mag": 4.4, "time": 1506414806850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.3187, -5.8706, 42.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72899101", "mag": 1.35, "time": 1506414495100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.810667, 37.473333, 3.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0x1", "mag": 4.0, "time": 1506414428310, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 115.4547, -8.3437, 7.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16907660", "mag": 2.5, "time": 1506414139904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2525, 63.3098, 5.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000auvl", "mag": 4.9, "time": 1506413746400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.8693, -24.5502, 549.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16907657", "mag": 1.7, "time": 1506413744657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.558, 61.3722, 73.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00607084", "mag": 1.1, "time": 1506413686395, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8996, 38.399, 10.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000ax0p", "mag": 3.0, "time": 1506413645840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.222, 52.6448, 36.78 ] } }, + { "type": "Feature", "properties": { "id": "ci38010856", "mag": 1.11, "time": 1506413205840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.4375, 33.438833, 9.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16907655", "mag": 1.3, "time": 1506412718967, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6643, 61.4913, 19.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16907652", "mag": 1.7, "time": 1506412362070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6643, 61.6414, 22.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16907651", "mag": 1.5, "time": 1506411582373, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2404, 59.9305, 72.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16949296", "mag": 1.3, "time": 1506411274342, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6597, 58.8354, 4.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72899096", "mag": 1.03, "time": 1506410824310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.914, 37.573833, -1.62 ] } }, + { "type": "Feature", "properties": { "id": "nc72899091", "mag": 1.42, "time": 1506410795100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.807833, 38.8245, 2.94 ] } }, + { "type": "Feature", "properties": { "id": "ak16907650", "mag": 2.0, "time": 1506410193440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.8603, 66.702, 16.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16949292", "mag": 1.6, "time": 1506409745435, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.82, 59.4363, 78.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16907646", "mag": 1.1, "time": 1506408445621, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.778, 62.2517, 10.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60249632", "mag": 2.87, "time": 1506407470180, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.651333, 44.820667, 6.96 ] } }, + { "type": "Feature", "properties": { "id": "ak16907641", "mag": 2.2, "time": 1506407401881, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1721, 59.3036, 66.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16949289", "mag": 1.7, "time": 1506406926287, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.737, 59.5006, 82.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38010824", "mag": 1.17, "time": 1506406440560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.498833, 34.926833, 12.29 ] } }, + { "type": "Feature", "properties": { "id": "us2000auv4", "mag": 4.9, "time": 1506404788280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 101.3356, -5.7378, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000auv3", "mag": 5.0, "time": 1506404673850, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.5505, -21.3378, 232.1 ] } }, + { "type": "Feature", "properties": { "id": "mb80257744", "mag": 1.03, "time": 1506404152920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.522667, 46.9085, 12.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000auuz", "mag": 4.6, "time": 1506404004140, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9602, 15.0621, 55.84 ] } }, + { "type": "Feature", "properties": { "id": "ak16949287", "mag": 1.5, "time": 1506403834555, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1229, 59.9191, 124.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72899076", "mag": 0.97, "time": 1506403715720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.825667, 37.454833, 1.23 ] } }, + { "type": "Feature", "properties": { "id": "nc72899066", "mag": 0.96, "time": 1506402794840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.798332, 38.824833, 2.56 ] } }, + { "type": "Feature", "properties": { "id": "mb80257739", "mag": 1.14, "time": 1506402535080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5275, 46.880667, 10.59 ] } }, + { "type": "Feature", "properties": { "id": "ci38010800", "mag": 1.46, "time": 1506401555090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.061, 34.207167, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38010792", "mag": 1.16, "time": 1506401392950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.064333, 34.207333, 2.74 ] } }, + { "type": "Feature", "properties": { "id": "nn00607042", "mag": 1.5, "time": 1506400440104, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0413, 37.0804, 8.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16906991", "mag": 2.7, "time": 1506400345749, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.4106, 60.9055, 24.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000autd", "mag": 6.4, "time": 1506399600760, "felt": 2, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -176.9366, -23.7135, 98.07 ] } }, + { "type": "Feature", "properties": { "id": "mb80257724", "mag": 1.75, "time": 1506399115590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525167, 46.8815, 10.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16949284", "mag": 1.4, "time": 1506398641123, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.643, 58.8409, 11.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16949283", "mag": 1.3, "time": 1506398319488, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6304, 58.8355, 8.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16906355", "mag": 2.3, "time": 1506398227222, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8611, 62.7984, 13.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72899031", "mag": 1.73, "time": 1506396860580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823667, 37.455333, 2.55 ] } }, + { "type": "Feature", "properties": { "id": "nc72899036", "mag": 1.13, "time": 1506396779490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764167, 38.956, 1.48 ] } }, + { "type": "Feature", "properties": { "id": "uu60249592", "mag": 1.7, "time": 1506396582400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.943167, 39.753833, 3.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16949281", "mag": 1.5, "time": 1506396506568, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7269, 58.5151, 73.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16906353", "mag": 1.3, "time": 1506396340348, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2988, 62.3609, 81.6 ] } }, + { "type": "Feature", "properties": { "id": "uw61310902", "mag": 1.38, "time": 1506395899750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.737167, 47.576333, 17.19 ] } }, + { "type": "Feature", "properties": { "id": "ak16906350", "mag": 2.1, "time": 1506395022337, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6717, 59.8577, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235803", "mag": 1.67, "time": 1506394171170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.620667, 37.161167, 4.48 ] } }, + { "type": "Feature", "properties": { "id": "nc72899026", "mag": 1.36, "time": 1506393508660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823833, 37.4545, 2.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16906345", "mag": 1.8, "time": 1506393385073, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5638, 59.8105, 0.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16906344", "mag": 1.2, "time": 1506393361198, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4631, 62.5638, 3.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16906343", "mag": 1.2, "time": 1506392589335, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2072, 61.6959, 2.7 ] } }, + { "type": "Feature", "properties": { "id": "uw61310887", "mag": 1.1, "time": 1506392466960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9235, 46.755833, 4.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16906342", "mag": 1.8, "time": 1506392061053, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.9619, 58.719, 83.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16906341", "mag": 1.1, "time": 1506391622110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.393, 62.6136, 80.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16905725", "mag": 2.0, "time": 1506390933341, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6474, 61.5055, 2.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000aus0", "mag": 5.1, "time": 1506390162180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.2892, -18.0618, 578.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16905719", "mag": 1.0, "time": 1506388357140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8119, 61.2841, 12.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16949271", "mag": 1.1, "time": 1506387919524, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.616, 62.8641, 85.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000avl1", "mag": 4.1, "time": 1506387869490, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.2679, -38.2792, 18.61 ] } }, + { "type": "Feature", "properties": { "id": "ak16905595", "mag": 1.0, "time": 1506387645089, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.7961, 60.4358, 8.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000aur8", "mag": 3.9, "time": 1506387254290, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.6296, -12.1347, 37.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16905592", "mag": 1.5, "time": 1506385892986, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6406, 61.6796, 57.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16905589", "mag": 1.7, "time": 1506385708409, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0359, 62.3774, 41.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72898986", "mag": 1.94, "time": 1506385192120, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.759667, 38.955667, 4.16 ] } }, + { "type": "Feature", "properties": { "id": "nn00607067", "mag": 1.1, "time": 1506385008302, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0721, 39.3599, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0hk", "mag": 4.4, "time": 1506383865610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.4109, -4.9919, 96.04 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0hl", "mag": 4.5, "time": 1506383851620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 3.755, 79.5651, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16905583", "mag": 2.0, "time": 1506383021414, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7759, 59.8203, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "hv61921341", "mag": 2.37, "time": 1506382999970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.826167, 19.509167, 12.397 ] } }, + { "type": "Feature", "properties": { "id": "nc72898971", "mag": 1.13, "time": 1506382612420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7125, 38.7455, 1.45 ] } }, + { "type": "Feature", "properties": { "id": "nc72898966", "mag": 1.63, "time": 1506382205240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.579, 36.013, 4.29 ] } }, + { "type": "Feature", "properties": { "id": "ci38010640", "mag": 1.0, "time": 1506381899530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792667, 33.508833, 4.84 ] } }, + { "type": "Feature", "properties": { "id": "ci38010624", "mag": 1.86, "time": 1506381762630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.681667, 35.033833, -0.82 ] } }, + { "type": "Feature", "properties": { "id": "nc72898956", "mag": 1.13, "time": 1506381482700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.320667, 37.6445, 0.55 ] } }, + { "type": "Feature", "properties": { "id": "mb80257694", "mag": 1.58, "time": 1506381447950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523833, 46.872833, 11.66 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0hj", "mag": 4.3, "time": 1506380384190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 115.85, -10.6682, 39.69 ] } }, + { "type": "Feature", "properties": { "id": "ci38010616", "mag": 1.42, "time": 1506380222440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.0935, 33.013167, -0.56 ] } }, + { "type": "Feature", "properties": { "id": "nc72898946", "mag": 1.13, "time": 1506379343550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7885, 38.832167, 1.97 ] } }, + { "type": "Feature", "properties": { "id": "ld60143416", "mag": 1.71, "time": 1506378906690, "felt": 170, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.513833, 40.798667, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16988709", "mag": 1.6, "time": 1506378800677, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4035, 60.0163, 139.3 ] } }, + { "type": "Feature", "properties": { "id": "mb80257689", "mag": 1.5, "time": 1506378570060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528833, 46.865833, 11.47 ] } }, + { "type": "Feature", "properties": { "id": "us2000aunr", "mag": 2.5, "time": 1506378435420, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.154, 37.3519, 3.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16988708", "mag": 1.0, "time": 1506378350972, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.034, 64.3489, 10.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000aunh", "mag": 5.0, "time": 1506377223500, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 124.3318, 0.8223, 219.8 ] } }, + { "type": "Feature", "properties": { "id": "uu60249557", "mag": 1.72, "time": 1506377199600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.460833, 42.646667, 2.74 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0hh", "mag": 4.3, "time": 1506376802200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.4659, -19.6395, 545.66 ] } }, + { "type": "Feature", "properties": { "id": "ak16905558", "mag": 1.3, "time": 1506376658938, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.4807, 65.756, 6.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38010544", "mag": 1.52, "time": 1506375768450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792333, 33.492, 4.2 ] } }, + { "type": "Feature", "properties": { "id": "uw61333756", "mag": 1.11, "time": 1506375211030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.748833, 46.851167, 1.54 ] } }, + { "type": "Feature", "properties": { "id": "ci38010536", "mag": 1.15, "time": 1506374622610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.200667, 33.034833, 4.46 ] } }, + { "type": "Feature", "properties": { "id": "nc72898906", "mag": 1.32, "time": 1506373159300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.887667, 37.572333, 1.73 ] } }, + { "type": "Feature", "properties": { "id": "ak16904952", "mag": 1.2, "time": 1506373039217, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2776, 63.8003, 116.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16904950", "mag": 1.1, "time": 1506372955267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1161, 63.268, 1.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72898901", "mag": 1.01, "time": 1506372828820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.791667, 37.454333, 7.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16904346", "mag": 1.5, "time": 1506372342933, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0547, 61.007, 13.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38010512", "mag": 1.25, "time": 1506372237980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.492167, 33.822333, -0.52 ] } }, + { "type": "Feature", "properties": { "id": "ci38010488", "mag": 3.1, "time": 1506371483300, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.220833, 32.220833, 20.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000aulg", "mag": 5.9, "time": 1506371363480, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 152.7133, -6.2113, 5.98 ] } }, + { "type": "Feature", "properties": { "id": "hv61921136", "mag": 1.72, "time": 1506370768560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.421333, 19.223333, 34.311 ] } }, + { "type": "Feature", "properties": { "id": "mb80257664", "mag": 1.07, "time": 1506370613150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526, 46.868, 10.18 ] } }, + { "type": "Feature", "properties": { "id": "us2000aukx", "mag": 2.6, "time": 1506370456500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -99.1495, 36.4119, 5.948 ] } }, + { "type": "Feature", "properties": { "id": "us2000auky", "mag": 4.2, "time": 1506370103510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 107.7299, -5.8793, 306.63 ] } }, + { "type": "Feature", "properties": { "id": "mb80257659", "mag": 1.44, "time": 1506369980640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.530333, 46.8795, 12.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16904319", "mag": 1.4, "time": 1506369740689, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5073, 60.0082, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16904318", "mag": 1.1, "time": 1506369510333, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5651, 61.4244, 63.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16904316", "mag": 1.1, "time": 1506368211425, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7001, 61.5145, 4.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aukb", "mag": 4.3, "time": 1506368143480, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.1586, 40.3587, 11.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16904315", "mag": 1.2, "time": 1506367996393, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8124, 59.8382, 15.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72898871", "mag": 1.41, "time": 1506367887720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.785167, 38.8375, 1.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16988695", "mag": 2.2, "time": 1506366990125, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.3689, 51.4218, 56.7 ] } }, + { "type": "Feature", "properties": { "id": "ci37166748", "mag": 1.04, "time": 1506366454300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.018667, 33.163167, -0.77 ] } }, + { "type": "Feature", "properties": { "id": "hv61921056", "mag": 2.06, "time": 1506366154290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.950667, 19.540833, 15.491 ] } }, + { "type": "Feature", "properties": { "id": "ak16903722", "mag": 2.0, "time": 1506365944635, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.478, 51.697, 15.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38010408", "mag": 1.27, "time": 1506365436790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.4445, 35.5745, 10.25 ] } }, + { "type": "Feature", "properties": { "id": "ci38010416", "mag": 1.17, "time": 1506365362690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.862667, 34.343333, -1.71 ] } }, + { "type": "Feature", "properties": { "id": "uu60249527", "mag": 1.29, "time": 1506365138370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.712833, 41.8725, 4.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16903609", "mag": 2.1, "time": 1506365025587, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8085, 63.1578, 132.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38010400", "mag": 1.04, "time": 1506364534100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.790833, 33.495667, 4.4 ] } }, + { "type": "Feature", "properties": { "id": "nn00606969", "mag": 1.1, "time": 1506364516065, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.689, 40.0864, 4.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16903599", "mag": 2.5, "time": 1506364456407, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8848, 59.5329, 96.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80257649", "mag": 1.4, "time": 1506364202040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5255, 46.866667, 10.23 ] } }, + { "type": "Feature", "properties": { "id": "nc72898846", "mag": 1.62, "time": 1506364136870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.781833, 36.209, 7.55 ] } }, + { "type": "Feature", "properties": { "id": "ak16903591", "mag": 1.5, "time": 1506363943453, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7347, 60.3302, 112.7 ] } }, + { "type": "Feature", "properties": { "id": "mb80257644", "mag": 1.05, "time": 1506363692190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525167, 46.8665, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38010376", "mag": 1.42, "time": 1506363664230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792667, 33.4945, 4.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aufz", "mag": 5.1, "time": 1506363043200, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 106.3876, -5.9298, 150.05 ] } }, + { "type": "Feature", "properties": { "id": "nc72898836", "mag": 1.32, "time": 1506362896010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.104, 37.324, -0.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16903584", "mag": 1.0, "time": 1506362694028, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.2167, 63.9342, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80257639", "mag": 1.36, "time": 1506362284340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.615667, 46.316833, -2.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16903579", "mag": 2.0, "time": 1506362237262, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1637, 59.6819, 106.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72898821", "mag": 1.99, "time": 1506361978590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.778667, 36.215667, 8.08 ] } }, + { "type": "Feature", "properties": { "id": "us2000auf8", "mag": 3.0, "time": 1506361091820, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.3303, 40.4414, 11.43 ] } }, + { "type": "Feature", "properties": { "id": "ci38010336", "mag": 2.11, "time": 1506360496580, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797167, 33.486667, 3.04 ] } }, + { "type": "Feature", "properties": { "id": "ak16988686", "mag": 1.5, "time": 1506360479843, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.7769, 51.9886, 24.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38010328", "mag": 1.51, "time": 1506359920880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.977, 33.995333, 18.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16988684", "mag": 1.6, "time": 1506359020522, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4355, 59.7613, 127.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72898791", "mag": 1.48, "time": 1506357667280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.679333, 40.288667, 4.66 ] } }, + { "type": "Feature", "properties": { "id": "nc72898786", "mag": 1.55, "time": 1506357321970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.322, 35.752333, 11.93 ] } }, + { "type": "Feature", "properties": { "id": "nc72898781", "mag": 1.12, "time": 1506356229990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811333, 38.794833, 2.79 ] } }, + { "type": "Feature", "properties": { "id": "ci38010256", "mag": 1.04, "time": 1506354566340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.858833, 33.8575, 16.19 ] } }, + { "type": "Feature", "properties": { "id": "ci38010272", "mag": 2.41, "time": 1506354509850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9285, 31.688833, 11.63 ] } }, + { "type": "Feature", "properties": { "id": "mb80257609", "mag": 1.3, "time": 1506354504500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.534667, 46.896, 11.48 ] } }, + { "type": "Feature", "properties": { "id": "mb80257604", "mag": 1.12, "time": 1506354406140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.531833, 46.867, 11.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16902391", "mag": 1.7, "time": 1506354336298, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8601, 62.0271, 60.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16902390", "mag": 1.1, "time": 1506354175816, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3984, 60.1663, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16901812", "mag": 1.4, "time": 1506353222973, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.1565, 60.3908, 0.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16901813", "mag": 1.3, "time": 1506353183037, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6264, 58.8255, 1.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16901809", "mag": 2.0, "time": 1506352267382, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0949, 59.636, 10.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000aucr", "mag": 4.6, "time": 1506352047620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 167.4691, -14.8531, 132.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16901806", "mag": 1.8, "time": 1506351538258, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8449, 59.8126, 1.3 ] } }, + { "type": "Feature", "properties": { "id": "mb80257594", "mag": 0.98, "time": 1506349616550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521333, 46.870833, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38010208", "mag": 1.21, "time": 1506348868740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.552, 33.526167, 13.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16901226", "mag": 1.1, "time": 1506348768479, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2671, 59.9538, 54.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000aubr", "mag": 4.6, "time": 1506348737440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 167.0258, -12.6224, 229.97 ] } }, + { "type": "Feature", "properties": { "id": "ci38010200", "mag": 1.19, "time": 1506348702870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.953833, 34.8405, 11.97 ] } }, + { "type": "Feature", "properties": { "id": "us2000aubf", "mag": 4.4, "time": 1506348571430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1777, 15.5423, 60.99 ] } }, + { "type": "Feature", "properties": { "id": "nc72898721", "mag": 1.03, "time": 1506348240990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.838333, 38.837334, 1.55 ] } }, + { "type": "Feature", "properties": { "id": "ak16901214", "mag": 2.7, "time": 1506348231637, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0448, 63.3492, 76.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000aub9", "mag": 4.3, "time": 1506347727000, "felt": 65, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.99, -32.683, 24.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72898706", "mag": 1.78, "time": 1506347531490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.838, 38.837833, 1.83 ] } }, + { "type": "Feature", "properties": { "id": "ci38010176", "mag": 0.96, "time": 1506346983830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.271667, 33.976667, 5.12 ] } }, + { "type": "Feature", "properties": { "id": "us2000aubt", "mag": 4.7, "time": 1506346771440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6657, -38.3887, 23.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16988672", "mag": 1.9, "time": 1506346449512, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.0765, 51.5898, 46.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16901206", "mag": 2.2, "time": 1506346185448, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7016, 61.5212, 15.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16901204", "mag": 1.6, "time": 1506346082012, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4545, 63.1289, 110.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72898686", "mag": 1.5, "time": 1506345854120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.787167, 36.211667, 7.46 ] } }, + { "type": "Feature", "properties": { "id": "ak16988669", "mag": 1.8, "time": 1506344531244, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.2595, 53.699, 44.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16901203", "mag": 1.5, "time": 1506343558401, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1793, 57.6776, 1.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72898666", "mag": 1.04, "time": 1506343096950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.862667, 37.613167, 7.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16900637", "mag": 2.0, "time": 1506342621159, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2424, 60.321, 83.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38010152", "mag": 1.32, "time": 1506342413630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.241667, 34.439, 7.98 ] } }, + { "type": "Feature", "properties": { "id": "us2000aua8", "mag": 4.6, "time": 1506342291600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.282, -28.2916, 30.33 ] } }, + { "type": "Feature", "properties": { "id": "nc72898661", "mag": 1.86, "time": 1506342035450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.000167, 36.431, -0.28 ] } }, + { "type": "Feature", "properties": { "id": "ci38010136", "mag": 1.46, "time": 1506341314650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.559, 35.341833, 7.37 ] } }, + { "type": "Feature", "properties": { "id": "ak16900622", "mag": 1.0, "time": 1506340661643, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.7013, 64.8764, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0h7", "mag": 4.2, "time": 1506340490190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 138.5087, 34.8799, 210.56 ] } }, + { "type": "Feature", "properties": { "id": "nc72898636", "mag": 1.46, "time": 1506340210490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.256667, 36.100167, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0hp", "mag": 4.2, "time": 1506340162430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4582, -17.8551, 595.96 ] } }, + { "type": "Feature", "properties": { "id": "us2000au9u", "mag": 4.6, "time": 1506340077990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4978, -17.9975, 539.99 ] } }, + { "type": "Feature", "properties": { "id": "ak16988664", "mag": 1.8, "time": 1506339965395, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4489, 51.676, 14.4 ] } }, + { "type": "Feature", "properties": { "id": "hv61920741", "mag": 2.06, "time": 1506339899560, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.473667, 19.201667, 36.657 ] } }, + { "type": "Feature", "properties": { "id": "ci38010120", "mag": 0.99, "time": 1506339434380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.471167, 34.247833, 12.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16900621", "mag": 1.0, "time": 1506338627047, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3115, 62.9535, 74.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72898616", "mag": 2.36, "time": 1506338018430, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.938333, 37.838667, 4.07 ] } }, + { "type": "Feature", "properties": { "id": "hv61920671", "mag": 1.81, "time": 1506336741780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.023667, 19.815, 11.479 ] } }, + { "type": "Feature", "properties": { "id": "mb80257584", "mag": 1.42, "time": 1506336624590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521667, 46.869333, 11.15 ] } }, + { "type": "Feature", "properties": { "id": "ak16900062", "mag": 1.8, "time": 1506336050720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8893, 60.3211, 15.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38010104", "mag": 1.06, "time": 1506335970890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7915, 33.506667, 6.39 ] } }, + { "type": "Feature", "properties": { "id": "nc72898601", "mag": 0.95, "time": 1506335637390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.6475, 37.476667, 8.18 ] } }, + { "type": "Feature", "properties": { "id": "nc72898596", "mag": 1.23, "time": 1506335593850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.2805, 36.094, 6.76 ] } }, + { "type": "Feature", "properties": { "id": "nc72898591", "mag": 1.04, "time": 1506335405570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.839333, 38.843166, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000au8v", "mag": 4.9, "time": 1506334920720, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 139.9741, -3.5898, 72.65 ] } }, + { "type": "Feature", "properties": { "id": "nn00606909", "mag": 1.4, "time": 1506334911790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.943, 37.551, 8.3 ] } }, + { "type": "Feature", "properties": { "id": "mb80257579", "mag": 1.3, "time": 1506333510580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523833, 46.872333, 11.79 ] } }, + { "type": "Feature", "properties": { "id": "mb80257574", "mag": 0.99, "time": 1506333384010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523, 46.875167, 11.91 ] } }, + { "type": "Feature", "properties": { "id": "us2000au8b", "mag": 5.0, "time": 1506332531610, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 154.0023, -5.3939, 63.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16899481", "mag": 1.2, "time": 1506332463619, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8097, 60.337, 8.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16899478", "mag": 2.7, "time": 1506332457083, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9674, 51.7565, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16899480", "mag": 2.7, "time": 1506332456973, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9649, 51.7427, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72898561", "mag": 1.34, "time": 1506332073270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.401667, 37.650667, 3.17 ] } }, + { "type": "Feature", "properties": { "id": "mb80257569", "mag": 2.91, "time": 1506332057970, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525833, 46.879333, 11.49 ] } }, + { "type": "Feature", "properties": { "id": "nn00606905", "mag": 1.5, "time": 1506331668203, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9249, 38.3947, 7.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38010072", "mag": 1.11, "time": 1506331415690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.790167, 33.497667, 5.47 ] } }, + { "type": "Feature", "properties": { "id": "ak16988657", "mag": 1.9, "time": 1506331001341, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4079, 51.6208, 15.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16899468", "mag": 1.4, "time": 1506330891437, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3579, 60.2131, 58.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16899467", "mag": 1.1, "time": 1506330692323, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4142, 68.5865, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16899465", "mag": 1.0, "time": 1506330113229, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.991, 61.1695, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "nn00606904", "mag": 2.5, "time": 1506329813575, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.1098, 39.0988, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16899462", "mag": 1.3, "time": 1506329610880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9036, 64.8595, 12.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38010048", "mag": 1.15, "time": 1506329091670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.815, 33.9555, 13.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000au7c", "mag": 3.5, "time": 1506329082460, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5238, 46.8486, 10.68 ] } }, + { "type": "Feature", "properties": { "id": "ci38010040", "mag": 1.01, "time": 1506328796420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.568, 35.1735, 8.56 ] } }, + { "type": "Feature", "properties": { "id": "nn00606901", "mag": 1.2, "time": 1506328748981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8911, 38.3811, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16898909", "mag": 1.4, "time": 1506327817672, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2932, 60.6736, 39.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16988651", "mag": 1.6, "time": 1506327629626, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8348, 59.5881, 89.7 ] } }, + { "type": "Feature", "properties": { "id": "uu60249397", "mag": 2.17, "time": 1506327209020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.448333, 38.993, -0.41 ] } }, + { "type": "Feature", "properties": { "id": "ak16898901", "mag": 1.1, "time": 1506326924743, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6407, 58.3143, 7.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000au6h", "mag": 4.7, "time": 1506326546500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.4008, -4.8417, 219.24 ] } }, + { "type": "Feature", "properties": { "id": "uu60249392", "mag": 1.79, "time": 1506326456200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.448, 42.620667, 6.55 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235773", "mag": 2.04, "time": 1506326285610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.968667, 37.281833, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000au5z", "mag": 4.4, "time": 1506325840560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.7801, 14.8764, 57.41 ] } }, + { "type": "Feature", "properties": { "id": "nc72898491", "mag": 0.95, "time": 1506325310440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818667, 37.478667, 0.05 ] } }, + { "type": "Feature", "properties": { "id": "nc72898486", "mag": 1.27, "time": 1506324949470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8175, 37.479333, 0.19 ] } }, + { "type": "Feature", "properties": { "id": "ak16898346", "mag": 2.1, "time": 1506324898662, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.5224, 64.5882, 8.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000au5p", "mag": 4.4, "time": 1506324432650, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.5244, -30.022, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000au5l", "mag": 4.5, "time": 1506324225060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1793, 15.5215, 66.49 ] } }, + { "type": "Feature", "properties": { "id": "nc72898461", "mag": 1.64, "time": 1506323849520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818167, 37.478667, 0.73 ] } }, + { "type": "Feature", "properties": { "id": "us2000au5i", "mag": 4.6, "time": 1506323785060, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 106.9645, -8.3755, 34.69 ] } }, + { "type": "Feature", "properties": { "id": "nc72898456", "mag": 1.01, "time": 1506323761220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818833, 37.478167, 0.69 ] } }, + { "type": "Feature", "properties": { "id": "nn00606939", "mag": 1.6, "time": 1506320868071, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.5993, 41.6963, 11.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16988646", "mag": 1.6, "time": 1506320845663, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7721, 59.5535, 80.8 ] } }, + { "type": "Feature", "properties": { "id": "ci38009968", "mag": 1.23, "time": 1506320510170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.738333, 33.655, 17.08 ] } }, + { "type": "Feature", "properties": { "id": "us2000au57", "mag": 5.0, "time": 1506320285610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -25.7407, -59.0289, 23.15 ] } }, + { "type": "Feature", "properties": { "id": "nn00606937", "mag": 1.7, "time": 1506320281288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.604, 41.7004, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80257544", "mag": 1.02, "time": 1506320165840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.538333, 46.891333, 11.64 ] } }, + { "type": "Feature", "properties": { "id": "ak16897784", "mag": 1.7, "time": 1506319825200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9967, 59.5158, 86.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16897782", "mag": 1.0, "time": 1506319406475, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2438, 65.7781, 4.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16897779", "mag": 1.8, "time": 1506318873463, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4148, 69.0584, 10.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72898431", "mag": 2.32, "time": 1506318557110, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.909, 37.334167, 8.51 ] } }, + { "type": "Feature", "properties": { "id": "nc72898406", "mag": 1.9, "time": 1506317549980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.705833, 39.697, 8.09 ] } }, + { "type": "Feature", "properties": { "id": "ak16988640", "mag": 1.4, "time": 1506317208929, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0479, 57.5544, 76.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16988639", "mag": 1.2, "time": 1506316463527, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9489, 61.4034, 66.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00606934", "mag": 1.4, "time": 1506315296099, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8855, 37.2234, 7.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000b0hn", "mag": 4.2, "time": 1506314791590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -27.4466, -60.0959, 87.69 ] } }, + { "type": "Feature", "properties": { "id": "nc72898391", "mag": 0.97, "time": 1506314750800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.80867, 38.800999, 1.95 ] } }, + { "type": "Feature", "properties": { "id": "nc72898386", "mag": 2.07, "time": 1506314732630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810833, 38.797667, 3.49 ] } }, + { "type": "Feature", "properties": { "id": "nc72898381", "mag": 1.3, "time": 1506314425330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1325, 38.050167, 2.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16897226", "mag": 1.1, "time": 1506314336648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.1369, 63.4162, 5.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000au3u", "mag": 4.3, "time": 1506313752770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7839, 15.5489, 36.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16897223", "mag": 1.5, "time": 1506313722965, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5906, 61.3427, 45.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16897221", "mag": 1.1, "time": 1506313193707, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.457, 63.4294, 4.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16988635", "mag": 1.2, "time": 1506312840546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0928, 61.1303, 26.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16988634", "mag": 1.1, "time": 1506312758288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7179, 62.8463, 7.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72898366", "mag": 1.09, "time": 1506312288130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.797501, 38.824165, 1.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16897219", "mag": 1.1, "time": 1506311801540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8303, 63.2243, 16.3 ] } }, + { "type": "Feature", "properties": { "id": "uw61333436", "mag": 1.41, "time": 1506311554000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.943833, 48.589333, 4.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16896672", "mag": 2.4, "time": 1506311539840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6826, 63.2689, 133.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38009904", "mag": 1.71, "time": 1506311193160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.813167, 34.048833, 13.41 ] } }, + { "type": "Feature", "properties": { "id": "ak16896671", "mag": 1.0, "time": 1506310652342, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6095, 62.9432, 11.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38009840", "mag": 1.15, "time": 1506308854410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.765333, 33.325667, 12.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16896670", "mag": 1.3, "time": 1506308756498, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.6787, 59.995, 9.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16896669", "mag": 1.3, "time": 1506308490557, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.667, 59.9936, 9.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61920451", "mag": 2.11, "time": 1506307247260, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.050167, 19.765, 47.26 ] } }, + { "type": "Feature", "properties": { "id": "ak16896663", "mag": 1.7, "time": 1506306347139, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.57, 59.4416, 74.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16896659", "mag": 1.5, "time": 1506306011000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5629, 61.3391, 37.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16896656", "mag": 1.3, "time": 1506306004481, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1978, 60.2569, 10.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16896653", "mag": 1.8, "time": 1506305432732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6915, 61.3592, 87.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16988622", "mag": 2.2, "time": 1506305398552, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.4539, 55.424, 127.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72898321", "mag": 0.97, "time": 1506303023560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821, 37.470667, 1.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38009824", "mag": 1.77, "time": 1506302722490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.721333, 32.171167, -0.08 ] } }, + { "type": "Feature", "properties": { "id": "us2000au34", "mag": 4.2, "time": 1506301011430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6458, 15.9582, 41.89 ] } }, + { "type": "Feature", "properties": { "id": "nc72898311", "mag": 1.53, "time": 1506300409700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.760333, 38.787333, 2.66 ] } }, + { "type": "Feature", "properties": { "id": "nc72898316", "mag": 1.17, "time": 1506300389070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.902833, 37.434167, 1.61 ] } }, + { "type": "Feature", "properties": { "id": "uu60249337", "mag": 1.05, "time": 1506300187150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.028, 44.797667, 10.68 ] } }, + { "type": "Feature", "properties": { "id": "ak16896106", "mag": 1.8, "time": 1506299319432, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0832, 61.9049, 66.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16895566", "mag": 1.9, "time": 1506298140072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9051, 57.7026, 76.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16988619", "mag": 1.6, "time": 1506298131890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9559, 60.0816, 113.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00606884", "mag": 1.4, "time": 1506297047630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0863, 37.3768, 7.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000au2t", "mag": 4.6, "time": 1506295898530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.3868, 31.2471, 159.23 ] } }, + { "type": "Feature", "properties": { "id": "us2000au2s", "mag": 4.7, "time": 1506295771740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3651, 15.6767, 54.03 ] } }, + { "type": "Feature", "properties": { "id": "uu60249317", "mag": 2.04, "time": 1506295039370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424667, 42.575667, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16935438", "mag": 1.4, "time": 1506294396969, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.934, 60.3588, 65.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72898291", "mag": 1.5, "time": 1506294312930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.799167, 37.544833, 8.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16895561", "mag": 1.1, "time": 1506294004090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0019, 62.1675, 14.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16895559", "mag": 1.7, "time": 1506293152617, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9808, 60.2626, 58.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72898281", "mag": 1.51, "time": 1506291814030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.123, 38.044833, 2.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16895553", "mag": 2.2, "time": 1506291209658, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9667, 58.2749, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "uu60249297", "mag": 2.2, "time": 1506289719780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.027, 44.7975, 11.07 ] } }, + { "type": "Feature", "properties": { "id": "nc72898251", "mag": 1.06, "time": 1506289376180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.80867, 38.824501, 1.89 ] } }, + { "type": "Feature", "properties": { "id": "nn00606863", "mag": 1.6, "time": 1506289302497, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1188, 37.3786, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16895018", "mag": 1.1, "time": 1506289187928, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5309, 62.2207, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72898246", "mag": 1.11, "time": 1506288942820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8205, 37.474667, -0.27 ] } }, + { "type": "Feature", "properties": { "id": "nc72898241", "mag": 1.11, "time": 1506288826190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819667, 37.477167, 0.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16935433", "mag": 1.6, "time": 1506288360789, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4754, 58.4123, 46.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16935432", "mag": 2.5, "time": 1506287912932, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.0291, 52.8069, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16895001", "mag": 2.4, "time": 1506287325387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3822, 59.9552, 133.4 ] } }, + { "type": "Feature", "properties": { "id": "nc71107574", "mag": 1.82, "time": 1506286958930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.1525, 38.965833, 3.75 ] } }, + { "type": "Feature", "properties": { "id": "nc72898236", "mag": 1.93, "time": 1506286874150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.849, 36.277667, 7.52 ] } }, + { "type": "Feature", "properties": { "id": "ak16894980", "mag": 2.3, "time": 1506286457929, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5039, 61.3116, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000au0x", "mag": 4.1, "time": 1506285951620, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 137.7689, 33.0106, 343.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16894459", "mag": 1.4, "time": 1506285529465, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7694, 59.8585, 7.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16894458", "mag": 3.5, "time": 1506285383201, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4213, 51.6336, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61919931", "mag": 1.61, "time": 1506285094170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2325, 19.4085, 26.679 ] } }, + { "type": "Feature", "properties": { "id": "nm60207286", "mag": 1.46, "time": 1506284271340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.900667, 36.601833, 4.15 ] } }, + { "type": "Feature", "properties": { "id": "nc72898226", "mag": 1.94, "time": 1506284238360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819, 37.476167, 0.74 ] } }, + { "type": "Feature", "properties": { "id": "hv61919891", "mag": 2.03, "time": 1506284234210, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.278503, 19.407, 0.61 ] } }, + { "type": "Feature", "properties": { "id": "us2000au0l", "mag": 5.0, "time": 1506283809180, "felt": 1, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 102.0863, -3.3959, 96.97 ] } }, + { "type": "Feature", "properties": { "id": "ak16894448", "mag": 1.6, "time": 1506283718319, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1504, 61.1564, 63.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72898216", "mag": 1.02, "time": 1506283590520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.826836, 38.841167, 1.21 ] } }, + { "type": "Feature", "properties": { "id": "nc72898211", "mag": 1.57, "time": 1506283158900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.113333, 38.042667, 2.45 ] } }, + { "type": "Feature", "properties": { "id": "ak16894439", "mag": 2.3, "time": 1506283079762, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.7022, 51.6829, 87.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72898206", "mag": 1.24, "time": 1506283017210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.777, 35.512, 0.74 ] } }, + { "type": "Feature", "properties": { "id": "ci38009648", "mag": 0.95, "time": 1506282824500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.909333, 33.494, 13.21 ] } }, + { "type": "Feature", "properties": { "id": "nc72898196", "mag": 1.08, "time": 1506282126770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.81, 38.806833, 2.17 ] } }, + { "type": "Feature", "properties": { "id": "ak16893920", "mag": 1.6, "time": 1506281844692, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.421, 62.907, 126.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72898191", "mag": 1.6, "time": 1506281467240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.010167, 37.8015, 1.31 ] } }, + { "type": "Feature", "properties": { "id": "nc72898186", "mag": 2.26, "time": 1506281041390, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8185, 37.474833, -0.18 ] } }, + { "type": "Feature", "properties": { "id": "uw61333306", "mag": 1.11, "time": 1506280827540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.812333, 48.284667, 12.62 ] } }, + { "type": "Feature", "properties": { "id": "ci38009608", "mag": 1.3, "time": 1506280518180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.038, 33.0905, 2.11 ] } }, + { "type": "Feature", "properties": { "id": "nc72898176", "mag": 2.1, "time": 1506280314320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818333, 37.475833, 0.78 ] } }, + { "type": "Feature", "properties": { "id": "ak16935422", "mag": 1.6, "time": 1506280296755, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7731, 59.4501, 75.7 ] } }, + { "type": "Feature", "properties": { "id": "hv61919726", "mag": 1.9, "time": 1506279270940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4185, 19.110833, 41.621 ] } }, + { "type": "Feature", "properties": { "id": "ak16935421", "mag": 1.7, "time": 1506279143123, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5363, 51.7438, 15.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16893907", "mag": 2.1, "time": 1506278978748, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.4135, 66.1088, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "uw61333296", "mag": 1.51, "time": 1506278869250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.581833, 47.593, 24.95 ] } }, + { "type": "Feature", "properties": { "id": "nc72898171", "mag": 1.13, "time": 1506278629370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.543167, 38.264833, 8.24 ] } }, + { "type": "Feature", "properties": { "id": "nn00606834", "mag": 1.5, "time": 1506278416314, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.885, 38.3509, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38009568", "mag": 1.23, "time": 1506278315340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.492333, 35.604833, 5.99 ] } }, + { "type": "Feature", "properties": { "id": "ak16893391", "mag": 2.3, "time": 1506277628203, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.1998, 53.9184, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16893390", "mag": 1.1, "time": 1506277025981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1933, 68.4549, 18.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16893388", "mag": 1.5, "time": 1506276710660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.3135, 68.0219, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16935416", "mag": 1.8, "time": 1506276357546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.0551, 51.7225, 6.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72898146", "mag": 1.54, "time": 1506276015270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810333, 38.836, 1.98 ] } }, + { "type": "Feature", "properties": { "id": "nn00606827", "mag": 1.3, "time": 1506274049277, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6642, 36.4428, 7.2 ] } }, + { "type": "Feature", "properties": { "id": "uw61333281", "mag": 2.14, "time": 1506273261550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.502167, 49.447833, -0.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000atz0", "mag": 4.3, "time": 1506273226630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.369, -22.6476, 261.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38009520", "mag": 2.39, "time": 1506272765060, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.032333, 33.096333, 9.36 ] } }, + { "type": "Feature", "properties": { "id": "nc72898121", "mag": 1.18, "time": 1506272385880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880667, 37.538167, 3.63 ] } }, + { "type": "Feature", "properties": { "id": "us2000atyw", "mag": 4.9, "time": 1506272236140, "felt": 49, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 27.2871, 36.912, 8.66 ] } }, + { "type": "Feature", "properties": { "id": "uw61333276", "mag": 0.97, "time": 1506272212660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.677, 48.245, 8.69 ] } }, + { "type": "Feature", "properties": { "id": "ci38009504", "mag": 1.59, "time": 1506272197880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.0285, 33.096, 10.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16935414", "mag": 1.3, "time": 1506271871925, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3105, 62.8907, 109.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16892357", "mag": 1.5, "time": 1506271104455, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2217, 60.9895, 43.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16892356", "mag": 1.0, "time": 1506270748541, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7754, 66.4015, 0.3 ] } }, + { "type": "Feature", "properties": { "id": "nn00606816", "mag": 1.3, "time": 1506270455535, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3547, 38.3427, 11.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16892349", "mag": 2.1, "time": 1506269387778, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9052, 64.2272, 113.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16892348", "mag": 1.2, "time": 1506269350233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0305, 61.1531, 0.9 ] } }, + { "type": "Feature", "properties": { "id": "uu60249237", "mag": 1.72, "time": 1506268839820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.899, 38.3125, 1.61 ] } }, + { "type": "Feature", "properties": { "id": "nc72898066", "mag": 2.26, "time": 1506268374330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820667, 37.604333, 4.11 ] } }, + { "type": "Feature", "properties": { "id": "hv61919541", "mag": 2.2, "time": 1506268362680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.553, 19.106833, 58.134 ] } }, + { "type": "Feature", "properties": { "id": "nc72898071", "mag": 1.35, "time": 1506268343880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.978833, 37.602333, 0.75 ] } }, + { "type": "Feature", "properties": { "id": "uw61333251", "mag": 0.99, "time": 1506267835060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.7565, 46.8405, 0.46 ] } }, + { "type": "Feature", "properties": { "id": "uu60249227", "mag": 1.55, "time": 1506267791100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.045667, 38.595, 10.17 ] } }, + { "type": "Feature", "properties": { "id": "nc72898046", "mag": 1.31, "time": 1506267662950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.359333, 36.063833, 13.03 ] } }, + { "type": "Feature", "properties": { "id": "uw61333241", "mag": 1.02, "time": 1506266858960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.7535, 46.835833, -0.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000atyb", "mag": 4.2, "time": 1506265370020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9623, 16.5258, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16891829", "mag": 1.1, "time": 1506265012702, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.7832, 60.3293, 15.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61333221", "mag": 2.23, "time": 1506264885990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.458, 41.843167, 29.32 ] } }, + { "type": "Feature", "properties": { "id": "ci38009392", "mag": 2.47, "time": 1506263949730, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.965667, 33.074, 3.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16891827", "mag": 1.6, "time": 1506263040480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.0762, 68.8735, 7.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16935406", "mag": 1.9, "time": 1506262994682, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4328, 58.9133, 119.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60249217", "mag": 1.98, "time": 1506261948290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.8955, 38.308167, 2.5 ] } }, + { "type": "Feature", "properties": { "id": "uw61333201", "mag": 1.01, "time": 1506261154820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.757333, 46.836833, 0.83 ] } }, + { "type": "Feature", "properties": { "id": "nn00606861", "mag": 1.0, "time": 1506260845911, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9076, 39.4306, 7.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16891323", "mag": 1.6, "time": 1506260101784, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2725, 63.8369, 122.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16935404", "mag": 1.9, "time": 1506259949572, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.9271, 51.4777, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16891318", "mag": 1.4, "time": 1506258938436, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1228, 60.1784, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16935403", "mag": 1.5, "time": 1506258927685, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.537, 59.7654, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000awkh", "mag": 4.5, "time": 1506257940620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.6787, -21.4068, 6.58 ] } }, + { "type": "Feature", "properties": { "id": "ci38009360", "mag": 1.01, "time": 1506257616920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6935, 33.4475, 13.86 ] } }, + { "type": "Feature", "properties": { "id": "hv61919476", "mag": 2.71, "time": 1506257049620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.326172, 19.400499, 6.36 ] } }, + { "type": "Feature", "properties": { "id": "us2000azwe", "mag": 4.0, "time": 1506256906900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0503, 15.0164, 47.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16935402", "mag": 1.3, "time": 1506256449894, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1247, 62.5252, 67.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000atx8", "mag": 4.5, "time": 1506256396240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.2151, 16.4456, 23.74 ] } }, + { "type": "Feature", "properties": { "id": "us2000awke", "mag": 4.3, "time": 1506254896510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -99.7664, -36.2005, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000atx1", "mag": 4.3, "time": 1506253816940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8221, 15.5422, 39.51 ] } }, + { "type": "Feature", "properties": { "id": "nc72897966", "mag": 1.94, "time": 1506252917940, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.353833, 38.334333, 8.17 ] } }, + { "type": "Feature", "properties": { "id": "ak16890316", "mag": 1.9, "time": 1506251419309, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7084, 53.1628, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16935399", "mag": 2.2, "time": 1506251253254, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.9705, 58.4119, 157.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000awkb", "mag": 4.4, "time": 1506250943050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.3134, -22.0133, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38009336", "mag": 1.4, "time": 1506250687150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.573, 33.198833, 3.26 ] } }, + { "type": "Feature", "properties": { "id": "ak16935398", "mag": 1.7, "time": 1506250678217, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.541, 51.1205, 34.1 ] } }, + { "type": "Feature", "properties": { "id": "ci37166588", "mag": 1.39, "time": 1506250675520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.547333, 33.281167, 1.13 ] } }, + { "type": "Feature", "properties": { "id": "ci38009328", "mag": 1.47, "time": 1506250567750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.565833, 33.2015, 2.63 ] } }, + { "type": "Feature", "properties": { "id": "us2000azw4", "mag": 4.0, "time": 1506250079340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2354, 15.2643, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72897961", "mag": 1.0, "time": 1506249470110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.771164, 38.839333, 1.45 ] } }, + { "type": "Feature", "properties": { "id": "ak16890295", "mag": 3.1, "time": 1506249009854, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4939, 58.556, 142.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38009320", "mag": 1.29, "time": 1506248967650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.577833, 33.1915, 3.45 ] } }, + { "type": "Feature", "properties": { "id": "us2000awka", "mag": 4.5, "time": 1506248797510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 101.4422, -3.5379, 76.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16889805", "mag": 1.1, "time": 1506248542391, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6804, 65.8304, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16889804", "mag": 1.4, "time": 1506248465317, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0578, 61.0579, 16.4 ] } }, + { "type": "Feature", "properties": { "id": "hv61919431", "mag": 2.09, "time": 1506248237750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.282165, 19.41, 0.97 ] } }, + { "type": "Feature", "properties": { "id": "us2000atwe", "mag": 5.8, "time": 1506247572180, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0996, 15.3335, 55.04 ] } }, + { "type": "Feature", "properties": { "id": "ak16889794", "mag": 1.8, "time": 1506247473558, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2731, 60.4252, 19.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16889792", "mag": 1.2, "time": 1506245981072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4789, 61.3979, 20.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16935392", "mag": 2.2, "time": 1506245821194, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.1457, 52.299, 147.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61333151", "mag": 1.32, "time": 1506245720210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3825, 46.455, 17.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000atw1", "mag": 4.3, "time": 1506245575860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -86.8213, 11.9773, 72.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16889787", "mag": 1.5, "time": 1506245559319, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1034, 61.6735, 30.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72897941", "mag": 1.12, "time": 1506245298510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880333, 37.529333, 3.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16889785", "mag": 1.4, "time": 1506245231368, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6899, 61.5181, 15.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000atvx", "mag": 4.0, "time": 1506245211400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.2276, 16.4152, 5.52 ] } }, + { "type": "Feature", "properties": { "id": "ak16889300", "mag": 1.5, "time": 1506244274159, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0562, 62.8873, 108.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16889299", "mag": 1.7, "time": 1506243971468, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.0331, 60.0823, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16889298", "mag": 1.2, "time": 1506242695770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7525, 61.9971, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "hv61919256", "mag": 2.47, "time": 1506242595490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.234167, 19.416667, 25.716 ] } }, + { "type": "Feature", "properties": { "id": "ak16889296", "mag": 1.5, "time": 1506242565319, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7169, 65.857, 21.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72897921", "mag": 1.06, "time": 1506242001250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8435, 37.469667, 2.92 ] } }, + { "type": "Feature", "properties": { "id": "nc72897911", "mag": 2.08, "time": 1506241606310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.552333, 36.824833, 5.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16888862", "mag": 1.4, "time": 1506241109945, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2949, 62.9113, 106.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38009280", "mag": 1.11, "time": 1506240906400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0385, 33.996167, 14.68 ] } }, + { "type": "Feature", "properties": { "id": "us2000atvi", "mag": 2.6, "time": 1506240803150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4513, 42.6043, 5.23 ] } }, + { "type": "Feature", "properties": { "id": "us2000atvl", "mag": 4.0, "time": 1506239983840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9034, 16.4793, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16888812", "mag": 1.7, "time": 1506239643860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1541, 59.6562, 69.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16935382", "mag": 1.8, "time": 1506239506704, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5249, 57.6124, 45.4 ] } }, + { "type": "Feature", "properties": { "id": "mb80257374", "mag": 1.2, "time": 1506238135570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.523333, 46.868, 11.76 ] } }, + { "type": "Feature", "properties": { "id": "nn00606790", "mag": 1.5, "time": 1506237560657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.1999, 42.1841, 0.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000atv2", "mag": 4.3, "time": 1506236966640, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.864, -35.1565, 48.32 ] } }, + { "type": "Feature", "properties": { "id": "ak16888374", "mag": 1.9, "time": 1506236724000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8397, 62.9467, 106.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16888373", "mag": 1.0, "time": 1506236683719, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1115, 61.3903, 3.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60249142", "mag": 1.26, "time": 1506236544020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.028333, 44.8, 10.63 ] } }, + { "type": "Feature", "properties": { "id": "nc72897871", "mag": 1.79, "time": 1506236124510, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.845333, 35.541667, 5.98 ] } }, + { "type": "Feature", "properties": { "id": "nc72897866", "mag": 2.12, "time": 1506235870210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3545, 38.341333, 8.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16935379", "mag": 1.6, "time": 1506235725999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.5436, 51.4418, 21.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000atuj", "mag": 4.6, "time": 1506235179700, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -75.5466, -14.3043, 33.52 ] } }, + { "type": "Feature", "properties": { "id": "nc72903821", "mag": 1.02, "time": 1506234997060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.948167, 41.046333, 9.53 ] } }, + { "type": "Feature", "properties": { "id": "nc72897856", "mag": 1.71, "time": 1506234937540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8185, 37.471333, 1.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16935378", "mag": 1.3, "time": 1506234863595, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9435, 61.261, 59.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38009240", "mag": 0.99, "time": 1506234721960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.828167, 33.977667, 16.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16935377", "mag": 3.3, "time": 1506234648623, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.3164, 50.4387, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16888327", "mag": 1.1, "time": 1506234051194, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0067, 67.8619, 3.3 ] } }, + { "type": "Feature", "properties": { "id": "hv61919146", "mag": 1.76, "time": 1506233551670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.438667, 19.110833, 40.565 ] } }, + { "type": "Feature", "properties": { "id": "nc72897836", "mag": 1.19, "time": 1506233494190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.879667, 37.536833, 3.32 ] } }, + { "type": "Feature", "properties": { "id": "nc72897831", "mag": 1.19, "time": 1506233212800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880167, 37.536833, 3.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16935375", "mag": 1.1, "time": 1506232927752, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.625, 63.077, 2.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16887898", "mag": 1.9, "time": 1506232339124, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4442, 51.588, 12.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000atud", "mag": 4.6, "time": 1506232184760, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.3102, 23.9217, 19.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16887893", "mag": 1.8, "time": 1506231025885, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6676, 61.5229, 16.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000attv", "mag": 3.2, "time": 1506230915380, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4686, 42.6086, 5.28 ] } }, + { "type": "Feature", "properties": { "id": "ci38009080", "mag": 1.1, "time": 1506230493370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.65, 35.937333, 3.69 ] } }, + { "type": "Feature", "properties": { "id": "nc72897801", "mag": 1.86, "time": 1506230402950, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.880833, 37.5355, 3.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000attk", "mag": 4.4, "time": 1506229834430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9698, 16.526, 14.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16887845", "mag": 2.2, "time": 1506229788458, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3609, 60.3798, 13.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38009064", "mag": 2.54, "time": 1506229471590, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.708833, 34.611167, -0.32 ] } }, + { "type": "Feature", "properties": { "id": "ak16887419", "mag": 2.5, "time": 1506228712730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1558, 57.6827, 0.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60249092", "mag": 1.45, "time": 1506228417670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.041833, 38.6065, 7.11 ] } }, + { "type": "Feature", "properties": { "id": "uu60013144", "mag": 2.65, "time": 1506227971910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.063667, 38.596667, 13.4 ] } }, + { "type": "Feature", "properties": { "id": "uu60249087", "mag": 3.34, "time": 1506227924130, "felt": 52, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.056, 38.615, 7.09 ] } }, + { "type": "Feature", "properties": { "id": "ci38009040", "mag": 1.66, "time": 1506227707260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.754667, 32.691333, 7.72 ] } }, + { "type": "Feature", "properties": { "id": "ak16887417", "mag": 1.4, "time": 1506227635748, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4813, 59.9807, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61919026", "mag": 1.76, "time": 1506225952210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.284164, 19.394167, 2.71 ] } }, + { "type": "Feature", "properties": { "id": "hv61918996", "mag": 1.99, "time": 1506224898090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.28067, 19.403999, 1.29 ] } }, + { "type": "Feature", "properties": { "id": "us2000atsq", "mag": 4.1, "time": 1506223896740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.2705, -18.0175, 148.09 ] } }, + { "type": "Feature", "properties": { "id": "ak16935368", "mag": 2.3, "time": 1506222958411, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.4834, 51.3236, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16886952", "mag": 1.2, "time": 1506222874628, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.387, 59.9979, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nm60207271", "mag": 1.17, "time": 1506222175440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.522833, 36.477167, 7.22 ] } }, + { "type": "Feature", "properties": { "id": "nc72897746", "mag": 1.28, "time": 1506221915120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.720833, 38.788, 2.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16886490", "mag": 1.1, "time": 1506220290807, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3418, 62.9812, 77.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000atse", "mag": 4.6, "time": 1506220200040, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.2801, -27.8834, 30.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16935365", "mag": 1.8, "time": 1506220032447, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1268, 57.8123, 70.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72897736", "mag": 1.07, "time": 1506219512840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8245, 37.478833, 1.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16935364", "mag": 2.4, "time": 1506219397177, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.8092, 52.1986, 20.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72897726", "mag": 2.48, "time": 1506219108260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -125.023333, 40.3465, 9.33 ] } }, + { "type": "Feature", "properties": { "id": "us2000atsa", "mag": 4.2, "time": 1506218615340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8425, 16.574, 39.83 ] } }, + { "type": "Feature", "properties": { "id": "ak16935363", "mag": 1.0, "time": 1506217950145, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5769, 68.6004, 0.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72897701", "mag": 1.48, "time": 1506217326030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819333, 37.475, -0.04 ] } }, + { "type": "Feature", "properties": { "id": "nc72897696", "mag": 1.19, "time": 1506216792400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.125, 36.5355, 3.43 ] } }, + { "type": "Feature", "properties": { "id": "ak16886371", "mag": 2.1, "time": 1506216606733, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.8852, 51.4616, 53.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000atrn", "mag": 3.8, "time": 1506215497620, "felt": 67, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.1371, 36.3727, 2.82 ] } }, + { "type": "Feature", "properties": { "id": "nc72897686", "mag": 2.17, "time": 1506215076790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.141167, 36.555, 2.89 ] } }, + { "type": "Feature", "properties": { "id": "ci38008976", "mag": 1.32, "time": 1506215071310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.450333, 34.2865, 7.66 ] } }, + { "type": "Feature", "properties": { "id": "us2000atrk", "mag": 5.0, "time": 1506214584220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 161.7808, -10.6598, 47.61 ] } }, + { "type": "Feature", "properties": { "id": "ak16885992", "mag": 2.0, "time": 1506214179876, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6803, 63.2188, 129.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38008968", "mag": 1.0, "time": 1506214163490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8005, 33.996, 18.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16885991", "mag": 1.4, "time": 1506214156491, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6167, 63.06, 7.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16885975", "mag": 2.0, "time": 1506213434632, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5807, 63.0643, 7.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16885911", "mag": 1.9, "time": 1506213142249, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5965, 63.0635, 4.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000atre", "mag": 4.4, "time": 1506212946200, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -88.7877, 12.9849, 60.16 ] } }, + { "type": "Feature", "properties": { "id": "nc72897676", "mag": 1.44, "time": 1506212851640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.836167, 37.574667, 1.65 ] } }, + { "type": "Feature", "properties": { "id": "ci38008928", "mag": 1.02, "time": 1506212597460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.178333, 33.195833, 6.76 ] } }, + { "type": "Feature", "properties": { "id": "ci38008920", "mag": 1.07, "time": 1506212251010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.430333, 34.0525, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16885578", "mag": 1.8, "time": 1506211566495, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6255, 61.4518, 71.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16885576", "mag": 1.5, "time": 1506211049943, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.5978, 61.5229, 17.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16885547", "mag": 1.3, "time": 1506210780241, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6346, 63.8335, 106.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16885533", "mag": 1.6, "time": 1506209676573, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5334, 61.8507, 43.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72897656", "mag": 1.03, "time": 1506208996140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7145, 38.772667, 2.47 ] } }, + { "type": "Feature", "properties": { "id": "ci38008912", "mag": 1.4, "time": 1506208905320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.801167, 33.9745, 17.62 ] } }, + { "type": "Feature", "properties": { "id": "ci38008904", "mag": 1.35, "time": 1506208456300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.924333, 33.9845, 4.74 ] } }, + { "type": "Feature", "properties": { "id": "us2000atqq", "mag": 4.5, "time": 1506207994550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9873, 16.6593, 8.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16885149", "mag": 1.0, "time": 1506207804984, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3702, 64.9969, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60249057", "mag": 2.12, "time": 1506207074140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.304, 44.720667, 6.11 ] } }, + { "type": "Feature", "properties": { "id": "nc72897646", "mag": 1.23, "time": 1506206872800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.735333, 38.787167, 1.28 ] } }, + { "type": "Feature", "properties": { "id": "us2000atq4", "mag": 4.6, "time": 1506204121620, "felt": 194, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.616, -33.7421, 44.72 ] } }, + { "type": "Feature", "properties": { "id": "ci38008864", "mag": 1.58, "time": 1506203611410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.609, 33.181333, 2.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16884706", "mag": 3.1, "time": 1506202930250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.1771, 51.8267, 132.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000atpq", "mag": 4.9, "time": 1506201617890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 124.82, 7.5438, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000atpp", "mag": 4.9, "time": 1506201494980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 124.8199, 7.5946, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16884645", "mag": 1.0, "time": 1506201077397, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.96, 64.7531, 1.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000atpb", "mag": 5.7, "time": 1506199628760, "felt": 53, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 124.8736, 7.6285, 31.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16884300", "mag": 2.8, "time": 1506199486287, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.6652, 52.5903, 67.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72897611", "mag": 1.26, "time": 1506199458450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821667, 37.604333, 4.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16884298", "mag": 1.2, "time": 1506198439700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5445, 59.7818, 0.1 ] } }, + { "type": "Feature", "properties": { "id": "uw61332966", "mag": 1.38, "time": 1506197756870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.684333, 48.248, 9.29 ] } }, + { "type": "Feature", "properties": { "id": "ak16884247", "mag": 2.2, "time": 1506197594492, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.0461, 51.8485, 92.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16883936", "mag": 1.0, "time": 1506196999226, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8099, 64.7452, 10.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38008816", "mag": 1.2, "time": 1506196919720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.403833, 34.223333, 11.34 ] } }, + { "type": "Feature", "properties": { "id": "nc72897586", "mag": 2.51, "time": 1506196446140, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.396167, 40.494333, 25.08 ] } }, + { "type": "Feature", "properties": { "id": "nc72897566", "mag": 2.07, "time": 1506194792800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835833, 37.572667, 1.63 ] } }, + { "type": "Feature", "properties": { "id": "nc72897561", "mag": 1.83, "time": 1506194678430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8365, 37.574, 1.71 ] } }, + { "type": "Feature", "properties": { "id": "ak16883864", "mag": 2.8, "time": 1506194224396, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.8992, 51.3293, 31.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16883866", "mag": 1.0, "time": 1506193955730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8833, 59.8983, 14.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72897541", "mag": 1.74, "time": 1506193009290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820833, 37.6045, 4.22 ] } }, + { "type": "Feature", "properties": { "id": "ak16883553", "mag": 1.2, "time": 1506192900100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4017, 65.5315, 14.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16883554", "mag": 1.2, "time": 1506192680980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.0611, 67.1099, 2.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000atnx", "mag": 2.6, "time": 1506192601240, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4214, 42.5566, 9.03 ] } }, + { "type": "Feature", "properties": { "id": "ak16883552", "mag": 1.1, "time": 1506192410113, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.197, 60.3011, 0.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72897531", "mag": 2.28, "time": 1506191594770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821667, 37.604, 4.22 ] } }, + { "type": "Feature", "properties": { "id": "us2000augr", "mag": 4.5, "time": 1506191531170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.4442, -11.942, 15.62 ] } }, + { "type": "Feature", "properties": { "id": "ci38008760", "mag": 1.23, "time": 1506190682920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.415167, 33.1465, 4.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38008752", "mag": 1.14, "time": 1506190401470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.972, 33.217167, 7.81 ] } }, + { "type": "Feature", "properties": { "id": "nc72897521", "mag": 1.68, "time": 1506190013010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811833, 38.821167, 1.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16883482", "mag": 1.4, "time": 1506189726896, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.742, 64.4224, 18.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16923786", "mag": 2.7, "time": 1506189654902, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.1544, 53.4208, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "hv61918336", "mag": 2.94, "time": 1506189242240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.611167, 19.4215, 2.482 ] } }, + { "type": "Feature", "properties": { "id": "us2000atn1", "mag": 4.4, "time": 1506188901480, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 125.1457, 7.0739, 96.15 ] } }, + { "type": "Feature", "properties": { "id": "nc72897511", "mag": 1.1, "time": 1506188786860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.7965, 37.484667, 7.75 ] } }, + { "type": "Feature", "properties": { "id": "ak16883178", "mag": 2.9, "time": 1506188673480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5715, 58.1668, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16923784", "mag": 1.7, "time": 1506187667099, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6425, 60.6215, 67.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000atms", "mag": 5.0, "time": 1506187553100, "felt": 30, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.9096, -30.7535, 117.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38008720", "mag": 1.14, "time": 1506187127550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.4515, 34.231833, 12.91 ] } }, + { "type": "Feature", "properties": { "id": "nc72897476", "mag": 2.49, "time": 1506186613660, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.3425, 36.714, -0.57 ] } }, + { "type": "Feature", "properties": { "id": "nc72897471", "mag": 1.19, "time": 1506186452260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.773834, 38.833832, 1.91 ] } }, + { "type": "Feature", "properties": { "id": "ci38008696", "mag": 1.09, "time": 1506186268310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.848333, 36.183167, 3.2 ] } }, + { "type": "Feature", "properties": { "id": "ci38008688", "mag": 1.35, "time": 1506185983910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.845167, 36.179667, 2.43 ] } }, + { "type": "Feature", "properties": { "id": "nc72897466", "mag": 1.85, "time": 1506185948480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.807, 38.052667, 0.81 ] } }, + { "type": "Feature", "properties": { "id": "us2000atmg", "mag": 4.4, "time": 1506185133990, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 71.1291, 36.4703, 91.01 ] } }, + { "type": "Feature", "properties": { "id": "us2000atmf", "mag": 4.5, "time": 1506184783190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.21, -28.772, 131.62 ] } }, + { "type": "Feature", "properties": { "id": "nc72897451", "mag": 1.44, "time": 1506184758630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.9955, 36.407667, 6.86 ] } }, + { "type": "Feature", "properties": { "id": "ci38008672", "mag": 2.68, "time": 1506184689590, "felt": 16, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8015, 33.498333, 5.63 ] } }, + { "type": "Feature", "properties": { "id": "ci38008664", "mag": 1.11, "time": 1506184563870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.261167, 34.006833, 14.43 ] } }, + { "type": "Feature", "properties": { "id": "us2000atmc", "mag": 2.7, "time": 1506184527900, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4447, 42.5711, 9.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000atma", "mag": 4.4, "time": 1506183893420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7171, 16.8156, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72897441", "mag": 1.31, "time": 1506183491090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.606833, 37.170833, 12.95 ] } }, + { "type": "Feature", "properties": { "id": "nc72897436", "mag": 1.56, "time": 1506183390100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.606833, 37.198667, 10.68 ] } }, + { "type": "Feature", "properties": { "id": "ak16882778", "mag": 2.6, "time": 1506183338101, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.6342, 57.1033, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16923782", "mag": 2.0, "time": 1506182696586, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8058, 59.0921, 75.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16882769", "mag": 3.1, "time": 1506182496691, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.0149, 52.3026, 176.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000atm1", "mag": 4.3, "time": 1506182042160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 62.7519, 26.1798, 45.69 ] } }, + { "type": "Feature", "properties": { "id": "ak16882474", "mag": 1.9, "time": 1506181429544, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7141, 61.0689, 15.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16882473", "mag": 1.1, "time": 1506181415825, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.5959, 60.5708, 14.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72897426", "mag": 1.24, "time": 1506180532690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.623667, 37.188167, 10.74 ] } }, + { "type": "Feature", "properties": { "id": "ci38008584", "mag": 1.58, "time": 1506180105990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.444, 33.030667, 2.87 ] } }, + { "type": "Feature", "properties": { "id": "us2000atlk", "mag": 3.8, "time": 1506180000610, "felt": 14, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4292, 42.5433, 9.91 ] } }, + { "type": "Feature", "properties": { "id": "us2000atlf", "mag": 4.2, "time": 1506179194220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0107, 16.603, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80257194", "mag": 1.15, "time": 1506178837080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525833, 46.886, 12.66 ] } }, + { "type": "Feature", "properties": { "id": "nn00606739", "mag": 1.0, "time": 1506178325112, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.0924, 40.2311, 5.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38008536", "mag": 1.59, "time": 1506177881730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.795667, 33.495667, 3.67 ] } }, + { "type": "Feature", "properties": { "id": "us2000atkr", "mag": 4.9, "time": 1506177106540, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8831, 16.6905, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000atku", "mag": 4.2, "time": 1506176872070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.97, 16.7939, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72897386", "mag": 1.06, "time": 1506176360420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811667, 38.818667, 2.57 ] } }, + { "type": "Feature", "properties": { "id": "ci38008512", "mag": 2.34, "time": 1506176315810, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0575, 34.503333, 8.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000atkn", "mag": 4.4, "time": 1506176300040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.1269, 16.7434, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16882104", "mag": 1.1, "time": 1506175629079, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8075, 60.3407, 9.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72897361", "mag": 0.96, "time": 1506174820850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.612, 37.392833, 13.92 ] } }, + { "type": "Feature", "properties": { "id": "ak16881826", "mag": 2.5, "time": 1506174802909, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6324, 58.8539, 123.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38008496", "mag": 1.78, "time": 1506174424760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.817167, 34.867667, 4.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16881795", "mag": 1.1, "time": 1506173527174, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8881, 64.8661, 12.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000atke", "mag": 5.1, "time": 1506173434140, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 120.8176, 13.6704, 193.27 ] } }, + { "type": "Feature", "properties": { "id": "us2000atk8", "mag": 4.8, "time": 1506173052110, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9123, 16.7308, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16881771", "mag": 1.2, "time": 1506172200912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8726, 64.8605, 11.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16881749", "mag": 1.6, "time": 1506171778198, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8844, 64.8563, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000atjy", "mag": 4.3, "time": 1506171499860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.9043, -2.9658, 44.93 ] } }, + { "type": "Feature", "properties": { "id": "uu60248857", "mag": 1.35, "time": 1506171338590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.890833, 37.000833, 18.28 ] } }, + { "type": "Feature", "properties": { "id": "us2000atjv", "mag": 6.1, "time": 1506171182420, "felt": 203, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9509, 16.7732, 9.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16881467", "mag": 1.4, "time": 1506170949832, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8768, 64.9158, 8.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16881459", "mag": 1.7, "time": 1506170669236, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6941, 64.6752, 17.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16881453", "mag": 1.5, "time": 1506170369239, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9047, 64.8585, 16.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000atjm", "mag": 4.6, "time": 1506169519350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.1923, 31.1823, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000avhc", "mag": 2.6, "time": 1506167877970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.84, 52.2553, 189.02 ] } }, + { "type": "Feature", "properties": { "id": "ak16881171", "mag": 2.3, "time": 1506167030162, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.8612, 51.6605, 44.9 ] } }, + { "type": "Feature", "properties": { "id": "uu60248832", "mag": 1.05, "time": 1506167017860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.340667, 40.274333, 3.24 ] } }, + { "type": "Feature", "properties": { "id": "us2000augc", "mag": 4.6, "time": 1506166612290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 154.9573, -5.8521, 181.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16881170", "mag": 1.2, "time": 1506166372386, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7852, 62.5649, 5.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16881168", "mag": 1.3, "time": 1506166038103, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5567, 63.2977, 0.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72897346", "mag": 1.79, "time": 1506165696260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.112333, 37.231, 6.72 ] } }, + { "type": "Feature", "properties": { "id": "us2000avha", "mag": 3.4, "time": 1506165671380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.4308, 52.2784, 36.52 ] } }, + { "type": "Feature", "properties": { "id": "ci38008448", "mag": 1.41, "time": 1506165347360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.561667, 32.957167, 8.78 ] } }, + { "type": "Feature", "properties": { "id": "ak16881165", "mag": 1.3, "time": 1506165145820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3968, 60.1913, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16881154", "mag": 1.7, "time": 1506164474729, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4355, 60.0468, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16923760", "mag": 1.5, "time": 1506164269172, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.3627, 51.5307, 19.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000atis", "mag": 5.8, "time": 1506163088980, "felt": 26, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1625, 15.6979, 74.22 ] } }, + { "type": "Feature", "properties": { "id": "ak16880880", "mag": 2.0, "time": 1506162923314, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4514, 58.8323, 121.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16880879", "mag": 1.5, "time": 1506162509845, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4379, 59.9894, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72897331", "mag": 1.09, "time": 1506162381540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.827, 37.610667, 4.37 ] } }, + { "type": "Feature", "properties": { "id": "ak16880874", "mag": 1.6, "time": 1506161778674, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9513, 62.6833, 55.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16880872", "mag": 2.2, "time": 1506161709130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.2999, 57.8298, 119.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16880868", "mag": 1.9, "time": 1506161335096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0011, 60.342, 8.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16880864", "mag": 1.5, "time": 1506160533641, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2829, 64.8808, 8.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72897316", "mag": 1.12, "time": 1506160300400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.288667, 36.670833, 2.66 ] } }, + { "type": "Feature", "properties": { "id": "us2000ati0", "mag": 4.5, "time": 1506158356450, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.7746, 9.1385, 52.29 ] } }, + { "type": "Feature", "properties": { "id": "nc72897301", "mag": 3.32, "time": 1506157219710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.0845, 40.348333, 11.62 ] } }, + { "type": "Feature", "properties": { "id": "uw61332771", "mag": 1.35, "time": 1506157207660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.313333, 47.606333, 8.75 ] } }, + { "type": "Feature", "properties": { "id": "nc72897271", "mag": 1.14, "time": 1506156362630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.254167, 36.643167, 6.03 ] } }, + { "type": "Feature", "properties": { "id": "ak16880667", "mag": 1.1, "time": 1506155808049, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.5764, 61.5311, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ati7", "mag": 3.5, "time": 1506155357560, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.0524, 41.3116, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000atht", "mag": 4.7, "time": 1506154802240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.0272, 44.3731, 31.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16880659", "mag": 1.0, "time": 1506154668324, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.1159, 65.4383, 3.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16880589", "mag": 2.0, "time": 1506153946841, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6279, 61.5946, 79.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72897246", "mag": 1.31, "time": 1506153823970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.762, 38.794, 0.72 ] } }, + { "type": "Feature", "properties": { "id": "ci38008352", "mag": 1.63, "time": 1506153604550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.4425, 33.0265, 5.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00606675", "mag": 1.2, "time": 1506152057931, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9167, 38.4054, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16880394", "mag": 3.6, "time": 1506152017544, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.3853, 52.2081, 31.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16923747", "mag": 1.9, "time": 1506151958661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4175, 51.6761, 16.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38008344", "mag": 1.48, "time": 1506151638300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.324167, 33.310833, 12.5 ] } }, + { "type": "Feature", "properties": { "id": "uu60248802", "mag": 2.41, "time": 1506151450100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.419667, 42.565833, 9.15 ] } }, + { "type": "Feature", "properties": { "id": "us2000ath8", "mag": 4.1, "time": 1506151137510, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2976, 15.8203, 61.65 ] } }, + { "type": "Feature", "properties": { "id": "nc72897236", "mag": 1.32, "time": 1506151113910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.898167, 37.524833, 12.73 ] } }, + { "type": "Feature", "properties": { "id": "us2000ath6", "mag": 4.1, "time": 1506150769430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3958, 15.2768, 10.51 ] } }, + { "type": "Feature", "properties": { "id": "ci38008328", "mag": 1.27, "time": 1506150100050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.200167, 33.893167, 7.86 ] } }, + { "type": "Feature", "properties": { "id": "nn00606672", "mag": 1.5, "time": 1506150086518, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2696, 38.2952, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000augd", "mag": 4.4, "time": 1506150000550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.8812, 20.1804, 76.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38008320", "mag": 1.19, "time": 1506149119830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9395, 33.982167, 4.39 ] } }, + { "type": "Feature", "properties": { "id": "us2000atgz", "mag": 4.2, "time": 1506149095090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.0247, 10.6523, 19.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16880326", "mag": 2.0, "time": 1506149068802, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0613, 61.3779, 34.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ath2", "mag": 4.7, "time": 1506149033340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.7584, -3.0863, 34.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16880327", "mag": 1.1, "time": 1506149006055, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2865, 68.6023, 13.4 ] } }, + { "type": "Feature", "properties": { "id": "uw61332671", "mag": 1.77, "time": 1506147857710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.281667, 47.7015, 25.73 ] } }, + { "type": "Feature", "properties": { "id": "nc72897231", "mag": 2.11, "time": 1506147638730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6555, 36.061833, 9.09 ] } }, + { "type": "Feature", "properties": { "id": "us2000aug5", "mag": 4.5, "time": 1506146537200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.8683, -24.2891, 524.27 ] } }, + { "type": "Feature", "properties": { "id": "ci38008296", "mag": 1.25, "time": 1506146485640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.616, 33.586167, 13.04 ] } }, + { "type": "Feature", "properties": { "id": "ak16880116", "mag": 1.8, "time": 1506145682289, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.2213, 66.2475, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "nn00606730", "mag": 1.3, "time": 1506145648978, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.1876, 38.2127, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38008288", "mag": 1.58, "time": 1506145525140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.4415, 32.5255, 16.12 ] } }, + { "type": "Feature", "properties": { "id": "nn00606667", "mag": 1.5, "time": 1506145236843, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.917, 38.3346, 11.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000atgp", "mag": 4.5, "time": 1506143865490, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.7175, 9.7486, 52.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000athl", "mag": 4.4, "time": 1506143271620, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 108.9322, -8.2399, 66.53 ] } }, + { "type": "Feature", "properties": { "id": "nc72897216", "mag": 1.88, "time": 1506142958730, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9835, 40.89, 15.76 ] } }, + { "type": "Feature", "properties": { "id": "nc72897211", "mag": 1.17, "time": 1506142616000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827667, 38.837166, 1.66 ] } }, + { "type": "Feature", "properties": { "id": "nc72897201", "mag": 0.95, "time": 1506142430900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.848, 38.839168, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72897191", "mag": 1.9, "time": 1506141940330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.177333, 40.264333, 3.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16879870", "mag": 2.3, "time": 1506141876996, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6246, 59.199, 103.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16879869", "mag": 1.3, "time": 1506141297637, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.7807, 60.3298, 7.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00606723", "mag": 1.0, "time": 1506140560559, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2867, 38.4929, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38008224", "mag": 0.95, "time": 1506140386650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.208667, 33.3405, 11.26 ] } }, + { "type": "Feature", "properties": { "id": "ak16879830", "mag": 1.4, "time": 1506140318328, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2827, 60.4409, 47.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00606722", "mag": 1.2, "time": 1506140002001, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9021, 38.3867, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00606720", "mag": 1.1, "time": 1506139980519, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2929, 38.489, 10.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72897176", "mag": 1.78, "time": 1506139907070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.285333, 38.488, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72897171", "mag": 1.19, "time": 1506139518870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.735336, 38.790001, 1.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72897166", "mag": 2.9, "time": 1506138206720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.992667, 40.335333, 11.62 ] } }, + { "type": "Feature", "properties": { "id": "us2000atgc", "mag": 4.2, "time": 1506137667560, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9729, 15.6003, 33.69 ] } }, + { "type": "Feature", "properties": { "id": "nc72897161", "mag": 3.28, "time": 1506137168410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.014, 40.471167, 11.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16879595", "mag": 2.4, "time": 1506137087441, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8458, 58.348, 0.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16923736", "mag": 1.3, "time": 1506135643558, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0957, 61.7127, 43.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16879403", "mag": 1.0, "time": 1506135058360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4982, 63.0889, 5.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16923734", "mag": 2.5, "time": 1506133328382, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.4425, 54.2787, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16879357", "mag": 2.6, "time": 1506132937319, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3477, 59.8339, 130.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16879346", "mag": 2.2, "time": 1506132165090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.4939, 67.7172, 16.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16879344", "mag": 2.6, "time": 1506132016431, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.1196, 54.9637, 82.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00606656", "mag": 1.3, "time": 1506130971840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3283, 38.6945, 9.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72897141", "mag": 2.05, "time": 1506130087910, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.4195, 40.470333, 27.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16879132", "mag": 1.4, "time": 1506129632041, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0373, 62.0301, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000atfh", "mag": 2.6, "time": 1506129518070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4417, 42.5563, 10.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72897136", "mag": 1.16, "time": 1506129465180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.888333, 36.006167, 8.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16879131", "mag": 1.2, "time": 1506128472934, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7081, 62.2652, 36.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72897126", "mag": 2.19, "time": 1506127820390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.640167, 36.048667, 19.79 ] } }, + { "type": "Feature", "properties": { "id": "us2000aug3", "mag": 4.3, "time": 1506127768780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.2316, -6.5899, 129.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000atfc", "mag": 4.4, "time": 1506126533850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4878, -17.8955, 579.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16878940", "mag": 1.3, "time": 1506126488960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4306, 62.433, 39.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16923727", "mag": 1.8, "time": 1506125768611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7156, 59.1725, 89.1 ] } }, + { "type": "Feature", "properties": { "id": "uw61332606", "mag": 1.37, "time": 1506125724350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8475, 47.767167, 17.62 ] } }, + { "type": "Feature", "properties": { "id": "us2000atf6", "mag": 4.6, "time": 1506125651480, "felt": 34, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 74.5944, 34.2131, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16923726", "mag": 1.0, "time": 1506125523162, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4554, 62.0263, 40.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16926133", "mag": 2.1, "time": 1506124308750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1191, 56.3855, 12.5 ] } }, + { "type": "Feature", "properties": { "id": "nn00606641", "mag": 1.1, "time": 1506124233235, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9048, 38.3823, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000atex", "mag": 5.3, "time": 1506124170400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.0234, 31.3473, 31.02 ] } }, + { "type": "Feature", "properties": { "id": "ak16878728", "mag": 1.1, "time": 1506123741185, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3949, 64.9801, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61332586", "mag": 1.03, "time": 1506123697550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.176833, 48.224167, 9.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16926129", "mag": 1.4, "time": 1506123469629, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.8468, 66.6906, 13.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16878722", "mag": 1.4, "time": 1506123273253, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.5552, 60.2789, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000awr8", "mag": 4.2, "time": 1506122891910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.1488, -4.6487, 111.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000ateh", "mag": 4.9, "time": 1506122747420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 159.6233, -7.7533, 37.28 ] } }, + { "type": "Feature", "properties": { "id": "uw61332576", "mag": 1.22, "time": 1506122597830, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.362, 45.695667, -0.73 ] } }, + { "type": "Feature", "properties": { "id": "ak16926127", "mag": 1.8, "time": 1506122331683, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.4507, 53.4966, 5.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72897116", "mag": 3.91, "time": 1506122239050, "felt": 60, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.417333, 40.495333, 26.88 ] } }, + { "type": "Feature", "properties": { "id": "nc72897111", "mag": 2.5, "time": 1506122222600, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.119, 36.5365, 3.92 ] } }, + { "type": "Feature", "properties": { "id": "ak16878700", "mag": 1.8, "time": 1506121093447, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.734, 61.0547, 12.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000awr7", "mag": 4.8, "time": 1506120979560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -35.8191, 7.4851, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80257104", "mag": 0.96, "time": 1506120805630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.649833, 45.463833, 2.97 ] } }, + { "type": "Feature", "properties": { "id": "ci38008136", "mag": 1.88, "time": 1506120529920, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8015, 33.496833, 4.18 ] } }, + { "type": "Feature", "properties": { "id": "nc72897096", "mag": 1.12, "time": 1506120001160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.939167, 37.600667, 1.08 ] } }, + { "type": "Feature", "properties": { "id": "us2000awra", "mag": 4.0, "time": 1506119896150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 128.7982, -5.8817, 310.41 ] } }, + { "type": "Feature", "properties": { "id": "ak16926125", "mag": 2.1, "time": 1506118947000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1588, 60.2166, 143.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38008120", "mag": 1.02, "time": 1506118476380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0015, 34.316333, 6.69 ] } }, + { "type": "Feature", "properties": { "id": "nc72897091", "mag": 1.46, "time": 1506118411060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8605, 39.795333, 0.38 ] } }, + { "type": "Feature", "properties": { "id": "ak16926124", "mag": 1.8, "time": 1506118096316, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2941, 60.3659, 4.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72897081", "mag": 1.12, "time": 1506117239720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.262833, 36.6425, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72897086", "mag": 2.87, "time": 1506117196030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.983667, 40.3995, 16.96 ] } }, + { "type": "Feature", "properties": { "id": "hv61917311", "mag": 1.89, "time": 1506116007530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.434662, 19.227833, 33.59 ] } }, + { "type": "Feature", "properties": { "id": "ak16926123", "mag": 1.1, "time": 1506115983704, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6992, 61.5094, 7.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16926121", "mag": 1.9, "time": 1506115445859, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1112, 60.0903, 117.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16926120", "mag": 1.1, "time": 1506115334031, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0777, 62.5847, 77.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000awr9", "mag": 4.3, "time": 1506115308090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.1151, -17.7862, 593.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16926119", "mag": 2.3, "time": 1506114986922, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0025, 54.0581, 74.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16926118", "mag": 1.7, "time": 1506114971248, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8129, 59.8684, 52.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72897066", "mag": 0.96, "time": 1506114595240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793999, 38.820167, 2.73 ] } }, + { "type": "Feature", "properties": { "id": "us2000atdb", "mag": 2.4, "time": 1506114466770, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7172, 36.3761, 4.22 ] } }, + { "type": "Feature", "properties": { "id": "ak16926117", "mag": 2.5, "time": 1506113979958, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.1399, 56.7494, 112.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16878294", "mag": 1.9, "time": 1506113817766, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1371, 60.4549, 78.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16878292", "mag": 1.4, "time": 1506113608674, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3651, 61.5158, 28.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16878288", "mag": 2.0, "time": 1506113191350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6595, 59.6404, 74.9 ] } }, + { "type": "Feature", "properties": { "id": "hv61917256", "mag": 1.43, "time": 1506112916300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.825667, 19.312167, 8.904 ] } }, + { "type": "Feature", "properties": { "id": "us2000atcg", "mag": 3.0, "time": 1506112409690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.6543, 40.4678, 10.42 ] } }, + { "type": "Feature", "properties": { "id": "ak16878117", "mag": 1.1, "time": 1506111493188, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4364, 62.2279, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16878112", "mag": 1.8, "time": 1506111203565, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6978, 58.82, 10.8 ] } }, + { "type": "Feature", "properties": { "id": "nm60207231", "mag": 0.97, "time": 1506111124010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.499167, 36.239, 6.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000atbf", "mag": 5.7, "time": 1506109815030, "felt": 112, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -126.8342, 40.4144, 11.01 ] } }, + { "type": "Feature", "properties": { "id": "nn00606606", "mag": 1.7, "time": 1506109275519, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.0338, 40.677, 7.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72897011", "mag": 1.34, "time": 1506108443760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.041, 35.58, -0.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16877921", "mag": 1.1, "time": 1506108429374, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.752, 61.522, 5.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38008072", "mag": 1.35, "time": 1506108266330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.202333, 34.987667, -0.83 ] } }, + { "type": "Feature", "properties": { "id": "nc72897001", "mag": 1.91, "time": 1506107768510, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7205, 38.773333, 1.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16877871", "mag": 1.9, "time": 1506107175373, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7465, 59.9075, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "mb80257054", "mag": 1.62, "time": 1506107025590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.474333, 46.006833, -2.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16877869", "mag": 1.6, "time": 1506107008752, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4734, 63.1712, 116.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38008032", "mag": 1.22, "time": 1506106977520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.345, 35.0535, -1.01 ] } }, + { "type": "Feature", "properties": { "id": "us2000atab", "mag": 4.5, "time": 1506106483030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 163.2943, 54.9226, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72896976", "mag": 1.19, "time": 1506105877560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.816833, 37.4545, 1.72 ] } }, + { "type": "Feature", "properties": { "id": "nc72896966", "mag": 1.64, "time": 1506105469690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.945833, 41.046833, 10.15 ] } }, + { "type": "Feature", "properties": { "id": "nc72896961", "mag": 1.88, "time": 1506105394080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.951833, 41.047667, 13.46 ] } }, + { "type": "Feature", "properties": { "id": "ak16926108", "mag": 2.2, "time": 1506105113528, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.5222, 56.3354, 50.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60248707", "mag": 1.68, "time": 1506104631990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.397333, 42.534833, 3.76 ] } }, + { "type": "Feature", "properties": { "id": "ci38007992", "mag": 1.55, "time": 1506104354710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9245, 35.899167, 6.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16926107", "mag": 1.2, "time": 1506103639337, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7358, 61.509, 12.2 ] } }, + { "type": "Feature", "properties": { "id": "hv61917106", "mag": 1.63, "time": 1506102792120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.303667, 18.980667, 12.732 ] } }, + { "type": "Feature", "properties": { "id": "ak16877700", "mag": 1.7, "time": 1506102481165, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.8203, 53.8611, 6.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16877698", "mag": 1.6, "time": 1506102300688, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.8262, 53.8452, 5.6 ] } }, + { "type": "Feature", "properties": { "id": "uw61332361", "mag": 1.6, "time": 1506102282810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.8865, 47.171, 14.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16877680", "mag": 1.9, "time": 1506102017646, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8735, 62.7643, 9.8 ] } }, + { "type": "Feature", "properties": { "id": "uu60248702", "mag": 1.26, "time": 1506101951970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.430167, 42.589833, 6.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16926103", "mag": 2.3, "time": 1506101692988, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.9282, 51.3815, 44.4 ] } }, + { "type": "Feature", "properties": { "id": "uu60248697", "mag": 2.15, "time": 1506100947090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4775, 42.630333, 2.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16926102", "mag": 1.9, "time": 1506100904987, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2736, 59.4158, 101.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16877679", "mag": 1.1, "time": 1506100453436, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9781, 63.2957, 76.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80257039", "mag": 1.48, "time": 1506100139660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.555833, 46.892333, 9.34 ] } }, + { "type": "Feature", "properties": { "id": "ci38007944", "mag": 1.7, "time": 1506100079090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.656667, 34.638, 3.99 ] } }, + { "type": "Feature", "properties": { "id": "uu60248692", "mag": 1.13, "time": 1506099922660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.408833, 42.514, 6.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16877641", "mag": 3.4, "time": 1506099810694, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7965, 62.8041, 16.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72896921", "mag": 1.1, "time": 1506099607680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.816333, 38.808833, 2.84 ] } }, + { "type": "Feature", "properties": { "id": "nc72896916", "mag": 3.01, "time": 1506099251650, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -125.362167, 40.3915, 25.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16877640", "mag": 1.4, "time": 1506099120563, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.4377, 69.5097, 14.2 ] } }, + { "type": "Feature", "properties": { "id": "hv61917081", "mag": 2.14, "time": 1506099100410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.043667, 19.653667, 42.069 ] } }, + { "type": "Feature", "properties": { "id": "ak16926098", "mag": 1.7, "time": 1506099097278, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9448, 59.8191, 95.1 ] } }, + { "type": "Feature", "properties": { "id": "ci37166268", "mag": 1.03, "time": 1506097971820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.496667, 33.561167, -0.73 ] } }, + { "type": "Feature", "properties": { "id": "ci38007912", "mag": 1.01, "time": 1506097946840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.406, 33.502167, 13.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16926097", "mag": 1.6, "time": 1506097726880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.164, 62.5769, 121.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72896896", "mag": 0.95, "time": 1506097561860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.062, 35.522667, 1.15 ] } }, + { "type": "Feature", "properties": { "id": "uu60248682", "mag": 1.11, "time": 1506097353810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.413333, 42.546167, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "uu60248677", "mag": 1.32, "time": 1506097004840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424667, 42.595, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72896881", "mag": 1.04, "time": 1506096955860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.874667, 37.619833, 8.25 ] } }, + { "type": "Feature", "properties": { "id": "nc72896886", "mag": 3.06, "time": 1506096897270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -127.211833, 40.581333, 16.62 ] } }, + { "type": "Feature", "properties": { "id": "uu60248672", "mag": 1.72, "time": 1506096443230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.447833, 42.59, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38007888", "mag": 1.36, "time": 1506095052550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7965, 33.495167, 4.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16877477", "mag": 1.5, "time": 1506094830892, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0265, 62.027, 12.7 ] } }, + { "type": "Feature", "properties": { "id": "uu60248667", "mag": 1.93, "time": 1506094359510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4395, 42.584333, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "nn00606574", "mag": 1.6, "time": 1506094148428, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9043, 38.3654, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "hv61917031", "mag": 1.65, "time": 1506094079130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.279333, 18.952333, 12.363 ] } }, + { "type": "Feature", "properties": { "id": "uu60248662", "mag": 2.05, "time": 1506093605010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.456167, 42.602333, 3.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000at3w", "mag": 2.6, "time": 1506093461490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.4231, 36.6952, 7.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16877317", "mag": 1.7, "time": 1506093374261, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3603, 60.6882, 68.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16926094", "mag": 2.1, "time": 1506093004583, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.8719, 54.5409, 50.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16877316", "mag": 1.4, "time": 1506092949248, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.2867, 67.5064, 1.5 ] } }, + { "type": "Feature", "properties": { "id": "nn00606471", "mag": 1.3, "time": 1506092280598, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1113, 38.2958, 6.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000awqu", "mag": 4.3, "time": 1506092048390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 121.5573, 18.5841, 62.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16926092", "mag": 1.3, "time": 1506091602226, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7703, 57.7311, 11.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16877311", "mag": 1.7, "time": 1506091080231, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.9318, 61.3129, 6.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000awqt", "mag": 4.5, "time": 1506090800020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.4373, -23.752, 560.01 ] } }, + { "type": "Feature", "properties": { "id": "nc72904206", "mag": 1.3, "time": 1506089865090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.585167, 40.4755, 15.05 ] } }, + { "type": "Feature", "properties": { "id": "uw61309452", "mag": 2.05, "time": 1506089062880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.375333, 45.841833, -0.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16926090", "mag": 1.6, "time": 1506088685970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6016, 61.227, 75.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16877153", "mag": 1.3, "time": 1506088314826, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7156, 61.5096, 6.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38007840", "mag": 1.07, "time": 1506088185480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7945, 33.498167, 6.09 ] } }, + { "type": "Feature", "properties": { "id": "nc72896831", "mag": 1.6, "time": 1506088032960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.772667, 38.806833, -0.28 ] } }, + { "type": "Feature", "properties": { "id": "nc72896826", "mag": 1.03, "time": 1506088021950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.822502, 38.836666, -0.75 ] } }, + { "type": "Feature", "properties": { "id": "ak16877151", "mag": 1.7, "time": 1506087613938, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3362, 62.1574, 11.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000awqs", "mag": 4.3, "time": 1506087606500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.5624, -22.5585, 578.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16877148", "mag": 1.9, "time": 1506087297503, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1731, 59.963, 87.7 ] } }, + { "type": "Feature", "properties": { "id": "nn00606565", "mag": 1.4, "time": 1506087185810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2162, 38.2627, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000at3c", "mag": 4.4, "time": 1506086932700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.2264, -0.3969, 83.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000at3j", "mag": 4.5, "time": 1506086850810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.4418, -19.1856, 573.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16877147", "mag": 1.0, "time": 1506086078366, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0434, 64.7457, 4.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16876989", "mag": 2.3, "time": 1506085118552, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6021, 60.5947, 0.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72896781", "mag": 1.59, "time": 1506084858350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.773167, 38.807167, -0.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16926084", "mag": 2.4, "time": 1506084692420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.7372, 51.5859, 56.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72896771", "mag": 1.74, "time": 1506084487230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.771667, 38.808833, 0.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16876986", "mag": 1.4, "time": 1506084219307, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7611, 61.5102, 5.3 ] } }, + { "type": "Feature", "properties": { "id": "hv61916896", "mag": 1.74, "time": 1506083571850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.465667, 19.190833, 35.257 ] } }, + { "type": "Feature", "properties": { "id": "ci38007816", "mag": 1.33, "time": 1506082333690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.362833, 33.373333, 6.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16876984", "mag": 1.5, "time": 1506082188790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7152, 61.5125, 7.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16876981", "mag": 1.8, "time": 1506082118329, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.7017, 61.5113, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16876980", "mag": 2.2, "time": 1506081950238, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1633, 59.909, 114.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38007792", "mag": 1.19, "time": 1506081499660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.503333, 35.304167, 5.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16876977", "mag": 1.9, "time": 1506081250212, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.1121, 59.2751, 8.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16876978", "mag": 1.2, "time": 1506081151639, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9729, 61.6318, 32.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80257019", "mag": 1.05, "time": 1506080783790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526167, 46.879833, 10.93 ] } }, + { "type": "Feature", "properties": { "id": "nc72896746", "mag": 1.05, "time": 1506079850700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.73983, 38.763668, 1.53 ] } }, + { "type": "Feature", "properties": { "id": "nc72896741", "mag": 1.1, "time": 1506078851480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.806, 38.8165, 3.19 ] } }, + { "type": "Feature", "properties": { "id": "uu60248647", "mag": 1.45, "time": 1506078497740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.445, 42.561833, 8.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16926075", "mag": 1.9, "time": 1506078386128, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8777, 58.9992, 112.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16876823", "mag": 1.1, "time": 1506078261719, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8636, 62.788, 13.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16876821", "mag": 1.4, "time": 1506077123303, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.923, 64.7739, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "nn00606454", "mag": 2.6, "time": 1506077002610, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.5007, 36.7388, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "mb80257004", "mag": 1.43, "time": 1506075410640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5235, 46.871, 11.97 ] } }, + { "type": "Feature", "properties": { "id": "nc72896721", "mag": 1.39, "time": 1506074864460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.841333, 38.844167, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "nn00606522", "mag": 1.1, "time": 1506074180637, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8235, 38.8303, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38007728", "mag": 1.52, "time": 1506073924220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.848, 36.181833, 2.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16926070", "mag": 1.6, "time": 1506073391784, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.2241, 61.5539, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16876665", "mag": 1.6, "time": 1506072332786, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3288, 63.1852, 90.1 ] } }, + { "type": "Feature", "properties": { "id": "hv61916851", "mag": 2.09, "time": 1506072148400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.868333, 20.063333, 23.409 ] } }, + { "type": "Feature", "properties": { "id": "ak16876664", "mag": 1.4, "time": 1506072136495, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5912, 61.9919, 28.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16926067", "mag": 1.3, "time": 1506071322182, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.632, 62.4195, 64.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60248637", "mag": 1.3, "time": 1506070695930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.437167, 42.637667, 5.25 ] } }, + { "type": "Feature", "properties": { "id": "us2000at26", "mag": 4.5, "time": 1506070497460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.9846, 3.8293, 107.48 ] } }, + { "type": "Feature", "properties": { "id": "ak16926066", "mag": 1.6, "time": 1506069293924, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7084, 58.832, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "uu60248632", "mag": 2.03, "time": 1506068604640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.901833, 38.286167, 1.02 ] } }, + { "type": "Feature", "properties": { "id": "ak16876662", "mag": 1.9, "time": 1506067828515, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4502, 59.8034, 55.7 ] } }, + { "type": "Feature", "properties": { "id": "nm60044913", "mag": 2.21, "time": 1506067533090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -92.239, 35.7905, 11.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16876658", "mag": 3.5, "time": 1506066694779, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.9518, 54.8173, 3.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72896676", "mag": 1.45, "time": 1506066561830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764833, 38.786167, 0.53 ] } }, + { "type": "Feature", "properties": { "id": "uw61309412", "mag": 1.49, "time": 1506066402670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.402833, 49.2735, 17.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72896671", "mag": 1.2, "time": 1506066223530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8225, 37.524667, 2.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16876647", "mag": 1.9, "time": 1506065065953, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.1147, 59.229, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60248627", "mag": 1.79, "time": 1506064954410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.417833, 42.575667, 8.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16876640", "mag": 1.0, "time": 1506063798789, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9184, 63.4232, 6.1 ] } }, + { "type": "Feature", "properties": { "id": "mb80256994", "mag": 1.71, "time": 1506063538810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.338833, 46.125333, 6.03 ] } }, + { "type": "Feature", "properties": { "id": "us2000at1d", "mag": 4.4, "time": 1506062755300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 151.9837, 45.5973, 22.46 ] } }, + { "type": "Feature", "properties": { "id": "nn00606510", "mag": 1.0, "time": 1506062740733, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9097, 38.416, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16876497", "mag": 2.9, "time": 1506062332060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.4396, 55.4155, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16876499", "mag": 1.5, "time": 1506062314773, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1276, 62.6705, 84.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16926058", "mag": 2.5, "time": 1506062164434, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.9814, 52.5733, 21.3 ] } }, + { "type": "Feature", "properties": { "id": "hv61916751", "mag": 1.88, "time": 1506061487210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4615, 19.287167, 7.924 ] } }, + { "type": "Feature", "properties": { "id": "ak16926055", "mag": 2.4, "time": 1506060569450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4546, 56.5041, 6.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60248622", "mag": 1.34, "time": 1506060334660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.447833, 42.622833, 5.33 ] } }, + { "type": "Feature", "properties": { "id": "nn00606434", "mag": 1.2, "time": 1506060248714, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8235, 38.8296, 13.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38007696", "mag": 1.17, "time": 1506059325210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.648333, 35.934, 3.86 ] } }, + { "type": "Feature", "properties": { "id": "ci38007680", "mag": 1.8, "time": 1506058671480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.570833, 35.360833, 4.84 ] } }, + { "type": "Feature", "properties": { "id": "us2000at0m", "mag": 5.5, "time": 1506058424310, "felt": 37, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.7724, 23.5614, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000at0v", "mag": 4.5, "time": 1506056644580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 159.4959, 54.788, 131.21 ] } }, + { "type": "Feature", "properties": { "id": "mb80256984", "mag": 1.12, "time": 1506056537920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5285, 46.885167, 14.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16926054", "mag": 1.3, "time": 1506056097918, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7519, 60.0539, 56.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16876343", "mag": 1.1, "time": 1506055943779, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.827, 62.7929, 14.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72896616", "mag": 2.0, "time": 1506055463630, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.788667, 37.456333, 7.66 ] } }, + { "type": "Feature", "properties": { "id": "ak16926049", "mag": 2.0, "time": 1506055458648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9681, 59.782, 98.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000at08", "mag": 4.7, "time": 1506054886300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -11.1483, -6.3489, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72896606", "mag": 0.97, "time": 1506054333450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821833, 37.5205, 2.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000aszw", "mag": 4.2, "time": 1506054023580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 26.2553, 39.1304, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72896586", "mag": 1.98, "time": 1506053997570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.883167, 37.538333, 2.49 ] } }, + { "type": "Feature", "properties": { "id": "ci38007648", "mag": 1.64, "time": 1506053954570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797167, 33.495167, 4.61 ] } }, + { "type": "Feature", "properties": { "id": "nc72896591", "mag": 1.12, "time": 1506053943320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.789333, 37.455, 7.99 ] } }, + { "type": "Feature", "properties": { "id": "us2000aszh", "mag": 2.9, "time": 1506053328020, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.682, 35.846, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16876210", "mag": 1.2, "time": 1506052567199, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7614, 63.1414, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16876208", "mag": 1.0, "time": 1506051888104, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3642, 64.8396, 21.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16876202", "mag": 2.8, "time": 1506051238210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6975, 59.8426, 2.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38007640", "mag": 1.04, "time": 1506050700240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.074333, 32.868, 9.32 ] } }, + { "type": "Feature", "properties": { "id": "ak16876199", "mag": 1.6, "time": 1506050508752, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1502, 60.9709, 20.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16876069", "mag": 1.7, "time": 1506048854655, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6692, 62.5598, 11.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16876067", "mag": 2.1, "time": 1506048427026, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7111, 59.884, 14.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72896561", "mag": 1.78, "time": 1506048332800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.779667, 37.392333, -2.31 ] } }, + { "type": "Feature", "properties": { "id": "nc72896556", "mag": 1.29, "time": 1506047940540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.0265, 36.559833, 6.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16926041", "mag": 2.5, "time": 1506047556201, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.992, 51.8656, 16.5 ] } }, + { "type": "Feature", "properties": { "id": "uu60248522", "mag": 1.34, "time": 1506047158170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.026833, 44.7755, 7.13 ] } }, + { "type": "Feature", "properties": { "id": "mb80256979", "mag": 1.73, "time": 1506043831850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.558333, 46.402, 3.35 ] } }, + { "type": "Feature", "properties": { "id": "nc72896531", "mag": 1.92, "time": 1506043357560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.780833, 37.389167, -2.29 ] } }, + { "type": "Feature", "properties": { "id": "mb80256969", "mag": 2.09, "time": 1506042441670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.930333, 44.292833, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16875940", "mag": 1.1, "time": 1506041862266, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0885, 63.2553, 2.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000awqf", "mag": 4.2, "time": 1506041406940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 165.3116, -15.6295, 57.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000asyh", "mag": 4.6, "time": 1506041280550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 149.2095, 43.8815, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235693", "mag": 1.82, "time": 1506040783670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.6825, 37.184, 4.37 ] } }, + { "type": "Feature", "properties": { "id": "ci38007600", "mag": 2.86, "time": 1506040660680, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.171833, 34.730667, 1.72 ] } }, + { "type": "Feature", "properties": { "id": "hv61916496", "mag": 1.7, "time": 1506040069030, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.755667, 19.862667, 13.433 ] } }, + { "type": "Feature", "properties": { "id": "us2000awqd", "mag": 4.6, "time": 1506040066970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 90.3605, 2.1475, 15.02 ] } }, + { "type": "Feature", "properties": { "id": "ak16875841", "mag": 1.4, "time": 1506039676822, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7004, 63.8605, 6.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000atbx", "mag": 2.6, "time": 1506039659260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5671, 46.8969, 11.48 ] } }, + { "type": "Feature", "properties": { "id": "us2000avmv", "mag": 2.8, "time": 1506039531410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0769, 52.3761, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80256959", "mag": 1.07, "time": 1506038377030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.445667, 43.5435, 11.24 ] } }, + { "type": "Feature", "properties": { "id": "ci38007584", "mag": 1.19, "time": 1506037977370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.764667, 33.324167, 13.64 ] } }, + { "type": "Feature", "properties": { "id": "ak16875834", "mag": 1.4, "time": 1506037872803, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.518, 61.5639, 31.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72896516", "mag": 1.31, "time": 1506037721390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.669, 37.2905, 3.04 ] } }, + { "type": "Feature", "properties": { "id": "mb80256954", "mag": 1.13, "time": 1506037549780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.4995, 46.8705, 10.41 ] } }, + { "type": "Feature", "properties": { "id": "us2000awq8", "mag": 4.4, "time": 1506037384370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.5809, 38.0785, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16875828", "mag": 2.4, "time": 1506037110228, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8706, 62.7902, 14.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16875826", "mag": 1.7, "time": 1506036232042, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4937, 61.5906, 31.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000asx4", "mag": 2.7, "time": 1506036218800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5127, 36.2915, 7.461 ] } }, + { "type": "Feature", "properties": { "id": "ci38007544", "mag": 3.0, "time": 1506035447270, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.397167, 32.383, 12.07 ] } }, + { "type": "Feature", "properties": { "id": "ci38007552", "mag": 1.61, "time": 1506035381320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.115667, 34.625667, -1.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16875823", "mag": 1.6, "time": 1506035182231, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5062, 64.6747, 9.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60248487", "mag": 2.1, "time": 1506035003920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.420167, 42.525833, 7.93 ] } }, + { "type": "Feature", "properties": { "id": "mb80256939", "mag": 1.72, "time": 1506034952670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5215, 46.8665, 11.26 ] } }, + { "type": "Feature", "properties": { "id": "ak16875817", "mag": 1.5, "time": 1506034226408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.0329, 53.5528, 17.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000awq7", "mag": 4.3, "time": 1506034167940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.929, -23.7349, 550.89 ] } }, + { "type": "Feature", "properties": { "id": "nc72896506", "mag": 1.29, "time": 1506033952800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.821, 38.814833, 2.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16875815", "mag": 1.5, "time": 1506033878487, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5575, 60.0344, 58.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16875810", "mag": 1.2, "time": 1506033325458, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4889, 59.8624, 47.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16875800", "mag": 1.4, "time": 1506032434891, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7482, 66.977, 12.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16875653", "mag": 4.2, "time": 1506032120973, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8756, 62.7831, 20.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72896496", "mag": 1.85, "time": 1506031741740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.5285, 36.803333, 3.27 ] } }, + { "type": "Feature", "properties": { "id": "nc72896486", "mag": 1.45, "time": 1506031445490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.526667, 36.809667, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "mb80256934", "mag": 2.12, "time": 1506031400210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.9225, 44.303333, 10.34 ] } }, + { "type": "Feature", "properties": { "id": "mb80256929", "mag": 1.26, "time": 1506030770930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.747833, 45.079167, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38007528", "mag": 1.87, "time": 1506030349230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.650167, 35.935333, 2.69 ] } }, + { "type": "Feature", "properties": { "id": "hv61916321", "mag": 2.02, "time": 1506029779130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.552333, 19.137667, 49.513 ] } }, + { "type": "Feature", "properties": { "id": "ci38007520", "mag": 1.21, "time": 1506029730430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.157, 33.634167, -0.52 ] } }, + { "type": "Feature", "properties": { "id": "hv61916316", "mag": 1.88, "time": 1506029586250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.419833, 19.099167, 42.057 ] } }, + { "type": "Feature", "properties": { "id": "hv61916311", "mag": 1.76, "time": 1506029522880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.437167, 19.160333, 37.287 ] } }, + { "type": "Feature", "properties": { "id": "nn00606376", "mag": 1.1, "time": 1506029276288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.9551, 40.0739, 10.9 ] } }, + { "type": "Feature", "properties": { "id": "hv61916301", "mag": 1.85, "time": 1506029141190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.439167, 19.1175, 39.677 ] } }, + { "type": "Feature", "properties": { "id": "ci37166108", "mag": 1.81, "time": 1506028904370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.241667, 32.920333, 11.27 ] } }, + { "type": "Feature", "properties": { "id": "ci38007512", "mag": 1.83, "time": 1506028897230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.241167, 32.916667, 7.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16875651", "mag": 1.4, "time": 1506028324426, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8843, 61.2141, 1.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00606357", "mag": 2.6, "time": 1506028168100, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6985, 39.7645, 7.3 ] } }, + { "type": "Feature", "properties": { "id": "nn00606355", "mag": 1.1, "time": 1506027762688, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.189, 38.4602, 2.1 ] } }, + { "type": "Feature", "properties": { "id": "ci38007480", "mag": 1.75, "time": 1506026384090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.371167, 35.054, 8.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16875645", "mag": 1.7, "time": 1506026360117, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.75, 60.0811, 100.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72896461", "mag": 1.53, "time": 1506026136260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827333, 38.841167, 1.96 ] } }, + { "type": "Feature", "properties": { "id": "ak16911613", "mag": 1.9, "time": 1506025569386, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0904, 58.6739, 124.2 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235678", "mag": 2.5, "time": 1506025487250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.888333, 37.204167, 6.25 ] } }, + { "type": "Feature", "properties": { "id": "ci38007472", "mag": 1.24, "time": 1506025368620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.488667, 33.850333, -0.48 ] } }, + { "type": "Feature", "properties": { "id": "us2000ass7", "mag": 4.8, "time": 1506025352080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8962, 15.2536, 65.44 ] } }, + { "type": "Feature", "properties": { "id": "ci38007464", "mag": 1.18, "time": 1506025134310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.882167, 33.977333, 19.48 ] } }, + { "type": "Feature", "properties": { "id": "ak16875518", "mag": 1.7, "time": 1506024448536, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5203, 61.3055, 10.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000asr5", "mag": 2.8, "time": 1506024284460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4191, 42.5686, 11.52 ] } }, + { "type": "Feature", "properties": { "id": "ci38007448", "mag": 1.54, "time": 1506024073190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.493667, 33.846667, -0.48 ] } }, + { "type": "Feature", "properties": { "id": "us2000asqw", "mag": 4.5, "time": 1506023938000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.359, -24.593, 89.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72896441", "mag": 0.97, "time": 1506023932370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818337, 38.807335, 2.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16911611", "mag": 2.0, "time": 1506023546957, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.8314, 53.8887, 16.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16875513", "mag": 2.1, "time": 1506022669821, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6752, 67.929, 13.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16875511", "mag": 1.6, "time": 1506022479067, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0122, 60.6265, 55.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72896431", "mag": 1.59, "time": 1506022296440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821333, 37.606, 4.18 ] } }, + { "type": "Feature", "properties": { "id": "us2000asq8", "mag": 4.5, "time": 1506022120080, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 57.3957, 30.689, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16875508", "mag": 2.8, "time": 1506022088454, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5339, 56.4471, 34.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16875497", "mag": 2.8, "time": 1506021225649, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3633, 62.2263, 8.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16875489", "mag": 2.0, "time": 1506019153622, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5458, 60.2285, 104.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38007432", "mag": 0.97, "time": 1506018755920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.4305, 33.027167, 7.61 ] } }, + { "type": "Feature", "properties": { "id": "nc72896416", "mag": 1.32, "time": 1506018676310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.105167, 37.325333, -0.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16875470", "mag": 3.4, "time": 1506018115237, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3313, 62.0747, 82.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38007408", "mag": 1.52, "time": 1506017937430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.240833, 33.339, 3.36 ] } }, + { "type": "Feature", "properties": { "id": "ci37165948", "mag": 1.22, "time": 1506017934430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.238, 33.341, 5.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16911603", "mag": 2.2, "time": 1506016859139, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.198, 56.7455, 55.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72896411", "mag": 1.56, "time": 1506016054120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.955667, 36.390833, 1.45 ] } }, + { "type": "Feature", "properties": { "id": "us2000ask8", "mag": 5.2, "time": 1506015812780, "felt": 1, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 153.792, -5.2273, 42.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16875367", "mag": 1.0, "time": 1506015790628, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3293, 61.4367, 9.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72896401", "mag": 1.29, "time": 1506015349390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.136833, 36.591, 7.95 ] } }, + { "type": "Feature", "properties": { "id": "nc72896396", "mag": 1.65, "time": 1506015154000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.830667, 38.841833, 1.92 ] } }, + { "type": "Feature", "properties": { "id": "ak16875364", "mag": 1.7, "time": 1506014707392, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9511, 61.182, 6.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000asjm", "mag": 4.1, "time": 1506014582020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1412, 14.9651, 31.77 ] } }, + { "type": "Feature", "properties": { "id": "nc72896391", "mag": 1.65, "time": 1506014547620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.522667, 37.119333, 6.68 ] } }, + { "type": "Feature", "properties": { "id": "nc72896386", "mag": 2.74, "time": 1506013969600, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.523, 37.119333, 7.11 ] } }, + { "type": "Feature", "properties": { "id": "uu60248457", "mag": 1.24, "time": 1506013292240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.416833, 42.5455, 6.54 ] } }, + { "type": "Feature", "properties": { "id": "nc72896381", "mag": 1.42, "time": 1506013025480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.7985, 38.024167, 4.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16875337", "mag": 1.5, "time": 1506012889205, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8562, 59.8876, 14.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16875335", "mag": 1.5, "time": 1506012588856, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.43, 69.5255, 6.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16875333", "mag": 1.4, "time": 1506012078477, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.7448, 65.4677, 16.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000asj3", "mag": 4.4, "time": 1506011673160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 94.8925, 24.9992, 82.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16875233", "mag": 2.0, "time": 1506011166366, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0389, 62.6945, 1.1 ] } }, + { "type": "Feature", "properties": { "id": "hv61916021", "mag": 1.65, "time": 1506010758380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.606333, 19.988, 0.02 ] } }, + { "type": "Feature", "properties": { "id": "nc72896356", "mag": 1.08, "time": 1506008853280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.736, 38.789501, 1.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38007344", "mag": 1.64, "time": 1506006904290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.040833, 34.932167, 7.95 ] } }, + { "type": "Feature", "properties": { "id": "uu60248432", "mag": 1.93, "time": 1506005934630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.899167, 38.2825, 1.23 ] } }, + { "type": "Feature", "properties": { "id": "nc72896351", "mag": 1.05, "time": 1506005402280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.872833, 37.542167, 5.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16875225", "mag": 2.6, "time": 1506004864279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.7558, 56.7802, 85.5 ] } }, + { "type": "Feature", "properties": { "id": "nn00606271", "mag": 1.4, "time": 1506004765898, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9071, 38.404, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16911592", "mag": 1.8, "time": 1506004687871, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.776, 59.9457, 96.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16875224", "mag": 1.0, "time": 1506004284441, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1472, 58.225, 2.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000asgp", "mag": 3.1, "time": 1506004160400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4287, 42.5341, 7.73 ] } }, + { "type": "Feature", "properties": { "id": "ak16875128", "mag": 1.2, "time": 1506003424957, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1414, 61.9718, 7.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16875123", "mag": 2.2, "time": 1506003380008, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.406, 61.1636, 56.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16875122", "mag": 1.5, "time": 1506003168025, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6121, 60.6288, 27.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000asgl", "mag": 4.5, "time": 1506003018350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 150.7163, -5.3996, 143.64 ] } }, + { "type": "Feature", "properties": { "id": "ak16911587", "mag": 2.0, "time": 1506002992795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.2107, 54.658, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16875121", "mag": 1.3, "time": 1506002287075, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7877, 63.0935, 115.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16875120", "mag": 1.3, "time": 1506002190951, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3702, 60.2093, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72896346", "mag": 1.58, "time": 1506001285170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.046, 37.631, -2.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16875118", "mag": 1.5, "time": 1506001054310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4947, 65.9329, 9.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16875115", "mag": 1.2, "time": 1506000273641, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8273, 59.8914, 16.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16875114", "mag": 1.0, "time": 1505999744527, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.927, 63.1123, 88.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16875113", "mag": 1.0, "time": 1505999509220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.8959, 53.8648, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72896326", "mag": 1.49, "time": 1505998900750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.040833, 37.6325, -1.69 ] } }, + { "type": "Feature", "properties": { "id": "nc72896316", "mag": 1.09, "time": 1505998199150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.854333, 37.553667, -1.13 ] } }, + { "type": "Feature", "properties": { "id": "nc72896306", "mag": 1.43, "time": 1505997631810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.009333, 37.578833, 2.18 ] } }, + { "type": "Feature", "properties": { "id": "nm60207176", "mag": 1.81, "time": 1505997033100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.530833, 36.304833, 9.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16875021", "mag": 1.2, "time": 1505996145934, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8383, 65.938, 13.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16875018", "mag": 1.2, "time": 1505995669198, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.912, 65.5133, 9.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72896296", "mag": 1.47, "time": 1505995317350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.196833, 37.9145, 9.67 ] } }, + { "type": "Feature", "properties": { "id": "nm60207166", "mag": 1.64, "time": 1505994488630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.4975, 36.289667, 7.47 ] } }, + { "type": "Feature", "properties": { "id": "us2000asex", "mag": 4.8, "time": 1505994269370, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.2903, 15.7805, 100.11 ] } }, + { "type": "Feature", "properties": { "id": "nn00606244", "mag": 1.4, "time": 1505993181062, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2534, 40.7726, 2.5 ] } }, + { "type": "Feature", "properties": { "id": "uu60248402", "mag": 1.76, "time": 1505993050130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.834, 37.5, 12.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16911577", "mag": 1.8, "time": 1505992688210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7102, 59.2193, 101.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72896276", "mag": 1.87, "time": 1505990638730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.821833, 38.807833, 2.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16911575", "mag": 1.4, "time": 1505990312220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1289, 60.9457, 91.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38007296", "mag": 1.16, "time": 1505989019560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.893333, 33.8875, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16874826", "mag": 2.4, "time": 1505988598717, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0672, 60.3368, 3.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16874821", "mag": 3.9, "time": 1505988559362, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.0266, 58.0197, 4.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000asdx", "mag": 3.2, "time": 1505987188740, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4339, 42.5809, 9.51 ] } }, + { "type": "Feature", "properties": { "id": "nc72896231", "mag": 1.31, "time": 1505985984190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7595, 39.290333, 11.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16874817", "mag": 1.2, "time": 1505985541058, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7623, 63.2246, 123.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72896221", "mag": 1.81, "time": 1505985066080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8215, 37.605333, 4.11 ] } }, + { "type": "Feature", "properties": { "id": "ak16911571", "mag": 1.2, "time": 1505984945428, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6774, 60.3679, 51.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000astb", "mag": 3.2, "time": 1505984479950, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 30.4877, 39.7496, 7.26 ] } }, + { "type": "Feature", "properties": { "id": "ak16874735", "mag": 1.1, "time": 1505984351439, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1345, 61.0202, 12.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16874733", "mag": 1.8, "time": 1505984244290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.6331, 69.6221, 10.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16911567", "mag": 1.4, "time": 1505983878943, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6066, 58.3406, 70.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16874730", "mag": 1.6, "time": 1505983557544, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6496, 63.2391, 128.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16874715", "mag": 3.0, "time": 1505983090867, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9585, 60.2394, 134.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16874713", "mag": 1.8, "time": 1505982752561, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3398, 60.0395, 62.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16874708", "mag": 1.6, "time": 1505981986749, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5434, 62.0196, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "ci38007280", "mag": 1.01, "time": 1505981662400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.966, 33.952667, 12.57 ] } }, + { "type": "Feature", "properties": { "id": "nc72896186", "mag": 1.8, "time": 1505981520300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764333, 38.786167, 0.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16874635", "mag": 1.2, "time": 1505980470681, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9567, 61.1836, 3.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80256854", "mag": 1.19, "time": 1505980355400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.540333, 46.865833, 13.58 ] } }, + { "type": "Feature", "properties": { "id": "hv61915846", "mag": 2.23, "time": 1505980220010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.471833, 19.187167, 6.497 ] } }, + { "type": "Feature", "properties": { "id": "nc72896176", "mag": 1.82, "time": 1505979900900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.789167, 37.455, 8.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16874613", "mag": 2.5, "time": 1505979347188, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6995, 61.302, 18.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72896141", "mag": 1.44, "time": 1505978529860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0545, 37.976333, 16.99 ] } }, + { "type": "Feature", "properties": { "id": "us2000asd1", "mag": 4.8, "time": 1505977959710, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -73.683, -37.9104, 6.87 ] } }, + { "type": "Feature", "properties": { "id": "nc72896116", "mag": 1.08, "time": 1505977815960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.784164, 38.838165, 0.65 ] } }, + { "type": "Feature", "properties": { "id": "ci38007272", "mag": 1.44, "time": 1505977166870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.235667, 34.473, 10.66 ] } }, + { "type": "Feature", "properties": { "id": "ak16874540", "mag": 1.8, "time": 1505976691446, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5178, 59.5615, 114.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38007264", "mag": 1.35, "time": 1505976496140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8585, 33.885833, 13.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16874539", "mag": 1.4, "time": 1505975897075, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7553, 60.3904, 17.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16911557", "mag": 1.9, "time": 1505975896384, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7415, 56.6876, 60.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16874533", "mag": 2.4, "time": 1505975550653, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.4341, 54.7916, 41.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16874531", "mag": 1.6, "time": 1505973877209, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0439, 60.1347, 121.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72896081", "mag": 0.98, "time": 1505973711190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.775002, 38.797669, 2.77 ] } }, + { "type": "Feature", "properties": { "id": "nc72896076", "mag": 2.49, "time": 1505973410410, "felt": 16, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.785833, 37.46, 8.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16874465", "mag": 1.3, "time": 1505973344875, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.0133, 60.1082, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16911553", "mag": 1.4, "time": 1505972962694, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3138, 59.699, 53.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16911552", "mag": 1.2, "time": 1505972745844, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4845, 60.1615, 61.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00606219", "mag": 1.3, "time": 1505972571887, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1193, 38.2806, 9.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16911551", "mag": 1.8, "time": 1505972563999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.15, 51.5531, 43.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00606295", "mag": 1.0, "time": 1505972403264, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6227, 38.8065, 14.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60248342", "mag": 1.16, "time": 1505971839680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.427333, 42.584333, 6.41 ] } }, + { "type": "Feature", "properties": { "id": "ak16874458", "mag": 1.0, "time": 1505971795387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1789, 60.7931, 15.4 ] } }, + { "type": "Feature", "properties": { "id": "nn00606215", "mag": 1.1, "time": 1505970724921, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9138, 38.4144, 3.9 ] } }, + { "type": "Feature", "properties": { "id": "nn00606292", "mag": 1.2, "time": 1505969821916, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9096, 38.3591, 10.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16874386", "mag": 2.2, "time": 1505966674333, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1806, 62.1688, 58.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16874381", "mag": 1.5, "time": 1505966192127, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.3423, 67.4818, 11.5 ] } }, + { "type": "Feature", "properties": { "id": "nn00606289", "mag": 1.1, "time": 1505965897622, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.612, 39.7777, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16874378", "mag": 1.4, "time": 1505965635289, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6084, 59.8249, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "ci38007240", "mag": 1.33, "time": 1505964848260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.392833, 34.0695, 3.63 ] } }, + { "type": "Feature", "properties": { "id": "uw61309117", "mag": 1.41, "time": 1505964727680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.537333, 45.623, 3.45 ] } }, + { "type": "Feature", "properties": { "id": "us2000asac", "mag": 2.3, "time": 1505963189900, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.6319, 35.02, 3.66 ] } }, + { "type": "Feature", "properties": { "id": "nc72896016", "mag": 1.0, "time": 1505962244660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.777664, 38.821335, 1.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16874313", "mag": 1.6, "time": 1505961692924, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.4015, 58.981, 9.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72896006", "mag": 2.63, "time": 1505961234600, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.778, 38.822333, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16874294", "mag": 1.4, "time": 1505960998663, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7592, 62.4966, 63.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16911541", "mag": 1.2, "time": 1505959763113, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0959, 69.101, 9.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72896001", "mag": 2.06, "time": 1505958864360, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.541, 35.984333, 10.27 ] } }, + { "type": "Feature", "properties": { "id": "ci38007216", "mag": 1.05, "time": 1505958019680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.250167, 34.038167, 14.18 ] } }, + { "type": "Feature", "properties": { "id": "ak16874254", "mag": 3.1, "time": 1505957941327, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.4863, 51.2677, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16874229", "mag": 1.1, "time": 1505957058757, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.7027, 61.7499, 26.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16874215", "mag": 1.1, "time": 1505956445202, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6955, 63.1111, 9.3 ] } }, + { "type": "Feature", "properties": { "id": "ci38007208", "mag": 1.4, "time": 1505955985550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.416, 33.868667, 14.65 ] } }, + { "type": "Feature", "properties": { "id": "hv61915531", "mag": 1.72, "time": 1505955195430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.279833, 19.405667, 1.328 ] } }, + { "type": "Feature", "properties": { "id": "ak16874182", "mag": 2.0, "time": 1505954859125, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6742, 63.0988, 11.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000as95", "mag": 4.5, "time": 1505954623610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9506, -18.3191, 525.15 ] } }, + { "type": "Feature", "properties": { "id": "ak16874180", "mag": 1.0, "time": 1505954368489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6875, 63.1114, 10.6 ] } }, + { "type": "Feature", "properties": { "id": "mb80256829", "mag": 1.22, "time": 1505954178230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.729167, 46.9255, 15.18 ] } }, + { "type": "Feature", "properties": { "id": "ci38007192", "mag": 2.27, "time": 1505953985850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.389333, 34.875667, 4.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16911531", "mag": 3.1, "time": 1505953036619, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.8238, 52.2316, 212.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16874133", "mag": 1.9, "time": 1505952707526, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3476, 61.7239, 1.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72895971", "mag": 2.7, "time": 1505952459520, "felt": 25, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.065833, 37.977333, 16.12 ] } }, + { "type": "Feature", "properties": { "id": "us2000as7z", "mag": 5.0, "time": 1505952320920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.3417, -18.3348, 223.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16874122", "mag": 1.3, "time": 1505952267890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.1071, 68.0646, 14.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16874119", "mag": 1.3, "time": 1505952216610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9186, 60.9563, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000as7r", "mag": 5.7, "time": 1505951964840, "felt": 7, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 113.0028, -6.141, 588.64 ] } }, + { "type": "Feature", "properties": { "id": "ci38007168", "mag": 1.0, "time": 1505951908320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.513, 33.929833, 3.12 ] } }, + { "type": "Feature", "properties": { "id": "ak16874078", "mag": 1.5, "time": 1505949607121, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.307, 64.9865, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72895936", "mag": 2.34, "time": 1505948330470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.830833, 38.8385, 2.22 ] } }, + { "type": "Feature", "properties": { "id": "us2000as71", "mag": 4.4, "time": 1505948258880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -70.8955, -19.9851, 13.88 ] } }, + { "type": "Feature", "properties": { "id": "ci38007144", "mag": 2.26, "time": 1505947525530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.600667, 32.8185, 11.77 ] } }, + { "type": "Feature", "properties": { "id": "us2000as6n", "mag": 4.7, "time": 1505946967130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 148.002, -5.1396, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16874025", "mag": 1.8, "time": 1505946583777, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5728, 63.1811, 118.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000as5y", "mag": 5.2, "time": 1505945844590, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 147.9821, -5.1384, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000as5x", "mag": 5.9, "time": 1505945616140, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 147.8337, -5.11, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16873995", "mag": 1.3, "time": 1505944353830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7194, 63.0772, 10.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72895916", "mag": 1.33, "time": 1505944123270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8235, 37.532, 3.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16903715", "mag": 1.5, "time": 1505944050318, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7597, 60.286, 105.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16873983", "mag": 1.6, "time": 1505944038560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2822, 60.1956, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16873980", "mag": 1.5, "time": 1505943645116, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7128, 62.2758, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72895911", "mag": 1.05, "time": 1505943458060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.817497, 38.818165, 1.98 ] } }, + { "type": "Feature", "properties": { "id": "mb80256764", "mag": 1.19, "time": 1505942553810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.3355, 46.855167, 12.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16873969", "mag": 1.0, "time": 1505941809382, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.8648, 61.3084, 14.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16903709", "mag": 1.3, "time": 1505940388991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1675, 59.8496, 11.5 ] } }, + { "type": "Feature", "properties": { "id": "hv61915241", "mag": 2.0, "time": 1505940250470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.695496, 19.176666, 1.78 ] } }, + { "type": "Feature", "properties": { "id": "uw61309057", "mag": 2.31, "time": 1505940000150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.92, 47.376, -0.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16873814", "mag": 1.4, "time": 1505938885178, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4385, 61.7606, 10.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16873808", "mag": 1.1, "time": 1505938683669, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6592, 62.5852, 59.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72895876", "mag": 1.45, "time": 1505938357840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.59, 36.021667, 3.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16873804", "mag": 1.4, "time": 1505938263457, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3926, 60.1466, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000as2f", "mag": 6.4, "time": 1505938189810, "felt": 16, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 169.0947, -18.7978, 200.19 ] } }, + { "type": "Feature", "properties": { "id": "hv61915206", "mag": 2.51, "time": 1505938077390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.033667, 19.2375, 39.578 ] } }, + { "type": "Feature", "properties": { "id": "ci38007104", "mag": 1.0, "time": 1505937649230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.0765, 32.813833, -0.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16873801", "mag": 2.0, "time": 1505937512139, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.8359, 53.871, 5.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000as1w", "mag": 2.5, "time": 1505937361300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.0579, 36.6187, 5.828 ] } }, + { "type": "Feature", "properties": { "id": "ak16873782", "mag": 1.2, "time": 1505936869830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8873, 62.1092, 41.4 ] } }, + { "type": "Feature", "properties": { "id": "mb80256709", "mag": 1.79, "time": 1505935321500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.451, 43.543667, 10.41 ] } }, + { "type": "Feature", "properties": { "id": "nn00606121", "mag": 1.5, "time": 1505934916827, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1139, 37.3666, 2.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38007096", "mag": 1.15, "time": 1505934203280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.751, 34.839333, -1.28 ] } }, + { "type": "Feature", "properties": { "id": "nn00606180", "mag": 1.3, "time": 1505934149532, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1164, 38.3161, 11.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72895851", "mag": 1.27, "time": 1505934073910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.592833, 39.610333, 2.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16873739", "mag": 2.2, "time": 1505933777306, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4033, 69.0735, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16873736", "mag": 1.7, "time": 1505933267549, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2132, 61.1317, 38.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38007072", "mag": 2.71, "time": 1505931747440, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.389167, 32.380167, 15.18 ] } }, + { "type": "Feature", "properties": { "id": "nc72895826", "mag": 1.69, "time": 1505931012940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.428333, 36.582667, 0.68 ] } }, + { "type": "Feature", "properties": { "id": "uu60248192", "mag": 1.44, "time": 1505930780280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.474333, 42.6455, 0.08 ] } }, + { "type": "Feature", "properties": { "id": "nc72895816", "mag": 2.1, "time": 1505929719570, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9675, 40.890167, 14.69 ] } }, + { "type": "Feature", "properties": { "id": "ak16873728", "mag": 1.2, "time": 1505929479491, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.582, 62.6618, 78.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16873142", "mag": 1.5, "time": 1505927860541, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2216, 61.5685, 73.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72895806", "mag": 3.65, "time": 1505927408630, "felt": 119, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.983667, 40.891333, 16.86 ] } }, + { "type": "Feature", "properties": { "id": "nc72895796", "mag": 3.18, "time": 1505926479240, "felt": 56, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.546833, 36.829167, 3.48 ] } }, + { "type": "Feature", "properties": { "id": "ak16873012", "mag": 1.4, "time": 1505926389012, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6968, 59.7895, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000arxv", "mag": 6.1, "time": 1505925436360, "felt": 102, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 144.6601, 37.9814, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16872904", "mag": 1.0, "time": 1505925010295, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5787, 62.1577, 21.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000arxl", "mag": 5.3, "time": 1505924711310, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 118.8822, -10.1961, 10.84 ] } }, + { "type": "Feature", "properties": { "id": "us2000arxs", "mag": 4.4, "time": 1505923365600, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 135.4357, 33.9578, 44.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16872233", "mag": 1.2, "time": 1505923328725, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1746, 60.1861, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38007024", "mag": 0.95, "time": 1505922246000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.593333, 34.202833, 4.57 ] } }, + { "type": "Feature", "properties": { "id": "us2000arwt", "mag": 4.9, "time": 1505921548830, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 166.9265, -14.913, 39.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000arwd", "mag": 2.4, "time": 1505921250610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.783, 37.3255, 5.27 ] } }, + { "type": "Feature", "properties": { "id": "us2000awnu", "mag": 4.6, "time": 1505921168060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -28.7481, 43.6321, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60248182", "mag": 1.14, "time": 1505920908550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.455667, 42.606, 5.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000arw1", "mag": 4.4, "time": 1505920105280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 70.9001, 36.5943, 194.83 ] } }, + { "type": "Feature", "properties": { "id": "us2000awp1", "mag": 4.1, "time": 1505919984040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.8639, 5.1272, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16903689", "mag": 2.1, "time": 1505918855154, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.5285, 56.3302, 52.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16871415", "mag": 1.5, "time": 1505918684626, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5508, 61.18, 5.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000arvu", "mag": 5.0, "time": 1505918528120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.1207, -17.9346, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38007016", "mag": 1.44, "time": 1505918468750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.514, 33.93, 3.08 ] } }, + { "type": "Feature", "properties": { "id": "nc72895731", "mag": 2.2, "time": 1505918095770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.179, 40.2545, 10.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000arvi", "mag": 5.3, "time": 1505917796770, "felt": 41, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 121.7572, 23.2931, 22.03 ] } }, + { "type": "Feature", "properties": { "id": "nc72895726", "mag": 2.76, "time": 1505917745400, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.182833, 40.246333, 11.38 ] } }, + { "type": "Feature", "properties": { "id": "uu60248172", "mag": 2.13, "time": 1505916637780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4155, 42.592833, 6.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16870720", "mag": 2.0, "time": 1505915942888, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.6193, 67.4066, 12.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16870653", "mag": 1.8, "time": 1505915336300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2998, 61.7353, 47.3 ] } }, + { "type": "Feature", "properties": { "id": "mb80256619", "mag": 1.37, "time": 1505914951120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527333, 46.886167, 13.87 ] } }, + { "type": "Feature", "properties": { "id": "ci38006992", "mag": 1.47, "time": 1505914753140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.453667, 34.324833, 9.66 ] } }, + { "type": "Feature", "properties": { "id": "nc72895721", "mag": 2.38, "time": 1505913728570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6465, 36.06, 20.18 ] } }, + { "type": "Feature", "properties": { "id": "ci38006968", "mag": 1.06, "time": 1505913698350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.79, 36.101, 8.43 ] } }, + { "type": "Feature", "properties": { "id": "ci38006952", "mag": 2.21, "time": 1505911740560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.197667, 32.419333, 10.66 ] } }, + { "type": "Feature", "properties": { "id": "ak16869931", "mag": 1.0, "time": 1505911683814, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0983, 64.9958, 11.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16869929", "mag": 1.1, "time": 1505910877864, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9571, 64.0729, 125.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000arkq", "mag": 5.0, "time": 1505910355700, "felt": 1, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 132.5848, 1.0854, 36.12 ] } }, + { "type": "Feature", "properties": { "id": "uu60248167", "mag": 1.05, "time": 1505910339650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.078167, 44.806167, 7.81 ] } }, + { "type": "Feature", "properties": { "id": "us2000arkf", "mag": 2.7, "time": 1505910255780, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4578, 42.6105, 7.92 ] } }, + { "type": "Feature", "properties": { "id": "hv61914931", "mag": 1.25, "time": 1505910251630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.624833, 19.4175, 3.162 ] } }, + { "type": "Feature", "properties": { "id": "ak16869355", "mag": 1.3, "time": 1505910194393, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4867, 61.3624, 40.7 ] } }, + { "type": "Feature", "properties": { "id": "uu60248157", "mag": 1.62, "time": 1505909926720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.418333, 42.6315, 2.43 ] } }, + { "type": "Feature", "properties": { "id": "nn00606071", "mag": 1.9, "time": 1505909820104, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6351, 40.2652, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "ci38006936", "mag": 1.08, "time": 1505907735210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.542167, 33.157167, 16.18 ] } }, + { "type": "Feature", "properties": { "id": "nc72895696", "mag": 1.65, "time": 1505907470630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.887667, 39.9645, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60248147", "mag": 1.97, "time": 1505907452270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.426833, 42.575667, 8.53 ] } }, + { "type": "Feature", "properties": { "id": "hv61914886", "mag": 2.38, "time": 1505907343420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.275162, 19.410833, 10.08 ] } }, + { "type": "Feature", "properties": { "id": "ak16903676", "mag": 1.3, "time": 1505907050579, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6927, 60.366, 14.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16869212", "mag": 1.1, "time": 1505906705387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0351, 61.9136, 37.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72895691", "mag": 1.89, "time": 1505906617690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.802667, 36.023667, 14.48 ] } }, + { "type": "Feature", "properties": { "id": "ak16903672", "mag": 2.7, "time": 1505906309964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.8205, 51.5611, 26.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72895686", "mag": 1.58, "time": 1505906251960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.257833, 39.404167, 3.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16868636", "mag": 1.1, "time": 1505905797402, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4101, 61.9294, 46.0 ] } }, + { "type": "Feature", "properties": { "id": "nm60207096", "mag": 1.74, "time": 1505905515890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.502, 36.239333, 7.22 ] } }, + { "type": "Feature", "properties": { "id": "ak16868555", "mag": 1.6, "time": 1505904607416, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.81, 59.8821, 7.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000arj1", "mag": 4.7, "time": 1505903968940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.4191, 15.2723, 57.48 ] } }, + { "type": "Feature", "properties": { "id": "ci38006912", "mag": 1.07, "time": 1505903473810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.495167, 35.975167, 6.03 ] } }, + { "type": "Feature", "properties": { "id": "uu60248142", "mag": 1.89, "time": 1505903157450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424333, 42.560333, 7.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16868496", "mag": 2.0, "time": 1505903116550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9125, 61.7794, 102.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16868494", "mag": 1.5, "time": 1505903092907, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2214, 61.9475, 35.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16903665", "mag": 1.3, "time": 1505902710790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7292, 62.9468, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16867924", "mag": 1.2, "time": 1505902608214, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7213, 59.8967, 2.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00606156", "mag": 1.0, "time": 1505901862661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.6593, 38.6914, 6.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72895661", "mag": 1.05, "time": 1505901620810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810837, 38.818668, 2.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16903662", "mag": 1.0, "time": 1505901509250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8825, 63.8483, 113.3 ] } }, + { "type": "Feature", "properties": { "id": "hv61914831", "mag": 1.76, "time": 1505901369660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.477661, 19.182333, 34.15 ] } }, + { "type": "Feature", "properties": { "id": "ak16867848", "mag": 1.1, "time": 1505900653451, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4004, 63.1493, 5.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000arir", "mag": 3.7, "time": 1505900227020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.1086, 55.2931, 60.27 ] } }, + { "type": "Feature", "properties": { "id": "uw61331666", "mag": 1.1, "time": 1505898593660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.672, 48.548667, -0.01 ] } }, + { "type": "Feature", "properties": { "id": "ci38006880", "mag": 2.13, "time": 1505898547760, "felt": 137, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.512, 33.929167, 3.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000arig", "mag": 4.9, "time": 1505898116470, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.0335, 30.5728, 51.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16867217", "mag": 1.6, "time": 1505898082784, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4786, 59.9819, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16867146", "mag": 1.1, "time": 1505897266615, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.8777, 60.4396, 4.0 ] } }, + { "type": "Feature", "properties": { "id": "ci38006872", "mag": 1.46, "time": 1505897209710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797667, 33.493667, 4.26 ] } }, + { "type": "Feature", "properties": { "id": "ak16867139", "mag": 2.2, "time": 1505896599575, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3632, 62.9389, 110.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72895641", "mag": 1.43, "time": 1505896494260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.840333, 37.569333, 1.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16903656", "mag": 1.6, "time": 1505896455015, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6591, 59.7355, 84.3 ] } }, + { "type": "Feature", "properties": { "id": "uu60248127", "mag": 1.21, "time": 1505896112670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.409833, 42.577333, 5.18 ] } }, + { "type": "Feature", "properties": { "id": "uu60248122", "mag": 1.04, "time": 1505896073990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.420167, 42.597, 5.54 ] } }, + { "type": "Feature", "properties": { "id": "us2000ari7", "mag": 2.8, "time": 1505895800120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4288, 42.5861, 7.69 ] } }, + { "type": "Feature", "properties": { "id": "hv61914791", "mag": 2.56, "time": 1505895324160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2775, 19.387833, 2.782 ] } }, + { "type": "Feature", "properties": { "id": "uu60248112", "mag": 2.6, "time": 1505895001440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.426333, 42.581333, 7.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16903653", "mag": 1.4, "time": 1505894006715, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1734, 57.6592, 5.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72895626", "mag": 1.53, "time": 1505893505020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.731, 35.610333, 5.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16866448", "mag": 1.5, "time": 1505893091784, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2468, 62.4591, 77.3 ] } }, + { "type": "Feature", "properties": { "id": "uu60013094", "mag": 1.81, "time": 1505893039830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.445667, 42.595833, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38006824", "mag": 1.12, "time": 1505893038610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.764667, 36.027, 1.93 ] } }, + { "type": "Feature", "properties": { "id": "uu60248107", "mag": 1.76, "time": 1505893022850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.440667, 42.600667, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "hv61914781", "mag": 1.67, "time": 1505892711130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6165, 19.4305, 3.542 ] } }, + { "type": "Feature", "properties": { "id": "ak16903651", "mag": 3.0, "time": 1505892680068, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.4523, 53.0789, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60248102", "mag": 1.36, "time": 1505892622540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.435667, 42.589167, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16866421", "mag": 1.6, "time": 1505892318030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3481, 59.8279, 3.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16866396", "mag": 2.2, "time": 1505891995067, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.4096, 54.4777, 11.3 ] } }, + { "type": "Feature", "properties": { "id": "hv61914776", "mag": 1.93, "time": 1505891884110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.875167, 19.494, 13.771 ] } }, + { "type": "Feature", "properties": { "id": "ak16866395", "mag": 1.1, "time": 1505891525159, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5895, 59.7855, 1.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16865784", "mag": 1.7, "time": 1505890304255, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8219, 63.9434, 110.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16903645", "mag": 1.5, "time": 1505889690090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8317, 59.5969, 83.3 ] } }, + { "type": "Feature", "properties": { "id": "uu60248092", "mag": 1.25, "time": 1505889314510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4045, 42.559, 7.09 ] } }, + { "type": "Feature", "properties": { "id": "ak16903644", "mag": 1.6, "time": 1505888156227, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1233, 56.6112, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16903642", "mag": 1.1, "time": 1505887874395, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5943, 62.8332, 79.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000arhc", "mag": 2.7, "time": 1505887339310, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.7528, 35.56, 6.78 ] } }, + { "type": "Feature", "properties": { "id": "nn00606041", "mag": 1.5, "time": 1505886348191, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1044, 37.3927, 2.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16865084", "mag": 2.3, "time": 1505886195952, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.96, 68.8119, 5.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16865080", "mag": 1.0, "time": 1505886128688, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.8653, 65.3778, 3.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16865073", "mag": 2.0, "time": 1505885821473, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.5664, 57.7913, 90.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16865048", "mag": 1.0, "time": 1505885371718, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9661, 63.2402, 5.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000arh1", "mag": 5.3, "time": 1505885168970, "felt": 29, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.3157, -16.2747, 92.59 ] } }, + { "type": "Feature", "properties": { "id": "us2000arha", "mag": 4.8, "time": 1505884561830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 148.9933, 44.304, 47.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16865027", "mag": 1.7, "time": 1505884405432, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8016, 59.167, 62.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16903636", "mag": 2.1, "time": 1505884147575, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.2848, 54.6322, 28.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16864392", "mag": 1.4, "time": 1505881969592, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3599, 61.7927, 48.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00606034", "mag": 1.2, "time": 1505881284660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8997, 38.3821, 8.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16903634", "mag": 1.9, "time": 1505881021363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3362, 59.9873, 134.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16864345", "mag": 1.4, "time": 1505880564938, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.7317, 59.9227, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16864341", "mag": 1.9, "time": 1505880299039, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2295, 62.4633, 79.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16903630", "mag": 1.6, "time": 1505878577379, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2105, 59.7151, 108.5 ] } }, + { "type": "Feature", "properties": { "id": "ci38006744", "mag": 1.15, "time": 1505878429650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3295, 36.066833, 4.96 ] } }, + { "type": "Feature", "properties": { "id": "uu60248077", "mag": 1.22, "time": 1505878406660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.422667, 42.523667, 7.06 ] } }, + { "type": "Feature", "properties": { "id": "ci38006752", "mag": 1.09, "time": 1505878374600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.328333, 36.063333, 2.53 ] } }, + { "type": "Feature", "properties": { "id": "ak16863731", "mag": 2.4, "time": 1505878347669, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1296, 60.1348, 9.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16903628", "mag": 1.7, "time": 1505878317110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2703, 59.8732, 126.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16863732", "mag": 1.2, "time": 1505878286762, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.9406, 59.985, 1.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38006736", "mag": 1.86, "time": 1505878275980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.331167, 36.0625, 4.96 ] } }, + { "type": "Feature", "properties": { "id": "ci37165628", "mag": 1.61, "time": 1505878262700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3305, 36.062833, 2.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16863728", "mag": 1.3, "time": 1505878130865, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3801, 60.7066, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000argd", "mag": 4.6, "time": 1505878085370, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8719, 16.1444, 48.73 ] } }, + { "type": "Feature", "properties": { "id": "uu60248072", "mag": 2.35, "time": 1505878084670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.423167, 42.581333, 8.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16863729", "mag": 2.5, "time": 1505878081761, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4258, 51.6886, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72895536", "mag": 1.94, "time": 1505877892960, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.286167, 36.776667, 10.03 ] } }, + { "type": "Feature", "properties": { "id": "ci38006720", "mag": 1.07, "time": 1505877439420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.752, 33.713, 15.96 ] } }, + { "type": "Feature", "properties": { "id": "uu60248067", "mag": 1.47, "time": 1505877309800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.445, 42.617667, 6.11 ] } }, + { "type": "Feature", "properties": { "id": "ci38006712", "mag": 1.07, "time": 1505875949770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.750333, 33.961833, 15.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000awn6", "mag": 4.0, "time": 1505875623990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.7511, -25.3193, 527.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000arfw", "mag": 4.9, "time": 1505875330110, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 174.3444, -41.5073, 24.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000arfs", "mag": 4.9, "time": 1505875055560, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.9075, 14.5711, 178.93 ] } }, + { "type": "Feature", "properties": { "id": "pr2017263000", "mag": 2.75, "time": 1505873919890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.3401, 18.9298, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16863060", "mag": 1.9, "time": 1505873560207, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1132, 59.1631, 57.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72895516", "mag": 1.58, "time": 1505873402400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.522667, 35.964833, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000arf6", "mag": 2.7, "time": 1505873292330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6365, 59.7836, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000arfq", "mag": 2.8, "time": 1505872583380, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -2.1386, 37.4306, 7.84 ] } }, + { "type": "Feature", "properties": { "id": "nc72895506", "mag": 1.14, "time": 1505872092600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.103, 36.606333, 9.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000arel", "mag": 6.1, "time": 1505871807940, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 162.614, -50.7145, 19.83 ] } }, + { "type": "Feature", "properties": { "id": "ak16862483", "mag": 2.0, "time": 1505871449331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.323, 61.0377, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16862466", "mag": 1.1, "time": 1505870969313, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0763, 60.3456, 0.4 ] } }, + { "type": "Feature", "properties": { "id": "mb80256529", "mag": 1.31, "time": 1505870488260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528, 46.8965, 11.33 ] } }, + { "type": "Feature", "properties": { "id": "nc72895486", "mag": 1.47, "time": 1505870467130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.586, 36.020333, 4.08 ] } }, + { "type": "Feature", "properties": { "id": "us2000are4", "mag": 4.5, "time": 1505868292650, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.5418, -3.912, 43.33 ] } }, + { "type": "Feature", "properties": { "id": "uu60248037", "mag": 2.04, "time": 1505868182810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.450167, 42.612833, 6.23 ] } }, + { "type": "Feature", "properties": { "id": "uu60248032", "mag": 1.14, "time": 1505868031480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.415833, 42.508, 5.93 ] } }, + { "type": "Feature", "properties": { "id": "us2000are1", "mag": 2.5, "time": 1505867820700, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7971, 36.457, 5.777 ] } }, + { "type": "Feature", "properties": { "id": "nc72895456", "mag": 1.52, "time": 1505867731230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.668833, 37.291667, 4.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000ardv", "mag": 5.0, "time": 1505866095740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 57.4066, 30.7208, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16903617", "mag": 1.9, "time": 1505866055349, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.744, 56.8763, 33.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16903616", "mag": 1.8, "time": 1505865710189, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.5947, 55.8757, 101.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16903615", "mag": 1.8, "time": 1505865589920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0266, 60.2087, 122.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ass3", "mag": 2.5, "time": 1505864736500, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.8008, 36.4519, 6.233 ] } }, + { "type": "Feature", "properties": { "id": "mb80256499", "mag": 1.38, "time": 1505864394760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.407833, 45.589, 4.43 ] } }, + { "type": "Feature", "properties": { "id": "us2000arcp", "mag": 3.0, "time": 1505863612870, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4223, 42.5909, 9.63 ] } }, + { "type": "Feature", "properties": { "id": "uw61331476", "mag": 1.93, "time": 1505863558820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.772333, 46.652333, -0.79 ] } }, + { "type": "Feature", "properties": { "id": "us2000arcv", "mag": 4.6, "time": 1505863376420, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 123.9102, 6.3611, 38.14 ] } }, + { "type": "Feature", "properties": { "id": "us2000arck", "mag": 2.6, "time": 1505863101700, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9891, 36.9623, 5.329 ] } }, + { "type": "Feature", "properties": { "id": "us2000arch", "mag": 4.6, "time": 1505862692240, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8625, 16.2348, 45.26 ] } }, + { "type": "Feature", "properties": { "id": "uw61331461", "mag": 1.43, "time": 1505862649350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.194333, 46.983167, -0.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16861101", "mag": 1.0, "time": 1505862438423, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3714, 64.9781, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000arca", "mag": 4.7, "time": 1505862303600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.4478, -36.2513, 47.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16860573", "mag": 1.3, "time": 1505861271657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6706, 62.0713, 0.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000arbk", "mag": 2.4, "time": 1505861097180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4595, 42.608, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aray", "mag": 3.2, "time": 1505859699230, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7506, 36.4396, 1.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000arar", "mag": 2.6, "time": 1505859474460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7831, 36.4511, 2.64 ] } }, + { "type": "Feature", "properties": { "id": "ci38006608", "mag": 0.96, "time": 1505859334750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.475333, 33.486667, 14.73 ] } }, + { "type": "Feature", "properties": { "id": "uu60247982", "mag": 1.65, "time": 1505858965080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.420667, 42.524833, 7.59 ] } }, + { "type": "Feature", "properties": { "id": "ak16859929", "mag": 1.1, "time": 1505857928856, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.6104, 61.9413, 2.9 ] } }, + { "type": "Feature", "properties": { "id": "nn00605999", "mag": 1.5, "time": 1505856979033, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.7943, 38.658, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16875936", "mag": 1.7, "time": 1505856840827, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.652, 53.3989, 20.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00606301", "mag": 1.4, "time": 1505856837357, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.7768, 38.66, 6.5 ] } }, + { "type": "Feature", "properties": { "id": "nn00606300", "mag": 1.4, "time": 1505856822494, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.7817, 38.6647, 4.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16859863", "mag": 1.4, "time": 1505856383099, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.06, 61.1692, 19.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60247972", "mag": 1.74, "time": 1505856071750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4475, 42.619, 6.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16859852", "mag": 1.7, "time": 1505856067799, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.5801, 68.0241, 10.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16859850", "mag": 1.3, "time": 1505856055065, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2245, 61.5244, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "nn00605994", "mag": 1.2, "time": 1505855929391, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1076, 37.3659, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar96", "mag": 4.9, "time": 1505855599810, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5112, 15.3218, 46.64 ] } }, + { "type": "Feature", "properties": { "id": "ci38006584", "mag": 1.62, "time": 1505855343650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.8445, 36.1795, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "nn00605990", "mag": 1.4, "time": 1505855191998, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3633, 38.1896, 5.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16859325", "mag": 2.3, "time": 1505854928991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9168, 61.6291, 63.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72895401", "mag": 1.19, "time": 1505854923520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.721832, 38.778832, 1.61 ] } }, + { "type": "Feature", "properties": { "id": "ak16859316", "mag": 1.9, "time": 1505854153817, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2675, 59.6779, 106.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar87", "mag": 4.0, "time": 1505854089550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.0339, -20.6057, 107.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16859309", "mag": 2.3, "time": 1505853828556, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9751, 62.3114, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16859297", "mag": 2.2, "time": 1505853447611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.476, 59.9101, 122.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16859290", "mag": 3.0, "time": 1505853445730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.8511, 55.6543, 46.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16859292", "mag": 3.6, "time": 1505853411703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.4847, 57.8969, 244.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72895391", "mag": 2.22, "time": 1505852777640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.194167, 40.744, 31.83 ] } }, + { "type": "Feature", "properties": { "id": "uu60247942", "mag": 1.28, "time": 1505852539380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.439833, 42.608667, 6.41 ] } }, + { "type": "Feature", "properties": { "id": "ak16859266", "mag": 1.1, "time": 1505852431345, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.5411, 60.0259, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar6z", "mag": 5.2, "time": 1505852287190, "felt": 32, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.7668, 37.2998, 35.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar6y", "mag": 5.2, "time": 1505852058100, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 150.8423, -5.5637, 99.91 ] } }, + { "type": "Feature", "properties": { "id": "ak16859257", "mag": 1.1, "time": 1505851589002, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.171, 64.5345, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "ci38006552", "mag": 1.38, "time": 1505851374120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.498833, 33.866667, -0.49 ] } }, + { "type": "Feature", "properties": { "id": "nc72895381", "mag": 1.43, "time": 1505851273540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.729333, 36.3275, 5.22 ] } }, + { "type": "Feature", "properties": { "id": "ak16875922", "mag": 1.3, "time": 1505850452543, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.3232, 58.1622, 6.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16875921", "mag": 2.9, "time": 1505849966730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.4901, 52.1476, 24.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60247932", "mag": 1.44, "time": 1505849337250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.421, 42.579, 5.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16875920", "mag": 1.3, "time": 1505849251567, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.6328, 59.921, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16858730", "mag": 1.2, "time": 1505848519202, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9009, 61.545, 3.9 ] } }, + { "type": "Feature", "properties": { "id": "hv61914226", "mag": 1.85, "time": 1505848191950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.283829, 19.389834, 2.69 ] } }, + { "type": "Feature", "properties": { "id": "ci38006520", "mag": 1.05, "time": 1505847392530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7695, 36.0195, 2.35 ] } }, + { "type": "Feature", "properties": { "id": "ci38006512", "mag": 1.61, "time": 1505847142180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.767, 36.0195, 2.27 ] } }, + { "type": "Feature", "properties": { "id": "ci38006496", "mag": 3.65, "time": 1505846743780, "felt": 24, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.769833, 36.019333, 1.78 ] } }, + { "type": "Feature", "properties": { "id": "hv61914191", "mag": 1.84, "time": 1505846559260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.249161, 19.378334, 1.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16875918", "mag": 2.8, "time": 1505846556982, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.8186, 52.0581, 213.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72895351", "mag": 1.32, "time": 1505846239310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.104167, 37.325333, -0.31 ] } }, + { "type": "Feature", "properties": { "id": "nc72895341", "mag": 2.76, "time": 1505846072870, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.359001, 36.981335, 8.57 ] } }, + { "type": "Feature", "properties": { "id": "ci38006480", "mag": 3.19, "time": 1505846053020, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.767333, 36.019, 1.55 ] } }, + { "type": "Feature", "properties": { "id": "nc72895286", "mag": 1.33, "time": 1505844883780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.572167, 35.430667, -0.58 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar1y", "mag": 4.6, "time": 1505844881000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.1913, -37.2281, 5.95 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar20", "mag": 7.1, "time": 1505844878420, "felt": 2048, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.4952, 18.5539, 51.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16858135", "mag": 1.6, "time": 1505844133798, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.026, 67.0927, 3.7 ] } }, + { "type": "Feature", "properties": { "id": "ci37766871", "mag": 1.54, "time": 1505844053390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.846, 36.179167, 2.24 ] } }, + { "type": "Feature", "properties": { "id": "ci37766863", "mag": 1.44, "time": 1505843932610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.768, 36.018667, 1.61 ] } }, + { "type": "Feature", "properties": { "id": "nm60207061", "mag": 1.72, "time": 1505843783380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.646167, 36.5445, 7.49 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqyy", "mag": 4.5, "time": 1505843446640, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.6161, -31.7548, 29.84 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235603", "mag": 1.89, "time": 1505842614490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.682, 37.184833, 3.97 ] } }, + { "type": "Feature", "properties": { "id": "nc72895271", "mag": 1.15, "time": 1505841330820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.259833, 36.753, 11.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqxe", "mag": 4.6, "time": 1505841149400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 128.1444, -7.5033, 158.11 ] } }, + { "type": "Feature", "properties": { "id": "uu60247882", "mag": 1.62, "time": 1505841064700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.426167, 42.5295, 8.11 ] } }, + { "type": "Feature", "properties": { "id": "nc72895256", "mag": 1.32, "time": 1505840661480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.598167, 36.752, -0.32 ] } }, + { "type": "Feature", "properties": { "id": "ci37766807", "mag": 2.45, "time": 1505840210530, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.766, 36.02, 1.86 ] } }, + { "type": "Feature", "properties": { "id": "uu60247877", "mag": 2.11, "time": 1505840158690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.448833, 42.606, 3.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16857619", "mag": 2.1, "time": 1505840007502, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8949, 63.2912, 101.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60247872", "mag": 1.62, "time": 1505839724910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.458833, 42.607, 3.95 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqvm", "mag": 2.7, "time": 1505839542100, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.469, 42.6077, 7.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72895246", "mag": 1.35, "time": 1505839417090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.485667, 35.221333, 6.04 ] } }, + { "type": "Feature", "properties": { "id": "ak16875914", "mag": 1.9, "time": 1505839174472, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4077, 58.8832, 118.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37766791", "mag": 1.22, "time": 1505838919650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3645, 33.1855, 10.21 ] } }, + { "type": "Feature", "properties": { "id": "ak16857617", "mag": 1.6, "time": 1505838902519, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.9995, 67.1881, 4.7 ] } }, + { "type": "Feature", "properties": { "id": "uu60247852", "mag": 2.07, "time": 1505838746530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4455, 42.613833, 1.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16857602", "mag": 1.1, "time": 1505837962181, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.5253, 60.121, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16857600", "mag": 1.9, "time": 1505837841567, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.1883, 53.9422, 44.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72895231", "mag": 2.9, "time": 1505837729840, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.833667, 37.507667, 1.79 ] } }, + { "type": "Feature", "properties": { "id": "us2000ary5", "mag": 2.9, "time": 1505837727410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4431, 42.6149, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "uu60247822", "mag": 2.11, "time": 1505837448870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.455167, 42.616, 1.41 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqtm", "mag": 3.1, "time": 1505837140170, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4706, 42.6154, 8.81 ] } }, + { "type": "Feature", "properties": { "id": "ak16875909", "mag": 2.2, "time": 1505836969879, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4914, 51.7473, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16857094", "mag": 1.1, "time": 1505836528626, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6176, 61.14, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16875907", "mag": 1.5, "time": 1505835821169, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.259, 60.5626, 90.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqsj", "mag": 2.6, "time": 1505835755980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5135, 36.2854, 4.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqsk", "mag": 2.5, "time": 1505835732030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4724, 42.6121, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16857093", "mag": 2.6, "time": 1505835424846, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4652, 51.7084, 16.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqsh", "mag": 3.0, "time": 1505835309120, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4508, 42.6064, 4.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16857091", "mag": 1.3, "time": 1505835219788, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0197, 66.1072, 6.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqs7", "mag": 3.5, "time": 1505834833670, "felt": 21, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4429, 42.6135, 8.34 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqwu", "mag": 2.5, "time": 1505834816200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.7965, 36.4516, 6.125 ] } }, + { "type": "Feature", "properties": { "id": "ak16875904", "mag": 1.6, "time": 1505834730734, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.9141, 57.1404, 29.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37766767", "mag": 1.14, "time": 1505834129200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.763833, 36.020667, 1.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16857088", "mag": 1.5, "time": 1505834082762, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0429, 60.6104, 77.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqrc", "mag": 4.8, "time": 1505832575280, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 178.0168, 52.0275, 131.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16875901", "mag": 1.4, "time": 1505831619582, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -137.534, 58.7008, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37766711", "mag": 1.96, "time": 1505831425050, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.765667, 36.018833, 1.51 ] } }, + { "type": "Feature", "properties": { "id": "ci37766703", "mag": 1.15, "time": 1505831411750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.764833, 36.019667, 1.65 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqqm", "mag": 4.5, "time": 1505831278930, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.4084, -31.8109, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16856556", "mag": 1.3, "time": 1505831243282, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7313, 59.8087, 0.9 ] } }, + { "type": "Feature", "properties": { "id": "nn00606015", "mag": 1.3, "time": 1505831170459, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8959, 38.3975, 10.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16856551", "mag": 1.9, "time": 1505831042494, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6819, 63.0946, 10.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16875898", "mag": 1.7, "time": 1505829915600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2865, 59.7628, 116.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16856544", "mag": 1.6, "time": 1505829548541, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3607, 61.0755, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72895191", "mag": 1.4, "time": 1505828746900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.799667, 38.815333, 3.57 ] } }, + { "type": "Feature", "properties": { "id": "nc72895181", "mag": 1.21, "time": 1505828239020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.96, 37.587, -0.68 ] } }, + { "type": "Feature", "properties": { "id": "pr2017262003", "mag": 3.12, "time": 1505828003180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.596, 19.2688, 38.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqpx", "mag": 5.1, "time": 1505827570500, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 53.9953, 27.9548, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72895166", "mag": 2.1, "time": 1505827334280, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.801333, 38.709667, 3.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16856036", "mag": 1.5, "time": 1505826795043, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9795, 61.8762, 43.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16856032", "mag": 1.6, "time": 1505825636722, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1838, 62.582, 3.3 ] } }, + { "type": "Feature", "properties": { "id": "ci37766679", "mag": 0.96, "time": 1505825558280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.804167, 33.865333, 14.31 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqp7", "mag": 4.4, "time": 1505825308910, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -78.7564, -2.1725, 112.59 ] } }, + { "type": "Feature", "properties": { "id": "ak16856030", "mag": 3.0, "time": 1505825190453, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.1381, 51.2155, 7.2 ] } }, + { "type": "Feature", "properties": { "id": "nn00605924", "mag": 1.0, "time": 1505824470372, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0787, 37.3317, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16856028", "mag": 1.3, "time": 1505824029137, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5369, 59.9737, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16856023", "mag": 1.7, "time": 1505823902403, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0502, 66.1255, 9.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16856015", "mag": 2.2, "time": 1505823557445, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.013, 66.1279, 12.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16856014", "mag": 1.1, "time": 1505823327376, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3053, 64.2153, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16856012", "mag": 1.2, "time": 1505823307912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2687, 63.3135, 1.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16856011", "mag": 2.3, "time": 1505823122176, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.4683, 54.3778, 12.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72895111", "mag": 1.33, "time": 1505822407460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.809833, 38.802, 3.64 ] } }, + { "type": "Feature", "properties": { "id": "nm60207021", "mag": 3.8, "time": 1505821648710, "felt": 1485, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.909833, 38.423833, 11.68 ] } }, + { "type": "Feature", "properties": { "id": "ak16855511", "mag": 1.6, "time": 1505821526245, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.7265, 65.4529, 0.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16875885", "mag": 2.4, "time": 1505821066912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.3853, 52.1246, 33.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72895086", "mag": 1.5, "time": 1505820901510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811333, 38.8115, 2.81 ] } }, + { "type": "Feature", "properties": { "id": "nn00605917", "mag": 1.0, "time": 1505819713127, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0296, 37.3121, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37766663", "mag": 1.51, "time": 1505819310540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.197333, 34.085167, 9.45 ] } }, + { "type": "Feature", "properties": { "id": "ak16875884", "mag": 2.8, "time": 1505819249763, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -171.074, 52.1917, 55.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqlv", "mag": 4.4, "time": 1505818453350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.3742, -31.7199, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16855501", "mag": 3.4, "time": 1505818346973, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7971, 56.0595, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16855500", "mag": 2.9, "time": 1505817985167, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.3494, 51.1124, 9.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72895061", "mag": 1.78, "time": 1505817758790, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.178833, 36.5795, 5.08 ] } }, + { "type": "Feature", "properties": { "id": "nc72895056", "mag": 2.12, "time": 1505817518530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.177333, 36.582833, 3.53 ] } }, + { "type": "Feature", "properties": { "id": "uu60247712", "mag": 1.36, "time": 1505817061570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.018167, 44.796, 9.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16875881", "mag": 1.6, "time": 1505816115601, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2511, 57.9599, 9.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16855499", "mag": 1.3, "time": 1505815877713, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8298, 61.5636, 56.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16855498", "mag": 2.3, "time": 1505815751742, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.7444, 52.8226, 62.9 ] } }, + { "type": "Feature", "properties": { "id": "pr2017262002", "mag": 3.05, "time": 1505815582890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.7015, 19.0933, 25.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16875878", "mag": 2.3, "time": 1505815056638, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6299, 51.8122, 76.9 ] } }, + { "type": "Feature", "properties": { "id": "pr2017262001", "mag": 3.03, "time": 1505814906490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.723, 19.2006, 9.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqkv", "mag": 3.1, "time": 1505814230020, "felt": 19, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8094, 35.9883, 6.72 ] } }, + { "type": "Feature", "properties": { "id": "nn00605909", "mag": 2.0, "time": 1505812861822, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0799, 37.3335, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "ci37766575", "mag": 1.76, "time": 1505810653690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.489167, 32.91, 3.69 ] } }, + { "type": "Feature", "properties": { "id": "hv61913891", "mag": 1.46, "time": 1505809604540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2385, 19.383667, 3.069 ] } }, + { "type": "Feature", "properties": { "id": "us2000awmg", "mag": 4.7, "time": 1505809455110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 162.925, -10.7783, 56.21 ] } }, + { "type": "Feature", "properties": { "id": "us2000asy2", "mag": 3.0, "time": 1505809273830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.747, 56.8207, 54.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16855496", "mag": 1.1, "time": 1505809181592, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6103, 61.758, 29.3 ] } }, + { "type": "Feature", "properties": { "id": "ci37766567", "mag": 2.63, "time": 1505808839560, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.053, 33.079333, 9.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16854995", "mag": 1.3, "time": 1505808496915, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.3955, 61.6352, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000awn2", "mag": 4.8, "time": 1505807930800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8135, 15.201, 45.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqji", "mag": 5.5, "time": 1505807596650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0446, 15.1414, 38.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16875872", "mag": 2.1, "time": 1505807457953, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.2219, 51.3226, 34.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72894976", "mag": 1.17, "time": 1505806773770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.792335, 38.809666, 2.7 ] } }, + { "type": "Feature", "properties": { "id": "ci37766551", "mag": 1.92, "time": 1505806527540, "felt": 28, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.473833, 34.086, 9.44 ] } }, + { "type": "Feature", "properties": { "id": "nn00605996", "mag": 1.0, "time": 1505804591858, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.786, 38.6641, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqiw", "mag": 4.9, "time": 1505804582700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5541, 15.6968, 62.85 ] } }, + { "type": "Feature", "properties": { "id": "nc72894951", "mag": 2.38, "time": 1505803512250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.804667, 38.658333, -1.93 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqim", "mag": 4.9, "time": 1505803059440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 162.5306, -11.0433, 31.53 ] } }, + { "type": "Feature", "properties": { "id": "ak16858212", "mag": 1.9, "time": 1505803043301, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8602, 60.3455, 116.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16854482", "mag": 1.5, "time": 1505802327547, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6967, 63.0934, 11.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37766535", "mag": 3.61, "time": 1505802044370, "felt": 9002, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.475667, 34.086667, 10.48 ] } }, + { "type": "Feature", "properties": { "id": "ci37766527", "mag": 1.21, "time": 1505801932130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.774833, 34.169667, 4.09 ] } }, + { "type": "Feature", "properties": { "id": "ak16875868", "mag": 1.8, "time": 1505801903580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.8368, 51.4427, 38.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16854479", "mag": 1.1, "time": 1505801695119, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7029, 61.7782, 46.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16875866", "mag": 1.4, "time": 1505801525136, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.4992, 53.7654, 79.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61331061", "mag": 2.06, "time": 1505797453620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.194667, 46.453167, 40.56 ] } }, + { "type": "Feature", "properties": { "id": "ci37766503", "mag": 1.67, "time": 1505797300060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.486333, 32.916167, 3.75 ] } }, + { "type": "Feature", "properties": { "id": "ak16854474", "mag": 1.9, "time": 1505797038222, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0668, 60.2297, 58.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16853980", "mag": 1.1, "time": 1505796127101, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3206, 62.3117, 31.2 ] } }, + { "type": "Feature", "properties": { "id": "uw61330981", "mag": 1.13, "time": 1505795983940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.682, 46.13, 13.15 ] } }, + { "type": "Feature", "properties": { "id": "ak16853978", "mag": 1.3, "time": 1505795947149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1655, 62.2572, 56.3 ] } }, + { "type": "Feature", "properties": { "id": "nn00605993", "mag": 1.1, "time": 1505795780711, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1363, 37.4312, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72894911", "mag": 1.31, "time": 1505795498990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7385, 38.757333, 2.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16875861", "mag": 1.1, "time": 1505795298437, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.2708, 60.1059, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "pr2017262000", "mag": 3.54, "time": 1505794257010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.6603, 17.4281, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16875860", "mag": 2.4, "time": 1505793870359, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.7298, 54.4321, 27.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16875859", "mag": 1.7, "time": 1505793327250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1948, 59.7387, 99.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16853975", "mag": 1.6, "time": 1505792759926, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.4718, 53.5765, 9.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72894906", "mag": 1.57, "time": 1505792076170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7735, 38.656833, -0.04 ] } }, + { "type": "Feature", "properties": { "id": "ci37766479", "mag": 1.69, "time": 1505792016930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.486333, 32.9165, 3.74 ] } }, + { "type": "Feature", "properties": { "id": "ci37766487", "mag": 1.34, "time": 1505791878570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.484833, 32.910667, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37766471", "mag": 1.85, "time": 1505791676460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.4825, 32.916333, 3.63 ] } }, + { "type": "Feature", "properties": { "id": "nc72894886", "mag": 1.72, "time": 1505789062930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.840667, 37.569167, 0.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16853477", "mag": 1.0, "time": 1505787688094, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.1719, 66.2583, 2.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16875853", "mag": 1.7, "time": 1505787600292, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3919, 59.6211, 106.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16875852", "mag": 1.1, "time": 1505786552106, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5941, 61.448, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80256309", "mag": 1.39, "time": 1505786055440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526833, 46.8665, 12.97 ] } }, + { "type": "Feature", "properties": { "id": "ak16853476", "mag": 1.1, "time": 1505785818136, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8501, 59.9025, 11.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16852984", "mag": 1.1, "time": 1505784566645, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6396, 62.818, 76.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqg7", "mag": 4.1, "time": 1505784206570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4373, 15.5332, 46.8 ] } }, + { "type": "Feature", "properties": { "id": "uu60247557", "mag": 1.04, "time": 1505784051560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.714, 41.274333, 9.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60247547", "mag": 1.47, "time": 1505783841160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.707167, 41.273, 13.52 ] } }, + { "type": "Feature", "properties": { "id": "hv61913526", "mag": 1.76, "time": 1505783827370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.457833, 19.1825, 36.457 ] } }, + { "type": "Feature", "properties": { "id": "uu60247542", "mag": 2.67, "time": 1505783530250, "felt": 53, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.715333, 41.2735, 12.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16852978", "mag": 2.3, "time": 1505783525625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6267, 63.2162, 130.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16852863", "mag": 2.5, "time": 1505781518245, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0202, 60.2096, 73.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72894856", "mag": 0.99, "time": 1505781008310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827331, 38.841667, 1.75 ] } }, + { "type": "Feature", "properties": { "id": "ak16852858", "mag": 1.1, "time": 1505780482987, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8182, 61.2069, 27.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72894851", "mag": 1.36, "time": 1505780335820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7775, 38.816, 2.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16852857", "mag": 1.6, "time": 1505780229532, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4, 60.0341, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16852855", "mag": 1.5, "time": 1505779887968, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8629, 61.2326, 1.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37766415", "mag": 1.9, "time": 1505779853200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.489333, 32.905167, 5.38 ] } }, + { "type": "Feature", "properties": { "id": "ci37165308", "mag": 1.73, "time": 1505779842240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.488, 32.911333, 4.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16852849", "mag": 1.7, "time": 1505779013710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9564, 61.0148, 51.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16852847", "mag": 1.4, "time": 1505778755901, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7113, 59.8038, 2.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16852839", "mag": 1.8, "time": 1505778454412, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4318, 51.6727, 27.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16852350", "mag": 2.0, "time": 1505777928661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5948, 59.4167, 88.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37766399", "mag": 1.34, "time": 1505777787740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.855667, 36.109333, 3.89 ] } }, + { "type": "Feature", "properties": { "id": "ak16905714", "mag": 1.0, "time": 1505777724697, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9455, 64.7711, 1.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37766391", "mag": 0.98, "time": 1505777305130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.852333, 36.108833, 4.09 ] } }, + { "type": "Feature", "properties": { "id": "ci37766383", "mag": 1.52, "time": 1505777027970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.673833, 35.0495, -0.79 ] } }, + { "type": "Feature", "properties": { "id": "nn00605852", "mag": 1.0, "time": 1505777021809, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.5662, 37.4193, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16852327", "mag": 1.3, "time": 1505776382741, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3544, 64.9878, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72894836", "mag": 1.11, "time": 1505776268170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.826164, 38.803165, -0.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16852320", "mag": 2.2, "time": 1505774485259, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6811, 59.3157, 121.6 ] } }, + { "type": "Feature", "properties": { "id": "uw61330861", "mag": 1.73, "time": 1505774113220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.3385, 46.609, -0.26 ] } }, + { "type": "Feature", "properties": { "id": "us2000awm5", "mag": 4.3, "time": 1505773697460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 150.1858, 46.1638, 102.95 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqck", "mag": 3.9, "time": 1505773335560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2122, -24.1635, 187.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72894811", "mag": 1.66, "time": 1505773221810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.814667, 38.797333, 2.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000aurg", "mag": 3.7, "time": 1505773151260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.33, 54.9516, 64.12 ] } }, + { "type": "Feature", "properties": { "id": "ak16851830", "mag": 1.1, "time": 1505773086095, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3969, 60.1593, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37766351", "mag": 2.36, "time": 1505772988180, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.856, 36.108833, 3.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqc4", "mag": 4.3, "time": 1505772810860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7554, 15.1768, 26.84 ] } }, + { "type": "Feature", "properties": { "id": "ak16905709", "mag": 1.9, "time": 1505772157260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3386, 60.1473, 141.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72894806", "mag": 1.27, "time": 1505771972190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.114667, 39.267, 3.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16905707", "mag": 2.2, "time": 1505771817995, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.2489, 54.4702, 80.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72894796", "mag": 2.0, "time": 1505771179880, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.128, 39.249833, 8.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16851826", "mag": 1.4, "time": 1505770110538, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6751, 61.3285, 49.9 ] } }, + { "type": "Feature", "properties": { "id": "ci37766303", "mag": 1.45, "time": 1505769920400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.605, 32.830833, 11.11 ] } }, + { "type": "Feature", "properties": { "id": "ci37766295", "mag": 1.71, "time": 1505769761910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.604667, 32.8245, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37766287", "mag": 2.17, "time": 1505769684730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.606, 32.822667, 12.54 ] } }, + { "type": "Feature", "properties": { "id": "pr2017261003", "mag": 2.77, "time": 1505769603950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.496, 19.0255, 9.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16851820", "mag": 1.8, "time": 1505768968360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5226, 60.8929, 114.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16851818", "mag": 1.8, "time": 1505768967170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6844, 60.3627, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61913136", "mag": 2.13, "time": 1505768803830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.602167, 19.474, 2.169 ] } }, + { "type": "Feature", "properties": { "id": "ci37766271", "mag": 1.2, "time": 1505768642090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.024833, 34.482, 7.73 ] } }, + { "type": "Feature", "properties": { "id": "ci37766255", "mag": 1.05, "time": 1505767837000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.472833, 34.117167, 12.54 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq9e", "mag": 4.0, "time": 1505767497800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.084, -30.3511, 16.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16851331", "mag": 3.1, "time": 1505767490141, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.4781, 55.9976, 142.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16851328", "mag": 1.1, "time": 1505767149947, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.8292, 66.9662, 11.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37766231", "mag": 0.99, "time": 1505765477990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.581833, 34.027833, 15.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16851294", "mag": 1.2, "time": 1505764980957, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5833, 61.5338, 35.4 ] } }, + { "type": "Feature", "properties": { "id": "uw61330806", "mag": 1.54, "time": 1505764971380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.54, 46.3245, -0.47 ] } }, + { "type": "Feature", "properties": { "id": "nn00605816", "mag": 1.4, "time": 1505764963953, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1157, 37.3834, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00605865", "mag": 1.1, "time": 1505764655295, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.1142, 38.3008, 12.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72894761", "mag": 1.86, "time": 1505764383660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820667, 37.543667, 3.73 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq7z", "mag": 4.9, "time": 1505764292580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6427, 15.3134, 31.07 ] } }, + { "type": "Feature", "properties": { "id": "ci37766191", "mag": 0.97, "time": 1505763617780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.450667, 34.371167, 7.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq71", "mag": 2.7, "time": 1505763144440, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4497, 42.6436, 9.31 ] } }, + { "type": "Feature", "properties": { "id": "ci37766183", "mag": 1.36, "time": 1505762589870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.1565, 35.016333, -1.02 ] } }, + { "type": "Feature", "properties": { "id": "mb80256274", "mag": 1.49, "time": 1505762568370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.536167, 46.875, 12.74 ] } }, + { "type": "Feature", "properties": { "id": "nn00605809", "mag": 1.3, "time": 1505762272549, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6987, 37.801, 0.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16850796", "mag": 1.9, "time": 1505761948762, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4688, 62.7498, 82.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00605855", "mag": 1.3, "time": 1505761056131, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1168, 37.3993, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37766175", "mag": 1.17, "time": 1505760720620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9445, 34.324333, -1.41 ] } }, + { "type": "Feature", "properties": { "id": "nc72894741", "mag": 1.25, "time": 1505760426930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8455, 38.818, 2.33 ] } }, + { "type": "Feature", "properties": { "id": "uu60247432", "mag": 1.19, "time": 1505760132640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.613667, 40.6905, 8.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16850168", "mag": 2.1, "time": 1505759367705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.838, 63.3882, 112.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37766167", "mag": 3.51, "time": 1505759058190, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.656502, 31.030666, 5.16 ] } }, + { "type": "Feature", "properties": { "id": "nn00605797", "mag": 1.7, "time": 1505758994627, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1288, 37.4056, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16850165", "mag": 1.4, "time": 1505758989527, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4112, 62.8303, 102.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16905692", "mag": 1.1, "time": 1505758393925, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8004, 59.9261, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "ci37766159", "mag": 1.12, "time": 1505757568700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.635, 33.146167, 7.87 ] } }, + { "type": "Feature", "properties": { "id": "nc72894726", "mag": 0.98, "time": 1505757550510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.418667, 37.284667, 6.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16905691", "mag": 1.4, "time": 1505757310878, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9735, 60.9138, 37.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16850161", "mag": 1.0, "time": 1505757088256, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0018, 62.0064, 13.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16905689", "mag": 1.2, "time": 1505757035772, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8926, 61.2214, 62.6 ] } }, + { "type": "Feature", "properties": { "id": "pr2017261002", "mag": 2.83, "time": 1505756997070, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.5011, 19.09, 29.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq4m", "mag": 4.3, "time": 1505756979200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.2066, 15.6332, 53.99 ] } }, + { "type": "Feature", "properties": { "id": "ak16849685", "mag": 1.4, "time": 1505755775657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6398, 58.3116, 3.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00605793", "mag": 2.1, "time": 1505755747277, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0899, 37.3433, 2.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq3v", "mag": 4.1, "time": 1505755544410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8487, 15.9949, 55.32 ] } }, + { "type": "Feature", "properties": { "id": "uu60247422", "mag": 3.28, "time": 1505755278460, "felt": 662, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.609167, 40.700833, 10.96 ] } }, + { "type": "Feature", "properties": { "id": "ak16849675", "mag": 1.0, "time": 1505754649061, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0364, 64.4942, 19.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72894701", "mag": 1.54, "time": 1505754599760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.869, 36.443167, 15.01 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235573", "mag": 2.16, "time": 1505754215540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.819333, 37.204, 5.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72894696", "mag": 1.11, "time": 1505753360080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.779167, 38.816834, 1.68 ] } }, + { "type": "Feature", "properties": { "id": "nc72894681", "mag": 2.71, "time": 1505753271320, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.776833, 38.818833, 1.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq1c", "mag": 4.3, "time": 1505753232560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 19.9297, 40.1065, 16.32 ] } }, + { "type": "Feature", "properties": { "id": "hv61912961", "mag": 1.88, "time": 1505752987740, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.220333, 19.426333, 30.266 ] } }, + { "type": "Feature", "properties": { "id": "ak16849646", "mag": 1.9, "time": 1505752045532, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8846, 59.8511, 56.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16905682", "mag": 2.1, "time": 1505751893024, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.9783, 51.5536, 48.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16905681", "mag": 1.4, "time": 1505751513529, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5148, 59.7419, 92.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq9y", "mag": 3.0, "time": 1505751460390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.173, 52.0554, 121.43 ] } }, + { "type": "Feature", "properties": { "id": "uu60247412", "mag": 1.56, "time": 1505751055750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.8355, 39.743833, 1.73 ] } }, + { "type": "Feature", "properties": { "id": "nn00605780", "mag": 1.0, "time": 1505750947574, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0248, 38.8721, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72894651", "mag": 1.22, "time": 1505750864240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8995, 37.521833, -0.61 ] } }, + { "type": "Feature", "properties": { "id": "us2000apzi", "mag": 4.5, "time": 1505750058850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 77.1478, 40.9769, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16905679", "mag": 1.0, "time": 1505749750880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3078, 62.9046, 85.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16849178", "mag": 1.3, "time": 1505749184927, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5131, 62.8898, 90.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000apyu", "mag": 4.3, "time": 1505748920580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.1652, -31.8057, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16849177", "mag": 3.5, "time": 1505748318594, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.7225, 51.7093, 41.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72894631", "mag": 1.04, "time": 1505748063110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.787498, 38.798832, -0.32 ] } }, + { "type": "Feature", "properties": { "id": "hv61912826", "mag": 1.1, "time": 1505748041950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.431667, 19.343833, 9.245 ] } }, + { "type": "Feature", "properties": { "id": "nn00605847", "mag": 1.0, "time": 1505747832897, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1332, 37.421, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000apya", "mag": 4.7, "time": 1505747639290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5858, 15.1833, 36.89 ] } }, + { "type": "Feature", "properties": { "id": "ak16848711", "mag": 1.3, "time": 1505747504037, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7568, 59.8878, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16905675", "mag": 2.1, "time": 1505746990876, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.9195, 57.1996, 98.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72894616", "mag": 2.19, "time": 1505746390770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.149, 40.217, 6.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16848704", "mag": 2.3, "time": 1505746286875, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.7477, 53.6076, 54.8 ] } }, + { "type": "Feature", "properties": { "id": "pr2017261001", "mag": 2.61, "time": 1505746245880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -64.7745, 18.8611, 60.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16848698", "mag": 2.1, "time": 1505746048831, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6658, 61.6841, 99.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq9s", "mag": 4.1, "time": 1505745176040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3907, 51.552, 15.01 ] } }, + { "type": "Feature", "properties": { "id": "us2000apxn", "mag": 4.9, "time": 1505745090220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.9092, -17.3471, 45.41 ] } }, + { "type": "Feature", "properties": { "id": "us2000apxj", "mag": 4.3, "time": 1505744936080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.2186, -31.8431, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00605771", "mag": 1.4, "time": 1505744651408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1135, 37.3693, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000apx5", "mag": 5.6, "time": 1505744352870, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5576, 15.2537, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16905668", "mag": 2.5, "time": 1505742582241, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.8697, 55.3906, 161.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000apwd", "mag": 5.8, "time": 1505742416590, "felt": 129, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.147, -31.82, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000apz2", "mag": 2.7, "time": 1505742004420, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5215, 46.8389, 9.05 ] } }, + { "type": "Feature", "properties": { "id": "nn00605759", "mag": 1.7, "time": 1505741994692, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.124, 38.2695, 11.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000apw7", "mag": 4.6, "time": 1505741142110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 167.9613, 54.8175, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16905665", "mag": 1.6, "time": 1505741113018, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.6727, 58.1121, 86.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16905664", "mag": 1.1, "time": 1505740639920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4494, 63.2584, 114.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72894591", "mag": 2.07, "time": 1505739410930, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0555, 37.236667, 7.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16848204", "mag": 1.1, "time": 1505739204689, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.9796, 60.2252, 8.2 ] } }, + { "type": "Feature", "properties": { "id": "mb80256214", "mag": 2.14, "time": 1505739119730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5825, 46.902333, 13.02 ] } }, + { "type": "Feature", "properties": { "id": "nc72894586", "mag": 2.01, "time": 1505738526550, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.378, 36.3415, 3.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16847753", "mag": 1.3, "time": 1505737613815, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1555, 60.2089, 8.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000apvj", "mag": 5.0, "time": 1505736665230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9085, -30.4189, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000apva", "mag": 4.9, "time": 1505736421580, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9784, 16.2017, 42.11 ] } }, + { "type": "Feature", "properties": { "id": "nc72894571", "mag": 1.07, "time": 1505736271580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.784332, 38.838333, 0.08 ] } }, + { "type": "Feature", "properties": { "id": "nc72894556", "mag": 0.97, "time": 1505736021180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818001, 38.813499, 2.19 ] } }, + { "type": "Feature", "properties": { "id": "ak16847743", "mag": 2.1, "time": 1505735884769, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3712, 59.8705, 71.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16847742", "mag": 1.0, "time": 1505735834346, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8742, 61.715, 45.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16905659", "mag": 1.3, "time": 1505735311381, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8392, 63.0532, 129.1 ] } }, + { "type": "Feature", "properties": { "id": "mb80256209", "mag": 1.05, "time": 1505734177450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.518, 46.853667, 12.03 ] } }, + { "type": "Feature", "properties": { "id": "mb80256199", "mag": 1.81, "time": 1505733980660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.487833, 46.873667, 12.76 ] } }, + { "type": "Feature", "properties": { "id": "nc72894526", "mag": 1.16, "time": 1505733885060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8005, 38.805833, 2.04 ] } }, + { "type": "Feature", "properties": { "id": "ak16847290", "mag": 1.5, "time": 1505733696824, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5693, 64.3804, 8.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72894516", "mag": 1.04, "time": 1505733506920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.814163, 38.801998, 2.32 ] } }, + { "type": "Feature", "properties": { "id": "us2000aur7", "mag": 3.1, "time": 1505733485810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.7034, 52.2855, 34.99 ] } }, + { "type": "Feature", "properties": { "id": "ak16847284", "mag": 1.4, "time": 1505732610976, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6388, 61.2241, 50.7 ] } }, + { "type": "Feature", "properties": { "id": "ci37765935", "mag": 1.95, "time": 1505732049210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.924667, 34.9205, 5.15 ] } }, + { "type": "Feature", "properties": { "id": "ci37765927", "mag": 1.35, "time": 1505731803760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3425, 35.462, 3.59 ] } }, + { "type": "Feature", "properties": { "id": "nc72894501", "mag": 1.64, "time": 1505731051670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.950333, 41.046833, 9.17 ] } }, + { "type": "Feature", "properties": { "id": "ak16905652", "mag": 2.0, "time": 1505729940504, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.5491, 54.9912, 67.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16846821", "mag": 3.6, "time": 1505729929794, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5426, 63.5414, 107.9 ] } }, + { "type": "Feature", "properties": { "id": "hv61912566", "mag": 1.91, "time": 1505728760570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.608167, 19.4375, 2.822 ] } }, + { "type": "Feature", "properties": { "id": "ak16846819", "mag": 1.2, "time": 1505728039731, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.773, 63.2917, 2.1 ] } }, + { "type": "Feature", "properties": { "id": "pr2017261000", "mag": 2.03, "time": 1505727803000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2451, 18.1321, 32.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37765911", "mag": 1.15, "time": 1505727350640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.034667, 34.574333, 8.17 ] } }, + { "type": "Feature", "properties": { "id": "nc72894496", "mag": 1.16, "time": 1505727178720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.815002, 38.806999, 3.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16846817", "mag": 1.3, "time": 1505726686491, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5195, 61.7191, 48.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72894491", "mag": 1.99, "time": 1505726671730, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.177167, 36.580167, 5.17 ] } }, + { "type": "Feature", "properties": { "id": "ak16846815", "mag": 1.4, "time": 1505726488235, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.0878, 61.0048, 19.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16846813", "mag": 1.3, "time": 1505726256030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0016, 62.7051, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16846811", "mag": 1.2, "time": 1505725663332, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7382, 59.7002, 39.4 ] } }, + { "type": "Feature", "properties": { "id": "nn00605720", "mag": 1.9, "time": 1505725520932, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0964, 37.3646, 4.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16905644", "mag": 1.4, "time": 1505724853854, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.3038, 57.9653, 66.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72894486", "mag": 1.37, "time": 1505724683560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.892833, 39.342333, 17.73 ] } }, + { "type": "Feature", "properties": { "id": "ak16905643", "mag": 1.3, "time": 1505724218199, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9106, 60.4014, 74.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16846810", "mag": 1.2, "time": 1505724188489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4141, 63.186, 102.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16846807", "mag": 2.8, "time": 1505723956077, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0917, 53.5664, 54.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16846803", "mag": 1.3, "time": 1505723952516, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.705, 62.5617, 9.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16846799", "mag": 1.9, "time": 1505723888518, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5274, 59.9845, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16846358", "mag": 1.3, "time": 1505723457765, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9157, 63.5359, 3.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72894456", "mag": 1.22, "time": 1505721765430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.157, 36.5615, 3.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16905637", "mag": 1.8, "time": 1505721695198, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.5368, 53.884, 45.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16846355", "mag": 1.3, "time": 1505721374282, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8253, 64.8958, 12.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16846352", "mag": 1.3, "time": 1505721334563, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8755, 64.8906, 14.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16846351", "mag": 1.4, "time": 1505720984307, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6407, 59.7861, 56.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16905633", "mag": 1.2, "time": 1505720070282, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2909, 61.9803, 75.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16905632", "mag": 1.3, "time": 1505720064076, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7225, 60.6284, 40.3 ] } }, + { "type": "Feature", "properties": { "id": "ci37765871", "mag": 0.96, "time": 1505719770880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.790667, 33.495, 4.99 ] } }, + { "type": "Feature", "properties": { "id": "hv61912506", "mag": 1.73, "time": 1505719651510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.218167, 19.4285, 29.836 ] } }, + { "type": "Feature", "properties": { "id": "nc72894436", "mag": 1.05, "time": 1505719249700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0175, 37.221333, 9.74 ] } }, + { "type": "Feature", "properties": { "id": "nc72894411", "mag": 1.53, "time": 1505718670360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827167, 38.8125, 1.64 ] } }, + { "type": "Feature", "properties": { "id": "ak16845911", "mag": 1.3, "time": 1505718573027, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.2238, 64.9935, 6.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72894406", "mag": 1.22, "time": 1505718182950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.180167, 36.585333, 5.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16845908", "mag": 1.1, "time": 1505717899889, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0029, 61.1046, 1.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16845905", "mag": 2.8, "time": 1505717405495, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0451, 53.5595, 58.8 ] } }, + { "type": "Feature", "properties": { "id": "mb80256179", "mag": 2.84, "time": 1505717382030, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.576167, 48.519, 10.89 ] } }, + { "type": "Feature", "properties": { "id": "ci37765839", "mag": 1.11, "time": 1505716385670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6075, 32.833667, 11.71 ] } }, + { "type": "Feature", "properties": { "id": "ak16905628", "mag": 1.2, "time": 1505716158469, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5838, 63.1688, 113.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16905627", "mag": 1.2, "time": 1505715377323, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6661, 60.0063, 5.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16845901", "mag": 1.6, "time": 1505714845138, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4484, 61.3659, 46.1 ] } }, + { "type": "Feature", "properties": { "id": "mb80256174", "mag": 1.81, "time": 1505714255290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529333, 46.9025, 12.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16845458", "mag": 1.9, "time": 1505713543034, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4235, 61.487, 4.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16845453", "mag": 3.2, "time": 1505712925929, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0259, 53.5803, 50.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000apru", "mag": 5.7, "time": 1505712483490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -12.7162, -18.5262, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00605697", "mag": 1.0, "time": 1505711755570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9167, 38.4153, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16845450", "mag": 2.7, "time": 1505711653057, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.4353, 51.7384, 88.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16845451", "mag": 1.4, "time": 1505711579811, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0383, 61.8395, 66.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72894331", "mag": 2.68, "time": 1505711256010, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -125.213167, 41.036, 15.48 ] } }, + { "type": "Feature", "properties": { "id": "us2000apre", "mag": 3.6, "time": 1505710149350, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.457, 42.6072, 5.27 ] } }, + { "type": "Feature", "properties": { "id": "uu60247312", "mag": 1.94, "time": 1505709538260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.024833, 44.791, 10.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16845447", "mag": 1.6, "time": 1505709232112, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.234, 53.4469, 14.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37765759", "mag": 1.11, "time": 1505708432940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797, 33.496667, 4.85 ] } }, + { "type": "Feature", "properties": { "id": "nm60206976", "mag": 2.5, "time": 1505708310780, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.764167, 36.103833, 7.78 ] } }, + { "type": "Feature", "properties": { "id": "nc72894281", "mag": 1.78, "time": 1505708211260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.583, 36.899833, 6.75 ] } }, + { "type": "Feature", "properties": { "id": "ak16845444", "mag": 1.6, "time": 1505708018964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0127, 61.0975, 1.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16845440", "mag": 1.7, "time": 1505706867753, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5639, 63.255, 126.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16845438", "mag": 3.0, "time": 1505706621950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0175, 55.7675, 33.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37765751", "mag": 1.44, "time": 1505706060150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797, 33.6865, 17.69 ] } }, + { "type": "Feature", "properties": { "id": "uu60247287", "mag": 2.42, "time": 1505704855680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.429167, 42.593667, 7.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16845431", "mag": 2.4, "time": 1505704484262, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8583, 58.216, 42.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16845430", "mag": 1.1, "time": 1505704418776, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2714, 58.1899, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80256144", "mag": 1.01, "time": 1505704182270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.526333, 46.8725, 13.72 ] } }, + { "type": "Feature", "properties": { "id": "ak16905611", "mag": 1.0, "time": 1505704113848, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9313, 61.6519, 67.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72894211", "mag": 1.84, "time": 1505703109320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.735167, 37.656, 5.91 ] } }, + { "type": "Feature", "properties": { "id": "ak16845426", "mag": 1.6, "time": 1505702885799, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6172, 61.5636, 14.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37765687", "mag": 1.59, "time": 1505702779150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.919833, 33.9785, 4.46 ] } }, + { "type": "Feature", "properties": { "id": "nn00605680", "mag": 1.4, "time": 1505702728608, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.713, 38.8287, 9.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16844993", "mag": 1.3, "time": 1505701093513, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5107, 62.1708, 21.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000awky", "mag": 4.1, "time": 1505700898950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3513, 15.0304, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37765671", "mag": 1.43, "time": 1505700367060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.172167, 34.033667, 5.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16905606", "mag": 1.2, "time": 1505699859087, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8715, 60.6663, 44.3 ] } }, + { "type": "Feature", "properties": { "id": "uw61330596", "mag": 1.49, "time": 1505699530930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.847333, 47.759167, 17.25 ] } }, + { "type": "Feature", "properties": { "id": "us2000apq2", "mag": 4.2, "time": 1505699407130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2351, 15.3068, 42.58 ] } }, + { "type": "Feature", "properties": { "id": "us2000awly", "mag": 4.2, "time": 1505698782750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1304, 14.9812, 38.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16905605", "mag": 1.0, "time": 1505698554304, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5172, 62.1736, 24.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72894176", "mag": 2.03, "time": 1505698095820, "felt": 171, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.295333, 37.912, 2.97 ] } }, + { "type": "Feature", "properties": { "id": "us2000appq", "mag": 4.5, "time": 1505697812820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 159.3367, 53.381, 85.64 ] } }, + { "type": "Feature", "properties": { "id": "ci37765639", "mag": 1.01, "time": 1505697641450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7125, 33.986833, 15.48 ] } }, + { "type": "Feature", "properties": { "id": "us2000appj", "mag": 4.2, "time": 1505697430690, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.5275, -17.5255, 167.68 ] } }, + { "type": "Feature", "properties": { "id": "ak16844988", "mag": 1.0, "time": 1505697245375, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1193, 62.3401, 0.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37765631", "mag": 1.87, "time": 1505697080810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.650333, 36.996833, -0.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16905602", "mag": 1.4, "time": 1505696884087, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1499, 61.9617, 114.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16844556", "mag": 1.5, "time": 1505696691069, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.8744, 60.2484, 9.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000azbk", "mag": 4.0, "time": 1505696468620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5206, 14.824, 18.19 ] } }, + { "type": "Feature", "properties": { "id": "ak16844553", "mag": 1.3, "time": 1505696463448, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4081, 64.6136, 20.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72894161", "mag": 1.21, "time": 1505695849630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.818833, 37.41, -0.31 ] } }, + { "type": "Feature", "properties": { "id": "us2000awku", "mag": 4.1, "time": 1505694807240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.306, 19.0286, 202.23 ] } }, + { "type": "Feature", "properties": { "id": "us2000app7", "mag": 4.4, "time": 1505694748030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 119.3564, -8.1346, 41.72 ] } }, + { "type": "Feature", "properties": { "id": "nn00605668", "mag": 1.2, "time": 1505694738920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.3624, 37.0509, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16844544", "mag": 2.0, "time": 1505694295643, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7281, 60.3555, 46.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16844543", "mag": 1.8, "time": 1505694278381, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7896, 59.8626, 4.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72894151", "mag": 1.42, "time": 1505693902060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.912833, 37.621667, 2.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16844541", "mag": 1.3, "time": 1505693551555, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.791, 61.7452, 48.2 ] } }, + { "type": "Feature", "properties": { "id": "mb80256109", "mag": 1.41, "time": 1505690846740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.522, 46.869667, 12.91 ] } }, + { "type": "Feature", "properties": { "id": "ci37765583", "mag": 1.3, "time": 1505690496480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.673167, 35.042833, -0.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16873959", "mag": 1.1, "time": 1505690288149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4144, 67.2216, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16844094", "mag": 1.9, "time": 1505690276630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.3972, 53.7854, 6.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000apnm", "mag": 4.9, "time": 1505689940400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 149.5672, -4.6379, 588.19 ] } }, + { "type": "Feature", "properties": { "id": "mb80256099", "mag": 2.34, "time": 1505689339390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5195, 46.899167, 12.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16844091", "mag": 1.5, "time": 1505688162418, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.5592, 60.9727, 72.2 ] } }, + { "type": "Feature", "properties": { "id": "mb80256084", "mag": 1.49, "time": 1505688150190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.8165, 46.9305, 13.74 ] } }, + { "type": "Feature", "properties": { "id": "nc72894131", "mag": 0.95, "time": 1505687822870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.026667, 36.453333, 2.98 ] } }, + { "type": "Feature", "properties": { "id": "nc72894126", "mag": 1.46, "time": 1505687740270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.618333, 36.970833, 5.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16844087", "mag": 1.3, "time": 1505686236328, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3499, 60.4807, 6.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16844084", "mag": 1.7, "time": 1505686047172, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7406, 64.6981, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16844079", "mag": 2.1, "time": 1505685489298, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3304, 60.4706, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "uw61330461", "mag": 2.46, "time": 1505684983130, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.725333, 47.439333, 22.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16873952", "mag": 2.2, "time": 1505684866449, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.006, 52.386, 9.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72894116", "mag": 1.14, "time": 1505684450170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.571833, 37.947167, 8.37 ] } }, + { "type": "Feature", "properties": { "id": "ak16873951", "mag": 1.3, "time": 1505684432066, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.6357, 60.5724, 2.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16843656", "mag": 1.6, "time": 1505683789980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1167, 59.7703, 41.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16843652", "mag": 1.6, "time": 1505683291823, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4894, 61.5289, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72894101", "mag": 1.41, "time": 1505682978360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834, 37.496, 1.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16843651", "mag": 2.6, "time": 1505682712646, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.4711, 51.686, 75.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72894096", "mag": 0.99, "time": 1505682599530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.816167, 37.455833, 1.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16843650", "mag": 1.2, "time": 1505682068077, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5842, 61.7746, 3.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72894086", "mag": 1.35, "time": 1505681812610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.973667, 36.395167, 4.69 ] } }, + { "type": "Feature", "properties": { "id": "nc72894081", "mag": 1.91, "time": 1505681477080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.809167, 38.797667, 3.52 ] } }, + { "type": "Feature", "properties": { "id": "nc72894076", "mag": 1.47, "time": 1505681470510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810167, 38.799167, 3.08 ] } }, + { "type": "Feature", "properties": { "id": "ak16873946", "mag": 1.4, "time": 1505680958230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1812, 62.2538, 76.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000apkx", "mag": 4.9, "time": 1505680147260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.9501, -18.9829, 129.26 ] } }, + { "type": "Feature", "properties": { "id": "ak16843225", "mag": 1.3, "time": 1505680062920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5209, 60.1956, 82.1 ] } }, + { "type": "Feature", "properties": { "id": "ci37765519", "mag": 1.42, "time": 1505680024130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.293, 35.488167, 2.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16873944", "mag": 1.3, "time": 1505679233862, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2975, 62.163, 79.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16873943", "mag": 1.8, "time": 1505678992249, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.8219, 51.8825, 86.4 ] } }, + { "type": "Feature", "properties": { "id": "uw61330431", "mag": 1.0, "time": 1505678333060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.5365, 47.603667, 19.51 ] } }, + { "type": "Feature", "properties": { "id": "ci37765487", "mag": 1.12, "time": 1505676865320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.608667, 32.830167, 11.82 ] } }, + { "type": "Feature", "properties": { "id": "us2000apke", "mag": 4.1, "time": 1505676865110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.5905, 12.0757, 53.01 ] } }, + { "type": "Feature", "properties": { "id": "us2000apkd", "mag": 3.9, "time": 1505676791370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -70.2379, -31.7388, 121.68 ] } }, + { "type": "Feature", "properties": { "id": "ci37765479", "mag": 1.54, "time": 1505676576290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.605333, 32.8245, 11.96 ] } }, + { "type": "Feature", "properties": { "id": "us2000apkc", "mag": 2.5, "time": 1505676527950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4244, 42.5958, 5.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00605653", "mag": 1.3, "time": 1505676457309, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.12, 38.2855, 13.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72894061", "mag": 1.21, "time": 1505675373140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.059667, 36.477833, 6.98 ] } }, + { "type": "Feature", "properties": { "id": "us2000apk4", "mag": 3.1, "time": 1505674381070, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.9818, 35.7788, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16842798", "mag": 1.4, "time": 1505672288384, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7121, 63.5719, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16842797", "mag": 2.7, "time": 1505669173773, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4976, 51.6544, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "mb80256039", "mag": 1.09, "time": 1505668834370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.6775, 46.891833, 15.96 ] } }, + { "type": "Feature", "properties": { "id": "ak16873938", "mag": 1.2, "time": 1505668625975, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5592, 62.857, 82.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37765423", "mag": 1.4, "time": 1505668324590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.831333, 32.775833, 2.46 ] } }, + { "type": "Feature", "properties": { "id": "ak16842795", "mag": 1.1, "time": 1505668022720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4003, 64.8531, 2.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72894026", "mag": 1.3, "time": 1505667983860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.734667, 38.788167, 1.43 ] } }, + { "type": "Feature", "properties": { "id": "ak16873936", "mag": 1.6, "time": 1505667107903, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0584, 57.21, 33.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37765415", "mag": 1.52, "time": 1505666643390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.833167, 32.781833, 2.39 ] } }, + { "type": "Feature", "properties": { "id": "ci37765407", "mag": 0.98, "time": 1505666358680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.273667, 33.981333, 6.22 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5v", "mag": 4.3, "time": 1505665820280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.2591, 0.908, 157.83 ] } }, + { "type": "Feature", "properties": { "id": "pr2017260000", "mag": 2.31, "time": 1505665148110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.9698, 19.0821, 23.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000apj3", "mag": 2.6, "time": 1505664664460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4059, 42.5497, 11.14 ] } }, + { "type": "Feature", "properties": { "id": "us2000apj0", "mag": 2.7, "time": 1505663998840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4107, 42.5429, 8.67 ] } }, + { "type": "Feature", "properties": { "id": "uw61330391", "mag": 1.11, "time": 1505663462920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.04, 46.880167, 6.02 ] } }, + { "type": "Feature", "properties": { "id": "uu60247022", "mag": 1.06, "time": 1505663122580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.025833, 44.790333, 9.98 ] } }, + { "type": "Feature", "properties": { "id": "nn00606540", "mag": 1.3, "time": 1505663040033, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.0921, 41.885, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16873932", "mag": 1.9, "time": 1505662296127, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.8489, 51.9624, 111.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5n", "mag": 4.5, "time": 1505662282900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.7612, 44.1688, 33.57 ] } }, + { "type": "Feature", "properties": { "id": "mb80255969", "mag": 2.04, "time": 1505662108810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.516, 46.881333, 14.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5p", "mag": 4.5, "time": 1505662091100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 149.0118, -6.3464, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16873931", "mag": 1.4, "time": 1505662034661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.362, 63.1318, 2.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000at68", "mag": 4.3, "time": 1505661360280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 148.9733, -6.4551, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16841969", "mag": 1.1, "time": 1505661169528, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6029, 66.5697, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "mb80255949", "mag": 1.49, "time": 1505659897070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.519, 46.855, 14.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000apij", "mag": 5.4, "time": 1505659803240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.6428, -16.6386, 30.39 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5x", "mag": 5.0, "time": 1505659691430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 92.0846, 12.809, 27.48 ] } }, + { "type": "Feature", "properties": { "id": "ci37765367", "mag": 1.03, "time": 1505659458990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.19, 33.2585, 9.58 ] } }, + { "type": "Feature", "properties": { "id": "nc72893976", "mag": 1.19, "time": 1505659223910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.825, 37.453, 1.57 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5m", "mag": 4.9, "time": 1505658989080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 149.1591, -6.3567, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000apie", "mag": 4.5, "time": 1505658574670, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 24.0015, 39.2721, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16841552", "mag": 1.3, "time": 1505658549717, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9309, 62.6606, 59.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000apif", "mag": 5.7, "time": 1505658367620, "felt": 0, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 148.8708, -6.3113, 18.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5l", "mag": 4.3, "time": 1505658365190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -17.9505, 64.5019, 9.15 ] } }, + { "type": "Feature", "properties": { "id": "us2000aza1", "mag": 4.2, "time": 1505658191320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5959, 15.2169, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000at6b", "mag": 4.6, "time": 1505658184020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -17.6137, 64.4904, 8.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16841550", "mag": 1.4, "time": 1505657865000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8499, 59.8804, 5.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37765335", "mag": 1.11, "time": 1505657294840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.367, 33.357167, 9.18 ] } }, + { "type": "Feature", "properties": { "id": "ak16841549", "mag": 1.4, "time": 1505657219284, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.0876, 69.5184, 4.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72893941", "mag": 1.51, "time": 1505657160730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818333, 38.818167, 2.23 ] } }, + { "type": "Feature", "properties": { "id": "nc72893946", "mag": 1.02, "time": 1505657152440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.817001, 38.8185, 2.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16873926", "mag": 1.7, "time": 1505656923604, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8082, 60.1773, 106.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16873925", "mag": 1.9, "time": 1505656654419, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6293, 59.5728, 120.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37765327", "mag": 2.88, "time": 1505656629430, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.882333, 31.6215, 9.25 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5k", "mag": 4.1, "time": 1505656609750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 126.5305, 1.7746, 37.54 ] } }, + { "type": "Feature", "properties": { "id": "nc72893936", "mag": 0.98, "time": 1505656502420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.125667, 36.566167, 8.44 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5i", "mag": 4.4, "time": 1505655648380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.9394, -17.3298, 553.92 ] } }, + { "type": "Feature", "properties": { "id": "se60044613", "mag": 2.03, "time": 1505655579030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -85.053333, 35.561333, 15.47 ] } }, + { "type": "Feature", "properties": { "id": "ci37765311", "mag": 1.07, "time": 1505655296260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.090333, 33.473833, 14.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16841547", "mag": 1.9, "time": 1505655282227, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7794, 63.9496, 114.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5r", "mag": 4.9, "time": 1505655030310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -11.7611, -21.01, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000as44", "mag": 2.6, "time": 1505654924870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.7236, 51.4933, 34.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16841538", "mag": 2.3, "time": 1505654819006, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6722, 62.9044, 66.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37765303", "mag": 0.97, "time": 1505654141860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.922167, 33.9755, 4.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000aphx", "mag": 4.0, "time": 1505653928680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4533, 15.5042, 7.94 ] } }, + { "type": "Feature", "properties": { "id": "ak16841537", "mag": 1.0, "time": 1505653531820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3466, 61.07, 12.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72893916", "mag": 0.99, "time": 1505653446980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835, 37.479333, 0.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16841536", "mag": 1.4, "time": 1505653266021, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6794, 67.9633, 14.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16841136", "mag": 1.5, "time": 1505652267061, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.9646, 53.8971, 6.6 ] } }, + { "type": "Feature", "properties": { "id": "nn00605626", "mag": 1.0, "time": 1505652081143, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2815, 36.537, 7.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16841133", "mag": 1.8, "time": 1505651930739, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7652, 62.1126, 23.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16841130", "mag": 2.2, "time": 1505651632523, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.454, 59.2923, 97.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37765271", "mag": 1.39, "time": 1505650827610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.021167, 33.921, 2.44 ] } }, + { "type": "Feature", "properties": { "id": "hv61911226", "mag": 1.91, "time": 1505650411260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.478668, 19.212334, 38.03 ] } }, + { "type": "Feature", "properties": { "id": "ak16841124", "mag": 2.1, "time": 1505649687852, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.7865, 65.3345, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72893881", "mag": 1.23, "time": 1505648682040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.543833, 37.339667, 10.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16840722", "mag": 3.2, "time": 1505648575230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.7144, 57.2975, 42.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5g", "mag": 4.3, "time": 1505647937400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 166.6171, -11.7459, 251.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16873911", "mag": 2.6, "time": 1505647578270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.7891, 66.3882, 37.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16873910", "mag": 2.0, "time": 1505647575716, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.55, 57.7487, 89.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16873909", "mag": 2.8, "time": 1505647412246, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.7412, 66.3682, 34.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16840719", "mag": 2.1, "time": 1505647228188, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4607, 60.5815, 14.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37765239", "mag": 1.03, "time": 1505646849520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.920667, 33.972167, 5.29 ] } }, + { "type": "Feature", "properties": { "id": "us2000aph6", "mag": 4.2, "time": 1505646653440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.3399, -21.9058, 192.78 ] } }, + { "type": "Feature", "properties": { "id": "us2000aph5", "mag": 4.7, "time": 1505646260660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 127.0437, 3.6252, 68.15 ] } }, + { "type": "Feature", "properties": { "id": "ak16873907", "mag": 2.2, "time": 1505645846935, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4823, 51.6608, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16873906", "mag": 1.2, "time": 1505645773090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.3827, 53.8702, 12.1 ] } }, + { "type": "Feature", "properties": { "id": "uw61330311", "mag": 1.94, "time": 1505644617240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.041167, 46.879167, 6.84 ] } }, + { "type": "Feature", "properties": { "id": "ak16840715", "mag": 1.5, "time": 1505644280463, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.605, 61.6723, 29.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37765223", "mag": 1.02, "time": 1505644185880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.465667, 34.376833, 9.74 ] } }, + { "type": "Feature", "properties": { "id": "ci37765215", "mag": 1.28, "time": 1505644151980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.358167, 33.415667, 12.48 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5e", "mag": 4.5, "time": 1505644031790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 92.0628, 12.7773, 33.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16873903", "mag": 1.4, "time": 1505643609236, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5971, 61.5891, 59.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16840713", "mag": 1.9, "time": 1505643118540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.0384, 63.1445, 14.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61911016", "mag": 2.48, "time": 1505641665420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.593167, 19.476, 2.731 ] } }, + { "type": "Feature", "properties": { "id": "ak16840350", "mag": 1.1, "time": 1505641100972, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8915, 64.848, 8.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5c", "mag": 4.7, "time": 1505640684330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -26.4288, -59.7896, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16840314", "mag": 2.8, "time": 1505640505656, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.6831, 60.3761, 2.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000apgy", "mag": 4.9, "time": 1505640302130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.2485, 37.3415, 54.96 ] } }, + { "type": "Feature", "properties": { "id": "us2000at65", "mag": 4.6, "time": 1505640090990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -13.5314, -7.0219, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000as3y", "mag": 2.7, "time": 1505639953270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.1147, 51.5611, 45.65 ] } }, + { "type": "Feature", "properties": { "id": "us2000at5a", "mag": 4.8, "time": 1505639681290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -13.1689, -7.0877, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16840312", "mag": 2.1, "time": 1505638931288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0719, 60.2719, 130.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16840302", "mag": 2.8, "time": 1505638686114, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2164, 60.4788, 97.5 ] } }, + { "type": "Feature", "properties": { "id": "uu60246942", "mag": 1.01, "time": 1505637537950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.025833, 44.786167, 7.95 ] } }, + { "type": "Feature", "properties": { "id": "nc72893791", "mag": 1.48, "time": 1505637347930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.879167, 37.109167, 2.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16839942", "mag": 1.9, "time": 1505637129909, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8564, 60.3231, 63.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72893786", "mag": 1.14, "time": 1505636971290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.737335, 38.786167, 0.85 ] } }, + { "type": "Feature", "properties": { "id": "nc72893781", "mag": 2.61, "time": 1505636516400, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.117, 36.594333, 6.98 ] } }, + { "type": "Feature", "properties": { "id": "us2000apg4", "mag": 4.6, "time": 1505636241220, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.1696, 7.5057, 23.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16839932", "mag": 1.1, "time": 1505636239228, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8157, 63.2668, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000apg0", "mag": 4.1, "time": 1505634585840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.7666, -23.8893, 236.18 ] } }, + { "type": "Feature", "properties": { "id": "ci37765143", "mag": 2.2, "time": 1505634363500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.373667, 32.9405, 7.78 ] } }, + { "type": "Feature", "properties": { "id": "nn00605603", "mag": 1.8, "time": 1505634209242, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8894, 38.3778, 11.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000apfv", "mag": 2.4, "time": 1505634047190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4463, 42.5857, 4.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16839551", "mag": 1.9, "time": 1505633391424, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7184, 59.603, 74.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72893741", "mag": 1.84, "time": 1505633100770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834167, 37.493833, 1.09 ] } }, + { "type": "Feature", "properties": { "id": "us2000apft", "mag": 2.6, "time": 1505632181750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4391, 42.6077, 6.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37765127", "mag": 0.98, "time": 1505632149420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.605167, 32.828333, 10.94 ] } }, + { "type": "Feature", "properties": { "id": "nc72893701", "mag": 1.35, "time": 1505631284810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.952833, 37.588167, 1.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000apfk", "mag": 4.3, "time": 1505630160580, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.6223, -35.7292, 85.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16839518", "mag": 2.0, "time": 1505629372703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7555, 60.0405, 18.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72893646", "mag": 1.36, "time": 1505628925460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.736667, 38.757, 1.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16873889", "mag": 2.9, "time": 1505628904808, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.5935, 53.8081, 78.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000apfd", "mag": 2.9, "time": 1505628801990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4531, 42.5908, 5.17 ] } }, + { "type": "Feature", "properties": { "id": "uu60246882", "mag": 1.05, "time": 1505628704550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.836, 44.307333, 7.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16873888", "mag": 1.1, "time": 1505628661963, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5848, 64.1727, 10.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000apfa", "mag": 4.9, "time": 1505628478300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9805, 16.0409, 45.23 ] } }, + { "type": "Feature", "properties": { "id": "uu60246872", "mag": 1.16, "time": 1505628425450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.817667, 44.294, 7.61 ] } }, + { "type": "Feature", "properties": { "id": "uu60246867", "mag": 1.13, "time": 1505628332210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.828167, 44.305167, 7.48 ] } }, + { "type": "Feature", "properties": { "id": "us2000apf6", "mag": 4.5, "time": 1505628213110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0121, 16.1058, 52.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16839149", "mag": 1.6, "time": 1505628012027, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2, 62.1778, 6.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000apf5", "mag": 4.3, "time": 1505627809940, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -88.5423, 14.4117, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37765039", "mag": 1.19, "time": 1505627007650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0955, 36.761167, 1.69 ] } }, + { "type": "Feature", "properties": { "id": "uu60246847", "mag": 3.15, "time": 1505626724050, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.841667, 44.302333, 7.53 ] } }, + { "type": "Feature", "properties": { "id": "uu60246837", "mag": 2.04, "time": 1505626455220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.822333, 44.293667, 7.53 ] } }, + { "type": "Feature", "properties": { "id": "ci37765023", "mag": 1.52, "time": 1505626163830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797833, 33.501167, 4.62 ] } }, + { "type": "Feature", "properties": { "id": "us2000apeu", "mag": 4.4, "time": 1505625898530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -86.4078, 10.7018, 35.32 ] } }, + { "type": "Feature", "properties": { "id": "nc72893621", "mag": 1.12, "time": 1505625800310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810165, 38.820499, 1.92 ] } }, + { "type": "Feature", "properties": { "id": "ci37764991", "mag": 1.62, "time": 1505625396010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.928167, 35.9015, 5.28 ] } }, + { "type": "Feature", "properties": { "id": "ci37764983", "mag": 1.96, "time": 1505624889150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.181, 33.187833, 5.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16838778", "mag": 1.4, "time": 1505624855438, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4712, 59.8595, 42.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72893601", "mag": 1.37, "time": 1505624608110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.8885, 37.105, 1.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16838775", "mag": 3.2, "time": 1505624284096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.1812, 54.0118, 9.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000apeh", "mag": 4.3, "time": 1505624194760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -105.7123, 17.7366, 31.43 ] } }, + { "type": "Feature", "properties": { "id": "ak16838774", "mag": 1.8, "time": 1505623546848, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7399, 59.8813, 5.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16838756", "mag": 1.2, "time": 1505622986310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8141, 63.2696, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16838752", "mag": 1.7, "time": 1505622626171, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.3598, 64.3838, 13.9 ] } }, + { "type": "Feature", "properties": { "id": "ci37764967", "mag": 0.95, "time": 1505622039760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1755, 33.965, 15.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16873881", "mag": 2.7, "time": 1505621586321, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.8861, 52.4075, 59.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16873880", "mag": 1.0, "time": 1505621507758, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3176, 61.144, 19.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16838400", "mag": 1.9, "time": 1505621153075, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1301, 60.8625, 64.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16838393", "mag": 2.5, "time": 1505620853506, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8794, 60.7582, 60.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16838388", "mag": 2.8, "time": 1505620146422, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7851, 59.8817, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72893571", "mag": 1.03, "time": 1505619694280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.821167, 38.807999, 1.94 ] } }, + { "type": "Feature", "properties": { "id": "ak16838386", "mag": 2.2, "time": 1505619628700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.9053, 67.6564, 13.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72893561", "mag": 1.07, "time": 1505619296320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.822502, 38.808998, 1.93 ] } }, + { "type": "Feature", "properties": { "id": "ci37764903", "mag": 1.12, "time": 1505618790010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.147333, 34.5405, 9.83 ] } }, + { "type": "Feature", "properties": { "id": "ak16838042", "mag": 1.6, "time": 1505617352105, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5056, 61.4142, 8.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16838020", "mag": 1.2, "time": 1505616366369, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6618, 60.5653, 6.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16838003", "mag": 1.0, "time": 1505615565391, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2146, 64.7331, 17.7 ] } }, + { "type": "Feature", "properties": { "id": "ci37764863", "mag": 1.1, "time": 1505613255300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.709667, 33.653333, 15.82 ] } }, + { "type": "Feature", "properties": { "id": "ci37764847", "mag": 1.21, "time": 1505612591880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.687167, 33.6285, 12.15 ] } }, + { "type": "Feature", "properties": { "id": "ci37764839", "mag": 1.47, "time": 1505612490180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.927167, 33.971833, 17.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16837647", "mag": 1.8, "time": 1505611875649, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.771, 59.8672, 1.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16873869", "mag": 1.7, "time": 1505609079690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.474, 51.671, 16.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61910741", "mag": 2.42, "time": 1505608202930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.177667, 19.442, 41.639 ] } }, + { "type": "Feature", "properties": { "id": "ak16836972", "mag": 2.6, "time": 1505606832814, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3048, 51.6525, 97.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37764815", "mag": 0.95, "time": 1505606822450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.746333, 33.887, 16.59 ] } }, + { "type": "Feature", "properties": { "id": "ak16836965", "mag": 2.3, "time": 1505606388180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7659, 59.8663, 5.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16836961", "mag": 2.4, "time": 1505606178328, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7941, 59.8509, 5.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16836957", "mag": 1.8, "time": 1505606050093, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.89, 59.8885, 15.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16860570", "mag": 1.4, "time": 1505605718038, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8821, 59.8989, 17.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16860569", "mag": 1.6, "time": 1505605674005, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8902, 59.9059, 15.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16860568", "mag": 1.9, "time": 1505605456859, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8916, 59.9103, 15.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16860567", "mag": 2.3, "time": 1505605410411, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.9, 59.889, 12.6 ] } }, + { "type": "Feature", "properties": { "id": "uw61330071", "mag": 2.57, "time": 1505605382130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.863333, 45.526833, 36.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000apcc", "mag": 5.1, "time": 1505605083280, "felt": 218, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -136.7498, 59.9037, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000apbv", "mag": 3.9, "time": 1505604419110, "felt": 198, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.6989, 35.8586, 2.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16836912", "mag": 2.9, "time": 1505604383308, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6017, 51.905, 128.2 ] } }, + { "type": "Feature", "properties": { "id": "uw61329986", "mag": 1.23, "time": 1505604005810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.754167, 46.857333, 1.43 ] } }, + { "type": "Feature", "properties": { "id": "us2000apbu", "mag": 4.7, "time": 1505603696310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -14.0114, -17.7554, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16860564", "mag": 1.6, "time": 1505603516964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1524, 61.3778, 62.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000apbm", "mag": 4.5, "time": 1505603442050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1822, 15.4761, 67.03 ] } }, + { "type": "Feature", "properties": { "id": "nc72893446", "mag": 2.29, "time": 1505603337140, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.616833, 36.971, 4.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16860563", "mag": 1.5, "time": 1505603223363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.5667, 57.9908, 15.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16860562", "mag": 1.6, "time": 1505602163820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0011, 60.0807, 110.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16836589", "mag": 1.7, "time": 1505601390855, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7769, 62.4045, 59.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72893436", "mag": 1.34, "time": 1505600967450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834167, 37.493, 0.66 ] } }, + { "type": "Feature", "properties": { "id": "uw61329976", "mag": 1.03, "time": 1505600388700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.491167, 46.067333, 18.24 ] } }, + { "type": "Feature", "properties": { "id": "ci37764791", "mag": 1.29, "time": 1505599746390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.431333, 33.040167, 10.42 ] } }, + { "type": "Feature", "properties": { "id": "nc72893421", "mag": 1.75, "time": 1505599309380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.164333, 35.816, 11.62 ] } }, + { "type": "Feature", "properties": { "id": "us2000apln", "mag": 3.8, "time": 1505599105290, "felt": 27, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 139.4711, 35.839, 65.43 ] } }, + { "type": "Feature", "properties": { "id": "nc72893416", "mag": 2.39, "time": 1505598962550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.606167, 40.391, 23.43 ] } }, + { "type": "Feature", "properties": { "id": "ak16836269", "mag": 2.6, "time": 1505598312964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.1504, 57.6803, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000apay", "mag": 4.1, "time": 1505597546760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4078, 15.1552, 27.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16860558", "mag": 1.5, "time": 1505597186774, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8073, 63.0653, 123.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72893411", "mag": 1.07, "time": 1505596690170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793999, 38.805332, 0.54 ] } }, + { "type": "Feature", "properties": { "id": "ci37764743", "mag": 1.25, "time": 1505596431740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.179, 33.192167, 7.19 ] } }, + { "type": "Feature", "properties": { "id": "us2000apa3", "mag": 5.2, "time": 1505595657570, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 159.8208, 52.9335, 55.59 ] } }, + { "type": "Feature", "properties": { "id": "nc72893406", "mag": 1.68, "time": 1505595567120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.832833, 37.5715, 2.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16835937", "mag": 1.2, "time": 1505594309155, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7782, 63.4422, 11.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16835935", "mag": 1.3, "time": 1505593468147, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0825, 63.2217, 0.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37764719", "mag": 1.01, "time": 1505593021350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.509667, 36.069667, 3.41 ] } }, + { "type": "Feature", "properties": { "id": "ci37764711", "mag": 1.86, "time": 1505592937400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.217, 32.373167, 19.88 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap9e", "mag": 4.2, "time": 1505592897770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.6768, -23.7075, 201.03 ] } }, + { "type": "Feature", "properties": { "id": "nn00605530", "mag": 1.0, "time": 1505591425440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.9, 39.4039, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72893386", "mag": 1.01, "time": 1505591244480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.504167, 37.923833, 7.96 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap8u", "mag": 5.1, "time": 1505590529510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.552, 15.3031, 17.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16835905", "mag": 2.1, "time": 1505590055161, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0556, 59.9293, 124.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60246652", "mag": 1.36, "time": 1505589841530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.020833, 44.802, 10.59 ] } }, + { "type": "Feature", "properties": { "id": "ci37764687", "mag": 1.0, "time": 1505588714630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.973333, 33.989, 6.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16835606", "mag": 2.1, "time": 1505588651481, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.7021, 67.8201, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "ci37764679", "mag": 1.11, "time": 1505588640970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.2045, 34.993167, -0.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap88", "mag": 4.3, "time": 1505588283560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7095, 15.6575, 33.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16860552", "mag": 2.1, "time": 1505587762267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2692, 60.1941, 137.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16860551", "mag": 1.2, "time": 1505586754071, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2984, 62.5136, 52.7 ] } }, + { "type": "Feature", "properties": { "id": "ci37764631", "mag": 1.09, "time": 1505586635400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.791667, 33.507667, 4.61 ] } }, + { "type": "Feature", "properties": { "id": "ci37764623", "mag": 1.32, "time": 1505586305110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.975667, 33.992333, 5.71 ] } }, + { "type": "Feature", "properties": { "id": "nc72893361", "mag": 1.14, "time": 1505585751450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8095, 38.823167, 1.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16835287", "mag": 2.1, "time": 1505584069266, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.8156, 57.4983, 73.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap76", "mag": 4.0, "time": 1505583967320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.5572, 15.6925, 24.12 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap74", "mag": 4.7, "time": 1505583533380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.7408, 24.878, 57.27 ] } }, + { "type": "Feature", "properties": { "id": "ak16860549", "mag": 1.4, "time": 1505583090155, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0305, 61.8843, 68.3 ] } }, + { "type": "Feature", "properties": { "id": "ci37764599", "mag": 1.28, "time": 1505582839910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.878167, 35.360667, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap78", "mag": 4.9, "time": 1505582156450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 161.507, -10.1846, 49.82 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap6d", "mag": 3.0, "time": 1505582077650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4285, 42.5847, 7.15 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap6b", "mag": 4.6, "time": 1505581929340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.1918, -37.2167, 6.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap64", "mag": 4.5, "time": 1505581636660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0682, 16.1115, 35.63 ] } }, + { "type": "Feature", "properties": { "id": "nc72893331", "mag": 1.49, "time": 1505581158890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.337833, 37.820167, -0.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16860548", "mag": 2.1, "time": 1505580632689, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.7764, 56.9377, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72893326", "mag": 1.43, "time": 1505580258840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.711, 38.750833, 1.46 ] } }, + { "type": "Feature", "properties": { "id": "nc72893316", "mag": 1.6, "time": 1505579747930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.717167, 38.752667, 1.24 ] } }, + { "type": "Feature", "properties": { "id": "nc72893306", "mag": 1.39, "time": 1505579471580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.0075, 37.570667, 2.07 ] } }, + { "type": "Feature", "properties": { "id": "hv61910186", "mag": 1.68, "time": 1505579377040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.611, 19.430167, 2.332 ] } }, + { "type": "Feature", "properties": { "id": "ci37764559", "mag": 1.5, "time": 1505579023330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.801833, 34.514833, 12.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16834974", "mag": 1.6, "time": 1505578926267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7481, 62.8102, 9.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16834965", "mag": 2.6, "time": 1505578647951, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7871, 61.8971, 60.5 ] } }, + { "type": "Feature", "properties": { "id": "mb80255754", "mag": 1.22, "time": 1505578208020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.489667, 44.705667, 13.34 ] } }, + { "type": "Feature", "properties": { "id": "nc72893286", "mag": 1.35, "time": 1505577465010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.047, 36.467, 7.96 ] } }, + { "type": "Feature", "properties": { "id": "nn00605503", "mag": 1.0, "time": 1505577266743, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.9133, 37.0358, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16834664", "mag": 2.4, "time": 1505577104470, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.431, 64.4709, 16.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap48", "mag": 2.5, "time": 1505575595120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4328, 42.5757, 6.87 ] } }, + { "type": "Feature", "properties": { "id": "nc72893281", "mag": 1.04, "time": 1505575420020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.895333, 37.565, -1.35 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap45", "mag": 2.6, "time": 1505574778570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4287, 42.5771, 8.55 ] } }, + { "type": "Feature", "properties": { "id": "ak16834651", "mag": 1.1, "time": 1505574443625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8572, 64.7619, 12.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72893271", "mag": 1.41, "time": 1505574428990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.946833, 37.638167, 2.02 ] } }, + { "type": "Feature", "properties": { "id": "ak16860541", "mag": 2.0, "time": 1505574078688, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3496, 59.7545, 127.1 ] } }, + { "type": "Feature", "properties": { "id": "ci37764535", "mag": 1.64, "time": 1505573652280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.1775, 33.193, 4.38 ] } }, + { "type": "Feature", "properties": { "id": "ak16834350", "mag": 1.4, "time": 1505572849209, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9009, 64.7582, 0.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap3f", "mag": 2.7, "time": 1505571851260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424, 42.5936, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16834332", "mag": 2.5, "time": 1505571656570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9804, 59.5744, 87.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap3b", "mag": 5.4, "time": 1505571537070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9072, 16.226, 27.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16860538", "mag": 1.3, "time": 1505570434361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2424, 62.5449, 91.4 ] } }, + { "type": "Feature", "properties": { "id": "uw61329766", "mag": 1.85, "time": 1505569264490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0445, 46.876833, 6.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16834028", "mag": 1.9, "time": 1505568376976, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1823, 62.4985, 43.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72893206", "mag": 1.29, "time": 1505567825160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.931167, 37.587167, 0.64 ] } }, + { "type": "Feature", "properties": { "id": "ci37764455", "mag": 2.74, "time": 1505566718480, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.162, 34.381, 19.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16860534", "mag": 1.8, "time": 1505566502565, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1816, 59.9775, 117.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72893196", "mag": 1.67, "time": 1505566233320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7105, 38.752667, 1.06 ] } }, + { "type": "Feature", "properties": { "id": "pr2017259001", "mag": 2.53, "time": 1505566066240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.1556, 17.5196, 8.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00605483", "mag": 1.9, "time": 1505565978805, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.5538, 38.7481, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37764447", "mag": 1.73, "time": 1505565806200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.609667, 33.184833, 2.89 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235458", "mag": 2.43, "time": 1505565729090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.570167, 37.344833, 5.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap2h", "mag": 5.1, "time": 1505565414430, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 154.9693, -6.4027, 84.07 ] } }, + { "type": "Feature", "properties": { "id": "nc72893191", "mag": 1.22, "time": 1505565031030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.840833, 37.499667, 1.31 ] } }, + { "type": "Feature", "properties": { "id": "nc72893176", "mag": 1.02, "time": 1505564232460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827667, 38.837502, 1.89 ] } }, + { "type": "Feature", "properties": { "id": "nc72893171", "mag": 1.16, "time": 1505563869000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.124, 36.5485, 6.91 ] } }, + { "type": "Feature", "properties": { "id": "nc72893166", "mag": 1.98, "time": 1505563826250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.96, 36.383333, 5.84 ] } }, + { "type": "Feature", "properties": { "id": "ak16860533", "mag": 2.3, "time": 1505563620965, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.2643, 51.2858, 23.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16833723", "mag": 1.8, "time": 1505563033811, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0307, 59.9768, 107.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16833722", "mag": 1.0, "time": 1505562940424, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5632, 63.5373, 8.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap1y", "mag": 2.6, "time": 1505562746670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.3487, 38.1953, 7.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16833715", "mag": 1.4, "time": 1505562545553, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0358, 63.0385, 119.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap1n", "mag": 4.9, "time": 1505561075850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.2793, -17.0456, 538.12 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap1h", "mag": 4.9, "time": 1505561004690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0304, 14.9269, 46.15 ] } }, + { "type": "Feature", "properties": { "id": "nc72893161", "mag": 1.71, "time": 1505560933840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.120167, 35.9645, 23.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000at4t", "mag": 4.2, "time": 1505560744440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 128.8254, -7.4355, 134.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16833426", "mag": 1.4, "time": 1505560633966, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.4578, 61.5042, 28.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap1d", "mag": 2.4, "time": 1505560442800, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8006, 35.9908, 5.836 ] } }, + { "type": "Feature", "properties": { "id": "nc72893146", "mag": 1.21, "time": 1505560059470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.829167, 37.4595, 2.47 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap17", "mag": 4.2, "time": 1505558287960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.162, 15.1165, 61.6 ] } }, + { "type": "Feature", "properties": { "id": "mb80255689", "mag": 1.86, "time": 1505557588190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1525, 48.101667, 7.53 ] } }, + { "type": "Feature", "properties": { "id": "nc72893131", "mag": 1.55, "time": 1505557460780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.826, 38.836333, 2.51 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap0t", "mag": 4.5, "time": 1505557108730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2297, 14.9414, 30.52 ] } }, + { "type": "Feature", "properties": { "id": "uw61329606", "mag": 1.52, "time": 1505556991880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.998833, 47.691333, 5.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap0r", "mag": 5.4, "time": 1505556693470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 83.5155, 42.2053, 16.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72893116", "mag": 1.84, "time": 1505556472360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.136, 35.962667, 25.16 ] } }, + { "type": "Feature", "properties": { "id": "us2000at4a", "mag": 4.0, "time": 1505555867920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.1193, -10.8831, 38.93 ] } }, + { "type": "Feature", "properties": { "id": "nc72893106", "mag": 2.2, "time": 1505555321940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.918167, 38.061667, 8.48 ] } }, + { "type": "Feature", "properties": { "id": "ci37764391", "mag": 3.37, "time": 1505555150630, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.616167, 33.169667, 8.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16833112", "mag": 1.5, "time": 1505554903991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7489, 59.845, 6.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16832833", "mag": 1.9, "time": 1505554129377, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.7145, 60.2604, 9.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16832826", "mag": 1.1, "time": 1505553506665, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3921, 63.5231, 5.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16832818", "mag": 2.0, "time": 1505552113865, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4792, 63.0863, 5.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16860523", "mag": 1.1, "time": 1505550954800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5868, 63.8926, 99.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ap0a", "mag": 4.0, "time": 1505550836160, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 27.685, 37.0689, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "ci37764359", "mag": 1.53, "time": 1505550124480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9555, 33.145833, 9.49 ] } }, + { "type": "Feature", "properties": { "id": "ci37764335", "mag": 1.72, "time": 1505549627950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.053167, 36.123167, 1.12 ] } }, + { "type": "Feature", "properties": { "id": "ci37764327", "mag": 1.0, "time": 1505549298090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.920833, 33.975167, 6.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16832531", "mag": 1.9, "time": 1505548305568, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9221, 64.7554, 18.3 ] } }, + { "type": "Feature", "properties": { "id": "pr2017259000", "mag": 3.64, "time": 1505548231440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -64.0526, 18.4531, 34.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00605447", "mag": 1.3, "time": 1505548133652, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0331, 40.436, 11.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16860520", "mag": 1.3, "time": 1505547550857, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9184, 62.2903, 70.9 ] } }, + { "type": "Feature", "properties": { "id": "ci37764303", "mag": 0.95, "time": 1505546199690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.922833, 33.978, 5.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16832252", "mag": 3.1, "time": 1505545940675, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.5336, 51.3744, 18.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72893051", "mag": 1.0, "time": 1505544999790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8995, 37.518833, 0.05 ] } }, + { "type": "Feature", "properties": { "id": "hv61909871", "mag": 3.66, "time": 1505544037320, "felt": 734, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.487667, 21.642167, 10.046 ] } }, + { "type": "Feature", "properties": { "id": "ak16832238", "mag": 2.6, "time": 1505543981141, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.591, 58.4419, 63.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16860517", "mag": 1.9, "time": 1505543962894, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4461, 59.504, 85.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37764247", "mag": 0.97, "time": 1505543854670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.918833, 33.976667, 6.71 ] } }, + { "type": "Feature", "properties": { "id": "ak16832235", "mag": 1.7, "time": 1505543819625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8364, 61.486, 9.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000anze", "mag": 4.4, "time": 1505543417100, "felt": 29, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.4791, 13.6017, 52.75 ] } }, + { "type": "Feature", "properties": { "id": "nc72893026", "mag": 0.96, "time": 1505543269370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8325, 37.540333, 4.97 ] } }, + { "type": "Feature", "properties": { "id": "nc72893021", "mag": 1.36, "time": 1505543240340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.181833, 37.775667, 14.71 ] } }, + { "type": "Feature", "properties": { "id": "ak16831965", "mag": 1.2, "time": 1505542824882, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1125, 62.0856, 43.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72893011", "mag": 1.57, "time": 1505541411490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8025, 38.706667, 3.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16831959", "mag": 1.0, "time": 1505541221769, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.4333, 66.2529, 10.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16831957", "mag": 1.8, "time": 1505541032598, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4004, 57.5066, 48.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000anz4", "mag": 4.4, "time": 1505540612950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -60.854, 17.4925, 32.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000anz2", "mag": 4.1, "time": 1505540153920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.143, 15.2335, 36.21 ] } }, + { "type": "Feature", "properties": { "id": "ci37764183", "mag": 1.57, "time": 1505539498920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.924667, 33.976667, 6.44 ] } }, + { "type": "Feature", "properties": { "id": "us2000anyv", "mag": 3.7, "time": 1505539256530, "felt": 22, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4153, 42.5716, 8.12 ] } }, + { "type": "Feature", "properties": { "id": "nc72893001", "mag": 1.74, "time": 1505539200450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.266667, 39.366833, -0.52 ] } }, + { "type": "Feature", "properties": { "id": "nn00605425", "mag": 1.2, "time": 1505536942149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.719, 36.6783, 6.3 ] } }, + { "type": "Feature", "properties": { "id": "ci37764071", "mag": 3.03, "time": 1505536766220, "felt": 99, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.926333, 33.9745, 5.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000anyf", "mag": 4.6, "time": 1505535666910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.9491, -1.4664, 157.52 ] } }, + { "type": "Feature", "properties": { "id": "nc72892991", "mag": 1.09, "time": 1505535129720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.777833, 39.807833, 8.29 ] } }, + { "type": "Feature", "properties": { "id": "us2000any5", "mag": 4.3, "time": 1505534256750, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.7094, 13.2544, 54.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16831411", "mag": 1.0, "time": 1505534077361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8446, 61.8774, 13.6 ] } }, + { "type": "Feature", "properties": { "id": "nn00605540", "mag": 1.1, "time": 1505533644071, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.5347, 38.3939, 14.7 ] } }, + { "type": "Feature", "properties": { "id": "ci37764039", "mag": 1.68, "time": 1505533494970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.682, 35.141167, 11.28 ] } }, + { "type": "Feature", "properties": { "id": "ci37764031", "mag": 1.75, "time": 1505533234710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.516833, 32.862, 5.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16831410", "mag": 1.3, "time": 1505532137489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8143, 61.3719, 31.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72892971", "mag": 0.98, "time": 1505532054400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8735, 37.542, 7.25 ] } }, + { "type": "Feature", "properties": { "id": "nm60206921", "mag": 1.9, "time": 1505531769960, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.3315, 35.6915, 12.51 ] } }, + { "type": "Feature", "properties": { "id": "ci37764007", "mag": 1.33, "time": 1505531552680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.105667, 34.034, 6.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16860509", "mag": 1.7, "time": 1505530441142, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2233, 59.405, 90.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16831409", "mag": 2.6, "time": 1505529914916, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.7519, 54.2192, 117.7 ] } }, + { "type": "Feature", "properties": { "id": "ci37763991", "mag": 1.37, "time": 1505528713010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.179, 33.193833, 7.41 ] } }, + { "type": "Feature", "properties": { "id": "ci37763983", "mag": 1.44, "time": 1505528615710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793333, 33.493667, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000anxt", "mag": 4.3, "time": 1505528560360, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -100.0309, 17.2785, 69.28 ] } }, + { "type": "Feature", "properties": { "id": "nc72892956", "mag": 1.06, "time": 1505527887720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.904167, 37.519667, -0.32 ] } }, + { "type": "Feature", "properties": { "id": "ak16831144", "mag": 1.1, "time": 1505526547318, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6449, 63.5861, 5.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16831140", "mag": 1.8, "time": 1505526295378, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4346, 59.0192, 66.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72892946", "mag": 1.02, "time": 1505525854460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764168, 38.786999, 0.87 ] } }, + { "type": "Feature", "properties": { "id": "ci37763959", "mag": 1.17, "time": 1505525787900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.395167, 34.877167, 11.59 ] } }, + { "type": "Feature", "properties": { "id": "nc72892941", "mag": 1.34, "time": 1505525721400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.772833, 38.807167, -0.11 ] } }, + { "type": "Feature", "properties": { "id": "nc72892936", "mag": 1.51, "time": 1505525691180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819167, 37.545, 3.75 ] } }, + { "type": "Feature", "properties": { "id": "us2000anxl", "mag": 4.6, "time": 1505525689580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.5872, 52.0486, 37.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16831132", "mag": 1.8, "time": 1505525666712, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6913, 63.5749, 10.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16831131", "mag": 1.1, "time": 1505525600973, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6368, 63.6017, 8.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72892931", "mag": 1.16, "time": 1505524996900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.806167, 36.224833, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16830868", "mag": 2.0, "time": 1505523996780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.276, 57.4142, 39.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16860501", "mag": 1.8, "time": 1505523576256, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.099, 59.7523, 100.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16830864", "mag": 1.0, "time": 1505522724047, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.3705, 66.2593, 7.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16830862", "mag": 1.4, "time": 1505522720015, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8357, 63.5631, 6.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000at41", "mag": 4.6, "time": 1505522674060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 69.6259, -23.9788, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000anwt", "mag": 4.3, "time": 1505522470090, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.2357, -37.2039, 9.72 ] } }, + { "type": "Feature", "properties": { "id": "uu60246252", "mag": 1.18, "time": 1505521902190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4075, 42.596, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16830861", "mag": 1.2, "time": 1505521740882, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7991, 61.6212, 38.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16830860", "mag": 1.0, "time": 1505521253411, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9628, 64.7584, 4.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16830858", "mag": 1.6, "time": 1505521010086, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3459, 62.5868, 57.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000at4p", "mag": 4.6, "time": 1505520028160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -30.9669, 2.8319, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16830852", "mag": 2.5, "time": 1505519615949, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8797, 64.7729, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16830848", "mag": 3.4, "time": 1505519352423, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.9613, 56.0051, 45.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16830585", "mag": 2.2, "time": 1505518242769, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9245, 64.7851, 9.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16830502", "mag": 1.5, "time": 1505517724005, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3927, 62.7723, 62.1 ] } }, + { "type": "Feature", "properties": { "id": "hv61909476", "mag": 1.46, "time": 1505517626230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6105, 19.420833, 2.212 ] } }, + { "type": "Feature", "properties": { "id": "us2000anvi", "mag": 4.9, "time": 1505517194700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.9781, 67.621, 14.89 ] } }, + { "type": "Feature", "properties": { "id": "ak16852972", "mag": 2.3, "time": 1505516822454, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.046, 51.6929, 12.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000asms", "mag": 4.2, "time": 1505515397660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 151.5667, -4.6769, 135.04 ] } }, + { "type": "Feature", "properties": { "id": "ak16830490", "mag": 2.1, "time": 1505515348546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2666, 60.2335, 149.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000anza", "mag": 4.2, "time": 1505515078190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 91.9514, 12.8959, 27.42 ] } }, + { "type": "Feature", "properties": { "id": "ak16852968", "mag": 1.7, "time": 1505514517165, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1028, 59.5574, 89.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16830486", "mag": 1.5, "time": 1505514413181, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8103, 64.7863, 4.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16852966", "mag": 1.7, "time": 1505514284700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1862, 59.9258, 120.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72892896", "mag": 1.71, "time": 1505514238180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.848, 40.281, 4.76 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqg1", "mag": 3.2, "time": 1505514207940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.4161, 53.6697, 25.19 ] } }, + { "type": "Feature", "properties": { "id": "nc72892891", "mag": 1.42, "time": 1505514193630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7085, 38.747, 1.29 ] } }, + { "type": "Feature", "properties": { "id": "us2000antx", "mag": 2.8, "time": 1505513431240, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9688, 37.279, 4.85 ] } }, + { "type": "Feature", "properties": { "id": "ak16830471", "mag": 1.3, "time": 1505513126878, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.0818, 58.2131, 3.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqg0", "mag": 2.6, "time": 1505512544140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6723, 51.5577, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000antf", "mag": 4.6, "time": 1505512126220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.5618, -5.9077, 108.71 ] } }, + { "type": "Feature", "properties": { "id": "ak16830466", "mag": 1.7, "time": 1505511266504, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.7109, 60.4891, 8.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000asmu", "mag": 4.3, "time": 1505510611600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 137.0445, 34.5022, 328.82 ] } }, + { "type": "Feature", "properties": { "id": "us2000anrz", "mag": 3.1, "time": 1505510517900, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4379, 42.6057, 6.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16830211", "mag": 3.0, "time": 1505510263990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8926, 64.7765, 8.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16852960", "mag": 1.5, "time": 1505509916511, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1722, 61.1116, 68.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16852959", "mag": 2.0, "time": 1505509441508, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4835, 51.7117, 13.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72892861", "mag": 1.56, "time": 1505509197990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.217167, 35.152667, 7.27 ] } }, + { "type": "Feature", "properties": { "id": "nn00605401", "mag": 1.3, "time": 1505508712532, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.5746, 38.7781, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000anqp", "mag": 4.4, "time": 1505508340380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.6832, 12.6788, 125.94 ] } }, + { "type": "Feature", "properties": { "id": "nn00605391", "mag": 1.0, "time": 1505508003630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3614, 38.5819, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37763831", "mag": 1.45, "time": 1505507271630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.356667, 34.4865, 9.29 ] } }, + { "type": "Feature", "properties": { "id": "ak16830197", "mag": 2.1, "time": 1505507006348, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.8768, 60.2433, 18.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72892846", "mag": 2.43, "time": 1505506978320, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.075333, 36.496667, 4.87 ] } }, + { "type": "Feature", "properties": { "id": "us2000annp", "mag": 2.3, "time": 1505506905940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4277, 42.5599, 9.59 ] } }, + { "type": "Feature", "properties": { "id": "ak16829946", "mag": 2.6, "time": 1505506584731, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.9781, 57.0654, 81.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72892841", "mag": 1.21, "time": 1505506558180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.801833, 38.823167, 2.59 ] } }, + { "type": "Feature", "properties": { "id": "ci37763815", "mag": 1.6, "time": 1505506434580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.772667, 33.326167, 12.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16829942", "mag": 2.0, "time": 1505506388550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6381, 59.7681, 10.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16829939", "mag": 1.3, "time": 1505506296730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3557, 64.9805, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16829919", "mag": 3.2, "time": 1505506091028, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8331, 59.8732, 91.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16829917", "mag": 1.1, "time": 1505506034459, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1896, 63.4641, 20.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72892821", "mag": 1.26, "time": 1505506033580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.407667, 37.504333, 1.03 ] } }, + { "type": "Feature", "properties": { "id": "pr2017258005", "mag": 3.43, "time": 1505505501670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -64.6295, 19.1915, 40.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16829915", "mag": 1.5, "time": 1505505395135, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6711, 60.3885, 41.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16829913", "mag": 2.1, "time": 1505505235226, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.0254, 58.4988, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16829904", "mag": 1.1, "time": 1505503708373, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5162, 63.4918, 1.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72892806", "mag": 1.03, "time": 1505503474580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.488333, 37.450833, 4.91 ] } }, + { "type": "Feature", "properties": { "id": "ci37763759", "mag": 1.72, "time": 1505502131450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.796, 33.503167, 6.45 ] } }, + { "type": "Feature", "properties": { "id": "us2000anjp", "mag": 5.5, "time": 1505501282460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -28.3292, -55.4644, 9.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72892771", "mag": 1.05, "time": 1505500911720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.725334, 38.757, 1.52 ] } }, + { "type": "Feature", "properties": { "id": "us2000anjh", "mag": 4.5, "time": 1505500904740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 169.72, 54.0122, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61308057", "mag": 0.97, "time": 1505500854880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.858667, 48.515, 37.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16829625", "mag": 1.6, "time": 1505499922143, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3749, 60.4419, 18.3 ] } }, + { "type": "Feature", "properties": { "id": "uu60246132", "mag": 1.51, "time": 1505499901840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.420667, 42.537167, 7.15 ] } }, + { "type": "Feature", "properties": { "id": "nc72892766", "mag": 2.33, "time": 1505499839660, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.49, 37.447667, 5.54 ] } }, + { "type": "Feature", "properties": { "id": "nc72892756", "mag": 1.0, "time": 1505499395080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.799667, 37.462333, 0.05 ] } }, + { "type": "Feature", "properties": { "id": "nc72892761", "mag": 1.02, "time": 1505499284680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.445, 37.379333, 14.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16829622", "mag": 1.1, "time": 1505498936272, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4458, 61.0059, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000anhz", "mag": 4.2, "time": 1505498539950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9892, 15.1825, 46.32 ] } }, + { "type": "Feature", "properties": { "id": "ak16829378", "mag": 1.9, "time": 1505498347271, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.7292, 60.4845, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37763719", "mag": 1.44, "time": 1505498108300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.178169, 35.602833, 5.95 ] } }, + { "type": "Feature", "properties": { "id": "us2000anhd", "mag": 5.0, "time": 1505497546880, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 28.8132, -2.7314, 12.98 ] } }, + { "type": "Feature", "properties": { "id": "ci37763711", "mag": 1.02, "time": 1505497385540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.102833, 33.170333, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16829370", "mag": 1.8, "time": 1505496661795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3298, 60.0961, 93.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72892746", "mag": 1.22, "time": 1505496479100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.641667, 37.477167, 6.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000angr", "mag": 4.6, "time": 1505496373980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 160.527, 53.8618, 60.06 ] } }, + { "type": "Feature", "properties": { "id": "ci37763679", "mag": 1.04, "time": 1505495567950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.808, 36.012167, 1.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16829365", "mag": 1.4, "time": 1505494067842, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3827, 63.102, 108.2 ] } }, + { "type": "Feature", "properties": { "id": "uw61308032", "mag": 1.41, "time": 1505493000220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.048333, 47.3965, 13.93 ] } }, + { "type": "Feature", "properties": { "id": "nc72892711", "mag": 1.1, "time": 1505492830650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.807, 38.822667, 2.57 ] } }, + { "type": "Feature", "properties": { "id": "uw61308027", "mag": 1.17, "time": 1505492391290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0485, 47.395833, 13.68 ] } }, + { "type": "Feature", "properties": { "id": "ak16829360", "mag": 2.9, "time": 1505491697051, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.4354, 53.7237, 49.7 ] } }, + { "type": "Feature", "properties": { "id": "pr2017258004", "mag": 1.98, "time": 1505491060700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.7353, 18.0013, 7.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16829358", "mag": 1.6, "time": 1505491027770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6843, 60.3013, 49.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000angc", "mag": 4.7, "time": 1505490910540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.4948, -51.951, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16829355", "mag": 3.2, "time": 1505490508935, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.4074, 55.3684, 134.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60246117", "mag": 1.78, "time": 1505490038910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.438833, 42.587833, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37763607", "mag": 1.3, "time": 1505489472220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.491167, 33.8525, -0.5 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235413", "mag": 2.08, "time": 1505488486050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.96, 37.276667, 2.46 ] } }, + { "type": "Feature", "properties": { "id": "ak16829351", "mag": 1.4, "time": 1505488175090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4615, 63.0908, 2.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61908956", "mag": 2.13, "time": 1505487142110, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.862333, 19.450333, 1.074 ] } }, + { "type": "Feature", "properties": { "id": "ak16829348", "mag": 2.3, "time": 1505486994801, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.5994, 64.2424, 10.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16852936", "mag": 1.5, "time": 1505485797408, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5105, 60.533, 54.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16829346", "mag": 1.6, "time": 1505485726963, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8399, 59.9528, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80255559", "mag": 1.54, "time": 1505485070000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528, 46.898, 12.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000asmd", "mag": 4.0, "time": 1505484479350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 118.2763, -7.0257, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37763559", "mag": 1.43, "time": 1505483064830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6045, 33.127833, 7.81 ] } }, + { "type": "Feature", "properties": { "id": "ci37763535", "mag": 1.14, "time": 1505482307640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.736833, 33.222833, 12.21 ] } }, + { "type": "Feature", "properties": { "id": "ci37763527", "mag": 1.65, "time": 1505482113260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.742833, 33.223833, 11.67 ] } }, + { "type": "Feature", "properties": { "id": "ci37763511", "mag": 2.98, "time": 1505481739410, "felt": 62, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.750167, 33.221833, 11.54 ] } }, + { "type": "Feature", "properties": { "id": "nn00605319", "mag": 1.4, "time": 1505481612897, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.536, 39.4025, 7.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16829343", "mag": 1.1, "time": 1505481511288, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.734, 60.477, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16829342", "mag": 1.1, "time": 1505481115042, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.6866, 60.4978, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000an8y", "mag": 3.0, "time": 1505480692500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9665, 37.2798, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000aqfs", "mag": 4.0, "time": 1505480677660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 177.1015, 51.6899, 62.37 ] } }, + { "type": "Feature", "properties": { "id": "nc72892656", "mag": 1.2, "time": 1505479917850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.478833, 36.923833, 5.96 ] } }, + { "type": "Feature", "properties": { "id": "ak16852930", "mag": 2.2, "time": 1505479857860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.6735, 54.2139, 72.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16852929", "mag": 1.3, "time": 1505479424949, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8074, 61.6789, 63.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37763455", "mag": 1.43, "time": 1505479133890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.172833, 33.1885, 5.98 ] } }, + { "type": "Feature", "properties": { "id": "us2000an8s", "mag": 5.0, "time": 1505479021440, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 99.4856, 1.5915, 160.08 ] } }, + { "type": "Feature", "properties": { "id": "ak16852928", "mag": 2.1, "time": 1505478896521, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.6795, 51.3691, 28.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61307972", "mag": 0.95, "time": 1505478878910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.588, 45.973333, 13.92 ] } }, + { "type": "Feature", "properties": { "id": "mb80255544", "mag": 1.19, "time": 1505478239910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527, 46.868167, 11.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16852925", "mag": 2.1, "time": 1505477897255, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.3237, 54.8499, 18.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72892641", "mag": 1.01, "time": 1505477523520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.799667, 38.833832, 2.01 ] } }, + { "type": "Feature", "properties": { "id": "us2000an8e", "mag": 2.7, "time": 1505477274970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.525, 46.8611, 10.18 ] } }, + { "type": "Feature", "properties": { "id": "ak16852924", "mag": 1.4, "time": 1505476792218, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5946, 57.6534, 29.9 ] } }, + { "type": "Feature", "properties": { "id": "pr2017258003", "mag": 2.18, "time": 1505476739060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.7808, 18.0135, 13.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16852923", "mag": 2.0, "time": 1505476493650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.7994, 54.9781, 25.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000an7z", "mag": 3.8, "time": 1505475906360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.753, 54.3697, 28.05 ] } }, + { "type": "Feature", "properties": { "id": "nc72892636", "mag": 2.0, "time": 1505475684320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.723167, 38.750667, 1.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16829087", "mag": 1.6, "time": 1505475033163, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.6709, 67.7999, 2.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16829082", "mag": 1.8, "time": 1505474984470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9722, 63.0999, 131.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16829079", "mag": 1.4, "time": 1505474678706, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.7297, 60.4779, 8.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000an7j", "mag": 2.7, "time": 1505474631800, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4441, 42.568, 7.22 ] } }, + { "type": "Feature", "properties": { "id": "nc72892626", "mag": 1.04, "time": 1505474439810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.804667, 37.458833, 0.13 ] } }, + { "type": "Feature", "properties": { "id": "ci37763407", "mag": 3.23, "time": 1505473976550, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.303167, 35.032833, 11.48 ] } }, + { "type": "Feature", "properties": { "id": "nn00605300", "mag": 1.1, "time": 1505473795002, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.7828, 38.6088, 8.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16828841", "mag": 1.7, "time": 1505473634732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.54, 59.9657, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61307932", "mag": 1.91, "time": 1505473610560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.044333, 46.870333, 5.23 ] } }, + { "type": "Feature", "properties": { "id": "uw61307927", "mag": 2.04, "time": 1505473528440, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.040667, 46.874167, 5.89 ] } }, + { "type": "Feature", "properties": { "id": "us2000an74", "mag": 4.6, "time": 1505473111350, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -60.5703, 14.9752, 55.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16828838", "mag": 2.3, "time": 1505473096912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.7454, 57.1664, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235273", "mag": 1.73, "time": 1505472377400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7775, 37.328833, 5.95 ] } }, + { "type": "Feature", "properties": { "id": "ak16828836", "mag": 1.2, "time": 1505472358115, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0141, 62.1581, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000an6x", "mag": 3.0, "time": 1505471961060, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4507, 42.5991, 6.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16828834", "mag": 1.6, "time": 1505471035679, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5654, 60.6122, 4.1 ] } }, + { "type": "Feature", "properties": { "id": "pr2017258002", "mag": 3.3, "time": 1505471012430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -65.039, 18.7165, 49.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72892606", "mag": 2.13, "time": 1505469780960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.106167, 36.291833, 27.69 ] } }, + { "type": "Feature", "properties": { "id": "ak16852912", "mag": 1.9, "time": 1505469324601, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0438, 60.2245, 124.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16828830", "mag": 2.7, "time": 1505468486908, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.378, 53.6654, 25.8 ] } }, + { "type": "Feature", "properties": { "id": "pr2017258001", "mag": 3.31, "time": 1505468158660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.9741, 18.1111, 53.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16828827", "mag": 1.9, "time": 1505468029663, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1086, 60.3742, 87.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000an6e", "mag": 2.1, "time": 1505467401730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4369, 42.5723, 4.71 ] } }, + { "type": "Feature", "properties": { "id": "ci37763367", "mag": 1.32, "time": 1505466931820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.601167, 35.792, 0.88 ] } }, + { "type": "Feature", "properties": { "id": "hv61908811", "mag": 1.86, "time": 1505466749280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.473328, 19.201, 34.94 ] } }, + { "type": "Feature", "properties": { "id": "pr2017258000", "mag": 2.64, "time": 1505466025100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.746, 17.9996, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000an5j", "mag": 3.6, "time": 1505463761200, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4416, 42.5753, 5.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16852908", "mag": 1.3, "time": 1505463469458, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.2829, 57.3488, 39.2 ] } }, + { "type": "Feature", "properties": { "id": "nn00605283", "mag": 1.7, "time": 1505461873940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.4437, 37.5652, 30.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72892591", "mag": 2.34, "time": 1505461865770, "felt": 34, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.815833, 37.416, -0.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72892576", "mag": 1.69, "time": 1505460536470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.027667, 35.933167, 12.08 ] } }, + { "type": "Feature", "properties": { "id": "ak16828820", "mag": 1.4, "time": 1505460317106, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3735, 59.7943, 6.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16852903", "mag": 1.3, "time": 1505459205027, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8448, 60.0925, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16828585", "mag": 1.4, "time": 1505458631465, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0593, 61.7131, 3.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000an4v", "mag": 4.4, "time": 1505458308660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.5767, -21.9172, 640.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16828584", "mag": 1.4, "time": 1505458006745, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.7132, 60.0014, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16828563", "mag": 2.8, "time": 1505456528325, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4989, 60.1125, 151.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16828570", "mag": 2.5, "time": 1505456526893, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2519, 60.1326, 152.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72892551", "mag": 2.6, "time": 1505456369610, "felt": 148, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.814333, 37.412167, -0.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16828560", "mag": 1.1, "time": 1505456105481, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0298, 65.3407, 11.3 ] } }, + { "type": "Feature", "properties": { "id": "ci37763319", "mag": 1.07, "time": 1505455402480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7685, 33.327833, 13.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16828558", "mag": 1.4, "time": 1505455356648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3726, 61.4994, 31.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16852896", "mag": 1.9, "time": 1505455322292, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2513, 60.1603, 135.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72892546", "mag": 1.03, "time": 1505455248140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.810667, 38.83, 2.09 ] } }, + { "type": "Feature", "properties": { "id": "ak16828556", "mag": 1.6, "time": 1505455168783, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.9297, 60.9306, 19.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37763311", "mag": 1.21, "time": 1505454701910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.190167, 33.332667, 10.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16852894", "mag": 1.7, "time": 1505453971264, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8667, 60.0997, 103.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000an3z", "mag": 4.6, "time": 1505453216820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.4676, -42.4862, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16852893", "mag": 1.1, "time": 1505452792257, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4902, 57.7349, 15.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16828554", "mag": 1.4, "time": 1505452679971, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3948, 61.1147, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16852891", "mag": 1.6, "time": 1505451604059, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9039, 61.8273, 105.7 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235253", "mag": 1.62, "time": 1505451601330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7765, 37.333333, 5.53 ] } }, + { "type": "Feature", "properties": { "id": "nc72892536", "mag": 2.78, "time": 1505451572070, "felt": 348, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.804667, 37.415, 2.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16828322", "mag": 1.1, "time": 1505451186525, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -138.7346, 60.4761, 9.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000anyw", "mag": 2.0, "time": 1505450267000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -71.42, 45.73, 18.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72892526", "mag": 1.26, "time": 1505449157230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802333, 38.8245, 1.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16828321", "mag": 1.4, "time": 1505448965816, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0369, 60.3155, 0.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000an31", "mag": 4.3, "time": 1505448638800, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -76.4066, -11.9189, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80255479", "mag": 1.23, "time": 1505447369570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529333, 46.896667, 13.22 ] } }, + { "type": "Feature", "properties": { "id": "ak16828316", "mag": 2.0, "time": 1505447351856, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1687, 59.8152, 101.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16828314", "mag": 1.7, "time": 1505447232655, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4451, 60.022, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72892516", "mag": 1.1, "time": 1505446837720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.730835, 38.793999, 1.32 ] } }, + { "type": "Feature", "properties": { "id": "uu60245937", "mag": 2.38, "time": 1505446750290, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.831833, 40.139667, 5.96 ] } }, + { "type": "Feature", "properties": { "id": "nn00605251", "mag": 1.0, "time": 1505446468632, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9033, 38.4011, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "uw61307757", "mag": 1.87, "time": 1505444885110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.039, 46.879667, 6.38 ] } }, + { "type": "Feature", "properties": { "id": "ak16828311", "mag": 1.7, "time": 1505444727120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.9607, 69.4522, 5.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16828309", "mag": 1.6, "time": 1505444714123, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2585, 60.8639, 35.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16828078", "mag": 1.7, "time": 1505444473211, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9441, 60.8403, 88.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16852882", "mag": 1.6, "time": 1505443841428, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.2335, 53.7145, 69.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000an1z", "mag": 4.4, "time": 1505443535780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.5573, 15.2748, 63.05 ] } }, + { "type": "Feature", "properties": { "id": "nc72892506", "mag": 1.02, "time": 1505442684550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.883667, 37.553, 2.17 ] } }, + { "type": "Feature", "properties": { "id": "hv61908531", "mag": 3.04, "time": 1505439944520, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.466833, 19.197667, 35.437 ] } }, + { "type": "Feature", "properties": { "id": "ak16827839", "mag": 1.5, "time": 1505439822541, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4032, 62.4253, 2.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37763231", "mag": 1.55, "time": 1505439516220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.3195, 34.068167, 18.36 ] } }, + { "type": "Feature", "properties": { "id": "us2000an15", "mag": 5.2, "time": 1505439500860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5689, -26.6333, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000an0z", "mag": 4.8, "time": 1505439407990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 94.866, 18.8304, 42.15 ] } }, + { "type": "Feature", "properties": { "id": "nc72892491", "mag": 1.99, "time": 1505438838520, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.813833, 37.412167, -0.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72892486", "mag": 3.28, "time": 1505438267780, "felt": 1110, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.805667, 37.414, -0.21 ] } }, + { "type": "Feature", "properties": { "id": "uw61307737", "mag": 1.35, "time": 1505438193040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.260833, 45.950833, -0.29 ] } }, + { "type": "Feature", "properties": { "id": "us2000an0d", "mag": 2.7, "time": 1505437987460, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5868, 37.2136, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000an0g", "mag": 4.3, "time": 1505437868680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4079, 15.6978, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16827837", "mag": 1.3, "time": 1505437000881, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7, 64.3159, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000aslu", "mag": 4.1, "time": 1505436496140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.8507, -18.1469, 603.85 ] } }, + { "type": "Feature", "properties": { "id": "ci37763199", "mag": 1.36, "time": 1505435921800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.729667, 33.651667, 14.16 ] } }, + { "type": "Feature", "properties": { "id": "nc72892481", "mag": 1.05, "time": 1505435403940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.1895, 36.589667, 2.71 ] } }, + { "type": "Feature", "properties": { "id": "us2000aslz", "mag": 4.4, "time": 1505434827610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.716, 24.4725, 93.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000amzk", "mag": 4.1, "time": 1505434054870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.3134, -31.912, 136.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16827738", "mag": 1.1, "time": 1505433675781, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4097, 60.0357, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61307717", "mag": 1.13, "time": 1505433139350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.677167, 47.835167, -0.74 ] } }, + { "type": "Feature", "properties": { "id": "nc72892476", "mag": 1.21, "time": 1505432696710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.828167, 37.448333, 11.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16827737", "mag": 2.4, "time": 1505432573787, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.6213, 54.0704, 37.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000amz3", "mag": 4.1, "time": 1505431969130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.671, 15.2225, 53.79 ] } }, + { "type": "Feature", "properties": { "id": "nc72892471", "mag": 1.5, "time": 1505431533120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.4815, 38.607167, 11.47 ] } }, + { "type": "Feature", "properties": { "id": "nc72892466", "mag": 1.83, "time": 1505431346810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.8125, 37.417833, 0.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16827381", "mag": 2.1, "time": 1505430963793, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5301, 63.0381, 100.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000amyn", "mag": 4.7, "time": 1505430410000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -172.7418, -15.3348, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72892451", "mag": 1.34, "time": 1505430316610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.842333, 38.821, 2.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16827378", "mag": 1.7, "time": 1505430242693, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.6605, 59.9169, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16827376", "mag": 1.4, "time": 1505430223593, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3686, 64.993, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235238", "mag": 1.58, "time": 1505429674020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.887667, 37.203667, 6.13 ] } }, + { "type": "Feature", "properties": { "id": "ak16827373", "mag": 1.9, "time": 1505429324646, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.3648, 60.031, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16827371", "mag": 1.2, "time": 1505429076761, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7478, 61.0185, 13.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000amx5", "mag": 4.0, "time": 1505428206900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.2168, 15.3544, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72892426", "mag": 2.04, "time": 1505428077100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.454833, 37.434333, 10.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16861216", "mag": 1.9, "time": 1505427925219, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.0714, 56.1589, 10.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16827036", "mag": 2.0, "time": 1505427923919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0766, 61.1472, 0.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000amww", "mag": 5.2, "time": 1505427661920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 170.1022, -13.8345, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37763135", "mag": 1.49, "time": 1505427523820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.866, 34.011167, 16.92 ] } }, + { "type": "Feature", "properties": { "id": "nn00605229", "mag": 2.2, "time": 1505427385689, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0155, 38.8648, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000askz", "mag": 4.1, "time": 1505426291450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.1685, -7.2026, 147.79 ] } }, + { "type": "Feature", "properties": { "id": "hv61908231", "mag": 2.43, "time": 1505426012270, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.012665, 19.708, 2.82 ] } }, + { "type": "Feature", "properties": { "id": "uu60245817", "mag": 1.37, "time": 1505425437900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.738, 38.746667, 7.72 ] } }, + { "type": "Feature", "properties": { "id": "ak16827032", "mag": 1.7, "time": 1505425052822, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4453, 59.9712, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16827035", "mag": 2.3, "time": 1505424622002, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.6154, 53.6195, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000asl6", "mag": 4.4, "time": 1505424366710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.1651, -12.9278, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "pr2017257005", "mag": 3.03, "time": 1505423754820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.8618, 18.9605, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000amub", "mag": 2.8, "time": 1505423589100, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.1847, 37.3761, 9.38 ] } }, + { "type": "Feature", "properties": { "id": "nc72892386", "mag": 1.71, "time": 1505423524180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.993, 37.849, 7.27 ] } }, + { "type": "Feature", "properties": { "id": "uw61307597", "mag": 1.91, "time": 1505423420600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.516333, 49.4855, -1.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16827021", "mag": 2.6, "time": 1505422812693, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9235, 64.0866, 5.1 ] } }, + { "type": "Feature", "properties": { "id": "pr2017257004", "mag": 3.1, "time": 1505421809880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.5351, 18.7848, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61307587", "mag": 2.41, "time": 1505421654690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.038167, 46.8785, 6.64 ] } }, + { "type": "Feature", "properties": { "id": "ci37763103", "mag": 1.09, "time": 1505421634220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.484667, 33.852667, -0.55 ] } }, + { "type": "Feature", "properties": { "id": "ci37763095", "mag": 2.06, "time": 1505421264070, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.377, 34.075, 2.89 ] } }, + { "type": "Feature", "properties": { "id": "ci37763087", "mag": 1.19, "time": 1505421203990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9245, 33.981667, 6.59 ] } }, + { "type": "Feature", "properties": { "id": "uw61307577", "mag": 2.03, "time": 1505420251860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.041833, 46.875667, 6.94 ] } }, + { "type": "Feature", "properties": { "id": "ci37763071", "mag": 1.01, "time": 1505420033530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.481, 33.8295, -0.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000amr0", "mag": 3.2, "time": 1505419914220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -103.2947, 31.1684, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16826805", "mag": 1.7, "time": 1505419715229, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.541, 59.9804, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80255399", "mag": 3.06, "time": 1505419221280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.5865, 48.5185, 11.24 ] } }, + { "type": "Feature", "properties": { "id": "uu60245777", "mag": 2.41, "time": 1505419186750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.829333, 40.126, 5.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16826800", "mag": 1.6, "time": 1505419140835, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.9798, 59.9221, 1.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72892321", "mag": 1.03, "time": 1505418518980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.838833, 37.542333, 4.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16861208", "mag": 1.9, "time": 1505418243673, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0345, 59.5576, 91.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72892316", "mag": 1.93, "time": 1505418215210, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.825833, 37.479167, 0.95 ] } }, + { "type": "Feature", "properties": { "id": "uw61307562", "mag": 1.61, "time": 1505417734660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.201667, 47.657667, 24.36 ] } }, + { "type": "Feature", "properties": { "id": "nc72892311", "mag": 2.58, "time": 1505417475310, "felt": 83, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.815167, 37.412167, -0.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16826593", "mag": 3.3, "time": 1505417123986, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.9114, 52.3919, 7.2 ] } }, + { "type": "Feature", "properties": { "id": "ld60143041", "mag": 1.13, "time": 1505416429790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -78.886167, 43.172167, 4.49 ] } }, + { "type": "Feature", "properties": { "id": "us2000amnb", "mag": 3.0, "time": 1505416249190, "felt": 10, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5193, 36.2853, 5.18 ] } }, + { "type": "Feature", "properties": { "id": "ak16826590", "mag": 1.5, "time": 1505416113279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1135, 61.6397, 76.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16826581", "mag": 3.0, "time": 1505415978301, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7549, 53.141, 25.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16826576", "mag": 2.1, "time": 1505415492270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9009, 60.0386, 108.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16826575", "mag": 1.4, "time": 1505414640813, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4567, 60.0012, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72892281", "mag": 1.22, "time": 1505414516760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.106667, 37.328833, -0.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16826369", "mag": 1.5, "time": 1505413533625, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2439, 60.5671, 11.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16826365", "mag": 2.1, "time": 1505413453164, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2344, 60.5666, 13.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16826364", "mag": 1.2, "time": 1505413265164, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.6599, 59.9119, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37763023", "mag": 1.39, "time": 1505413136790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.316167, 35.0525, -0.97 ] } }, + { "type": "Feature", "properties": { "id": "uw61307532", "mag": 1.1, "time": 1505412859730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.3855, 45.629833, -1.63 ] } }, + { "type": "Feature", "properties": { "id": "nc72892266", "mag": 0.96, "time": 1505412496280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.823167, 37.5355, 0.22 ] } }, + { "type": "Feature", "properties": { "id": "nc72892261", "mag": 1.1, "time": 1505411783250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.808166, 38.800167, 2.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16826335", "mag": 1.2, "time": 1505411310289, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0556, 61.0558, 10.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16826330", "mag": 1.6, "time": 1505411005327, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8642, 60.9198, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000amk5", "mag": 5.8, "time": 1505410888670, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.732, 18.6699, 173.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72892241", "mag": 3.28, "time": 1505410337330, "felt": 1346, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.8135, 37.411667, -0.21 ] } }, + { "type": "Feature", "properties": { "id": "us2000amw9", "mag": 2.9, "time": 1505410106220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.434, 42.5971, 8.27 ] } }, + { "type": "Feature", "properties": { "id": "ci37762975", "mag": 1.37, "time": 1505410085790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.795333, 33.494833, 5.03 ] } }, + { "type": "Feature", "properties": { "id": "us2000amja", "mag": 3.2, "time": 1505409999020, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4403, 42.586, 8.7 ] } }, + { "type": "Feature", "properties": { "id": "uw61307502", "mag": 2.03, "time": 1505409449050, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.775333, 47.590667, 26.27 ] } }, + { "type": "Feature", "properties": { "id": "us2000amis", "mag": 4.1, "time": 1505408885650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3313, 15.7247, 66.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16826120", "mag": 2.2, "time": 1505408670072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8183, 60.7702, 77.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000amhu", "mag": 2.5, "time": 1505407539000, "felt": 179, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.0236, 32.7967, 6.19 ] } }, + { "type": "Feature", "properties": { "id": "ak16826109", "mag": 3.4, "time": 1505406315703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.9733, 53.4109, 37.9 ] } }, + { "type": "Feature", "properties": { "id": "pr2017257003", "mag": 1.93, "time": 1505405250720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.1335, 18.0533, 14.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16825909", "mag": 3.0, "time": 1505405033445, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.4291, 57.7254, 15.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16861191", "mag": 2.2, "time": 1505404726740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.4598, 52.5561, 41.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000amga", "mag": 4.5, "time": 1505404343560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.122, -6.0228, 63.06 ] } }, + { "type": "Feature", "properties": { "id": "uu60245622", "mag": 1.46, "time": 1505403828660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.640167, 41.675, 10.23 ] } }, + { "type": "Feature", "properties": { "id": "ci37762935", "mag": 1.53, "time": 1505403471570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.7005, 36.071833, 0.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16861190", "mag": 1.9, "time": 1505403359391, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.3367, 58.804, 116.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37762927", "mag": 1.08, "time": 1505403357540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.6365, 33.9595, 15.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16825908", "mag": 1.4, "time": 1505402885768, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5012, 61.3116, 5.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16825714", "mag": 2.2, "time": 1505399922942, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.5211, 53.4862, 2.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72892201", "mag": 2.8, "time": 1505399703490, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8115, 37.473, 1.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16825708", "mag": 2.5, "time": 1505399664156, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3242, 59.9299, 129.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000amdz", "mag": 4.3, "time": 1505399623950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8439, 15.4623, 51.01 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235213", "mag": 2.12, "time": 1505398747570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.888167, 37.203167, 5.99 ] } }, + { "type": "Feature", "properties": { "id": "ak16825704", "mag": 1.0, "time": 1505398436381, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.6928, 63.8584, 11.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37762895", "mag": 1.82, "time": 1505398376370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.448167, 33.465, 11.86 ] } }, + { "type": "Feature", "properties": { "id": "mb80255329", "mag": 1.87, "time": 1505398289770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.534833, 46.870333, 11.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16825519", "mag": 1.8, "time": 1505397944345, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.464, 59.9879, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000amcx", "mag": 2.4, "time": 1505397840240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4117, 42.6047, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "pr2017257002", "mag": 3.32, "time": 1505397292070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.3985, 17.9023, 89.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16861180", "mag": 2.0, "time": 1505397099289, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.7867, 53.5505, 48.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16861178", "mag": 1.1, "time": 1505394745904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8149, 59.8173, 16.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72892181", "mag": 0.97, "time": 1505394542400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.833667, 37.603833, 3.53 ] } }, + { "type": "Feature", "properties": { "id": "nn00605167", "mag": 1.1, "time": 1505394484720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9328, 38.4065, 6.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16825327", "mag": 1.8, "time": 1505394377057, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5142, 60.0065, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16825325", "mag": 1.1, "time": 1505393895767, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0247, 61.1655, 6.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16825323", "mag": 1.3, "time": 1505393727514, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.0737, 61.1407, 3.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ambm", "mag": 2.8, "time": 1505393579230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4339, 42.5276, 8.74 ] } }, + { "type": "Feature", "properties": { "id": "nc72892176", "mag": 1.12, "time": 1505393008100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8295, 37.486167, 1.89 ] } }, + { "type": "Feature", "properties": { "id": "ak16825308", "mag": 2.8, "time": 1505392115017, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1037, 58.6121, 140.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72892171", "mag": 1.95, "time": 1505392014690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.811, 37.47, 1.05 ] } }, + { "type": "Feature", "properties": { "id": "ci37762879", "mag": 2.48, "time": 1505391903440, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.03, 34.269167, 1.91 ] } }, + { "type": "Feature", "properties": { "id": "hv61907846", "mag": 1.74, "time": 1505391154930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.801498, 20.135166, 20.69 ] } }, + { "type": "Feature", "properties": { "id": "ak16825129", "mag": 1.8, "time": 1505390600450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.6941, 53.4145, 21.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60245547", "mag": 1.86, "time": 1505390326640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.506167, 37.5615, 15.73 ] } }, + { "type": "Feature", "properties": { "id": "ak16825126", "mag": 1.4, "time": 1505389290941, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.5082, 60.1407, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16825125", "mag": 1.0, "time": 1505389269829, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3654, 61.4964, 18.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16861166", "mag": 1.9, "time": 1505388913353, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3862, 51.6162, 20.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16825120", "mag": 2.1, "time": 1505388602725, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.7931, 54.8482, 3.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16825116", "mag": 1.5, "time": 1505388522841, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3442, 61.3489, 49.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16825115", "mag": 1.2, "time": 1505388281614, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5528, 61.7241, 28.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16824940", "mag": 1.2, "time": 1505387093135, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3758, 61.1701, 24.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72892141", "mag": 1.22, "time": 1505386514410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.131, 36.571833, 9.94 ] } }, + { "type": "Feature", "properties": { "id": "ak16824937", "mag": 2.5, "time": 1505385684936, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.0082, 52.3291, 6.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16824932", "mag": 1.6, "time": 1505384400903, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5379, 59.9886, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16824930", "mag": 1.2, "time": 1505383839558, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.3238, 66.4782, 11.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16861154", "mag": 1.9, "time": 1505383026342, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.851, 54.0129, 69.5 ] } }, + { "type": "Feature", "properties": { "id": "hv61907791", "mag": 1.61, "time": 1505382391650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.223667, 18.879, 14.409 ] } }, + { "type": "Feature", "properties": { "id": "ak16824762", "mag": 1.4, "time": 1505381878343, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4212, 60.1553, 64.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16824759", "mag": 2.0, "time": 1505381875397, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7269, 61.5265, 60.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72892131", "mag": 0.97, "time": 1505381710130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.720001, 38.778168, 1.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16824756", "mag": 2.0, "time": 1505380861272, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0471, 60.1915, 70.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16861150", "mag": 2.6, "time": 1505380391671, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.8518, 53.4455, 2.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16824753", "mag": 2.6, "time": 1505380263376, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.1582, 56.2796, 14.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60245457", "mag": 2.53, "time": 1505379272870, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -108.827333, 40.120667, -3.25 ] } }, + { "type": "Feature", "properties": { "id": "ci37762823", "mag": 2.96, "time": 1505378281630, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.181833, 31.831667, 18.32 ] } }, + { "type": "Feature", "properties": { "id": "nc72892121", "mag": 1.02, "time": 1505377845780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.717499, 38.774666, 2.13 ] } }, + { "type": "Feature", "properties": { "id": "nc72892116", "mag": 1.11, "time": 1505377833950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.714333, 38.776667, 1.68 ] } }, + { "type": "Feature", "properties": { "id": "us2000am81", "mag": 4.6, "time": 1505377166860, "felt": 66, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -76.4481, -11.977, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235208", "mag": 1.81, "time": 1505376928150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.570333, 37.345667, 5.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16824583", "mag": 1.6, "time": 1505376729312, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4585, 60.3656, 97.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72892106", "mag": 1.19, "time": 1505376712450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.799833, 38.712667, 4.08 ] } }, + { "type": "Feature", "properties": { "id": "ci37762815", "mag": 1.04, "time": 1505374690080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.221833, 32.924167, 12.12 ] } }, + { "type": "Feature", "properties": { "id": "ak16824572", "mag": 1.6, "time": 1505374660381, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.7598, 65.436, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000am75", "mag": 4.4, "time": 1505372640680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -72.6754, -34.2973, 1.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16824419", "mag": 1.8, "time": 1505372310107, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5103, 60.0002, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37762807", "mag": 1.14, "time": 1505372248820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.872333, 36.502833, 6.38 ] } }, + { "type": "Feature", "properties": { "id": "ak16824418", "mag": 1.0, "time": 1505372093089, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8634, 59.8384, 41.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16824415", "mag": 1.3, "time": 1505371860862, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4454, 63.0596, 8.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37762783", "mag": 1.64, "time": 1505371108250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.625167, 32.844, 11.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16824411", "mag": 1.3, "time": 1505371053195, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1765, 60.359, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aywv", "mag": 4.0, "time": 1505370268660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6903, 15.5507, 43.43 ] } }, + { "type": "Feature", "properties": { "id": "ci37762759", "mag": 1.32, "time": 1505370002700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.733, 33.668167, 13.69 ] } }, + { "type": "Feature", "properties": { "id": "hv61907731", "mag": 1.75, "time": 1505369997330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.382, 19.236, 32.221 ] } }, + { "type": "Feature", "properties": { "id": "ci37762751", "mag": 0.96, "time": 1505369947950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.731167, 33.674333, 14.82 ] } }, + { "type": "Feature", "properties": { "id": "us2000aywt", "mag": 4.0, "time": 1505369661520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2582, 14.9559, 25.35 ] } }, + { "type": "Feature", "properties": { "id": "nc72892081", "mag": 1.08, "time": 1505369496760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.1615, 36.5675, 3.55 ] } }, + { "type": "Feature", "properties": { "id": "us2000am6i", "mag": 4.5, "time": 1505369450740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3229, 15.1323, 35.74 ] } }, + { "type": "Feature", "properties": { "id": "us2000am6b", "mag": 4.4, "time": 1505369156780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7112, 15.4856, 25.87 ] } }, + { "type": "Feature", "properties": { "id": "us2000am61", "mag": 3.0, "time": 1505368177800, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.3656, 36.7402, 7.992 ] } }, + { "type": "Feature", "properties": { "id": "hv61907641", "mag": 2.26, "time": 1505367585250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.425667, 19.294167, 8.845 ] } }, + { "type": "Feature", "properties": { "id": "us2000arcx", "mag": 3.2, "time": 1505367393080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4046, 51.5999, 12.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000am5i", "mag": 4.2, "time": 1505366427980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.0841, 14.4266, 49.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000amaf", "mag": 4.7, "time": 1505366112080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 148.0489, -1.356, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72892391", "mag": 1.0, "time": 1505365754150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.669167, 40.386833, 6.29 ] } }, + { "type": "Feature", "properties": { "id": "us2000am56", "mag": 4.7, "time": 1505365399680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.0709, 14.4637, 52.71 ] } }, + { "type": "Feature", "properties": { "id": "mb80255284", "mag": 0.98, "time": 1505365218550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.522, 46.8975, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16861140", "mag": 1.2, "time": 1505365047321, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0097, 62.5721, 78.1 ] } }, + { "type": "Feature", "properties": { "id": "ci37762615", "mag": 0.95, "time": 1505364900090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.405833, 33.049333, 3.39 ] } }, + { "type": "Feature", "properties": { "id": "nc72892056", "mag": 1.38, "time": 1505364695740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834, 37.54, 4.68 ] } }, + { "type": "Feature", "properties": { "id": "uw61307352", "mag": 1.78, "time": 1505364485340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.942833, 46.866667, 10.19 ] } }, + { "type": "Feature", "properties": { "id": "ak16824230", "mag": 1.9, "time": 1505364358950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.959, 59.8075, 60.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37762599", "mag": 1.23, "time": 1505364106870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.992833, 33.957167, 16.75 ] } }, + { "type": "Feature", "properties": { "id": "ci37762591", "mag": 2.12, "time": 1505363550640, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.864667, 34.336333, 2.71 ] } }, + { "type": "Feature", "properties": { "id": "nc72892041", "mag": 1.83, "time": 1505363410540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.834167, 37.540667, 4.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16824097", "mag": 1.0, "time": 1505363016608, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1668, 62.6309, 61.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000am4b", "mag": 3.2, "time": 1505362481060, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.9406, 37.3096, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16823967", "mag": 2.0, "time": 1505361191283, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2972, 61.0176, 70.0 ] } }, + { "type": "Feature", "properties": { "id": "pr2017257000", "mag": 4.32, "time": 1505360450920, "felt": 14, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.791, 18.2223, 133.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000am3s", "mag": 3.3, "time": 1505360430180, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5112, 36.2854, 3.99 ] } }, + { "type": "Feature", "properties": { "id": "ci37762583", "mag": 1.43, "time": 1505358534420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.6335, 37.005167, 1.55 ] } }, + { "type": "Feature", "properties": { "id": "ci37762575", "mag": 1.39, "time": 1505358219310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.606667, 32.828, 12.41 ] } }, + { "type": "Feature", "properties": { "id": "ci37762567", "mag": 1.41, "time": 1505358109150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.427667, 34.225833, 13.02 ] } }, + { "type": "Feature", "properties": { "id": "us2000amd4", "mag": 3.2, "time": 1505357901130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4442, 42.5241, 6.99 ] } }, + { "type": "Feature", "properties": { "id": "us2000amd0", "mag": 3.1, "time": 1505357873450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4212, 42.5232, 8.42 ] } }, + { "type": "Feature", "properties": { "id": "us2000am2z", "mag": 4.0, "time": 1505357591000, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4618, 42.5096, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60245162", "mag": 3.43, "time": 1505357581000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.426833, 42.522333, 7.86 ] } }, + { "type": "Feature", "properties": { "id": "ak16861134", "mag": 1.6, "time": 1505356675370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8887, 59.6609, 90.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16823826", "mag": 1.2, "time": 1505356643722, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.394, 60.1683, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000am28", "mag": 2.4, "time": 1505356555350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4263, 42.5303, 6.85 ] } }, + { "type": "Feature", "properties": { "id": "nn00605135", "mag": 1.0, "time": 1505356439739, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8899, 37.3603, 8.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16823823", "mag": 1.2, "time": 1505356197786, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8776, 62.7371, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72892031", "mag": 0.98, "time": 1505355727940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.737663, 38.785168, 2.12 ] } }, + { "type": "Feature", "properties": { "id": "nc72892026", "mag": 1.09, "time": 1505355720450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.746833, 38.787833, 0.11 ] } }, + { "type": "Feature", "properties": { "id": "ak16861131", "mag": 1.7, "time": 1505355503652, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2915, 59.077, 76.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72892021", "mag": 1.67, "time": 1505355378570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.139667, 37.139, 11.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16823809", "mag": 1.2, "time": 1505354254705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3285, 60.1933, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000am21", "mag": 3.2, "time": 1505353999720, "felt": 13, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 22.899, 42.6704, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37762543", "mag": 1.21, "time": 1505353838790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.543667, 34.513833, 6.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000am1y", "mag": 2.6, "time": 1505353481360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4312, 42.6014, 6.92 ] } }, + { "type": "Feature", "properties": { "id": "ak16823693", "mag": 1.0, "time": 1505351348552, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.644, 62.6994, 58.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16823694", "mag": 2.1, "time": 1505351146642, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.5002, 54.7664, 27.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16823688", "mag": 1.1, "time": 1505350854568, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6619, 59.8124, 15.7 ] } }, + { "type": "Feature", "properties": { "id": "pr2017257001", "mag": 1.33, "time": 1505350270080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.141, 18.0321, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16823577", "mag": 2.7, "time": 1505349755149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.3635, 54.4582, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16861124", "mag": 1.1, "time": 1505349382106, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.2989, 65.668, 14.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000am0x", "mag": 4.6, "time": 1505348843700, "felt": 139, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 139.6152, 35.7719, 48.83 ] } }, + { "type": "Feature", "properties": { "id": "ci37762495", "mag": 1.0, "time": 1505347877510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3345, 33.3545, 11.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16823574", "mag": 2.8, "time": 1505347636545, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.3466, 52.1109, 79.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16823573", "mag": 2.3, "time": 1505347560653, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4123, 51.617, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "ci37762487", "mag": 1.28, "time": 1505347417680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2715, 33.976667, 5.05 ] } }, + { "type": "Feature", "properties": { "id": "hv61907326", "mag": 1.75, "time": 1505347375860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.394165, 19.238333, 32.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16861121", "mag": 1.7, "time": 1505347241023, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4, 51.6505, 10.1 ] } }, + { "type": "Feature", "properties": { "id": "hv61907236", "mag": 2.19, "time": 1505347011230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.3835, 19.243, 32.131 ] } }, + { "type": "Feature", "properties": { "id": "nc72891986", "mag": 1.15, "time": 1505346581750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.5475, 37.143167, 3.07 ] } }, + { "type": "Feature", "properties": { "id": "uw61307262", "mag": 1.18, "time": 1505346312450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.458833, 45.814167, -0.95 ] } }, + { "type": "Feature", "properties": { "id": "ak16823443", "mag": 1.7, "time": 1505346090013, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3313, 60.824, 55.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37762463", "mag": 2.21, "time": 1505345845770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.610333, 32.834, 14.54 ] } }, + { "type": "Feature", "properties": { "id": "ci37762455", "mag": 1.23, "time": 1505345794660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.613333, 32.828, 12.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16823442", "mag": 1.4, "time": 1505345681125, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1366, 63.4085, 115.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80255184", "mag": 0.99, "time": 1505345517200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.161833, 48.091333, 6.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16823441", "mag": 1.4, "time": 1505345131416, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9358, 61.9565, 65.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000alzg", "mag": 4.2, "time": 1505344897150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.4183, -18.058, 145.27 ] } }, + { "type": "Feature", "properties": { "id": "ak16823332", "mag": 2.8, "time": 1505344031893, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3482, 51.3154, 44.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16823330", "mag": 1.3, "time": 1505343882913, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3403, 64.9963, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000alyy", "mag": 3.2, "time": 1505343206750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5646, 46.8793, 10.55 ] } }, + { "type": "Feature", "properties": { "id": "uw61307247", "mag": 1.57, "time": 1505343065140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.347833, 44.090833, -1.55 ] } }, + { "type": "Feature", "properties": { "id": "ci37762423", "mag": 2.63, "time": 1505342925380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6105, 32.832833, 13.39 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235168", "mag": 1.72, "time": 1505342816860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.966333, 37.277833, 4.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60245097", "mag": 1.4, "time": 1505342728590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.0425, 44.6825, 13.02 ] } }, + { "type": "Feature", "properties": { "id": "ci37762407", "mag": 1.11, "time": 1505342669930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2705, 33.978, 5.78 ] } }, + { "type": "Feature", "properties": { "id": "ak16830577", "mag": 2.2, "time": 1505342546550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.6253, 55.5692, 53.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37762415", "mag": 1.75, "time": 1505342494590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.999333, 33.073, -0.12 ] } }, + { "type": "Feature", "properties": { "id": "nn00605103", "mag": 1.1, "time": 1505342257553, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.367, 38.5022, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "ci37762399", "mag": 1.66, "time": 1505342009270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.612333, 32.834667, 12.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37762391", "mag": 1.75, "time": 1505341937760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.613, 32.838667, 12.07 ] } }, + { "type": "Feature", "properties": { "id": "ci37762383", "mag": 1.83, "time": 1505341540510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.614, 32.8335, 12.31 ] } }, + { "type": "Feature", "properties": { "id": "ci37762367", "mag": 3.47, "time": 1505341287040, "felt": 39, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.615833, 32.843833, 15.23 ] } }, + { "type": "Feature", "properties": { "id": "hv61907176", "mag": 1.67, "time": 1505340803980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.213667, 19.3035, 2.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16823316", "mag": 2.5, "time": 1505340733287, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3859, 61.6698, 29.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72891951", "mag": 1.45, "time": 1505340188960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.841667, 37.532167, -1.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16830575", "mag": 1.5, "time": 1505340177499, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5229, 57.7401, 52.1 ] } }, + { "type": "Feature", "properties": { "id": "ci37762359", "mag": 1.73, "time": 1505340060360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.274, 33.976333, 5.08 ] } }, + { "type": "Feature", "properties": { "id": "ci37762351", "mag": 3.26, "time": 1505339982500, "felt": 19, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.276, 33.975333, 3.91 ] } }, + { "type": "Feature", "properties": { "id": "ak16830574", "mag": 1.6, "time": 1505339727053, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.4531, 53.5386, 11.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16823310", "mag": 1.1, "time": 1505339360762, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.5682, 53.9212, 8.1 ] } }, + { "type": "Feature", "properties": { "id": "ci37762343", "mag": 1.12, "time": 1505339170890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.795167, 33.507167, 4.82 ] } }, + { "type": "Feature", "properties": { "id": "mb80255169", "mag": 1.13, "time": 1505339091750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.622667, 46.909667, 10.61 ] } }, + { "type": "Feature", "properties": { "id": "us2000alwi", "mag": 4.7, "time": 1505338937260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0086, 15.1566, 38.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37762335", "mag": 1.17, "time": 1505338520010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.614667, 32.832167, 10.18 ] } }, + { "type": "Feature", "properties": { "id": "ci37762327", "mag": 1.59, "time": 1505338477140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.615333, 32.843, 15.01 ] } }, + { "type": "Feature", "properties": { "id": "uu60245082", "mag": 1.54, "time": 1505338298430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.043833, 44.678167, 13.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000alvq", "mag": 5.0, "time": 1505338251370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9904, 15.7092, 39.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72891936", "mag": 1.29, "time": 1505338239110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.017333, 37.5655, -0.37 ] } }, + { "type": "Feature", "properties": { "id": "ci37762303", "mag": 1.69, "time": 1505337757160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7965, 33.504167, 5.32 ] } }, + { "type": "Feature", "properties": { "id": "uu60245072", "mag": 1.82, "time": 1505336663200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.075667, 44.674, 5.83 ] } }, + { "type": "Feature", "properties": { "id": "ci37762287", "mag": 1.49, "time": 1505336435640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.498833, 33.8575, -0.61 ] } }, + { "type": "Feature", "properties": { "id": "mb80255154", "mag": 2.29, "time": 1505335433020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.7145, 46.9035, 15.16 ] } }, + { "type": "Feature", "properties": { "id": "nc72891916", "mag": 1.11, "time": 1505334220120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7985, 38.833168, 1.37 ] } }, + { "type": "Feature", "properties": { "id": "nc72891911", "mag": 1.01, "time": 1505333988430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.811165, 38.815666, 2.78 ] } }, + { "type": "Feature", "properties": { "id": "ak16823196", "mag": 1.7, "time": 1505333862556, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2791, 60.1339, 58.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72891901", "mag": 1.64, "time": 1505333181410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.814, 38.8085, 2.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72891896", "mag": 1.52, "time": 1505332739060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.817667, 37.481167, 0.23 ] } }, + { "type": "Feature", "properties": { "id": "ci37762231", "mag": 1.56, "time": 1505331922920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.381833, 35.980833, 4.99 ] } }, + { "type": "Feature", "properties": { "id": "us2000alqh", "mag": 4.6, "time": 1505331447000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 112.9501, -6.0986, 590.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000alq6", "mag": 3.0, "time": 1505331233180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4525, 42.6029, 6.02 ] } }, + { "type": "Feature", "properties": { "id": "ak16823083", "mag": 1.8, "time": 1505330838320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.8987, 61.0912, 0.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16823082", "mag": 1.3, "time": 1505330810883, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.7682, 61.1384, 6.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16823080", "mag": 1.9, "time": 1505329947650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7636, 59.6753, 80.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37762215", "mag": 1.01, "time": 1505329786970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1445, 33.667, -0.63 ] } }, + { "type": "Feature", "properties": { "id": "nc72891881", "mag": 1.2, "time": 1505329775160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.850167, 37.644667, 5.63 ] } }, + { "type": "Feature", "properties": { "id": "ci37762207", "mag": 1.15, "time": 1505329688010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.187167, 34.993167, -0.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16830566", "mag": 2.0, "time": 1505328672149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.302, 51.3949, 36.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16822979", "mag": 1.3, "time": 1505328502909, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3078, 61.2967, 15.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72891876", "mag": 1.1, "time": 1505327236230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.745666, 38.787834, 1.52 ] } }, + { "type": "Feature", "properties": { "id": "ak16822977", "mag": 1.3, "time": 1505326599778, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0157, 63.5538, 1.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72891871", "mag": 2.5, "time": 1505325897250, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0595, 40.449667, 16.29 ] } }, + { "type": "Feature", "properties": { "id": "nc72891866", "mag": 1.77, "time": 1505325532440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0005, 35.943167, 17.23 ] } }, + { "type": "Feature", "properties": { "id": "nc72891861", "mag": 1.4, "time": 1505325215290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.600167, 35.482, -0.46 ] } }, + { "type": "Feature", "properties": { "id": "ci37762175", "mag": 1.47, "time": 1505324991750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.609, 32.840667, 14.81 ] } }, + { "type": "Feature", "properties": { "id": "ak16822975", "mag": 1.2, "time": 1505324283732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.2438, 62.4485, 2.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72891851", "mag": 1.07, "time": 1505324016940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.841167, 37.491667, -0.1 ] } }, + { "type": "Feature", "properties": { "id": "se60179327", "mag": 3.2, "time": 1505323990930, "felt": 525, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -80.703, 37.472833, 17.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16822973", "mag": 1.1, "time": 1505323870033, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7446, 59.8908, 41.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16830561", "mag": 1.8, "time": 1505323399318, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9553, 59.6095, 109.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16830560", "mag": 2.0, "time": 1505322404855, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5059, 60.1768, 153.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000alkc", "mag": 4.4, "time": 1505321962400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6803, 15.7969, 43.13 ] } }, + { "type": "Feature", "properties": { "id": "ak16830559", "mag": 1.8, "time": 1505321554841, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.8197, 51.97, 7.3 ] } }, + { "type": "Feature", "properties": { "id": "nc72891831", "mag": 2.56, "time": 1505318816290, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.704667, 40.484, 16.91 ] } }, + { "type": "Feature", "properties": { "id": "ak16822799", "mag": 1.8, "time": 1505318719906, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.4098, 51.7491, 29.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16822798", "mag": 1.1, "time": 1505318596103, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8143, 62.8428, 67.1 ] } }, + { "type": "Feature", "properties": { "id": "hv61906796", "mag": 2.1, "time": 1505317840280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.485504, 19.219, 36.43 ] } }, + { "type": "Feature", "properties": { "id": "ak16822695", "mag": 1.3, "time": 1505316869586, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4592, 63.3484, 0.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000asbr", "mag": 4.3, "time": 1505316791790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.1284, -4.88, 54.06 ] } }, + { "type": "Feature", "properties": { "id": "hv61906781", "mag": 1.87, "time": 1505316745210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.889333, 19.9115, 24.592 ] } }, + { "type": "Feature", "properties": { "id": "us2000alhx", "mag": 5.0, "time": 1505316098600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 161.9266, -10.7647, 46.64 ] } }, + { "type": "Feature", "properties": { "id": "ak16822692", "mag": 2.1, "time": 1505315572825, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2966, 59.7717, 67.1 ] } }, + { "type": "Feature", "properties": { "id": "nm60179312", "mag": 1.77, "time": 1505315298800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.672667, 36.156667, 9.37 ] } }, + { "type": "Feature", "properties": { "id": "ak16822691", "mag": 1.8, "time": 1505315111913, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8055, 59.8229, 63.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16822689", "mag": 1.5, "time": 1505313796189, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.627, 60.7945, 30.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37762039", "mag": 1.34, "time": 1505312641900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.791, 36.012167, 1.22 ] } }, + { "type": "Feature", "properties": { "id": "nn00605012", "mag": 1.1, "time": 1505309502885, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9116, 38.3879, 15.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16830551", "mag": 1.1, "time": 1505309158928, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8896, 60.3719, 15.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16822590", "mag": 1.1, "time": 1505309077336, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.3908, 66.2048, 11.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80255099", "mag": 1.92, "time": 1505309076210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.547833, 44.257, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72891776", "mag": 1.02, "time": 1505308975510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.918167, 37.593167, 0.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16822588", "mag": 1.4, "time": 1505308950441, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4711, 65.4989, 11.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00604990", "mag": 2.3, "time": 1505308914949, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.818, 38.8311, 8.7 ] } }, + { "type": "Feature", "properties": { "id": "ci37762007", "mag": 2.3, "time": 1505308483530, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.585667, 35.139667, 1.62 ] } }, + { "type": "Feature", "properties": { "id": "ci37761999", "mag": 1.26, "time": 1505308208470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6185, 32.838, 13.81 ] } }, + { "type": "Feature", "properties": { "id": "hv61906676", "mag": 1.95, "time": 1505307948740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.298996, 19.424334, 6.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37761983", "mag": 1.11, "time": 1505307567020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.623, 32.839333, 10.27 ] } }, + { "type": "Feature", "properties": { "id": "us2000alfh", "mag": 4.5, "time": 1505306912090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.7023, 15.8472, 95.22 ] } }, + { "type": "Feature", "properties": { "id": "mb80255094", "mag": 1.19, "time": 1505305625190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.642667, 46.956667, 13.27 ] } }, + { "type": "Feature", "properties": { "id": "ci37761967", "mag": 0.99, "time": 1505305387220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.587333, 36.179667, 0.99 ] } }, + { "type": "Feature", "properties": { "id": "nc72891766", "mag": 1.15, "time": 1505305306770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.820333, 38.804, 2.93 ] } }, + { "type": "Feature", "properties": { "id": "us2000anw3", "mag": 2.5, "time": 1505305272030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.6774, 53.9359, 13.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37761959", "mag": 1.4, "time": 1505304763660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.829167, 32.782333, 3.76 ] } }, + { "type": "Feature", "properties": { "id": "us2000asbk", "mag": 4.1, "time": 1505303510580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 128.1783, 2.9917, 58.22 ] } }, + { "type": "Feature", "properties": { "id": "nc72891751", "mag": 0.99, "time": 1505303358450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.082167, 35.707667, 6.66 ] } }, + { "type": "Feature", "properties": { "id": "ak16822583", "mag": 1.1, "time": 1505302645910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3182, 60.2384, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16822582", "mag": 2.3, "time": 1505302558389, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.6566, 51.5758, 56.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000alew", "mag": 3.9, "time": 1505302030040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2516, 14.855, 22.24 ] } }, + { "type": "Feature", "properties": { "id": "mb80255084", "mag": 1.07, "time": 1505300960250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.511667, 46.9035, 5.32 ] } }, + { "type": "Feature", "properties": { "id": "ak16822577", "mag": 1.5, "time": 1505300414194, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.9212, 64.7545, 3.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000alee", "mag": 3.3, "time": 1505299970430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6225, 59.7836, 5.44 ] } }, + { "type": "Feature", "properties": { "id": "uu60244877", "mag": 2.35, "time": 1505299838240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.8535, 44.770833, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72891746", "mag": 1.53, "time": 1505299590270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793, 38.8215, 3.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16830540", "mag": 1.9, "time": 1505298481141, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1134, 57.8805, 76.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000anw1", "mag": 3.0, "time": 1505298226550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.0008, 50.1653, 25.9 ] } }, + { "type": "Feature", "properties": { "id": "nn00604987", "mag": 1.7, "time": 1505298050456, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.8103, 39.3643, 9.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16822473", "mag": 1.2, "time": 1505297484913, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4897, 63.0467, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16822472", "mag": 2.4, "time": 1505297294726, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.0416, 53.5692, 24.5 ] } }, + { "type": "Feature", "properties": { "id": "uw61307017", "mag": 1.34, "time": 1505297037790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.764333, 48.271333, 1.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16830536", "mag": 1.2, "time": 1505297029108, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7778, 60.5002, 3.8 ] } }, + { "type": "Feature", "properties": { "id": "uu60244867", "mag": 2.44, "time": 1505296698750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.422, 42.567833, 7.73 ] } }, + { "type": "Feature", "properties": { "id": "us2000aldk", "mag": 4.3, "time": 1505296627560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9055, 15.639, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37761935", "mag": 1.02, "time": 1505296379600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.6215, 32.831333, 10.19 ] } }, + { "type": "Feature", "properties": { "id": "us2000aldd", "mag": 4.5, "time": 1505295980580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7401, 15.5449, 31.41 ] } }, + { "type": "Feature", "properties": { "id": "us2000ald3", "mag": 2.4, "time": 1505295918600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.9039, 36.2089, 4.448 ] } }, + { "type": "Feature", "properties": { "id": "ak16822468", "mag": 2.5, "time": 1505295654705, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.2898, 58.6446, 4.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ald0", "mag": 4.3, "time": 1505295123840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.5523, -23.5684, 541.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16822374", "mag": 2.1, "time": 1505294583800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.5476, 52.7346, 39.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000alcs", "mag": 3.9, "time": 1505294302600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2348, 15.2732, 42.03 ] } }, + { "type": "Feature", "properties": { "id": "hv61906586", "mag": 2.11, "time": 1505294188360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.356003, 19.467167, 4.72 ] } }, + { "type": "Feature", "properties": { "id": "nc72891726", "mag": 1.09, "time": 1505293695870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793831, 38.822334, 2.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000alcf", "mag": 2.6, "time": 1505292526080, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4275, 42.596, 6.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16822373", "mag": 1.5, "time": 1505292217097, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4702, 60.5679, 7.7 ] } }, + { "type": "Feature", "properties": { "id": "nn00604985", "mag": 1.6, "time": 1505292088777, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.548, 37.4198, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72891721", "mag": 1.57, "time": 1505290933360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.889333, 39.366167, 10.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16822371", "mag": 1.4, "time": 1505290808147, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.8609, 62.2453, 3.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16822294", "mag": 1.5, "time": 1505289269698, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7566, 62.9227, 94.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16822278", "mag": 1.1, "time": 1505287972451, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.7433, 64.7476, 3.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16822251", "mag": 3.4, "time": 1505287366858, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.5871, 61.6459, 24.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16822240", "mag": 4.2, "time": 1505287337046, "felt": 42, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9213, 62.8983, 79.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000albc", "mag": 2.3, "time": 1505286819380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4494, 42.6632, 10.21 ] } }, + { "type": "Feature", "properties": { "id": "ak16830527", "mag": 1.8, "time": 1505286603893, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0388, 59.8755, 109.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16822236", "mag": 1.3, "time": 1505286374065, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3111, 60.5579, 12.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72891681", "mag": 1.39, "time": 1505286150510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8285, 37.467, -1.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16822233", "mag": 1.6, "time": 1505285865490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8651, 62.2629, 96.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000alb7", "mag": 2.6, "time": 1505285839040, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4177, 42.5618, 8.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16830523", "mag": 1.7, "time": 1505285675768, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.1432, 53.7072, 69.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000alb2", "mag": 4.5, "time": 1505284765560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.084, -22.1327, 549.09 ] } }, + { "type": "Feature", "properties": { "id": "nn00605030", "mag": 1.1, "time": 1505284250632, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9094, 38.3681, 5.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16830521", "mag": 1.2, "time": 1505284146176, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8175, 60.5189, 13.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000alax", "mag": 4.7, "time": 1505283996200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.6079, 13.4506, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72891656", "mag": 2.62, "time": 1505283657320, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.803833, 37.486167, 2.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37761831", "mag": 1.06, "time": 1505283115050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.795667, 33.5045, 6.22 ] } }, + { "type": "Feature", "properties": { "id": "ak16822160", "mag": 1.4, "time": 1505282783934, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9732, 60.9785, 5.5 ] } }, + { "type": "Feature", "properties": { "id": "mb80255029", "mag": 1.01, "time": 1505281846410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5335, 46.862167, 10.42 ] } }, + { "type": "Feature", "properties": { "id": "ak16822085", "mag": 1.5, "time": 1505279524459, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.8464, 60.3009, 18.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ala9", "mag": 4.5, "time": 1505279374230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.453, 15.3914, 72.28 ] } }, + { "type": "Feature", "properties": { "id": "ci37761799", "mag": 0.97, "time": 1505279080610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.108167, 34.0375, 6.71 ] } }, + { "type": "Feature", "properties": { "id": "ak16830517", "mag": 1.1, "time": 1505278511333, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.4202, 60.2062, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80255024", "mag": 0.95, "time": 1505278401320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529833, 46.864167, 11.03 ] } }, + { "type": "Feature", "properties": { "id": "nc72891626", "mag": 1.1, "time": 1505277590570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.657667, 37.1885, 3.74 ] } }, + { "type": "Feature", "properties": { "id": "nc72891621", "mag": 1.74, "time": 1505277415750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.886167, 39.3655, 10.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16822082", "mag": 1.6, "time": 1505275993590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.0455, 67.102, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72891611", "mag": 1.07, "time": 1505275610780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.795, 38.834667, 1.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16822080", "mag": 3.5, "time": 1505275475357, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4947, 51.6652, 10.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72891606", "mag": 2.64, "time": 1505275168490, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.793833, 38.835667, 1.89 ] } }, + { "type": "Feature", "properties": { "id": "mb80255014", "mag": 0.96, "time": 1505274355010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.537, 46.87, 9.71 ] } }, + { "type": "Feature", "properties": { "id": "nc72891581", "mag": 0.95, "time": 1505273207520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.795166, 38.836666, 1.37 ] } }, + { "type": "Feature", "properties": { "id": "mb80255009", "mag": 1.36, "time": 1505273099690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.536167, 46.872333, 11.58 ] } }, + { "type": "Feature", "properties": { "id": "pr2017256002", "mag": 2.65, "time": 1505272611930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.4988, 19.1065, 25.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72891561", "mag": 0.95, "time": 1505272540610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.796669, 38.836834, 1.67 ] } }, + { "type": "Feature", "properties": { "id": "nc72891556", "mag": 1.43, "time": 1505272430980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.798333, 38.835167, 1.85 ] } }, + { "type": "Feature", "properties": { "id": "nc72891551", "mag": 2.57, "time": 1505272400990, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.795667, 38.835, 1.82 ] } }, + { "type": "Feature", "properties": { "id": "us2000al90", "mag": 4.7, "time": 1505272023240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -73.0946, 9.5711, 124.17 ] } }, + { "type": "Feature", "properties": { "id": "mb80255004", "mag": 1.06, "time": 1505270988240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.532, 46.864667, 11.36 ] } }, + { "type": "Feature", "properties": { "id": "us2000al8v", "mag": 4.4, "time": 1505270586710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5721, 15.2889, 34.84 ] } }, + { "type": "Feature", "properties": { "id": "ci37761727", "mag": 1.4, "time": 1505270305170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.643667, 34.5065, 17.68 ] } }, + { "type": "Feature", "properties": { "id": "ak16822007", "mag": 1.0, "time": 1505269102037, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6691, 63.5608, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "pr2017256000", "mag": 3.12, "time": 1505269072880, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.5123, 19.091, 21.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72891541", "mag": 1.06, "time": 1505268817240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.517833, 36.804167, 4.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16821999", "mag": 1.7, "time": 1505268378179, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2198, 61.7575, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000al86", "mag": 5.0, "time": 1505268098300, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5276, 15.1558, 14.07 ] } }, + { "type": "Feature", "properties": { "id": "mb80254989", "mag": 1.38, "time": 1505267929610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.540667, 46.872333, 11.48 ] } }, + { "type": "Feature", "properties": { "id": "mb80254984", "mag": 0.99, "time": 1505267728460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5535, 46.8885, 10.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16821934", "mag": 1.1, "time": 1505267091152, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2406, 64.8451, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72891516", "mag": 1.94, "time": 1505266613010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.366833, 40.4805, 29.25 ] } }, + { "type": "Feature", "properties": { "id": "pr2017256001", "mag": 3.05, "time": 1505266581450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.5053, 19.0955, 25.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37761639", "mag": 2.16, "time": 1505265949130, "felt": 80, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.768667, 33.774833, 2.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16821933", "mag": 1.0, "time": 1505265920217, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.4031, 60.2216, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37761631", "mag": 1.35, "time": 1505265794450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.333667, 32.933167, 11.47 ] } }, + { "type": "Feature", "properties": { "id": "ak16821931", "mag": 1.3, "time": 1505265469603, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.5511, 61.3707, 12.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000al7y", "mag": 4.1, "time": 1505265414270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4234, 15.3254, 35.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16821926", "mag": 2.1, "time": 1505265047390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5313, 60.6712, 14.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16821924", "mag": 1.7, "time": 1505264772966, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.5006, 65.2775, 11.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000al7s", "mag": 4.1, "time": 1505263876510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.3188, 15.5954, 29.98 ] } }, + { "type": "Feature", "properties": { "id": "hv61906111", "mag": 1.46, "time": 1505262900730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.538167, 19.256333, 8.429 ] } }, + { "type": "Feature", "properties": { "id": "nc72891421", "mag": 1.92, "time": 1505262602400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.273167, 36.148167, 8.47 ] } }, + { "type": "Feature", "properties": { "id": "hv61906101", "mag": 2.02, "time": 1505262046800, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.276672, 19.404333, 0.19 ] } }, + { "type": "Feature", "properties": { "id": "nc72891406", "mag": 1.7, "time": 1505261981400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.865667, 36.439667, 6.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000al7a", "mag": 3.9, "time": 1505261942310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.399, 14.9659, 29.81 ] } }, + { "type": "Feature", "properties": { "id": "hv61906081", "mag": 1.94, "time": 1505261244650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.535, 19.849, 23.752 ] } }, + { "type": "Feature", "properties": { "id": "ci37761535", "mag": 1.56, "time": 1505261179000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.165833, 34.0375, 5.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16850793", "mag": 2.2, "time": 1505260675964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.4757, 53.3828, 38.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16821817", "mag": 1.0, "time": 1505258496556, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.5762, 67.0334, 2.1 ] } }, + { "type": "Feature", "properties": { "id": "uw61306902", "mag": 1.1, "time": 1505258286020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.374667, 45.693833, -0.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000al6d", "mag": 4.9, "time": 1505257835180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -32.4621, 58.0975, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37761503", "mag": 1.49, "time": 1505257449290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.675833, 35.043, -0.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16821811", "mag": 1.3, "time": 1505256864247, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3463, 64.994, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61905981", "mag": 1.81, "time": 1505256516770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.543333, 19.851167, 24.833 ] } }, + { "type": "Feature", "properties": { "id": "ak16821806", "mag": 2.7, "time": 1505256286618, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.4621, 65.79, 5.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16821804", "mag": 1.5, "time": 1505255958164, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3411, 61.6898, 7.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000al5m", "mag": 4.0, "time": 1505255324930, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -70.8843, -20.2485, 15.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000al5h", "mag": 4.8, "time": 1505254407650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -32.3543, 58.0241, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72891326", "mag": 1.22, "time": 1505251854350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.794833, 38.819333, 2.91 ] } }, + { "type": "Feature", "properties": { "id": "ci37761407", "mag": 1.17, "time": 1505251524970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.193167, 34.9985, -0.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000al44", "mag": 4.6, "time": 1505250860230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -32.4259, 58.0753, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16821734", "mag": 1.5, "time": 1505250673775, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.907, 60.3564, 8.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000al3g", "mag": 4.9, "time": 1505250247360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -32.4208, 58.165, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72891306", "mag": 1.1, "time": 1505250244890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819333, 37.604167, 3.81 ] } }, + { "type": "Feature", "properties": { "id": "ci37761383", "mag": 1.74, "time": 1505250166450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.805333, 33.691833, 15.39 ] } }, + { "type": "Feature", "properties": { "id": "ci37761375", "mag": 1.49, "time": 1505248746150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.3685, 33.956333, 12.98 ] } }, + { "type": "Feature", "properties": { "id": "ci37761367", "mag": 1.03, "time": 1505248730160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.575167, 33.465333, 9.81 ] } }, + { "type": "Feature", "properties": { "id": "us2000al2x", "mag": 4.8, "time": 1505248700330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.19, -15.0799, 144.26 ] } }, + { "type": "Feature", "properties": { "id": "nc72891286", "mag": 2.07, "time": 1505247727770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.5795, 39.603833, -0.21 ] } }, + { "type": "Feature", "properties": { "id": "ak16821575", "mag": 1.5, "time": 1505247191039, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9811, 64.7032, 15.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000al1n", "mag": 2.7, "time": 1505247025290, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.3683, 36.7446, 14.63 ] } }, + { "type": "Feature", "properties": { "id": "nc72891281", "mag": 1.59, "time": 1505246933110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.827333, 38.839, 2.11 ] } }, + { "type": "Feature", "properties": { "id": "us2000al1t", "mag": 4.3, "time": 1505246854930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4239, 15.7169, 52.92 ] } }, + { "type": "Feature", "properties": { "id": "nc72891276", "mag": 1.98, "time": 1505246713670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.876833, 37.8095, 14.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16850781", "mag": 1.8, "time": 1505246486363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5902, 57.2026, 44.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37761335", "mag": 0.96, "time": 1505246263650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.759333, 33.8575, 5.49 ] } }, + { "type": "Feature", "properties": { "id": "ci37761319", "mag": 2.18, "time": 1505245563030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.385, 32.3285, 10.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16850780", "mag": 3.0, "time": 1505245054736, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.5817, 52.3665, 32.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16821568", "mag": 1.3, "time": 1505244764083, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4179, 63.5705, 4.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72891271", "mag": 2.16, "time": 1505244492580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.146667, 40.211833, 2.94 ] } }, + { "type": "Feature", "properties": { "id": "nc72891266", "mag": 1.1, "time": 1505244145950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.875667, 38.839667, 2.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000al0z", "mag": 4.4, "time": 1505243754080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.7715, -21.9227, 347.97 ] } }, + { "type": "Feature", "properties": { "id": "ak16821516", "mag": 1.4, "time": 1505243650979, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5267, 60.0018, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16821564", "mag": 1.6, "time": 1505243467122, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.2171, 59.7927, 8.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000akzt", "mag": 4.7, "time": 1505243351270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -32.2455, 58.0337, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000akzf", "mag": 4.3, "time": 1505243172030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6417, 15.6677, 51.24 ] } }, + { "type": "Feature", "properties": { "id": "us2000akyq", "mag": 4.4, "time": 1505241724530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9743, 16.3622, 66.45 ] } }, + { "type": "Feature", "properties": { "id": "nc72891231", "mag": 1.19, "time": 1505241397800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.244667, 39.3805, 3.22 ] } }, + { "type": "Feature", "properties": { "id": "us2000akyh", "mag": 4.4, "time": 1505241368140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.5996, 15.3334, 74.72 ] } }, + { "type": "Feature", "properties": { "id": "us2000aky8", "mag": 4.6, "time": 1505240973270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0643, 15.2212, 44.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16850775", "mag": 1.7, "time": 1505240703529, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2159, 59.366, 81.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000akxq", "mag": 2.8, "time": 1505240585080, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4572, 42.5165, 8.78 ] } }, + { "type": "Feature", "properties": { "id": "ak16821457", "mag": 1.1, "time": 1505238948365, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1631, 60.0754, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16850772", "mag": 1.0, "time": 1505238898070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.2683, 61.5446, 35.4 ] } }, + { "type": "Feature", "properties": { "id": "hv61905641", "mag": 2.1, "time": 1505238187460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.247667, 19.393167, 36.582 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq68", "mag": 2.8, "time": 1505237765880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.9785, 55.7766, 56.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000akwr", "mag": 4.3, "time": 1505237620800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.6779, -5.2108, 218.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16821449", "mag": 2.3, "time": 1505236529463, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.4402, 53.5209, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16821379", "mag": 2.4, "time": 1505235536293, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.4636, 60.5717, 9.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000akvp", "mag": 4.5, "time": 1505235493410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.2449, 15.2798, 73.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq63", "mag": 3.1, "time": 1505235473870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.5043, 53.6304, 25.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16821334", "mag": 1.0, "time": 1505235138364, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.7095, 60.5946, 14.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72891191", "mag": 1.63, "time": 1505235102110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.444167, 37.384167, 12.11 ] } }, + { "type": "Feature", "properties": { "id": "us2000akwm", "mag": 4.6, "time": 1505234310180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -58.4081, 13.9047, 20.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16821326", "mag": 1.9, "time": 1505234239386, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7021, 63.9919, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37761199", "mag": 1.12, "time": 1505233979950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.139333, 35.857167, 3.42 ] } }, + { "type": "Feature", "properties": { "id": "ak16821324", "mag": 1.0, "time": 1505233378354, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8118, 65.9855, 3.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16821323", "mag": 2.3, "time": 1505232589454, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.3915, 52.0051, 11.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72891166", "mag": 1.17, "time": 1505232534860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.976167, 37.596833, 8.18 ] } }, + { "type": "Feature", "properties": { "id": "us2000akua", "mag": 4.5, "time": 1505231911880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.3156, -7.5665, 115.97 ] } }, + { "type": "Feature", "properties": { "id": "ci37761183", "mag": 1.38, "time": 1505231682740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.031667, 33.866, 11.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72891131", "mag": 1.13, "time": 1505231490780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821167, 37.605, 4.21 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq60", "mag": 3.4, "time": 1505230949090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -171.7818, 52.0274, 61.84 ] } }, + { "type": "Feature", "properties": { "id": "us2000akty", "mag": 4.1, "time": 1505230831380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.0909, 55.1751, 22.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000asax", "mag": 4.2, "time": 1505230532990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.919, -24.5557, 553.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000aktu", "mag": 5.0, "time": 1505230101200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9204, 15.0356, 34.73 ] } }, + { "type": "Feature", "properties": { "id": "ci37761159", "mag": 0.99, "time": 1505229927560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.794, 33.505667, 4.44 ] } }, + { "type": "Feature", "properties": { "id": "us2000akts", "mag": 4.4, "time": 1505229916500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4589, 15.8693, 40.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16850759", "mag": 2.0, "time": 1505229684203, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4729, 57.3614, 66.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000asau", "mag": 4.5, "time": 1505228968140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.2892, -30.4261, 12.38 ] } }, + { "type": "Feature", "properties": { "id": "us2000akt9", "mag": 4.7, "time": 1505227714260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 167.6472, -14.1046, 43.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16821264", "mag": 1.4, "time": 1505227661290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5591, 61.6356, 28.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16821262", "mag": 1.8, "time": 1505227098718, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5176, 60.4846, 107.4 ] } }, + { "type": "Feature", "properties": { "id": "pr2017255006", "mag": 3.11, "time": 1505226988680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.8866, 18.066, 112.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16821260", "mag": 1.3, "time": 1505226855029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.482, 62.559, 83.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37761111", "mag": 1.33, "time": 1505226544460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.166, 34.036, 5.82 ] } }, + { "type": "Feature", "properties": { "id": "nc72891096", "mag": 1.34, "time": 1505226449930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7255, 38.788667, 1.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16850755", "mag": 1.5, "time": 1505226255965, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5898, 60.4951, 99.5 ] } }, + { "type": "Feature", "properties": { "id": "uu60244417", "mag": 1.65, "time": 1505226014340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.334667, 44.621667, 2.11 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq5x", "mag": 3.1, "time": 1505225597950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -171.3403, 52.1694, 67.96 ] } }, + { "type": "Feature", "properties": { "id": "uu60244407", "mag": 1.34, "time": 1505225495130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.467, 42.663667, 3.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16821259", "mag": 1.2, "time": 1505225438730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3559, 60.1768, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16821258", "mag": 1.2, "time": 1505225170339, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1399, 60.3035, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16821221", "mag": 1.0, "time": 1505223846302, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7846, 53.7799, 6.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16821217", "mag": 1.4, "time": 1505223357390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7209, 60.3452, 65.8 ] } }, + { "type": "Feature", "properties": { "id": "hv61905526", "mag": 1.72, "time": 1505223290340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.929167, 19.870667, 12.697 ] } }, + { "type": "Feature", "properties": { "id": "ak16821215", "mag": 1.4, "time": 1505223177976, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.314, 60.1844, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60244352", "mag": 2.41, "time": 1505222826990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.443167, 42.595, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16821210", "mag": 1.0, "time": 1505222200792, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.0089, 61.3182, 28.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000akri", "mag": 2.9, "time": 1505221931200, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.9201, 36.2062, 6.163 ] } }, + { "type": "Feature", "properties": { "id": "ak16821207", "mag": 2.0, "time": 1505221802809, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9996, 62.229, 72.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000akrz", "mag": 2.5, "time": 1505220235620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5432, 46.8852, 12.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16821169", "mag": 1.1, "time": 1505219786301, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9544, 67.3188, 9.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16821166", "mag": 1.0, "time": 1505219272070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.0159, 59.8987, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72891076", "mag": 1.16, "time": 1505219059140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820667, 37.602667, 4.12 ] } }, + { "type": "Feature", "properties": { "id": "ci37761079", "mag": 1.06, "time": 1505218941580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.819667, 33.71, 15.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16850742", "mag": 2.4, "time": 1505218654701, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4252, 51.6857, 14.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16821165", "mag": 1.0, "time": 1505218329490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4876, 60.0043, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16821163", "mag": 1.3, "time": 1505217760897, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4102, 62.0418, 78.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72891061", "mag": 0.96, "time": 1505217348960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.826333, 37.602833, 3.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16821126", "mag": 1.3, "time": 1505216937519, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1452, 62.8895, 56.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16821125", "mag": 1.1, "time": 1505216743699, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.6326, 60.2201, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16821120", "mag": 1.7, "time": 1505216018269, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0049, 60.6518, 14.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16821119", "mag": 1.5, "time": 1505215652902, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.8093, 53.7706, 8.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000akpn", "mag": 4.7, "time": 1505215606400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 101.7514, 27.9618, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16850734", "mag": 1.1, "time": 1505215354092, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0512, 61.2674, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000akpc", "mag": 4.2, "time": 1505214378050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8032, 16.1985, 37.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60244277", "mag": 1.7, "time": 1505214238510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.430167, 38.334333, 2.58 ] } }, + { "type": "Feature", "properties": { "id": "ak16821114", "mag": 1.9, "time": 1505213809149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8883, 61.2794, 95.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72891031", "mag": 1.31, "time": 1505213535320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.861167, 37.426667, 3.97 ] } }, + { "type": "Feature", "properties": { "id": "uu60244252", "mag": 1.02, "time": 1505213356870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.007333, 44.7855, 7.95 ] } }, + { "type": "Feature", "properties": { "id": "ak16821079", "mag": 1.4, "time": 1505212565937, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7135, 59.8217, 2.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72891026", "mag": 1.86, "time": 1505212446760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.801833, 35.832333, 9.72 ] } }, + { "type": "Feature", "properties": { "id": "uw61306757", "mag": 1.64, "time": 1505211458410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.728833, 46.841667, -2.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16821074", "mag": 1.9, "time": 1505210888686, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7981, 61.0848, 49.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37761007", "mag": 0.97, "time": 1505210308130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.34, 33.3915, 3.45 ] } }, + { "type": "Feature", "properties": { "id": "ak16821073", "mag": 1.0, "time": 1505210226661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8733, 61.5592, 31.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000aknn", "mag": 4.7, "time": 1505209925680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.31, -20.0675, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16850728", "mag": 1.6, "time": 1505209600286, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4588, 61.074, 107.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60244207", "mag": 2.1, "time": 1505209143550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.465333, 42.608333, 2.53 ] } }, + { "type": "Feature", "properties": { "id": "ak16850727", "mag": 1.6, "time": 1505208401509, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2489, 60.3172, 132.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16821071", "mag": 1.7, "time": 1505208310612, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6819, 58.4203, 78.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aknb", "mag": 4.4, "time": 1505208006490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7329, 15.7927, 47.14 ] } }, + { "type": "Feature", "properties": { "id": "ak16821038", "mag": 1.4, "time": 1505207062279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7269, 62.2754, 47.5 ] } }, + { "type": "Feature", "properties": { "id": "pr2017255004", "mag": 3.01, "time": 1505207032870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.6503, 18.1753, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16821031", "mag": 2.4, "time": 1505206694908, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4161, 60.188, 103.5 ] } }, + { "type": "Feature", "properties": { "id": "hv61905311", "mag": 2.02, "time": 1505206056030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.975333, 19.557, 44.801 ] } }, + { "type": "Feature", "properties": { "id": "ak16821027", "mag": 2.1, "time": 1505205093842, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.4164, 57.0134, 65.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq5l", "mag": 3.0, "time": 1505204765080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.2778, 52.1101, 228.97 ] } }, + { "type": "Feature", "properties": { "id": "nm60179282", "mag": 1.12, "time": 1505204172200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -89.554167, 36.472, 8.99 ] } }, + { "type": "Feature", "properties": { "id": "us2000asam", "mag": 4.1, "time": 1505203793240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.4651, -4.9334, 167.53 ] } }, + { "type": "Feature", "properties": { "id": "ak16821023", "mag": 1.4, "time": 1505203680731, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1732, 61.3766, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq5k", "mag": 2.8, "time": 1505203540370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.5128, 54.8119, 22.77 ] } }, + { "type": "Feature", "properties": { "id": "ci37760911", "mag": 1.29, "time": 1505202683830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.019667, 34.347833, 1.32 ] } }, + { "type": "Feature", "properties": { "id": "ak16821022", "mag": 1.1, "time": 1505201992117, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4302, 65.4772, 14.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000aq5j", "mag": 3.4, "time": 1505201513110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.335, 52.1151, 36.52 ] } }, + { "type": "Feature", "properties": { "id": "nn00604832", "mag": 1.5, "time": 1505201175706, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.919, 38.3871, 7.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16821017", "mag": 1.4, "time": 1505201121331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.8746, 64.7668, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000akm6", "mag": 4.0, "time": 1505200774070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6261, 15.7276, 39.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16821016", "mag": 1.1, "time": 1505200723657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6326, 59.9341, 17.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72890911", "mag": 1.14, "time": 1505200493800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835833, 37.502, -0.69 ] } }, + { "type": "Feature", "properties": { "id": "pr2017255005", "mag": 3.62, "time": 1505200390090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.7348, 17.4213, 58.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000asal", "mag": 4.5, "time": 1505200235050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 175.9237, -40.6778, 35.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16821015", "mag": 1.0, "time": 1505200050481, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0733, 62.8571, 78.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72890906", "mag": 1.85, "time": 1505199341840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.959667, 36.079833, 11.15 ] } }, + { "type": "Feature", "properties": { "id": "ak16820976", "mag": 4.5, "time": 1505198623340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.0626, 55.2018, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16820951", "mag": 1.3, "time": 1505198176732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6431, 63.3655, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "nn00604828", "mag": 1.4, "time": 1505197517767, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.0826, 39.1124, 11.2 ] } }, + { "type": "Feature", "properties": { "id": "nn00604827", "mag": 2.8, "time": 1505197059215, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.294, 37.806, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000akla", "mag": 4.9, "time": 1505196044760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 70.8701, -26.0946, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37760839", "mag": 1.35, "time": 1505195823730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.070833, 34.124, 7.32 ] } }, + { "type": "Feature", "properties": { "id": "ak16850710", "mag": 1.4, "time": 1505195695881, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9514, 59.3304, 53.9 ] } }, + { "type": "Feature", "properties": { "id": "uu60244052", "mag": 1.22, "time": 1505195536580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.435667, 42.555167, 6.85 ] } }, + { "type": "Feature", "properties": { "id": "us2000akkz", "mag": 4.4, "time": 1505195184110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3657, 15.4552, 61.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16820948", "mag": 1.9, "time": 1505194916797, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7632, 53.2354, 44.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16850708", "mag": 1.2, "time": 1505194707074, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5938, 63.2379, 122.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80254859", "mag": 1.15, "time": 1505194171440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527333, 46.863, 11.45 ] } }, + { "type": "Feature", "properties": { "id": "nc72890836", "mag": 1.09, "time": 1505193911680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.735833, 38.760833, 1.36 ] } }, + { "type": "Feature", "properties": { "id": "us2000akkp", "mag": 4.6, "time": 1505193612080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8716, 15.0886, 57.71 ] } }, + { "type": "Feature", "properties": { "id": "ak16820908", "mag": 2.5, "time": 1505193453186, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.7231, 53.1426, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000akkk", "mag": 5.3, "time": 1505192927120, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.832, 15.182, 60.95 ] } }, + { "type": "Feature", "properties": { "id": "mb80254849", "mag": 1.28, "time": 1505192738900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5175, 46.899833, 10.92 ] } }, + { "type": "Feature", "properties": { "id": "mb80254844", "mag": 1.54, "time": 1505192475320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.973833, 43.2425, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16820905", "mag": 1.1, "time": 1505191714754, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.4231, 60.1297, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72890796", "mag": 1.14, "time": 1505190808830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.835, 37.502667, -0.15 ] } }, + { "type": "Feature", "properties": { "id": "nc72890791", "mag": 1.45, "time": 1505190617760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.788, 37.455, 7.56 ] } }, + { "type": "Feature", "properties": { "id": "pr2017255003", "mag": 1.94, "time": 1505190564980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.3923, 18.5168, 23.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16850705", "mag": 1.4, "time": 1505190149086, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3144, 60.1274, 78.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16850704", "mag": 1.8, "time": 1505189303211, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.0362, 56.0678, 8.4 ] } }, + { "type": "Feature", "properties": { "id": "uu60243967", "mag": 1.29, "time": 1505189093580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.059333, 40.568667, 7.12 ] } }, + { "type": "Feature", "properties": { "id": "hv61905031", "mag": 2.8, "time": 1505189080390, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.320667, 21.633833, 8.469 ] } }, + { "type": "Feature", "properties": { "id": "pr2017255001", "mag": 2.63, "time": 1505188852110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.3921, 18.5325, 19.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80254839", "mag": 2.17, "time": 1505188197080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.530167, 46.8705, 12.49 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70235033", "mag": 2.06, "time": 1505188185670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.492167, 37.299667, 4.92 ] } }, + { "type": "Feature", "properties": { "id": "nc72890766", "mag": 2.21, "time": 1505187928020, "felt": 6, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.319833, 40.4865, 13.1 ] } }, + { "type": "Feature", "properties": { "id": "ci37760735", "mag": 1.81, "time": 1505187547790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.287333, 34.079667, 14.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16850702", "mag": 1.3, "time": 1505187086661, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8075, 61.2964, 89.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16850701", "mag": 1.4, "time": 1505186992230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.2832, 60.1725, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80254834", "mag": 1.19, "time": 1505186273780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.528833, 46.863667, 13.34 ] } }, + { "type": "Feature", "properties": { "id": "ci37760703", "mag": 1.89, "time": 1505185679940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.797333, 33.494667, 4.01 ] } }, + { "type": "Feature", "properties": { "id": "pr2017255002", "mag": 2.13, "time": 1505185260690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.0131, 19.0945, 24.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72890706", "mag": 2.85, "time": 1505184989380, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821333, 37.6055, 4.17 ] } }, + { "type": "Feature", "properties": { "id": "nc72890701", "mag": 1.11, "time": 1505184817490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.821333, 37.468667, -0.39 ] } }, + { "type": "Feature", "properties": { "id": "nc72890691", "mag": 2.54, "time": 1505184593110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -124.502, 40.2965, 19.04 ] } }, + { "type": "Feature", "properties": { "id": "ci37760663", "mag": 0.96, "time": 1505184048300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1715, 34.0385, 5.42 ] } }, + { "type": "Feature", "properties": { "id": "nc72890681", "mag": 1.03, "time": 1505183875680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820667, 37.4715, -1.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16820879", "mag": 1.6, "time": 1505183679937, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3232, 62.0502, 60.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16850697", "mag": 1.5, "time": 1505183127519, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0397, 60.1249, 106.2 ] } }, + { "type": "Feature", "properties": { "id": "pr2017255000", "mag": 3.99, "time": 1505182040830, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.7961, 18.688, 102.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000akii", "mag": 2.5, "time": 1505181688510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.445, 42.5935, 6.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16850696", "mag": 1.4, "time": 1505181679899, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6734, 59.8319, 93.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16820869", "mag": 1.9, "time": 1505181012974, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.001, 59.4008, 36.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16820867", "mag": 1.9, "time": 1505180308488, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5196, 59.9375, 123.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16820865", "mag": 1.6, "time": 1505179834308, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8744, 63.0936, 89.7 ] } }, + { "type": "Feature", "properties": { "id": "uu60243827", "mag": 1.28, "time": 1505179319200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.414167, 42.53, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72890631", "mag": 0.96, "time": 1505179150280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.816, 37.475, 1.48 ] } }, + { "type": "Feature", "properties": { "id": "ci37760623", "mag": 1.18, "time": 1505178887000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.025, 36.311333, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72890616", "mag": 1.11, "time": 1505178809900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.820167, 37.474167, -0.42 ] } }, + { "type": "Feature", "properties": { "id": "us2000akhk", "mag": 5.1, "time": 1505178756750, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.097, 15.4421, 48.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16820847", "mag": 1.9, "time": 1505178590464, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8044, 60.0035, 75.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72890606", "mag": 2.1, "time": 1505178296120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.819667, 37.471, -0.04 ] } }, + { "type": "Feature", "properties": { "id": "us2000akhe", "mag": 4.8, "time": 1505178017830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2744, 15.0853, 44.38 ] } }, + { "type": "Feature", "properties": { "id": "us2000akhb", "mag": 2.4, "time": 1505177859710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4236, 42.5422, 5.98 ] } }, + { "type": "Feature", "properties": { "id": "ci37760607", "mag": 1.78, "time": 1505177706210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.796167, 33.491167, 3.15 ] } }, + { "type": "Feature", "properties": { "id": "us2000akh7", "mag": 2.8, "time": 1505177557480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4213, 42.5825, 7.47 ] } }, + { "type": "Feature", "properties": { "id": "nc72890576", "mag": 2.34, "time": 1505177324250, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.82, 37.473, 0.51 ] } }, + { "type": "Feature", "properties": { "id": "hv61904866", "mag": 1.99, "time": 1505176986190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.857, 19.358667, 41.774 ] } }, + { "type": "Feature", "properties": { "id": "ak16820845", "mag": 1.3, "time": 1505176784517, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3458, 60.155, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72890561", "mag": 1.42, "time": 1505176270180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8195, 37.4765, -0.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16820836", "mag": 2.9, "time": 1505175684396, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1737, 62.7988, 8.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60243772", "mag": 1.28, "time": 1505175463030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.450167, 42.593667, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000akgt", "mag": 2.7, "time": 1505175275390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.45, 42.6006, 6.65 ] } }, + { "type": "Feature", "properties": { "id": "us2000akgp", "mag": 3.1, "time": 1505174426060, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4619, 42.5922, 9.11 ] } }, + { "type": "Feature", "properties": { "id": "us2000amy6", "mag": 3.4, "time": 1505174223950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.0579, 52.772, 207.41 ] } }, + { "type": "Feature", "properties": { "id": "us2000amy5", "mag": 3.3, "time": 1505173482210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.0407, 51.8595, 146.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16820045", "mag": 1.1, "time": 1505171834061, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9121, 61.9185, 44.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000akg3", "mag": 4.4, "time": 1505171543900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3251, 15.4699, 53.34 ] } }, + { "type": "Feature", "properties": { "id": "nc72890511", "mag": 1.3, "time": 1505171391890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.012, 37.426833, 3.03 ] } }, + { "type": "Feature", "properties": { "id": "us2000akfs", "mag": 4.2, "time": 1505169617100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6345, 15.6178, 38.83 ] } }, + { "type": "Feature", "properties": { "id": "us2000akfr", "mag": 2.8, "time": 1505169599030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4698, 42.6061, 6.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16827363", "mag": 2.0, "time": 1505169544066, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4581, 51.6497, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16819990", "mag": 1.0, "time": 1505169272029, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1659, 59.9838, 14.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16827361", "mag": 1.5, "time": 1505168696545, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2029, 59.1798, 77.3 ] } }, + { "type": "Feature", "properties": { "id": "ci37760423", "mag": 1.26, "time": 1505168688630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3355, 32.933, 10.81 ] } }, + { "type": "Feature", "properties": { "id": "us2000akf8", "mag": 5.0, "time": 1505168453040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9567, 15.7603, 48.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16819215", "mag": 1.5, "time": 1505167702707, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4466, 62.4273, 81.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar1k", "mag": 4.4, "time": 1505167046570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.2966, -4.9444, 49.23 ] } }, + { "type": "Feature", "properties": { "id": "nc72890491", "mag": 1.11, "time": 1505166863970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.544833, 37.529, 12.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000akeb", "mag": 5.1, "time": 1505166728910, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -178.3593, 51.5235, 54.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16819167", "mag": 1.4, "time": 1505166664445, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3213, 60.2363, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000akdz", "mag": 4.3, "time": 1505166482960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.1669, 15.1965, 62.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000akdq", "mag": 2.6, "time": 1505166481930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4105, 42.5306, 6.58 ] } }, + { "type": "Feature", "properties": { "id": "ak16827357", "mag": 2.3, "time": 1505165942611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.8283, 55.1229, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61306477", "mag": 1.21, "time": 1505165549480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.1755, 46.198833, 3.06 ] } }, + { "type": "Feature", "properties": { "id": "nc72890461", "mag": 2.23, "time": 1505164836450, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.939, 35.641167, 4.35 ] } }, + { "type": "Feature", "properties": { "id": "us2000ayll", "mag": 4.1, "time": 1505164739710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6724, 15.4385, 31.22 ] } }, + { "type": "Feature", "properties": { "id": "ci37760359", "mag": 2.29, "time": 1505164180230, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.940167, 35.427833, 21.14 ] } }, + { "type": "Feature", "properties": { "id": "us2000akcq", "mag": 5.5, "time": 1505164150350, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0139, 14.9074, 27.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000akch", "mag": 2.4, "time": 1505164053450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4202, 42.5566, 9.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16827356", "mag": 1.9, "time": 1505163754769, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.4142, 51.8321, 32.9 ] } }, + { "type": "Feature", "properties": { "id": "ci37760351", "mag": 1.47, "time": 1505163661880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.9785, 32.6095, -0.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16827355", "mag": 1.0, "time": 1505163537708, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.7591, 65.4356, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00604742", "mag": 1.3, "time": 1505163193915, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9149, 38.3846, 5.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000akbz", "mag": 4.1, "time": 1505162450200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.477, 52.2896, 65.69 ] } }, + { "type": "Feature", "properties": { "id": "mb80254709", "mag": 1.54, "time": 1505162126870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.327667, 46.1355, 6.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16818311", "mag": 2.4, "time": 1505162030333, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.0, 53.2916, 13.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16818304", "mag": 2.2, "time": 1505161796041, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.8204, 65.319, 3.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16818297", "mag": 2.0, "time": 1505161193751, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8659, 62.8899, 99.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16818278", "mag": 3.2, "time": 1505160763887, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.115, 63.145, 108.2 ] } }, + { "type": "Feature", "properties": { "id": "mb80254694", "mag": 1.38, "time": 1505160716790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.540833, 46.904833, 11.87 ] } }, + { "type": "Feature", "properties": { "id": "us2000akaa", "mag": 2.5, "time": 1505159932140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4306, 42.5727, 7.14 ] } }, + { "type": "Feature", "properties": { "id": "mb80254684", "mag": 1.16, "time": 1505159186030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.524833, 46.8675, 11.01 ] } }, + { "type": "Feature", "properties": { "id": "ak16827348", "mag": 1.2, "time": 1505158596706, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2022, 60.4231, 48.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16817479", "mag": 2.9, "time": 1505158124591, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5505, 65.8017, 12.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16817476", "mag": 3.0, "time": 1505158119494, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2439, 66.0161, 16.1 ] } }, + { "type": "Feature", "properties": { "id": "nn00604719", "mag": 1.3, "time": 1505157785095, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8838, 38.8119, 4.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72890441", "mag": 1.74, "time": 1505157705880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.778, 38.7915, 3.48 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak9n", "mag": 3.0, "time": 1505157604550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.471, 42.609, 7.61 ] } }, + { "type": "Feature", "properties": { "id": "ak16817472", "mag": 1.1, "time": 1505156621773, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3067, 62.9071, 5.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16827345", "mag": 1.6, "time": 1505156304521, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3368, 59.849, 84.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16816710", "mag": 1.0, "time": 1505155839711, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7252, 63.4914, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16827343", "mag": 1.6, "time": 1505155190108, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9414, 58.9343, 71.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60243377", "mag": 2.04, "time": 1505154917000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.423167, 42.524333, 7.67 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak8v", "mag": 4.8, "time": 1505154337990, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 125.9192, 10.9561, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16827342", "mag": 1.4, "time": 1505154205074, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0563, 59.7893, 104.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000akih", "mag": 3.5, "time": 1505153371450, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -8.5745, 37.1247, 19.99 ] } }, + { "type": "Feature", "properties": { "id": "ak16816675", "mag": 2.0, "time": 1505153241938, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1793, 60.2771, 148.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00604702", "mag": 1.1, "time": 1505152546779, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8175, 38.8318, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72890416", "mag": 1.57, "time": 1505151412520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8205, 37.474, -0.34 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak7u", "mag": 5.7, "time": 1505151309620, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.3373, 23.9529, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak7m", "mag": 2.5, "time": 1505151089130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4259, 42.5401, 6.8 ] } }, + { "type": "Feature", "properties": { "id": "mb80254649", "mag": 1.0, "time": 1505150945110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.515833, 46.859, 13.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16815885", "mag": 1.4, "time": 1505150387657, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8119, 60.5833, 13.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37760231", "mag": 1.15, "time": 1505150078250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.339833, 33.717167, -0.52 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar17", "mag": 4.5, "time": 1505148873550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -27.1014, -58.1449, 29.22 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar14", "mag": 4.7, "time": 1505148316830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.7999, 10.8571, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak6r", "mag": 4.4, "time": 1505148294180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 93.763, 11.1912, 135.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar16", "mag": 4.3, "time": 1505147708500, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 105.5216, 28.9426, 37.11 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak65", "mag": 5.0, "time": 1505146815920, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 21.5733, 39.2104, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60012999", "mag": 2.37, "time": 1505146629690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.425833, 42.545833, 6.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak62", "mag": 3.2, "time": 1505146591940, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4221, 42.5774, 8.61 ] } }, + { "type": "Feature", "properties": { "id": "ci37760191", "mag": 1.27, "time": 1505146302070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.870333, 36.5125, 7.71 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar11", "mag": 4.2, "time": 1505146234900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 169.8301, -18.5966, 222.96 ] } }, + { "type": "Feature", "properties": { "id": "ci37760183", "mag": 1.04, "time": 1505146087980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.721333, 33.538833, 2.61 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak5l", "mag": 4.4, "time": 1505145120270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9232, 15.0128, 54.55 ] } }, + { "type": "Feature", "properties": { "id": "ak16827338", "mag": 1.8, "time": 1505144756285, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.3358, 57.9354, 144.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak5f", "mag": 4.3, "time": 1505144492050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0414, 15.1729, 45.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16815056", "mag": 1.9, "time": 1505144205558, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6743, 59.7685, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak58", "mag": 3.1, "time": 1505144033150, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4647, 42.6086, 4.31 ] } }, + { "type": "Feature", "properties": { "id": "uu60243162", "mag": 1.47, "time": 1505143989150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.462833, 42.578167, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16815038", "mag": 1.9, "time": 1505143851904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7738, 62.154, 53.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16815036", "mag": 1.9, "time": 1505143815664, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0859, 60.2049, 139.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak57", "mag": 4.8, "time": 1505143793430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 169.1802, 54.2242, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak55", "mag": 4.3, "time": 1505143224640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.6506, -2.821, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak4j", "mag": 3.0, "time": 1505142692750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4148, 42.5413, 9.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak4f", "mag": 4.4, "time": 1505142409640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0513, 14.8747, 44.09 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak40", "mag": 5.0, "time": 1505141758490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3653, 15.3524, 32.65 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar1h", "mag": 4.9, "time": 1505141691760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.0928, -23.8876, 37.16 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak3s", "mag": 4.2, "time": 1505141169530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7122, 15.3112, 28.67 ] } }, + { "type": "Feature", "properties": { "id": "mb80254604", "mag": 1.16, "time": 1505141014400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.532333, 46.8915, 13.58 ] } }, + { "type": "Feature", "properties": { "id": "nc72890356", "mag": 0.96, "time": 1505141002070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.819168, 38.845001, -0.69 ] } }, + { "type": "Feature", "properties": { "id": "ak16814255", "mag": 2.0, "time": 1505140885717, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.2937, 51.4307, 40.1 ] } }, + { "type": "Feature", "properties": { "id": "uw61306377", "mag": 1.82, "time": 1505140831500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.526167, 45.054, 14.59 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak3q", "mag": 4.2, "time": 1505140745590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4233, 15.4024, 50.36 ] } }, + { "type": "Feature", "properties": { "id": "ci37760143", "mag": 1.15, "time": 1505140731290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.260667, 32.865667, 12.62 ] } }, + { "type": "Feature", "properties": { "id": "nc72890351", "mag": 1.47, "time": 1505140721900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.98, 37.905667, 7.94 ] } }, + { "type": "Feature", "properties": { "id": "pr2017254001", "mag": 1.99, "time": 1505140527660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.1661, 18.2745, 22.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak3b", "mag": 2.7, "time": 1505140375620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4329, 42.6048, 10.74 ] } }, + { "type": "Feature", "properties": { "id": "uu60243057", "mag": 2.26, "time": 1505140157270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.440667, 42.570833, 6.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak35", "mag": 2.8, "time": 1505139740960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4268, 42.5293, 6.86 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar1f", "mag": 4.4, "time": 1505139719640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -33.2097, 57.3966, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak30", "mag": 2.8, "time": 1505139413770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4261, 42.5344, 6.18 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak2x", "mag": 2.8, "time": 1505139156090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4192, 42.5317, 7.87 ] } }, + { "type": "Feature", "properties": { "id": "nc72890336", "mag": 1.18, "time": 1505138783780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.788833, 37.4565, 7.82 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak5e", "mag": 3.4, "time": 1505138730330, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4143, 42.5438, 7.19 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak2i", "mag": 2.7, "time": 1505138706230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4164, 42.5288, 7.13 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak2w", "mag": 4.2, "time": 1505138643370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.2941, 49.241, 567.61 ] } }, + { "type": "Feature", "properties": { "id": "ak16813499", "mag": 2.0, "time": 1505138537316, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.7415, 61.4216, 18.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak25", "mag": 2.7, "time": 1505138348200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4259, 42.5325, 7.14 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar0y", "mag": 4.6, "time": 1505138171510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 95.9326, 17.4028, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16813481", "mag": 1.9, "time": 1505137989499, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3857, 59.1724, 56.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak1y", "mag": 2.6, "time": 1505137521110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4339, 42.5419, 8.21 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak1r", "mag": 2.9, "time": 1505137114700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4362, 42.5456, 6.59 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak1m", "mag": 3.0, "time": 1505136985250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4366, 42.5476, 10.03 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar0x", "mag": 4.6, "time": 1505136879610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 94.6908, 22.421, 111.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16813475", "mag": 2.1, "time": 1505136538402, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.5913, 51.4481, 48.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak17", "mag": 4.7, "time": 1505136395640, "felt": 63, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4397, 42.547, 8.42 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar13", "mag": 4.3, "time": 1505136238290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.0316, -19.7635, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37760103", "mag": 1.09, "time": 1505136097380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.293, 35.087333, 5.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16812727", "mag": 2.6, "time": 1505135732771, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9083, 64.6086, 14.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16812725", "mag": 1.1, "time": 1505135440719, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.9809, 60.2846, 15.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16812722", "mag": 1.3, "time": 1505135255673, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2227, 61.5128, 2.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00604646", "mag": 1.4, "time": 1505134420760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0108, 37.3174, 5.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72890261", "mag": 1.53, "time": 1505134375000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.944, 37.596667, 2.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16812712", "mag": 1.2, "time": 1505134108855, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0572, 63.3368, 5.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72890256", "mag": 2.28, "time": 1505133958310, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.804, 37.487667, 2.35 ] } }, + { "type": "Feature", "properties": { "id": "ak16827325", "mag": 1.0, "time": 1505133922020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6291, 68.5279, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16827324", "mag": 2.0, "time": 1505133892582, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.5495, 51.3476, 48.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak0e", "mag": 2.5, "time": 1505133857280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4384, 42.5522, 4.67 ] } }, + { "type": "Feature", "properties": { "id": "uu60242837", "mag": 1.53, "time": 1505133790240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.424667, 42.5545, 3.92 ] } }, + { "type": "Feature", "properties": { "id": "hv61904231", "mag": 1.21, "time": 1505133342610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.6145, 19.417333, 2.362 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak05", "mag": 4.1, "time": 1505133270220, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4421, 42.5481, 9.98 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak03", "mag": 2.7, "time": 1505133174850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4364, 42.5648, 8.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16812710", "mag": 1.0, "time": 1505133166684, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8559, 62.6857, 65.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar0u", "mag": 4.2, "time": 1505133047670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -179.1594, -25.8043, 396.76 ] } }, + { "type": "Feature", "properties": { "id": "nn00604676", "mag": 1.2, "time": 1505132161656, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9061, 38.3603, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16811973", "mag": 1.1, "time": 1505132086727, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8547, 61.7247, 43.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16811972", "mag": 1.5, "time": 1505132009437, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3277, 62.9497, 102.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajzy", "mag": 2.5, "time": 1505131814160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4451, 42.6131, 6.65 ] } }, + { "type": "Feature", "properties": { "id": "mb80254459", "mag": 2.11, "time": 1505131462070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.591167, 48.595333, 11.25 ] } }, + { "type": "Feature", "properties": { "id": "ak16811969", "mag": 1.3, "time": 1505131136327, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0317, 60.2939, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37760055", "mag": 1.58, "time": 1505130502980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.1345, 33.263, 3.81 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajzq", "mag": 3.0, "time": 1505130391090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4364, 42.5733, 9.58 ] } }, + { "type": "Feature", "properties": { "id": "ak16811954", "mag": 3.1, "time": 1505130323357, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.1197, 60.1444, 17.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar0t", "mag": 4.0, "time": 1505129120720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.0508, -16.1442, 368.85 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajzk", "mag": 4.5, "time": 1505129105150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -74.1346, -37.5234, 25.58 ] } }, + { "type": "Feature", "properties": { "id": "nc72890236", "mag": 2.17, "time": 1505128675290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822, 37.459167, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16827315", "mag": 2.3, "time": 1505128561623, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.8371, 52.7853, 7.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16811944", "mag": 1.3, "time": 1505128093436, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.0565, 64.7051, 17.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16811204", "mag": 1.3, "time": 1505127768013, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.9834, 54.7566, 4.6 ] } }, + { "type": "Feature", "properties": { "id": "hv61904116", "mag": 2.16, "time": 1505127753700, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.28183, 19.407, 0.02 ] } }, + { "type": "Feature", "properties": { "id": "ci37760031", "mag": 2.03, "time": 1505127492210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.712, 33.879333, 13.03 ] } }, + { "type": "Feature", "properties": { "id": "ak16827311", "mag": 1.5, "time": 1505127421795, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.853, 59.6229, 96.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16811203", "mag": 1.3, "time": 1505127015264, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6217, 68.5348, 1.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16811201", "mag": 1.5, "time": 1505126914844, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1251, 64.9961, 18.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16811199", "mag": 1.6, "time": 1505125956806, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.5218, 65.7316, 2.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16811198", "mag": 1.6, "time": 1505125657616, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.3884, 53.8156, 54.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72890226", "mag": 1.01, "time": 1505125359080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.753998, 38.790165, 3.35 ] } }, + { "type": "Feature", "properties": { "id": "ci37760023", "mag": 1.32, "time": 1505125346420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.25, 34.0295, 14.73 ] } }, + { "type": "Feature", "properties": { "id": "ci37760015", "mag": 1.79, "time": 1505125221750, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.210667, 33.964, 14.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16811192", "mag": 1.6, "time": 1505124596279, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.4191, 53.5639, 6.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajy4", "mag": 3.0, "time": 1505124017240, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4438, 42.5496, 7.43 ] } }, + { "type": "Feature", "properties": { "id": "ak16811190", "mag": 1.5, "time": 1505123878146, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2865, 60.4132, 89.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16811188", "mag": 1.0, "time": 1505123692728, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3358, 61.5763, 29.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72890206", "mag": 0.98, "time": 1505123643110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.747167, 37.409167, 5.32 ] } }, + { "type": "Feature", "properties": { "id": "ak16811186", "mag": 1.6, "time": 1505123476693, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.8224, 59.7877, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajxv", "mag": 2.9, "time": 1505123164250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4237, 42.5673, 7.37 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajxj", "mag": 4.3, "time": 1505122591560, "felt": 25, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4287, 42.5544, 2.24 ] } }, + { "type": "Feature", "properties": { "id": "uu60242567", "mag": 2.2, "time": 1505122522080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4315, 42.546167, 6.37 ] } }, + { "type": "Feature", "properties": { "id": "ci37759983", "mag": 1.63, "time": 1505121892310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.268167, 34.059667, 16.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16810446", "mag": 2.6, "time": 1505121756650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4598, 60.9205, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16810443", "mag": 1.2, "time": 1505121065274, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.565, 68.8276, 0.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37759967", "mag": 1.22, "time": 1505119075410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.577833, 33.463, 8.81 ] } }, + { "type": "Feature", "properties": { "id": "uw61306317", "mag": 1.48, "time": 1505118779800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.494333, 48.421333, 23.39 ] } }, + { "type": "Feature", "properties": { "id": "uu60242517", "mag": 2.59, "time": 1505118734680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -109.851333, 41.686167, 9.37 ] } }, + { "type": "Feature", "properties": { "id": "pr2017254000", "mag": 3.41, "time": 1505118382390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.9758, 19.4726, 83.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16809713", "mag": 1.0, "time": 1505117722024, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.6659, 62.2481, 21.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16809711", "mag": 3.4, "time": 1505116920134, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.5449, 52.5632, 40.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajwn", "mag": 4.4, "time": 1505116663270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9806, 15.3004, 56.84 ] } }, + { "type": "Feature", "properties": { "id": "ci37759959", "mag": 1.14, "time": 1505116447350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2325, 33.327833, 10.93 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajwc", "mag": 2.7, "time": 1505116217360, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4585, 42.6238, 8.02 ] } }, + { "type": "Feature", "properties": { "id": "uu60242452", "mag": 1.42, "time": 1505115184130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4215, 42.555167, 8.21 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajw6", "mag": 4.3, "time": 1505114696270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.1399, -24.246, 215.32 ] } }, + { "type": "Feature", "properties": { "id": "ak16809708", "mag": 1.5, "time": 1505114006947, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8258, 60.1009, 45.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16827294", "mag": 1.9, "time": 1505113098912, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.8676, 59.0889, 2.2 ] } }, + { "type": "Feature", "properties": { "id": "mb80254374", "mag": 1.5, "time": 1505112921190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.529333, 46.8645, 12.3 ] } }, + { "type": "Feature", "properties": { "id": "ci37759927", "mag": 2.02, "time": 1505112772010, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.403, 34.906, 11.64 ] } }, + { "type": "Feature", "properties": { "id": "ak16809693", "mag": 2.3, "time": 1505111147899, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.1691, 60.3968, 3.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72890121", "mag": 1.12, "time": 1505109941490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.819168, 38.807335, 2.77 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajvf", "mag": 2.9, "time": 1505109741010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4688, 42.5774, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajva", "mag": 4.3, "time": 1505109063560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9711, 15.3853, 85.78 ] } }, + { "type": "Feature", "properties": { "id": "nc72890106", "mag": 1.68, "time": 1505108835910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.298667, 36.839667, 6.48 ] } }, + { "type": "Feature", "properties": { "id": "ak16809690", "mag": 2.3, "time": 1505108549578, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.9816, 56.0816, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajv3", "mag": 2.5, "time": 1505108046520, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4343, 42.6729, 8.91 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajuy", "mag": 4.3, "time": 1505107771280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.0235, 15.4152, 96.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16827288", "mag": 1.8, "time": 1505107165861, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.0716, 53.7182, 69.4 ] } }, + { "type": "Feature", "properties": { "id": "uw61306307", "mag": 1.9, "time": 1505107163540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.039333, 46.874833, 6.58 ] } }, + { "type": "Feature", "properties": { "id": "nc72890096", "mag": 1.14, "time": 1505106775000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.0835, 41.351667, 6.69 ] } }, + { "type": "Feature", "properties": { "id": "ak16809640", "mag": 2.4, "time": 1505106550298, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8937, 61.0452, 165.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16808961", "mag": 1.6, "time": 1505105485577, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1953, 59.1308, 77.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajuh", "mag": 4.0, "time": 1505105288350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1177, 14.9912, 39.36 ] } }, + { "type": "Feature", "properties": { "id": "uu60242387", "mag": 2.04, "time": 1505105195110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4145, 42.553333, 8.78 ] } }, + { "type": "Feature", "properties": { "id": "ci37759879", "mag": 1.88, "time": 1505105166860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.690333, 36.111167, 2.14 ] } }, + { "type": "Feature", "properties": { "id": "uu60242382", "mag": 1.62, "time": 1505105133670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.917167, 39.7665, 0.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajua", "mag": 4.2, "time": 1505104652010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.1678, 15.2785, 67.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000aju8", "mag": 4.3, "time": 1505104387690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 134.2896, -4.2452, 11.73 ] } }, + { "type": "Feature", "properties": { "id": "us2000aju4", "mag": 4.2, "time": 1505104376590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8401, 15.5681, 47.06 ] } }, + { "type": "Feature", "properties": { "id": "ak16808959", "mag": 1.5, "time": 1505103598244, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.9778, 58.2872, 74.3 ] } }, + { "type": "Feature", "properties": { "id": "uw61306297", "mag": 2.04, "time": 1505103582560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.041833, 46.873833, 6.67 ] } }, + { "type": "Feature", "properties": { "id": "uw61306292", "mag": 2.25, "time": 1505103114370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.041333, 46.872667, 6.52 ] } }, + { "type": "Feature", "properties": { "id": "ak16827283", "mag": 1.6, "time": 1505102962401, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.439, 59.7864, 127.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16827279", "mag": 1.3, "time": 1505101851739, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7785, 59.9173, 97.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar0i", "mag": 4.1, "time": 1505101626150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 152.4651, -10.314, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759855", "mag": 1.09, "time": 1505101001790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.693833, 36.111833, 2.19 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajtf", "mag": 3.6, "time": 1505100425300, "felt": 34, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.7392, 35.5637, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar0g", "mag": 4.3, "time": 1505099718750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -33.3922, 57.1877, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16808239", "mag": 1.2, "time": 1505099609741, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.1984, 60.4559, 13.3 ] } }, + { "type": "Feature", "properties": { "id": "mb80254349", "mag": 1.33, "time": 1505099352010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.536833, 46.868167, 13.72 ] } }, + { "type": "Feature", "properties": { "id": "ak16808202", "mag": 1.5, "time": 1505098597935, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.3852, 59.9636, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16808197", "mag": 1.0, "time": 1505098478421, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2252, 63.2571, 2.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16808189", "mag": 2.2, "time": 1505098007693, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -137.7551, 60.3801, 2.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajt6", "mag": 3.1, "time": 1505097902820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -137.7475, 60.3735, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajt7", "mag": 5.1, "time": 1505097732030, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 134.3851, -4.1892, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16808181", "mag": 1.1, "time": 1505097584665, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6756, 61.6922, 62.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajt5", "mag": 3.0, "time": 1505097294300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4685, 42.672, 9.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajt2", "mag": 2.8, "time": 1505097280810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4535, 42.6306, 9.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar0e", "mag": 4.3, "time": 1505096741600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.0697, 24.7471, 68.23 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajsz", "mag": 4.7, "time": 1505096631090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9001, 15.6517, 51.53 ] } }, + { "type": "Feature", "properties": { "id": "ak16807505", "mag": 1.3, "time": 1505096509471, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.9046, 61.531, 28.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16807502", "mag": 1.6, "time": 1505096282982, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.2586, 62.549, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72890026", "mag": 1.21, "time": 1505096190960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.009667, 37.590833, -0.07 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajsw", "mag": 4.2, "time": 1505095770400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.418, 15.8113, 56.97 ] } }, + { "type": "Feature", "properties": { "id": "ak16807468", "mag": 1.2, "time": 1505095529647, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0357, 62.0888, 52.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37759783", "mag": 2.05, "time": 1505095452510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.502333, 35.679, 6.19 ] } }, + { "type": "Feature", "properties": { "id": "nc72890021", "mag": 1.71, "time": 1505095034230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.535667, 37.632333, 19.33 ] } }, + { "type": "Feature", "properties": { "id": "ci37759775", "mag": 1.34, "time": 1505095022580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.507333, 34.488, 1.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajsk", "mag": 4.6, "time": 1505093529680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 143.5451, 12.9836, 114.29 ] } }, + { "type": "Feature", "properties": { "id": "ak16827267", "mag": 1.3, "time": 1505093440775, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1537, 59.7401, 106.9 ] } }, + { "type": "Feature", "properties": { "id": "ci37759759", "mag": 1.69, "time": 1505093145730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.798167, 33.493667, 3.61 ] } }, + { "type": "Feature", "properties": { "id": "nn00604614", "mag": 1.5, "time": 1505092989312, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.6589, 37.3487, 6.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar1r", "mag": 3.5, "time": 1505092806050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 170.8111, 53.8607, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ar0b", "mag": 4.2, "time": 1505092783010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 95.953, 17.3198, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61903861", "mag": 1.26, "time": 1505092321650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.490333, 19.339667, 9.09 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajsh", "mag": 4.1, "time": 1505092219210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 129.972, -6.9548, 134.48 ] } }, + { "type": "Feature", "properties": { "id": "ak16806794", "mag": 1.3, "time": 1505092129494, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3457, 60.4497, 89.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16827265", "mag": 1.1, "time": 1505091880397, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6719, 63.2902, 124.6 ] } }, + { "type": "Feature", "properties": { "id": "uu60242262", "mag": 2.47, "time": 1505091634360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.440667, 42.578333, 7.23 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajsf", "mag": 2.3, "time": 1505091431720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.443, 42.5904, 7.61 ] } }, + { "type": "Feature", "properties": { "id": "ak16827264", "mag": 1.3, "time": 1505091007359, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.0095, 58.5704, 86.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72890011", "mag": 1.58, "time": 1505090685010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.832333, 37.542333, 4.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37759743", "mag": 1.01, "time": 1505090624240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.589167, 36.0335, 2.63 ] } }, + { "type": "Feature", "properties": { "id": "us2000amxb", "mag": 3.0, "time": 1505090296990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.554, 51.5916, 17.56 ] } }, + { "type": "Feature", "properties": { "id": "nc72890001", "mag": 0.97, "time": 1505089976320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.831, 37.541833, 4.79 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajsa", "mag": 4.9, "time": 1505089942200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9938, 15.3932, 58.95 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajs1", "mag": 3.2, "time": 1505088752720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4151, 42.563, 8.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajrw", "mag": 4.4, "time": 1505087147130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.4901, 14.0924, 54.64 ] } }, + { "type": "Feature", "properties": { "id": "ak16806048", "mag": 1.2, "time": 1505085946916, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.3481, 62.1328, 10.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37759727", "mag": 1.54, "time": 1505085941950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.663167, 35.044, -0.82 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajrn", "mag": 2.4, "time": 1505085758040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4372, 42.584, 3.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16827727", "mag": 1.2, "time": 1505085448361, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0012, 60.1398, 104.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajrh", "mag": 2.4, "time": 1505084625610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4614, 42.6018, 5.02 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajre", "mag": 3.0, "time": 1505084186000, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4583, 42.5935, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16805384", "mag": 1.3, "time": 1505084019928, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9225, 60.1912, 51.8 ] } }, + { "type": "Feature", "properties": { "id": "pr2017253006", "mag": 3.55, "time": 1505083663180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.7241, 19.5025, 24.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759703", "mag": 1.47, "time": 1505083414820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.164, 34.038833, 6.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759695", "mag": 2.37, "time": 1505083359860, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.166167, 34.037667, 6.01 ] } }, + { "type": "Feature", "properties": { "id": "ci37759687", "mag": 1.26, "time": 1505083316070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.166667, 34.039167, 6.08 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70234968", "mag": 1.57, "time": 1505083207900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.877167, 37.229167, 3.02 ] } }, + { "type": "Feature", "properties": { "id": "ci37759679", "mag": 1.03, "time": 1505082787240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.290167, 35.090833, 2.62 ] } }, + { "type": "Feature", "properties": { "id": "uu60242127", "mag": 1.52, "time": 1505082515530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.439, 42.5855, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16805375", "mag": 2.0, "time": 1505082468672, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2261, 62.1899, 53.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16805361", "mag": 2.4, "time": 1505082389962, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8636, 68.2355, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajq9", "mag": 3.3, "time": 1505081821360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4511, 42.5959, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72889956", "mag": 1.01, "time": 1505081275110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.790333, 37.452833, 8.21 ] } }, + { "type": "Feature", "properties": { "id": "ak16805341", "mag": 2.5, "time": 1505081090999, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9101, 57.044, 46.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajpe", "mag": 5.9, "time": 1505079621210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -33.6765, 57.1272, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72889936", "mag": 1.22, "time": 1505079295950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.937667, 37.601667, 1.02 ] } }, + { "type": "Feature", "properties": { "id": "nc72889931", "mag": 1.1, "time": 1505078962470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.806, 37.5175, -2.34 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajp8", "mag": 2.8, "time": 1505078892060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4509, 42.5792, 6.22 ] } }, + { "type": "Feature", "properties": { "id": "uw61306227", "mag": 1.13, "time": 1505078465000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.011167, 46.792, 5.12 ] } }, + { "type": "Feature", "properties": { "id": "uu60241997", "mag": 1.44, "time": 1505078100230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.422167, 42.554167, 8.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16827720", "mag": 1.0, "time": 1505077902054, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.0938, 58.0932, 50.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72889921", "mag": 1.74, "time": 1505077579730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.941333, 37.642833, 0.01 ] } }, + { "type": "Feature", "properties": { "id": "nc72889926", "mag": 1.62, "time": 1505077560070, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.946167, 37.638667, -0.65 ] } }, + { "type": "Feature", "properties": { "id": "nc72889911", "mag": 0.99, "time": 1505077390170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.394833, 36.9325, 8.56 ] } }, + { "type": "Feature", "properties": { "id": "pr2017253005", "mag": 2.52, "time": 1505077373570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.714, 18.0166, 7.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72889916", "mag": 0.95, "time": 1505077317230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.881833, 37.512333, -0.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16804640", "mag": 1.6, "time": 1505077302019, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.5368, 58.8361, 122.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajnd", "mag": 4.5, "time": 1505076424950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2595, 15.0768, 55.96 ] } }, + { "type": "Feature", "properties": { "id": "nn00604604", "mag": 1.4, "time": 1505076297106, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.9555, 40.8314, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16803984", "mag": 1.3, "time": 1505076289998, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1907, 63.4845, 0.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajms", "mag": 3.3, "time": 1505075535460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4239, 42.5436, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00604570", "mag": 1.1, "time": 1505075507371, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.8807, 36.8036, 7.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16827715", "mag": 1.2, "time": 1505074869438, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7422, 60.0074, 102.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16803877", "mag": 1.0, "time": 1505074842648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.4194, 63.2783, 7.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajm5", "mag": 2.5, "time": 1505074494700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4599, 42.5711, 10.61 ] } }, + { "type": "Feature", "properties": { "id": "hv61903706", "mag": 1.86, "time": 1505074128010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.273331, 19.413166, 0.54 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajlx", "mag": 3.2, "time": 1505074034020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.42, 42.5453, 7.37 ] } }, + { "type": "Feature", "properties": { "id": "ak16803869", "mag": 1.2, "time": 1505073920064, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7217, 63.3651, 4.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajls", "mag": 4.3, "time": 1505073807210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -69.114, -23.6018, 85.28 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajlp", "mag": 4.6, "time": 1505073492510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 13.2839, 42.1689, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759623", "mag": 1.13, "time": 1505073299090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.162, 34.035333, 6.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajlc", "mag": 2.7, "time": 1505072667200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.6178, 36.1361, 5.301 ] } }, + { "type": "Feature", "properties": { "id": "mb80254244", "mag": 1.15, "time": 1505072506030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527667, 46.862667, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000akfw", "mag": 3.1, "time": 1505072325000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4094, 42.5488, 7.85 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajl5", "mag": 2.7, "time": 1505072221960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4249, 42.5451, 9.42 ] } }, + { "type": "Feature", "properties": { "id": "nc72889901", "mag": 1.7, "time": 1505072189820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.784833, 38.824667, 1.65 ] } }, + { "type": "Feature", "properties": { "id": "nc72889906", "mag": 1.54, "time": 1505072140190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.153, 37.129167, 12.33 ] } }, + { "type": "Feature", "properties": { "id": "nc72889891", "mag": 1.28, "time": 1505070945740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.891, 37.544167, 1.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16803197", "mag": 2.5, "time": 1505070454371, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.4505, 54.6854, 60.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajkd", "mag": 4.1, "time": 1505070312980, "felt": 41, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4177, 42.5563, 13.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72889881", "mag": 1.58, "time": 1505069810220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.149, 37.1305, 12.32 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajkz", "mag": 2.4, "time": 1505069780800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4181, 42.5449, 7.46 ] } }, + { "type": "Feature", "properties": { "id": "pr2017253004", "mag": 3.24, "time": 1505069521610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -65.0411, 19.2021, 48.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61903656", "mag": 1.57, "time": 1505069138690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.104167, 19.329333, 5.178 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajjx", "mag": 2.9, "time": 1505068769580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4153, 42.5555, 7.28 ] } }, + { "type": "Feature", "properties": { "id": "ak16802543", "mag": 1.6, "time": 1505068750842, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6404, 58.5519, 66.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajju", "mag": 2.5, "time": 1505068746720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -104.9924, 37.0464, 6.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72889876", "mag": 1.12, "time": 1505068188960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.315667, 36.955833, 7.62 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajjp", "mag": 2.3, "time": 1505068125580, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.1711, 35.6565, 7.54 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajjl", "mag": 2.4, "time": 1505067921890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4388, 42.6003, 7.21 ] } }, + { "type": "Feature", "properties": { "id": "ci37759607", "mag": 1.53, "time": 1505067791950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.169667, 34.037167, 4.29 ] } }, + { "type": "Feature", "properties": { "id": "ci37759599", "mag": 0.99, "time": 1505067584720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.163333, 34.028, 2.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajn9", "mag": 2.7, "time": 1505067322220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.5732, 52.3355, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16827705", "mag": 1.3, "time": 1505067315004, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7536, 59.2097, 68.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72889866", "mag": 1.0, "time": 1505067136160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.764168, 38.833, 0.66 ] } }, + { "type": "Feature", "properties": { "id": "nc72889861", "mag": 1.06, "time": 1505067131030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.759667, 38.833667, 1.17 ] } }, + { "type": "Feature", "properties": { "id": "ak16802540", "mag": 1.3, "time": 1505066586033, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.3745, 62.1772, 42.1 ] } }, + { "type": "Feature", "properties": { "id": "ci37759591", "mag": 1.48, "time": 1505066404370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.166333, 34.044667, 5.25 ] } }, + { "type": "Feature", "properties": { "id": "ci37759583", "mag": 1.53, "time": 1505066395290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.163333, 34.041167, 5.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16827703", "mag": 1.0, "time": 1505066200905, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.7529, 58.6862, 17.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759567", "mag": 1.34, "time": 1505066082610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.163833, 34.040667, 6.08 ] } }, + { "type": "Feature", "properties": { "id": "ak16802539", "mag": 1.1, "time": 1505065957419, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0268, 60.5262, 19.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajjb", "mag": 2.5, "time": 1505065916650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4209, 42.5639, 8.61 ] } }, + { "type": "Feature", "properties": { "id": "ci37759559", "mag": 1.32, "time": 1505065772840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2325, 34.474333, 11.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16802537", "mag": 1.3, "time": 1505065364910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.2942, 63.1472, 1.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759551", "mag": 1.1, "time": 1505065150010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.172667, 34.034333, 5.23 ] } }, + { "type": "Feature", "properties": { "id": "ci37759543", "mag": 1.69, "time": 1505064387890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.295, 35.088667, 4.44 ] } }, + { "type": "Feature", "properties": { "id": "ak16802513", "mag": 1.5, "time": 1505064158942, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -145.1889, 65.0868, 19.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajj3", "mag": 4.4, "time": 1505063935670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 82.4969, 41.9157, 28.96 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajiy", "mag": 2.7, "time": 1505063902750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4577, 42.6058, 5.68 ] } }, + { "type": "Feature", "properties": { "id": "uu60241602", "mag": 1.36, "time": 1505063711640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.415333, 42.567, 9.66 ] } }, + { "type": "Feature", "properties": { "id": "ci37759535", "mag": 1.1, "time": 1505063618920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.165167, 34.041667, 6.46 ] } }, + { "type": "Feature", "properties": { "id": "nc72889821", "mag": 1.62, "time": 1505063575750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.157167, 37.135667, 10.29 ] } }, + { "type": "Feature", "properties": { "id": "nc72889816", "mag": 1.01, "time": 1505063492860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.774667, 35.547833, 5.09 ] } }, + { "type": "Feature", "properties": { "id": "ci37759527", "mag": 2.15, "time": 1505063398380, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.238167, 34.467833, 11.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajih", "mag": 2.5, "time": 1505062945810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4296, 42.5627, 11.62 ] } }, + { "type": "Feature", "properties": { "id": "nc72889806", "mag": 2.49, "time": 1505062781340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.801833, 38.789333, 3.19 ] } }, + { "type": "Feature", "properties": { "id": "uu60013054", "mag": 1.65, "time": 1505062641290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.444, 42.594667, 6.67 ] } }, + { "type": "Feature", "properties": { "id": "uu60241572", "mag": 2.02, "time": 1505062621720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.432167, 42.5965, 4.48 ] } }, + { "type": "Feature", "properties": { "id": "ci37759519", "mag": 1.59, "time": 1505062248460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.167, 34.038667, 4.49 ] } }, + { "type": "Feature", "properties": { "id": "ci37759511", "mag": 1.92, "time": 1505062179580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.165, 34.039333, 4.98 ] } }, + { "type": "Feature", "properties": { "id": "ci37759503", "mag": 1.57, "time": 1505062145210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.164167, 34.037667, 5.25 ] } }, + { "type": "Feature", "properties": { "id": "ci37759495", "mag": 1.42, "time": 1505061900480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.165667, 34.038667, 5.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16801882", "mag": 1.1, "time": 1505061849133, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.1509, 60.3803, 7.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759487", "mag": 1.49, "time": 1505061523920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.893, 35.343333, 5.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16801880", "mag": 1.5, "time": 1505061368254, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.731, 60.0161, 6.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37759471", "mag": 1.2, "time": 1505061266330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.167333, 34.040167, 4.42 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajn8", "mag": 3.4, "time": 1505060976520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.3264, 52.5377, 96.17 ] } }, + { "type": "Feature", "properties": { "id": "ci37759455", "mag": 1.41, "time": 1505060968220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.8935, 35.3405, 5.83 ] } }, + { "type": "Feature", "properties": { "id": "ak16801858", "mag": 1.5, "time": 1505060123211, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4433, 51.6859, 21.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16801272", "mag": 1.1, "time": 1505059792074, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.1384, 63.4871, 1.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16827692", "mag": 2.2, "time": 1505059542515, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.3922, 52.3983, 21.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72889781", "mag": 1.29, "time": 1505059412980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.943667, 37.596167, 2.31 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajqf", "mag": 4.6, "time": 1505058668170, "felt": 49, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 139.1945, 35.7377, 54.25 ] } }, + { "type": "Feature", "properties": { "id": "nc72889766", "mag": 1.32, "time": 1505058489100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.046333, 38.9295, 0.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajhi", "mag": 2.5, "time": 1505058212500, "felt": 9, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.7958, 35.9926, 4.398 ] } }, + { "type": "Feature", "properties": { "id": "ak16801236", "mag": 1.4, "time": 1505058208151, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9025, 57.4691, 48.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37759407", "mag": 1.83, "time": 1505057535880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.3395, 34.014333, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000artt", "mag": 4.2, "time": 1505057483820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.9272, 37.8866, 41.94 ] } }, + { "type": "Feature", "properties": { "id": "ak16827688", "mag": 1.7, "time": 1505057440690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7035, 58.208, 3.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajh6", "mag": 4.6, "time": 1505057331420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4383, 15.2976, 42.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajh4", "mag": 2.6, "time": 1505057207380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4289, 42.5593, 7.96 ] } }, + { "type": "Feature", "properties": { "id": "ak16827687", "mag": 1.5, "time": 1505057001386, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4181, 51.7014, 6.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajh2", "mag": 4.2, "time": 1505056916120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2576, 14.9344, 12.93 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajgy", "mag": 2.5, "time": 1505056755330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7823, 37.3283, 5.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16827686", "mag": 1.1, "time": 1505056731493, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.8679, 57.3821, 46.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajgx", "mag": 2.8, "time": 1505056639060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4498, 42.5804, 5.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16827685", "mag": 1.2, "time": 1505056471867, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.1402, 60.9584, 19.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajgu", "mag": 2.5, "time": 1505056401260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4462, 42.5738, 5.62 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajgm", "mag": 4.9, "time": 1505055545760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.6784, 14.1109, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759383", "mag": 1.0, "time": 1505055131400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.169167, 34.0425, 5.43 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajge", "mag": 3.4, "time": 1505054862840, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4185, 42.5625, 9.41 ] } }, + { "type": "Feature", "properties": { "id": "ak16800620", "mag": 1.1, "time": 1505054600546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7386, 61.4915, 80.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajgc", "mag": 3.1, "time": 1505054298370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4151, 42.55, 7.52 ] } }, + { "type": "Feature", "properties": { "id": "ak16800576", "mag": 2.5, "time": 1505054208776, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9361, 60.2731, 64.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72889746", "mag": 1.38, "time": 1505053809310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.442, 37.695667, 4.15 ] } }, + { "type": "Feature", "properties": { "id": "pr2017253003", "mag": 2.17, "time": 1505052857240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2868, 18.1121, 18.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajg9", "mag": 2.9, "time": 1505052838460, "felt": 11, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5162, 46.8743, 14.72 ] } }, + { "type": "Feature", "properties": { "id": "nc72889741", "mag": 1.38, "time": 1505052751930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.824333, 38.060667, 1.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16799977", "mag": 1.0, "time": 1505052033903, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.8767, 61.5617, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "mb80254079", "mag": 1.59, "time": 1505051737640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.410667, 44.4485, 6.72 ] } }, + { "type": "Feature", "properties": { "id": "ak16799971", "mag": 1.7, "time": 1505051381698, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.7235, 59.8179, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajfa", "mag": 4.3, "time": 1505051330480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -90.3498, 13.069, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajf7", "mag": 4.0, "time": 1505050961060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.3526, 52.4771, 237.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16799942", "mag": 1.7, "time": 1505050892677, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6731, 59.5546, 120.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajf3", "mag": 4.6, "time": 1505050808670, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.529, 15.6631, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajf0", "mag": 4.5, "time": 1505050687090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4173, 15.2922, 52.65 ] } }, + { "type": "Feature", "properties": { "id": "us2000artu", "mag": 4.1, "time": 1505050610220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 128.1836, -7.5542, 159.39 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajex", "mag": 4.3, "time": 1505049954620, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.6306, 15.7653, 20.71 ] } }, + { "type": "Feature", "properties": { "id": "ci37759303", "mag": 1.26, "time": 1505049848270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7985, 33.504667, 4.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajeq", "mag": 2.8, "time": 1505049297970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4232, 42.5578, 7.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16799353", "mag": 1.3, "time": 1505049096103, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6348, 59.8194, 14.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajen", "mag": 3.0, "time": 1505048991180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4182, 42.5509, 7.02 ] } }, + { "type": "Feature", "properties": { "id": "ak16827673", "mag": 1.6, "time": 1505048796797, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -167.3116, 53.3278, 13.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajej", "mag": 2.6, "time": 1505048615320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4688, 42.6115, 6.14 ] } }, + { "type": "Feature", "properties": { "id": "mb80254034", "mag": 1.41, "time": 1505048540860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521667, 46.8615, 12.53 ] } }, + { "type": "Feature", "properties": { "id": "mb80254029", "mag": 1.23, "time": 1505048399750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.521167, 46.853, 11.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16799346", "mag": 2.0, "time": 1505048306207, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2292, 62.187, 56.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000aje5", "mag": 4.4, "time": 1505047810980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.8604, 12.4905, 60.22 ] } }, + { "type": "Feature", "properties": { "id": "us2000aje3", "mag": 3.6, "time": 1505047519260, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4283, 42.5536, 6.44 ] } }, + { "type": "Feature", "properties": { "id": "us2000aje1", "mag": 2.8, "time": 1505047427230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4487, 42.6011, 5.82 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajdz", "mag": 2.5, "time": 1505047141140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4433, 42.6033, 3.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajm3", "mag": 3.4, "time": 1505046945740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.4897, 52.4554, 37.93 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajdq", "mag": 3.1, "time": 1505046464560, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4503, 42.6011, 4.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16827668", "mag": 1.6, "time": 1505046395510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3819, 59.8907, 133.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajdf", "mag": 3.9, "time": 1505045951750, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4091, 42.5736, 10.02 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajdd", "mag": 3.1, "time": 1505045857190, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4617, 42.6284, 4.97 ] } }, + { "type": "Feature", "properties": { "id": "uu60241107", "mag": 2.14, "time": 1505045641970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.427, 42.59, 6.81 ] } }, + { "type": "Feature", "properties": { "id": "ak16798742", "mag": 1.3, "time": 1505045327481, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3496, 69.231, 1.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajd9", "mag": 4.3, "time": 1505045213250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.1554, 14.0483, 13.91 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajd2", "mag": 4.5, "time": 1505044829750, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.4915, 15.8549, 21.45 ] } }, + { "type": "Feature", "properties": { "id": "ak16798732", "mag": 2.6, "time": 1505044761546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.966, 59.8093, 102.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajcy", "mag": 2.6, "time": 1505044665510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.5652, 42.6019, 9.42 ] } }, + { "type": "Feature", "properties": { "id": "us2000artq", "mag": 4.4, "time": 1505044070510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 120.6016, 12.9144, 38.64 ] } }, + { "type": "Feature", "properties": { "id": "ak16827665", "mag": 1.6, "time": 1505043947734, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3635, 51.6272, 0.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajci", "mag": 2.9, "time": 1505043647160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4487, 42.6201, 8.65 ] } }, + { "type": "Feature", "properties": { "id": "ak16827663", "mag": 2.1, "time": 1505043481292, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.5488, 52.6471, 37.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajch", "mag": 2.9, "time": 1505043441680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4464, 42.565, 8.31 ] } }, + { "type": "Feature", "properties": { "id": "nn00604506", "mag": 1.1, "time": 1505043238904, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.2044, 38.3052, 10.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajce", "mag": 2.6, "time": 1505042826200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4252, 42.5577, 5.15 ] } }, + { "type": "Feature", "properties": { "id": "ak16798700", "mag": 1.7, "time": 1505042612937, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.2918, 69.235, 1.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajc9", "mag": 3.1, "time": 1505042537350, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4318, 42.5604, 7.18 ] } }, + { "type": "Feature", "properties": { "id": "hv61903466", "mag": 2.42, "time": 1505042508060, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.211833, 19.916833, 13.349 ] } }, + { "type": "Feature", "properties": { "id": "ak16798696", "mag": 1.3, "time": 1505042293807, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.3271, 69.2374, 3.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajbt", "mag": 4.7, "time": 1505041959050, "felt": 41, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4701, 42.6074, 4.56 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajbp", "mag": 2.6, "time": 1505041798510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4553, 42.6057, 2.2 ] } }, + { "type": "Feature", "properties": { "id": "nn00604588", "mag": 1.0, "time": 1505041736983, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8863, 39.0228, 11.8 ] } }, + { "type": "Feature", "properties": { "id": "pr2017253002", "mag": 2.88, "time": 1505041375350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.305, 18.603, 82.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajbk", "mag": 3.1, "time": 1505040789630, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4404, 42.601, 4.73 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajbj", "mag": 2.6, "time": 1505040635620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4423, 42.5705, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37759247", "mag": 1.02, "time": 1505040606370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.192167, 33.778, 3.52 ] } }, + { "type": "Feature", "properties": { "id": "uw61306142", "mag": 2.37, "time": 1505040308500, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.040167, 46.875333, 6.45 ] } }, + { "type": "Feature", "properties": { "id": "ak16827659", "mag": 2.3, "time": 1505040202211, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.8004, 51.946, 193.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajba", "mag": 2.5, "time": 1505040116970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4234, 42.6126, 8.0 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70234948", "mag": 1.52, "time": 1505039824000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.878333, 37.226333, 2.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajay", "mag": 2.5, "time": 1505039717650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4475, 42.5965, 6.66 ] } }, + { "type": "Feature", "properties": { "id": "ci37759239", "mag": 1.83, "time": 1505039190870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.297667, 34.7275, 4.7 ] } }, + { "type": "Feature", "properties": { "id": "ci37759231", "mag": 1.46, "time": 1505038960010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.206167, 33.030167, 5.66 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajah", "mag": 4.9, "time": 1505038459290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5926, 15.8657, 62.07 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajad", "mag": 2.8, "time": 1505038317850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4649, 42.5713, 2.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ajac", "mag": 2.8, "time": 1505038143220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.3389, 42.5698, 5.91 ] } }, + { "type": "Feature", "properties": { "id": "us2000aja1", "mag": 2.5, "time": 1505037892850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4134, 42.5966, 2.41 ] } }, + { "type": "Feature", "properties": { "id": "nc72889666", "mag": 2.44, "time": 1505037177900, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.680333, 36.934833, 10.93 ] } }, + { "type": "Feature", "properties": { "id": "us2000ak98", "mag": 2.7, "time": 1505037007800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.9657, 36.5378, 5.921 ] } }, + { "type": "Feature", "properties": { "id": "us2000akbp", "mag": 3.5, "time": 1505036907810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4216, 42.6147, 2.61 ] } }, + { "type": "Feature", "properties": { "id": "hv61903376", "mag": 2.02, "time": 1505036885770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.244, 19.404333, 38.634 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj9i", "mag": 5.0, "time": 1505036830570, "felt": 222, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4155, 42.5629, 9.83 ] } }, + { "type": "Feature", "properties": { "id": "nn00604494", "mag": 1.3, "time": 1505036614546, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9198, 38.3864, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16797541", "mag": 2.3, "time": 1505036483755, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -176.8674, 50.427, 38.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72889656", "mag": 1.55, "time": 1505036419440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9445, 37.642333, -0.52 ] } }, + { "type": "Feature", "properties": { "id": "us2000artp", "mag": 4.7, "time": 1505036336060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 147.742, 44.4006, 89.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj9e", "mag": 4.1, "time": 1505036045120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8669, 15.7031, 37.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16797519", "mag": 3.3, "time": 1505035967489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.9107, 62.993, 122.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16797515", "mag": 2.4, "time": 1505035289100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.6897, 53.169, 25.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16827654", "mag": 1.4, "time": 1505034233691, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9911, 60.3931, 86.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16796945", "mag": 2.3, "time": 1505033682313, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0313, 60.3066, 10.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72889646", "mag": 1.08, "time": 1505033636850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.818001, 38.801998, 2.52 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj8v", "mag": 2.4, "time": 1505033298010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.484, 42.6096, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000amz2", "mag": 2.8, "time": 1505033251180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.0563, 54.0093, 14.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37759175", "mag": 1.28, "time": 1505033174200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.362167, 33.154333, 11.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16796924", "mag": 1.8, "time": 1505033149645, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.7762, 53.453, 28.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj8s", "mag": 5.5, "time": 1505033064540, "felt": 15, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 142.8932, 41.7813, 45.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj8i", "mag": 5.2, "time": 1505032778170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5035, 15.7644, 57.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000amz1", "mag": 2.8, "time": 1505032715690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -162.8991, 53.5788, 15.9 ] } }, + { "type": "Feature", "properties": { "id": "mb80253749", "mag": 1.76, "time": 1505032545100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.524667, 46.889167, 14.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj87", "mag": 3.8, "time": 1505032481960, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -104.9548, 37.0369, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000artm", "mag": 4.4, "time": 1505032427640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.852, -18.159, 601.21 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj86", "mag": 4.2, "time": 1505032314990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 22.3039, 38.0722, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759159", "mag": 0.97, "time": 1505031839650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1615, 34.0365, 4.44 ] } }, + { "type": "Feature", "properties": { "id": "us2000artk", "mag": 3.8, "time": 1505031830730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 170.788, 53.8251, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000amyz", "mag": 2.6, "time": 1505031468470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4988, 51.6871, 9.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000arti", "mag": 4.5, "time": 1505031463320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.9123, -25.0133, 508.03 ] } }, + { "type": "Feature", "properties": { "id": "hv61903321", "mag": 1.9, "time": 1505031307020, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.376, 19.109, 42.633 ] } }, + { "type": "Feature", "properties": { "id": "ci37759151", "mag": 2.32, "time": 1505031276490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.528667, 33.143833, 8.22 ] } }, + { "type": "Feature", "properties": { "id": "nc72889631", "mag": 1.68, "time": 1505031062020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.1025, 35.652333, 4.49 ] } }, + { "type": "Feature", "properties": { "id": "ci37759127", "mag": 0.99, "time": 1505030565890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.4795, 34.347667, 6.85 ] } }, + { "type": "Feature", "properties": { "id": "ak16796357", "mag": 1.6, "time": 1505029768799, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6864, 61.2792, 33.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16796347", "mag": 2.8, "time": 1505029738842, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8811, 62.6834, 89.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16796345", "mag": 1.1, "time": 1505029334941, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9656, 62.9587, 88.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16796343", "mag": 1.4, "time": 1505028430485, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.3315, 60.2265, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759079", "mag": 1.03, "time": 1505028192380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.793833, 33.508, 4.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16827644", "mag": 2.2, "time": 1505028185237, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.9799, 52.0013, 156.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000artg", "mag": 4.2, "time": 1505027908500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.9129, -24.5931, 503.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj7r", "mag": 4.5, "time": 1505027720310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5866, 15.1076, 24.87 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj7m", "mag": 3.3, "time": 1505027636400, "felt": 12, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.804, 35.9918, 5.961 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj7l", "mag": 3.0, "time": 1505027344470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4316, 42.5611, 7.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16796341", "mag": 1.6, "time": 1505026917606, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.9481, 51.2072, 22.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16796340", "mag": 1.2, "time": 1505026743356, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0079, 59.5892, 41.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16796338", "mag": 1.3, "time": 1505026513369, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0949, 62.0857, 37.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37759055", "mag": 1.58, "time": 1505026335940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.798333, 33.501167, 3.42 ] } }, + { "type": "Feature", "properties": { "id": "mb80253734", "mag": 1.14, "time": 1505025721140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -113.170167, 47.328333, 19.23 ] } }, + { "type": "Feature", "properties": { "id": "ak16796336", "mag": 1.0, "time": 1505025668896, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2865, 62.4037, 46.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16796333", "mag": 1.6, "time": 1505025496149, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.8107, 60.5943, 2.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72889606", "mag": 1.8, "time": 1505025336300, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.260333, 36.150833, 8.23 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj7g", "mag": 4.3, "time": 1505024815920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5354, 15.0816, 39.42 ] } }, + { "type": "Feature", "properties": { "id": "ak16827636", "mag": 1.3, "time": 1505024434533, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4031, 51.77, 19.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16795777", "mag": 1.4, "time": 1505024355978, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.0051, 60.2926, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759039", "mag": 1.89, "time": 1505024281500, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.871, 36.511333, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "nn00604470", "mag": 1.2, "time": 1505024158420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1219, 37.3848, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72889576", "mag": 0.98, "time": 1505022995190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.766333, 37.576333, 4.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj75", "mag": 4.0, "time": 1505022687700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2661, 15.0962, 47.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16827633", "mag": 1.4, "time": 1505022608119, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9863, 59.5419, 87.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16795771", "mag": 1.7, "time": 1505022431855, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7645, 61.916, 63.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16795770", "mag": 1.2, "time": 1505022130505, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6083, 61.2662, 54.7 ] } }, + { "type": "Feature", "properties": { "id": "nn00604466", "mag": 1.4, "time": 1505021979344, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1529, 37.0254, 0.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16795766", "mag": 1.7, "time": 1505021975648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1305, 61.3941, 3.7 ] } }, + { "type": "Feature", "properties": { "id": "pr2017253001", "mag": 2.14, "time": 1505021553530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.0151, 18.2211, 26.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37759015", "mag": 1.41, "time": 1505021428240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.1665, 34.037667, 5.07 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj6q", "mag": 2.8, "time": 1505020972500, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.6874, 36.6964, 8.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37758999", "mag": 1.58, "time": 1505020355730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.168833, 34.037667, 4.71 ] } }, + { "type": "Feature", "properties": { "id": "nc72889556", "mag": 1.12, "time": 1505019834580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.712167, 38.750333, 2.07 ] } }, + { "type": "Feature", "properties": { "id": "uw61306032", "mag": 2.05, "time": 1505019796720, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.038167, 46.874333, 6.38 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj6e", "mag": 4.1, "time": 1505019258690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.3705, 67.5564, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj6c", "mag": 4.1, "time": 1505019032690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0925, 15.7467, 34.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000ayew", "mag": 4.2, "time": 1505018634430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9037, 15.4311, 74.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37758959", "mag": 1.24, "time": 1505018324480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.169833, 34.0395, 6.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16795206", "mag": 2.1, "time": 1505018157144, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.4944, 60.3044, 178.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ayer", "mag": 4.0, "time": 1505017700720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8225, 15.3927, 47.72 ] } }, + { "type": "Feature", "properties": { "id": "ci37758935", "mag": 1.14, "time": 1505017497720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.169, 34.039333, 6.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16795202", "mag": 1.4, "time": 1505017366860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3287, 63.2644, 12.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37758927", "mag": 0.97, "time": 1505017113210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.034167, 34.268333, -0.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16827627", "mag": 1.4, "time": 1505017084382, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.915, 59.1941, 109.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37758911", "mag": 1.67, "time": 1505016996470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.167, 34.037833, 5.81 ] } }, + { "type": "Feature", "properties": { "id": "ak16795198", "mag": 1.2, "time": 1505016773648, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4096, 62.1404, 0.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16795193", "mag": 2.2, "time": 1505016672191, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3522, 59.8641, 133.9 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70234903", "mag": 1.63, "time": 1505016085390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.572167, 37.347167, 4.85 ] } }, + { "type": "Feature", "properties": { "id": "ak16795191", "mag": 1.2, "time": 1505016021415, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.4153, 61.11, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj5p", "mag": 4.3, "time": 1505015407020, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 141.7252, 38.0198, 68.12 ] } }, + { "type": "Feature", "properties": { "id": "ak16795189", "mag": 1.3, "time": 1505014815822, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7877, 59.5199, 52.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72889511", "mag": 1.11, "time": 1505014765900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.711998, 38.755501, 2.76 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj5f", "mag": 4.1, "time": 1505014246310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7509, 15.2659, 43.51 ] } }, + { "type": "Feature", "properties": { "id": "ak16795181", "mag": 2.2, "time": 1505014149113, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.8561, 61.3045, 25.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16795185", "mag": 1.8, "time": 1505014144643, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.2491, 60.9757, 43.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj59", "mag": 4.1, "time": 1505013882540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.2187, 67.6427, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61306007", "mag": 1.81, "time": 1505013085820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.600667, 43.836167, 3.82 ] } }, + { "type": "Feature", "properties": { "id": "mb80253724", "mag": 1.18, "time": 1505012880400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.520333, 46.896167, 10.28 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj51", "mag": 5.8, "time": 1505012842340, "felt": 8, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5278, 15.3896, 29.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16794614", "mag": 1.5, "time": 1505011941254, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.0253, 66.769, 24.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16794611", "mag": 1.9, "time": 1505011477433, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.452, 60.9238, 15.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16794610", "mag": 2.3, "time": 1505010496180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.5196, 51.817, 106.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000arv6", "mag": 4.0, "time": 1505010360400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9747, 15.1883, 59.97 ] } }, + { "type": "Feature", "properties": { "id": "pr2017253000", "mag": 2.65, "time": 1505009947880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.1073, 18.2203, 79.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj4r", "mag": 4.3, "time": 1505009855470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.3515, 14.9239, 35.26 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj4q", "mag": 2.4, "time": 1505009730390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.403, 42.6058, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16794604", "mag": 1.5, "time": 1505009566066, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5055, 61.4008, 14.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj4m", "mag": 3.2, "time": 1505008832850, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4779, 42.6737, 2.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000aye7", "mag": 3.9, "time": 1505008653110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.442, 15.7739, 41.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj4i", "mag": 4.2, "time": 1505008285900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3811, 14.9456, 27.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16827395", "mag": 1.0, "time": 1505008083507, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7452, 63.1544, 9.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16794056", "mag": 1.8, "time": 1505007980655, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -137.9725, 59.1241, 13.0 ] } }, + { "type": "Feature", "properties": { "id": "nn00604443", "mag": 1.1, "time": 1505007942083, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9112, 38.3937, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37758839", "mag": 1.22, "time": 1505007033130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.383167, 33.193, 7.75 ] } }, + { "type": "Feature", "properties": { "id": "ak16827393", "mag": 1.2, "time": 1505006807930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6807, 59.9356, 95.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj47", "mag": 4.1, "time": 1505005871300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.689, 16.7045, 39.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj44", "mag": 4.3, "time": 1505005501920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7157, 15.408, 32.22 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj41", "mag": 4.3, "time": 1505005103690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5751, 15.5308, 63.49 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj3z", "mag": 4.4, "time": 1505004749280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4987, 15.3526, 47.21 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj3t", "mag": 3.3, "time": 1505004389150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -129.358, 44.2464, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16793513", "mag": 2.3, "time": 1505004296412, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -143.3005, 58.2485, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16793511", "mag": 2.0, "time": 1505004250005, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3901, 51.6935, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj3m", "mag": 3.3, "time": 1505004159420, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -129.0417, 44.4745, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16827390", "mag": 1.5, "time": 1505004153873, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.9635, 59.4036, 98.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16827388", "mag": 1.4, "time": 1505003603974, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4592, 51.7361, 18.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16793506", "mag": 1.5, "time": 1505003554878, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5578, 62.0025, 41.6 ] } }, + { "type": "Feature", "properties": { "id": "mb80253689", "mag": 0.96, "time": 1505003169140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.508667, 46.879833, 9.14 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj3k", "mag": 4.7, "time": 1505002421890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -172.5775, -16.7183, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16793503", "mag": 1.2, "time": 1505001653442, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.0694, 51.6811, 2.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj3c", "mag": 2.3, "time": 1505001525800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.427, 42.5803, 7.86 ] } }, + { "type": "Feature", "properties": { "id": "hv61903041", "mag": 1.97, "time": 1505000788390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.501, 19.948333, 38.213 ] } }, + { "type": "Feature", "properties": { "id": "ak16793502", "mag": 2.1, "time": 1505000595653, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.5442, 56.1065, 5.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj36", "mag": 3.3, "time": 1505000090270, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -129.0754, 44.3952, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72889416", "mag": 1.43, "time": 1505000045060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.709167, 38.768333, 1.44 ] } }, + { "type": "Feature", "properties": { "id": "nc72889411", "mag": 1.18, "time": 1504999845050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.424167, 38.768, 7.71 ] } }, + { "type": "Feature", "properties": { "id": "ak16793501", "mag": 1.0, "time": 1504999793486, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0175, 59.5958, 36.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16793499", "mag": 1.5, "time": 1504999218478, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.9885, 60.7112, 87.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16823567", "mag": 1.5, "time": 1504999019129, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.3619, 57.7499, 9.3 ] } }, + { "type": "Feature", "properties": { "id": "hv61903026", "mag": 1.83, "time": 1504999009760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.28717, 19.4025, 1.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16793495", "mag": 1.5, "time": 1504998539010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.1873, 63.1024, 94.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16793492", "mag": 1.9, "time": 1504998198191, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.4513, 66.9866, 0.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16793490", "mag": 1.1, "time": 1504998084010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3555, 64.9906, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000am0g", "mag": 2.9, "time": 1504997864050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -161.5776, 54.9813, 70.97 ] } }, + { "type": "Feature", "properties": { "id": "us2000am0f", "mag": 3.0, "time": 1504997382330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.4861, 55.435, 25.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj2w", "mag": 2.6, "time": 1504996101810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4595, 42.6646, 8.07 ] } }, + { "type": "Feature", "properties": { "id": "ak16823560", "mag": 1.1, "time": 1504995586471, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.5516, 60.1674, 10.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj2g", "mag": 2.6, "time": 1504995580700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -99.3253, 36.95, 2.161 ] } }, + { "type": "Feature", "properties": { "id": "nc72889401", "mag": 1.53, "time": 1504995533070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.883167, 39.862333, 5.12 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj2p", "mag": 4.3, "time": 1504995471290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -73.6167, -36.1497, 25.35 ] } }, + { "type": "Feature", "properties": { "id": "ci37758743", "mag": 0.97, "time": 1504995032090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.927167, 35.897667, 6.49 ] } }, + { "type": "Feature", "properties": { "id": "ak16792945", "mag": 1.9, "time": 1504994934423, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.6439, 60.0021, 159.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72889396", "mag": 1.01, "time": 1504994309360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.744499, 38.774666, 1.39 ] } }, + { "type": "Feature", "properties": { "id": "mb80253659", "mag": 1.35, "time": 1504994237270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.767667, 45.618, 0.67 ] } }, + { "type": "Feature", "properties": { "id": "nc72889391", "mag": 1.15, "time": 1504994059680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.4355, 39.501833, 12.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000ayd8", "mag": 4.0, "time": 1504993547880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0655, 15.7772, 34.99 ] } }, + { "type": "Feature", "properties": { "id": "uu60240502", "mag": 1.28, "time": 1504993388650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.014167, 44.781833, 8.11 ] } }, + { "type": "Feature", "properties": { "id": "nc72889381", "mag": 1.37, "time": 1504992621690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.732833, 38.768167, 0.83 ] } }, + { "type": "Feature", "properties": { "id": "nc72889376", "mag": 1.64, "time": 1504992347010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.879, 39.861333, 5.75 ] } }, + { "type": "Feature", "properties": { "id": "nc72889366", "mag": 0.99, "time": 1504990736460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.712667, 38.913333, 2.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj18", "mag": 4.9, "time": 1504990247280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.6127, -27.7277, 147.22 ] } }, + { "type": "Feature", "properties": { "id": "us2000aksk", "mag": 2.8, "time": 1504990158400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8073, 35.9883, 6.228 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj13", "mag": 3.1, "time": 1504990070700, "felt": 18, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -96.8015, 35.9914, 5.85 ] } }, + { "type": "Feature", "properties": { "id": "us2000arta", "mag": 4.2, "time": 1504989955640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0828, 15.537, 19.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16792284", "mag": 1.6, "time": 1504989907169, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0546, 60.3983, 79.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72889356", "mag": 0.96, "time": 1504989514010, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.201333, 37.802667, 8.55 ] } }, + { "type": "Feature", "properties": { "id": "ak16823554", "mag": 1.4, "time": 1504989475242, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.8158, 59.9912, 96.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj0w", "mag": 2.8, "time": 1504989429400, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5041, 36.2908, 8.103 ] } }, + { "type": "Feature", "properties": { "id": "hv61902851", "mag": 1.98, "time": 1504989368750, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.279159, 19.391001, 0.54 ] } }, + { "type": "Feature", "properties": { "id": "us2000art9", "mag": 4.4, "time": 1504989282650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5518, 15.0779, 35.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj0x", "mag": 4.2, "time": 1504989178220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8925, 15.5513, 33.85 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj1p", "mag": 2.3, "time": 1504988963860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.4077, 55.6085, 30.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16823552", "mag": 1.2, "time": 1504988912939, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7854, 60.1774, 76.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj0r", "mag": 4.8, "time": 1504988774940, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8055, 15.4862, 41.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16823551", "mag": 1.5, "time": 1504988703567, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6984, 60.153, 94.6 ] } }, + { "type": "Feature", "properties": { "id": "hv61902831", "mag": 2.68, "time": 1504988541740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.446, 20.027167, 8.137 ] } }, + { "type": "Feature", "properties": { "id": "uu60240472", "mag": 1.31, "time": 1504988346800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.206, 39.282333, -3.32 ] } }, + { "type": "Feature", "properties": { "id": "hv61902821", "mag": 2.08, "time": 1504988052380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.281998, 19.411833, 2.05 ] } }, + { "type": "Feature", "properties": { "id": "ak16791747", "mag": 1.2, "time": 1504986900345, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4114, 60.0877, 56.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72889346", "mag": 1.15, "time": 1504985576640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.723667, 38.753833, 1.93 ] } }, + { "type": "Feature", "properties": { "id": "us2000aizy", "mag": 4.4, "time": 1504984967070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.1285, 55.2452, 28.63 ] } }, + { "type": "Feature", "properties": { "id": "ak16823547", "mag": 2.3, "time": 1504984573262, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.2291, 50.8322, 17.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000aizr", "mag": 2.3, "time": 1504983888120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4504, 42.6494, 10.91 ] } }, + { "type": "Feature", "properties": { "id": "nn00604425", "mag": 1.1, "time": 1504983732096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8284, 38.06, 3.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16791198", "mag": 1.7, "time": 1504983607869, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5288, 51.7278, 12.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72889341", "mag": 1.77, "time": 1504983196540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.881, 38.833667, 2.0 ] } }, + { "type": "Feature", "properties": { "id": "uu60240427", "mag": 2.17, "time": 1504983086160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.417167, 42.555833, 8.52 ] } }, + { "type": "Feature", "properties": { "id": "us2000aizg", "mag": 4.4, "time": 1504983043410, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4218, 15.787, 57.77 ] } }, + { "type": "Feature", "properties": { "id": "hv61902716", "mag": 1.45, "time": 1504983007260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.274333, 18.915833, 7.212 ] } }, + { "type": "Feature", "properties": { "id": "ak16823545", "mag": 1.7, "time": 1504982688397, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -166.1975, 53.2518, 21.4 ] } }, + { "type": "Feature", "properties": { "id": "nn00604404", "mag": 2.1, "time": 1504981848383, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9058, 38.3558, 8.8 ] } }, + { "type": "Feature", "properties": { "id": "nc72889331", "mag": 1.22, "time": 1504981774440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.480833, 38.843833, 10.34 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiz4", "mag": 4.4, "time": 1504981610170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 155.7383, 49.4785, 59.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16791190", "mag": 2.4, "time": 1504980782997, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.857, 67.7643, 14.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16823543", "mag": 1.8, "time": 1504980266831, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4071, 51.6082, 9.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37758695", "mag": 1.06, "time": 1504980028730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.307667, 34.0925, 16.16 ] } }, + { "type": "Feature", "properties": { "id": "ak16791189", "mag": 1.3, "time": 1504980002277, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.043, 60.3576, 52.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiyg", "mag": 4.4, "time": 1504979697800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.459, 15.3004, 36.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16823541", "mag": 1.5, "time": 1504978178608, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.8616, 58.3062, 104.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000aycf", "mag": 4.2, "time": 1504977766490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1719, 15.1363, 19.92 ] } }, + { "type": "Feature", "properties": { "id": "nc72889311", "mag": 1.86, "time": 1504977631430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.621667, 39.523333, 4.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000am0a", "mag": 2.9, "time": 1504977007380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3606, 51.5729, 20.05 ] } }, + { "type": "Feature", "properties": { "id": "uw61305857", "mag": 1.96, "time": 1504976913320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.5835, 49.325, -0.06 ] } }, + { "type": "Feature", "properties": { "id": "nn00604394", "mag": 1.0, "time": 1504976713972, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.9184, 39.4189, 9.4 ] } }, + { "type": "Feature", "properties": { "id": "nn00604419", "mag": 1.0, "time": 1504976501919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9128, 38.3555, 7.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16823539", "mag": 1.7, "time": 1504975843554, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3563, 51.6531, 13.1 ] } }, + { "type": "Feature", "properties": { "id": "uu60240367", "mag": 1.09, "time": 1504975707090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.071, 44.717, 8.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16790653", "mag": 3.1, "time": 1504974617088, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3417, 51.6239, 10.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16790654", "mag": 1.9, "time": 1504974537489, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -175.3148, 51.695, 47.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000aix7", "mag": 4.4, "time": 1504974070040, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1553, 15.4199, 68.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000aix4", "mag": 2.7, "time": 1504973305730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4403, 42.5514, 9.99 ] } }, + { "type": "Feature", "properties": { "id": "ci37758639", "mag": 1.49, "time": 1504972882060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.274333, 33.977333, 4.89 ] } }, + { "type": "Feature", "properties": { "id": "ak16823535", "mag": 1.4, "time": 1504972779074, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6619, 59.5746, 73.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16790651", "mag": 1.4, "time": 1504972583759, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.0742, 62.1419, 37.4 ] } }, + { "type": "Feature", "properties": { "id": "hv61902621", "mag": 1.3, "time": 1504971779440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.013167, 19.393333, 2.338 ] } }, + { "type": "Feature", "properties": { "id": "ci37758631", "mag": 1.6, "time": 1504971677250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.497167, 32.741, 8.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16790130", "mag": 2.4, "time": 1504971409637, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4283, 51.6859, 9.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiwm", "mag": 5.3, "time": 1504971008260, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8484, 15.8296, 39.05 ] } }, + { "type": "Feature", "properties": { "id": "nc72889281", "mag": 1.07, "time": 1504970982380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.944833, 37.598167, 1.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiwh", "mag": 4.8, "time": 1504970946650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5822, 15.0866, 46.84 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiwe", "mag": 4.6, "time": 1504970869530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9636, 15.3251, 65.27 ] } }, + { "type": "Feature", "properties": { "id": "nc72889276", "mag": 1.09, "time": 1504970812160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.855667, 37.658833, 2.53 ] } }, + { "type": "Feature", "properties": { "id": "ak16790123", "mag": 2.1, "time": 1504970292620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.13, 51.4897, 41.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16790120", "mag": 1.2, "time": 1504968778296, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.3618, 61.0444, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiw3", "mag": 4.1, "time": 1504968358930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.193, 15.2562, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16789598", "mag": 2.5, "time": 1504968226307, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7868, 63.1355, 123.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16789594", "mag": 1.9, "time": 1504968045372, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.7112, 60.6453, 16.4 ] } }, + { "type": "Feature", "properties": { "id": "ci37758615", "mag": 1.41, "time": 1504967951280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.275, 33.978333, 4.74 ] } }, + { "type": "Feature", "properties": { "id": "ak16823526", "mag": 1.9, "time": 1504967456812, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.4388, 54.8237, 32.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aivy", "mag": 4.2, "time": 1504967440700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1556, 16.3217, 115.13 ] } }, + { "type": "Feature", "properties": { "id": "ak16823525", "mag": 1.4, "time": 1504967368293, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.6252, 59.9753, 101.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16823524", "mag": 1.7, "time": 1504966965980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.7649, 56.8018, 3.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16823523", "mag": 1.6, "time": 1504966219015, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.4826, 51.2597, 23.7 ] } }, + { "type": "Feature", "properties": { "id": "nc72889256", "mag": 1.03, "time": 1504966067680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.012333, 37.593667, 0.37 ] } }, + { "type": "Feature", "properties": { "id": "nn00604381", "mag": 2.3, "time": 1504966020076, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.3553, 40.6574, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "ci37758607", "mag": 1.15, "time": 1504965758050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.386667, 33.320333, 5.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000aivs", "mag": 2.6, "time": 1504965349760, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.431, 42.5704, 9.32 ] } }, + { "type": "Feature", "properties": { "id": "mb80253559", "mag": 1.01, "time": 1504964725150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.785167, 43.612, -3.47 ] } }, + { "type": "Feature", "properties": { "id": "ak16823520", "mag": 2.0, "time": 1504964361277, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.4265, 54.015, 30.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16823518", "mag": 1.4, "time": 1504963874108, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0471, 60.762, 82.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16789076", "mag": 1.7, "time": 1504963420635, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7554, 59.5701, 80.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aivg", "mag": 4.8, "time": 1504963319300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.118, 15.2555, 36.22 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiva", "mag": 4.7, "time": 1504963129400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9764, 15.3921, 63.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16823516", "mag": 1.1, "time": 1504962479847, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.8765, 58.9325, 12.9 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70234863", "mag": 1.66, "time": 1504961953310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.8555, 37.210833, 3.69 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiuu", "mag": 4.3, "time": 1504961286800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1507, 15.2159, 54.84 ] } }, + { "type": "Feature", "properties": { "id": "nc72889151", "mag": 1.59, "time": 1504961182210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.2615, 36.143, 9.79 ] } }, + { "type": "Feature", "properties": { "id": "ak16823515", "mag": 1.3, "time": 1504960711273, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5542, 59.755, 14.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiud", "mag": 4.5, "time": 1504959908650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2891, 15.5969, 67.38 ] } }, + { "type": "Feature", "properties": { "id": "ak16823514", "mag": 2.3, "time": 1504959541727, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -158.2315, 55.4677, 18.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiu3", "mag": 3.5, "time": 1504959495530, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.3875, 42.5392, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiu8", "mag": 4.9, "time": 1504959466540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4075, 16.1573, 92.03 ] } }, + { "type": "Feature", "properties": { "id": "ak16788555", "mag": 1.8, "time": 1504958775607, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.5009, 59.7863, 1.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16823512", "mag": 1.2, "time": 1504958710011, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.6279, 61.013, 77.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aitr", "mag": 5.2, "time": 1504958620590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -66.1721, -22.4546, 222.22 ] } }, + { "type": "Feature", "properties": { "id": "ci37758559", "mag": 2.17, "time": 1504958517340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.871333, 36.511, 7.46 ] } }, + { "type": "Feature", "properties": { "id": "nc72889136", "mag": 1.89, "time": 1504958245210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.943333, 37.597, 2.4 ] } }, + { "type": "Feature", "properties": { "id": "ak16788550", "mag": 1.2, "time": 1504957995087, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7877, 61.7723, 59.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000aita", "mag": 3.9, "time": 1504957968370, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4749, 42.5793, 8.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aitc", "mag": 4.9, "time": 1504957853960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4489, 15.7338, 63.09 ] } }, + { "type": "Feature", "properties": { "id": "nc72889131", "mag": 1.42, "time": 1504957844330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.822667, 37.604833, 3.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ait9", "mag": 3.1, "time": 1504957715430, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4515, 42.5732, 7.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ait3", "mag": 3.0, "time": 1504956895100, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7026, 36.641, 8.008 ] } }, + { "type": "Feature", "properties": { "id": "us2000am03", "mag": 2.5, "time": 1504956200380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.0448, 53.9738, 19.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000ait2", "mag": 4.0, "time": 1504956162220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.601, 15.854, 69.04 ] } }, + { "type": "Feature", "properties": { "id": "us2000aisv", "mag": 2.4, "time": 1504955702120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4242, 42.579, 6.95 ] } }, + { "type": "Feature", "properties": { "id": "us2000aisz", "mag": 4.5, "time": 1504955498600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 126.8292, 3.6504, 59.54 ] } }, + { "type": "Feature", "properties": { "id": "nc72889126", "mag": 1.04, "time": 1504955440550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.832333, 37.5415, 4.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16788046", "mag": 2.3, "time": 1504954557233, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.3602, 51.5792, 17.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000aisn", "mag": 4.2, "time": 1504953867200, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -70.2262, -15.3425, 224.81 ] } }, + { "type": "Feature", "properties": { "id": "uu60240042", "mag": 1.27, "time": 1504953324130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.006167, 44.792, 10.46 ] } }, + { "type": "Feature", "properties": { "id": "pr2017252001", "mag": 2.09, "time": 1504953205290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2761, 18.0591, 19.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37758511", "mag": 1.45, "time": 1504952800930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.930333, 35.903, 6.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000ayba", "mag": 4.1, "time": 1504952366970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5053, 15.7495, 68.22 ] } }, + { "type": "Feature", "properties": { "id": "mb80253459", "mag": 1.52, "time": 1504952233330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.447, 46.021167, 0.93 ] } }, + { "type": "Feature", "properties": { "id": "nc72889121", "mag": 1.03, "time": 1504952209100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.871, 37.554833, 4.73 ] } }, + { "type": "Feature", "properties": { "id": "ci37758487", "mag": 1.12, "time": 1504952052150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.988, 36.408833, 5.76 ] } }, + { "type": "Feature", "properties": { "id": "us2000ais8", "mag": 4.3, "time": 1504951965100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.9766, 44.5128, 265.04 ] } }, + { "type": "Feature", "properties": { "id": "nn00604410", "mag": 1.1, "time": 1504951735991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.3876, 37.2486, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37758471", "mag": 1.08, "time": 1504951652550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.931667, 34.0345, 15.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16787530", "mag": 1.1, "time": 1504951610158, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7897, 67.3419, 11.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000ais3", "mag": 5.4, "time": 1504951518370, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 133.9356, -4.9459, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000airu", "mag": 4.6, "time": 1504951047220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.0237, -24.161, 169.64 ] } }, + { "type": "Feature", "properties": { "id": "ak16787527", "mag": 1.5, "time": 1504950964134, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1724, 62.5675, 9.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16787525", "mag": 1.4, "time": 1504950309819, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.6065, 60.0265, 7.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000am01", "mag": 3.8, "time": 1504950233710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.0371, 53.9395, 13.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72889106", "mag": 1.8, "time": 1504950063660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.642667, 38.4305, 9.02 ] } }, + { "type": "Feature", "properties": { "id": "us2000ayb4", "mag": 3.9, "time": 1504949950000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.1532, 14.9116, 21.58 ] } }, + { "type": "Feature", "properties": { "id": "nc72889101", "mag": 1.84, "time": 1504949895770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.008833, 39.729667, 5.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16823500", "mag": 1.6, "time": 1504949837453, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.187, 59.0211, 72.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16823499", "mag": 1.5, "time": 1504949724642, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.0279, 61.4535, 96.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000arsy", "mag": 4.1, "time": 1504949643990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 169.3876, -19.5742, 213.81 ] } }, + { "type": "Feature", "properties": { "id": "ak16787519", "mag": 1.4, "time": 1504949316312, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.0341, 61.6767, 50.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16823497", "mag": 2.2, "time": 1504949226805, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.3563, 55.6967, 21.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000airg", "mag": 2.3, "time": 1504948998980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4451, 42.6157, 5.99 ] } }, + { "type": "Feature", "properties": { "id": "nc72889066", "mag": 0.98, "time": 1504947621670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.982833, 37.917667, 10.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16823496", "mag": 2.0, "time": 1504947486008, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.2987, 51.7726, 13.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16787403", "mag": 2.6, "time": 1504947413205, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5944, 59.4202, 75.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiqx", "mag": 4.1, "time": 1504946674160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5388, 15.3559, 54.35 ] } }, + { "type": "Feature", "properties": { "id": "ci37758415", "mag": 1.03, "time": 1504946346090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.892667, 32.718333, 8.72 ] } }, + { "type": "Feature", "properties": { "id": "us2000avsk", "mag": 2.8, "time": 1504946098400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4224, 42.5665, 6.74 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiqt", "mag": 2.6, "time": 1504946086710, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4255, 42.5806, 6.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000avsj", "mag": 2.7, "time": 1504945947000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4298, 42.5744, 7.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000ampk", "mag": 3.3, "time": 1504945822720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4585, 42.6108, 6.88 ] } }, + { "type": "Feature", "properties": { "id": "us2000al9w", "mag": 3.6, "time": 1504945687860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4277, 42.5592, 9.39 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiur", "mag": 4.0, "time": 1504945641000, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4155, 42.5631, 8.48 ] } }, + { "type": "Feature", "properties": { "id": "ak16823493", "mag": 1.8, "time": 1504945521703, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.5064, 51.8445, 13.1 ] } }, + { "type": "Feature", "properties": { "id": "ci37758407", "mag": 1.19, "time": 1504945503520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.470167, 34.3615, 1.96 ] } }, + { "type": "Feature", "properties": { "id": "us2000akd5", "mag": 3.3, "time": 1504945430400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4221, 42.5799, 5.91 ] } }, + { "type": "Feature", "properties": { "id": "us2000art2", "mag": 4.5, "time": 1504945418710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 145.5761, 18.7533, 262.64 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiq7", "mag": 4.1, "time": 1504945384770, "felt": 32, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4167, 42.5619, 7.19 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiql", "mag": 4.5, "time": 1504945169540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.0828, -6.9776, 133.54 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiq2", "mag": 3.3, "time": 1504944298530, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.427, 42.5842, 7.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000aipz", "mag": 4.8, "time": 1504944096330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0129, 15.2713, 53.97 ] } }, + { "type": "Feature", "properties": { "id": "us2000arsw", "mag": 4.7, "time": 1504943699570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -25.2724, -59.2757, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "hv61902241", "mag": 1.62, "time": 1504943455500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.2485, 19.386833, 31.012 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj4h", "mag": 2.6, "time": 1504943362330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4304, 42.5789, 7.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000aipn", "mag": 4.2, "time": 1504943316560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 74.9524, 38.8091, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aipm", "mag": 2.3, "time": 1504943304230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4353, 42.5792, 9.03 ] } }, + { "type": "Feature", "properties": { "id": "us2000aipl", "mag": 2.8, "time": 1504942989430, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4364, 42.5726, 8.45 ] } }, + { "type": "Feature", "properties": { "id": "us2000art3", "mag": 4.7, "time": 1504942625890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 146.7566, 13.8193, 16.98 ] } }, + { "type": "Feature", "properties": { "id": "ak16823489", "mag": 2.2, "time": 1504941981540, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6119, 68.4897, 9.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16786898", "mag": 2.3, "time": 1504941973751, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6435, 68.4109, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aipa", "mag": 4.1, "time": 1504940445840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7031, 15.6436, 38.39 ] } }, + { "type": "Feature", "properties": { "id": "ak16786512", "mag": 1.4, "time": 1504940146158, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6116, 61.8175, 55.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37758383", "mag": 1.42, "time": 1504940130810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.027333, 34.440333, 12.46 ] } }, + { "type": "Feature", "properties": { "id": "uw61305607", "mag": 1.15, "time": 1504939688980, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.4665, 48.458667, 29.09 ] } }, + { "type": "Feature", "properties": { "id": "nn00604353", "mag": 1.1, "time": 1504939522222, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.9216, 38.3812, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ayad", "mag": 4.2, "time": 1504939027620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4368, 15.1947, 59.18 ] } }, + { "type": "Feature", "properties": { "id": "ak16823487", "mag": 1.3, "time": 1504938992964, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2717, 59.963, 19.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16786506", "mag": 2.6, "time": 1504938975370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.5829, 68.5268, 13.9 ] } }, + { "type": "Feature", "properties": { "id": "ci37758359", "mag": 1.28, "time": 1504938780620, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.4375, 32.7105, 7.58 ] } }, + { "type": "Feature", "properties": { "id": "us2000ayac", "mag": 4.2, "time": 1504938734260, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6092, 15.0415, 60.74 ] } }, + { "type": "Feature", "properties": { "id": "us2000aip9", "mag": 4.8, "time": 1504938495700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9169, 15.1747, 62.25 ] } }, + { "type": "Feature", "properties": { "id": "us2000aing", "mag": 5.0, "time": 1504938263510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7579, 15.8771, 50.37 ] } }, + { "type": "Feature", "properties": { "id": "nc72889046", "mag": 1.74, "time": 1504938239010, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.951833, 36.388167, 3.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37758351", "mag": 1.69, "time": 1504938189230, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.433333, 32.708, 11.7 ] } }, + { "type": "Feature", "properties": { "id": "ci37758343", "mag": 2.17, "time": 1504938036110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.650333, 32.557, 11.77 ] } }, + { "type": "Feature", "properties": { "id": "us2000arsu", "mag": 4.2, "time": 1504937955720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.536, 15.7206, 33.37 ] } }, + { "type": "Feature", "properties": { "id": "us2000aya9", "mag": 4.1, "time": 1504937750680, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4987, 15.6186, 49.66 ] } }, + { "type": "Feature", "properties": { "id": "us2000ain2", "mag": 4.5, "time": 1504937531380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2803, 15.4532, 53.46 ] } }, + { "type": "Feature", "properties": { "id": "mb80253349", "mag": 1.16, "time": 1504937527100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5255, 46.891167, 14.63 ] } }, + { "type": "Feature", "properties": { "id": "us2000aimz", "mag": 4.9, "time": 1504936574470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -25.7043, -59.8211, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aya4", "mag": 4.1, "time": 1504936122970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4429, 15.8428, 39.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16823484", "mag": 1.2, "time": 1504936114606, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7939, 63.1602, 125.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16786077", "mag": 1.2, "time": 1504935774238, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.9696, 65.5175, 9.8 ] } }, + { "type": "Feature", "properties": { "id": "nn00604400", "mag": 1.2, "time": 1504935386919, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.5673, 40.9452, 13.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000alzw", "mag": 3.4, "time": 1504935359040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -170.4837, 52.2353, 39.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16786013", "mag": 1.4, "time": 1504934755508, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2112, 59.8068, 77.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aimb", "mag": 4.7, "time": 1504934538770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7033, 15.6728, 51.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000arum", "mag": 4.3, "time": 1504934315700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6748, 15.2159, 35.55 ] } }, + { "type": "Feature", "properties": { "id": "us2000aim7", "mag": 4.0, "time": 1504934242180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.7794, 15.3776, 67.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000aim0", "mag": 4.3, "time": 1504933783810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0338, 15.1325, 37.84 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay9t", "mag": 4.3, "time": 1504933351910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8516, 15.6769, 64.29 ] } }, + { "type": "Feature", "properties": { "id": "ak16785716", "mag": 1.3, "time": 1504933227428, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6303, 68.5196, 9.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16823479", "mag": 1.4, "time": 1504933167331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3862, 58.1118, 65.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16823478", "mag": 1.9, "time": 1504932908497, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.2638, 51.342, 32.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ailq", "mag": 5.5, "time": 1504932892100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0613, 15.0808, 29.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ailp", "mag": 4.5, "time": 1504932819610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 119.1423, -8.6068, 144.45 ] } }, + { "type": "Feature", "properties": { "id": "ak16785656", "mag": 1.7, "time": 1504932712383, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.238, 65.7544, 14.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72889011", "mag": 1.03, "time": 1504932679700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.051167, 36.471667, 6.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000ailm", "mag": 2.9, "time": 1504932636140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.9441, 58.6028, 4.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay9s", "mag": 4.1, "time": 1504932576140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6151, 15.175, 41.76 ] } }, + { "type": "Feature", "properties": { "id": "us2000ailg", "mag": 2.7, "time": 1504932451000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5107, 36.2919, 8.117 ] } }, + { "type": "Feature", "properties": { "id": "mb80253329", "mag": 1.19, "time": 1504932343290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.527833, 46.862667, 11.76 ] } }, + { "type": "Feature", "properties": { "id": "ci37758279", "mag": 1.67, "time": 1504932048030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.507167, 33.653, 1.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16823475", "mag": 1.1, "time": 1504931942522, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2765, 60.0722, 83.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000aila", "mag": 4.2, "time": 1504931645090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4593, 15.3365, 41.87 ] } }, + { "type": "Feature", "properties": { "id": "ci37758271", "mag": 1.52, "time": 1504931420370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.8695, 34.238, 8.73 ] } }, + { "type": "Feature", "properties": { "id": "ak16785521", "mag": 1.4, "time": 1504931241910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.646, 68.5258, 6.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16785582", "mag": 1.0, "time": 1504931175076, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1393, 61.7136, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000ail5", "mag": 4.7, "time": 1504930943390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4341, 15.1257, 27.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16785423", "mag": 1.8, "time": 1504930589594, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6499, 68.5284, 16.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16785419", "mag": 2.0, "time": 1504930533977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1907, 61.6985, 2.3 ] } }, + { "type": "Feature", "properties": { "id": "nm60179177", "mag": 3.06, "time": 1504930529110, "felt": 135, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -87.913, 38.425, 11.76 ] } }, + { "type": "Feature", "properties": { "id": "mb80253319", "mag": 1.63, "time": 1504930497770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.491667, 46.891833, 11.66 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay9p", "mag": 4.1, "time": 1504930486630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9352, 15.3169, 41.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay9n", "mag": 3.7, "time": 1504930165360, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5559, 15.8989, 56.13 ] } }, + { "type": "Feature", "properties": { "id": "ak16785231", "mag": 2.5, "time": 1504929910494, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6125, 68.5273, 8.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16785228", "mag": 2.4, "time": 1504929817958, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6164, 68.5069, 15.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ail9", "mag": 4.2, "time": 1504929739110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2125, 15.079, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000alzs", "mag": 2.7, "time": 1504929498060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.2368, 51.9836, 19.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16823467", "mag": 1.5, "time": 1504929296944, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.2744, 61.3017, 122.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay9h", "mag": 3.8, "time": 1504928398040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0181, 16.0961, 38.88 ] } }, + { "type": "Feature", "properties": { "id": "pr2017252000", "mag": 3.08, "time": 1504928197450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.4461, 18.7428, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay9g", "mag": 4.1, "time": 1504927088180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4711, 15.1531, 65.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16784944", "mag": 1.8, "time": 1504927005991, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3303, 60.1916, 78.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16784941", "mag": 2.3, "time": 1504926969938, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6189, 68.5221, 13.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16784938", "mag": 2.1, "time": 1504926585070, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6431, 68.5555, 3.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000aijy", "mag": 4.9, "time": 1504926495850, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3472, 15.9092, 62.55 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay9f", "mag": 4.0, "time": 1504926311940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.338, 15.4947, 53.82 ] } }, + { "type": "Feature", "properties": { "id": "ak16784757", "mag": 1.4, "time": 1504926151958, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.5619, 63.1355, 67.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay9d", "mag": 4.0, "time": 1504926060810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.644, 15.4622, 58.54 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay9b", "mag": 4.0, "time": 1504925827780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0747, 15.195, 43.36 ] } }, + { "type": "Feature", "properties": { "id": "us2000aj03", "mag": 2.7, "time": 1504925336910, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.2524, 54.0919, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000aijm", "mag": 4.5, "time": 1504925090110, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -67.2748, -24.2322, 205.92 ] } }, + { "type": "Feature", "properties": { "id": "us2000aijl", "mag": 5.1, "time": 1504925024150, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7923, 15.6429, 57.68 ] } }, + { "type": "Feature", "properties": { "id": "ak16784618", "mag": 2.6, "time": 1504924922956, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6215, 68.5087, 13.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000aij6", "mag": 4.9, "time": 1504924325880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2803, 15.0759, 19.62 ] } }, + { "type": "Feature", "properties": { "id": "ak16823460", "mag": 1.6, "time": 1504924009517, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.6908, 68.536, 4.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16823459", "mag": 1.6, "time": 1504923856019, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.1588, 59.9206, 119.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37758231", "mag": 1.09, "time": 1504923480190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.197667, 33.036667, 6.54 ] } }, + { "type": "Feature", "properties": { "id": "ak16823458", "mag": 1.2, "time": 1504923376066, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8869, 60.0725, 77.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16784466", "mag": 1.3, "time": 1504922976851, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.9394, 63.4575, 10.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37758223", "mag": 1.64, "time": 1504922815610, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.095167, 35.773167, 10.47 ] } }, + { "type": "Feature", "properties": { "id": "uw61305517", "mag": 1.22, "time": 1504922472730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.234, 46.341167, 11.49 ] } }, + { "type": "Feature", "properties": { "id": "ci37758207", "mag": 0.96, "time": 1504922375210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.930333, 35.896833, 5.72 ] } }, + { "type": "Feature", "properties": { "id": "ak16823455", "mag": 1.1, "time": 1504921668573, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5605, 58.7828, 14.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16784171", "mag": 1.5, "time": 1504921324109, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.7065, 68.5298, 8.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay97", "mag": 4.2, "time": 1504921245860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8933, 15.7086, 79.65 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay95", "mag": 4.0, "time": 1504920659630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5492, 15.7942, 35.56 ] } }, + { "type": "Feature", "properties": { "id": "ak16784114", "mag": 1.2, "time": 1504920524598, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.8278, 67.3421, 14.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16823452", "mag": 1.3, "time": 1504919998366, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.593, 58.7481, 11.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000arv3", "mag": 4.3, "time": 1504919742200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -82.4369, 7.7941, 13.81 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiic", "mag": 4.1, "time": 1504919644420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.098, 15.37, 28.41 ] } }, + { "type": "Feature", "properties": { "id": "nc72888926", "mag": 1.51, "time": 1504919499600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.797167, 38.8195, 2.74 ] } }, + { "type": "Feature", "properties": { "id": "hv61901901", "mag": 2.49, "time": 1504919482270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.300507, 19.404333, 13.76 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay91", "mag": 4.1, "time": 1504919175710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.5371, 15.6773, 67.69 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay90", "mag": 3.9, "time": 1504918842770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4561, 15.2969, 47.01 ] } }, + { "type": "Feature", "properties": { "id": "nc72888921", "mag": 1.43, "time": 1504918334270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.63, 40.262167, 3.32 ] } }, + { "type": "Feature", "properties": { "id": "us2000aiht", "mag": 4.4, "time": 1504918076900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5874, 15.6439, 12.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16783729", "mag": 1.5, "time": 1504917773363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7901, 64.8033, 13.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16823450", "mag": 1.8, "time": 1504917198075, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.1288, 53.4202, 28.2 ] } }, + { "type": "Feature", "properties": { "id": "uu60239577", "mag": 1.64, "time": 1504917186550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.438333, 42.574167, 3.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16823449", "mag": 1.6, "time": 1504917085381, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.671, 59.1673, 61.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000aihy", "mag": 4.1, "time": 1504916600330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3911, 16.0661, 39.18 ] } }, + { "type": "Feature", "properties": { "id": "us2000aih9", "mag": 2.8, "time": 1504916318430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4281, 42.5718, 5.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000aih8", "mag": 2.5, "time": 1504916278870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4338, 42.5822, 5.38 ] } }, + { "type": "Feature", "properties": { "id": "ak16783588", "mag": 1.6, "time": 1504916071368, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.3277, 59.285, 86.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16783586", "mag": 1.1, "time": 1504915994737, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.056, 67.2634, 8.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16823446", "mag": 2.1, "time": 1504915956900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.713, 53.9765, 25.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37758159", "mag": 1.56, "time": 1504915633570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2745, 33.978, 4.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000arsl", "mag": 4.3, "time": 1504915283460, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6805, 16.8287, 106.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16823445", "mag": 1.2, "time": 1504915279966, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -136.6323, 59.8055, 11.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16783409", "mag": 1.6, "time": 1504915272065, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.43, 61.3236, 75.8 ] } }, + { "type": "Feature", "properties": { "id": "ci37164028", "mag": 1.71, "time": 1504915194240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.598333, 33.300667, 5.25 ] } }, + { "type": "Feature", "properties": { "id": "ci37758151", "mag": 2.09, "time": 1504915192060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.24, 32.322667, 6.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16783408", "mag": 1.6, "time": 1504915154515, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3632, 60.1661, 90.3 ] } }, + { "type": "Feature", "properties": { "id": "hv61901846", "mag": 1.94, "time": 1504914308880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.314, 18.895833, 12.72 ] } }, + { "type": "Feature", "properties": { "id": "nc72888886", "mag": 1.0, "time": 1504914139040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.003833, 37.588667, 1.64 ] } }, + { "type": "Feature", "properties": { "id": "ak16783243", "mag": 1.1, "time": 1504913564223, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.2504, 62.3109, 15.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16821920", "mag": 1.3, "time": 1504913498285, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.1821, 58.2348, 101.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16821919", "mag": 1.4, "time": 1504913414028, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.1655, 60.5722, 86.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16821918", "mag": 1.1, "time": 1504913077516, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.597, 58.7696, 12.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000aigc", "mag": 4.1, "time": 1504912952040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1585, 15.0785, 47.75 ] } }, + { "type": "Feature", "properties": { "id": "uu60239522", "mag": 1.86, "time": 1504912091450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.417833, 42.557333, 7.29 ] } }, + { "type": "Feature", "properties": { "id": "us2000aifs", "mag": 4.4, "time": 1504911443790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 82.6815, 44.316, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16782938", "mag": 1.1, "time": 1504911183072, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3769, 64.9856, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16782937", "mag": 1.1, "time": 1504910876129, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -146.7587, 61.2722, 29.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16782871", "mag": 1.5, "time": 1504910569120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -139.4893, 60.1552, 7.8 ] } }, + { "type": "Feature", "properties": { "id": "ak16782868", "mag": 1.4, "time": 1504910467245, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.7194, 62.6908, 57.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16821913", "mag": 1.7, "time": 1504910258777, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.0231, 58.2214, 149.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72888801", "mag": 1.9, "time": 1504909953040, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.8175, 37.486333, -0.46 ] } }, + { "type": "Feature", "properties": { "id": "us2000aif7", "mag": 2.5, "time": 1504909902600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5076, 36.2848, 8.171 ] } }, + { "type": "Feature", "properties": { "id": "us2000aif4", "mag": 4.8, "time": 1504909723200, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8865, 15.3302, 30.08 ] } }, + { "type": "Feature", "properties": { "id": "ak16821912", "mag": 1.1, "time": 1504909705310, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3127, 62.4824, 115.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000aif0", "mag": 3.0, "time": 1504909701800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.5069, 36.2872, 6.887 ] } }, + { "type": "Feature", "properties": { "id": "mb80253249", "mag": 1.02, "time": 1504909626120, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.500333, 46.870333, 14.95 ] } }, + { "type": "Feature", "properties": { "id": "nc72888791", "mag": 1.37, "time": 1504909453970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.04, 37.6285, -2.07 ] } }, + { "type": "Feature", "properties": { "id": "us2000aier", "mag": 4.4, "time": 1504908895340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0113, 15.4861, 55.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16821911", "mag": 1.3, "time": 1504908516343, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.8637, 60.6448, 52.5 ] } }, + { "type": "Feature", "properties": { "id": "ci37758063", "mag": 1.18, "time": 1504908189370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.201167, 33.035167, 5.64 ] } }, + { "type": "Feature", "properties": { "id": "nc72888781", "mag": 1.42, "time": 1504907868300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.038667, 37.624833, -2.91 ] } }, + { "type": "Feature", "properties": { "id": "us2000aie8", "mag": 4.7, "time": 1504907825570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5854, 15.5735, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72888776", "mag": 1.8, "time": 1504907588830, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.040167, 37.63, -1.66 ] } }, + { "type": "Feature", "properties": { "id": "us2000aie6", "mag": 4.6, "time": 1504907582410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4976, 15.7473, 55.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000aidm", "mag": 4.5, "time": 1504906777370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0707, 15.2209, 55.42 ] } }, + { "type": "Feature", "properties": { "id": "us2000aid9", "mag": 4.8, "time": 1504906287810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3905, 15.4318, 56.37 ] } }, + { "type": "Feature", "properties": { "id": "nc72888771", "mag": 1.19, "time": 1504906092960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.451, 37.990333, 1.49 ] } }, + { "type": "Feature", "properties": { "id": "us2000aicx", "mag": 4.3, "time": 1504906074440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2669, 15.5886, 57.93 ] } }, + { "type": "Feature", "properties": { "id": "ak16782412", "mag": 1.0, "time": 1504906074363, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.3787, 62.4883, 7.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16782375", "mag": 2.3, "time": 1504905457780, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.4787, 52.748, 40.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72888756", "mag": 1.38, "time": 1504905314090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.756167, 39.273333, 4.85 ] } }, + { "type": "Feature", "properties": { "id": "ak16782374", "mag": 1.2, "time": 1504905292993, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.8681, 59.9024, 67.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000aicp", "mag": 4.2, "time": 1504905187950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4812, 15.6987, 35.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16782334", "mag": 1.1, "time": 1504904835105, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -144.7621, 65.5089, 13.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16782328", "mag": 2.5, "time": 1504904826453, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.811, 61.2391, 56.6 ] } }, + { "type": "Feature", "properties": { "id": "uw61305342", "mag": 1.93, "time": 1504904598280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.065167, 44.442833, -1.58 ] } }, + { "type": "Feature", "properties": { "id": "nc72888751", "mag": 1.54, "time": 1504903192860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7535, 39.279333, 8.66 ] } }, + { "type": "Feature", "properties": { "id": "ak16781999", "mag": 3.0, "time": 1504902403320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2239, 60.1717, 139.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16781990", "mag": 2.9, "time": 1504902403227, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2392, 60.1979, 145.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay7u", "mag": 4.1, "time": 1504902279690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7805, 15.528, 44.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16821902", "mag": 2.3, "time": 1504902127057, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.6706, 53.1595, 47.8 ] } }, + { "type": "Feature", "properties": { "id": "mb80253224", "mag": 1.28, "time": 1504901825890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.961667, 44.423667, 7.65 ] } }, + { "type": "Feature", "properties": { "id": "ci37758023", "mag": 1.23, "time": 1504901676790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.243333, 34.049667, 14.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000arsf", "mag": 4.8, "time": 1504901654190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 169.1397, -18.9749, 151.93 ] } }, + { "type": "Feature", "properties": { "id": "us2000aib4", "mag": 4.7, "time": 1504901358420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4084, 14.947, 20.03 ] } }, + { "type": "Feature", "properties": { "id": "mb80254729", "mag": 1.15, "time": 1504901142840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5325, 46.863333, 12.44 ] } }, + { "type": "Feature", "properties": { "id": "us2000arse", "mag": 4.2, "time": 1504900520170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 122.6478, 18.4195, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16781710", "mag": 1.5, "time": 1504900346639, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.5122, 61.5519, 57.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16781709", "mag": 1.3, "time": 1504900242686, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.7722, 60.316, 70.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000aibq", "mag": 2.5, "time": 1504899687060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4383, 42.5694, 8.27 ] } }, + { "type": "Feature", "properties": { "id": "nc72888741", "mag": 1.05, "time": 1504899640660, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.013, 37.593167, 0.27 ] } }, + { "type": "Feature", "properties": { "id": "us2000aib3", "mag": 2.8, "time": 1504899556990, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4363, 42.571, 9.27 ] } }, + { "type": "Feature", "properties": { "id": "us2000aia5", "mag": 2.6, "time": 1504899482480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4289, 42.5733, 13.75 ] } }, + { "type": "Feature", "properties": { "id": "ak16781595", "mag": 1.7, "time": 1504899244914, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -141.1502, 60.3533, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16781585", "mag": 3.9, "time": 1504899189169, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.5601, 59.2544, 64.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37758007", "mag": 2.02, "time": 1504898829300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.561833, 31.0585, 5.61 ] } }, + { "type": "Feature", "properties": { "id": "ak16781550", "mag": 1.4, "time": 1504898282611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6296, 61.6699, 64.1 ] } }, + { "type": "Feature", "properties": { "id": "ci37757991", "mag": 1.52, "time": 1504897913130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.184167, 34.008167, 14.79 ] } }, + { "type": "Feature", "properties": { "id": "ci37757975", "mag": 1.23, "time": 1504897847890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.191833, 34.995167, -0.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai96", "mag": 4.7, "time": 1504897612480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1128, 15.0427, 38.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay7g", "mag": 4.5, "time": 1504897486190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6162, 15.5292, 52.13 ] } }, + { "type": "Feature", "properties": { "id": "us2000aku3", "mag": 2.7, "time": 1504897427450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4362, 42.5723, 6.2 ] } }, + { "type": "Feature", "properties": { "id": "us2000aruj", "mag": 4.0, "time": 1504897268300, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 151.0589, 51.6006, 526.16 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai8x", "mag": 5.3, "time": 1504897044080, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9814, 16.231, 63.24 ] } }, + { "type": "Feature", "properties": { "id": "us2000ars7", "mag": 4.4, "time": 1504896441090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 166.9803, -12.2109, 239.13 ] } }, + { "type": "Feature", "properties": { "id": "us2000ars8", "mag": 4.2, "time": 1504895755810, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4237, 15.0921, 33.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16781202", "mag": 1.1, "time": 1504895394318, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.517, 62.887, 92.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai8l", "mag": 5.0, "time": 1504895053450, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0247, 15.6158, 25.92 ] } }, + { "type": "Feature", "properties": { "id": "nc72888711", "mag": 1.13, "time": 1504894886190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.369, 37.616167, 3.76 ] } }, + { "type": "Feature", "properties": { "id": "ci37757951", "mag": 1.29, "time": 1504894538140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.34, 35.0645, -0.97 ] } }, + { "type": "Feature", "properties": { "id": "nn00604251", "mag": 1.1, "time": 1504893693579, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.5283, 37.177, 14.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72888696", "mag": 1.24, "time": 1504893681000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.9525, 37.9215, -0.25 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai89", "mag": 4.9, "time": 1504893629390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.339, 15.3801, 37.31 ] } }, + { "type": "Feature", "properties": { "id": "ak16780971", "mag": 2.0, "time": 1504893338524, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.7656, 56.9755, 12.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai7x", "mag": 4.4, "time": 1504893167240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8739, 15.6809, 69.44 ] } }, + { "type": "Feature", "properties": { "id": "ci37757919", "mag": 1.09, "time": 1504892320190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.792333, 33.504167, 6.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16780872", "mag": 2.7, "time": 1504892251611, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.2184, 60.0235, 132.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai7w", "mag": 5.1, "time": 1504892136330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 54.7094, 14.7125, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16780870", "mag": 1.9, "time": 1504892114398, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.5364, 59.0829, 80.6 ] } }, + { "type": "Feature", "properties": { "id": "nn00604241", "mag": 1.7, "time": 1504892108096, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.8858, 39.5547, 16.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37757903", "mag": 1.06, "time": 1504892000240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.084, 33.233167, 9.85 ] } }, + { "type": "Feature", "properties": { "id": "mb80253164", "mag": 0.95, "time": 1504891992150, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.5415, 46.8995, 11.59 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai7p", "mag": 4.3, "time": 1504891955840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.495, 15.1404, 36.22 ] } }, + { "type": "Feature", "properties": { "id": "ak16780841", "mag": 1.4, "time": 1504891846856, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.3249, 60.9139, 26.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000arsh", "mag": 4.5, "time": 1504891333730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 133.2388, -6.8416, 19.98 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay6x", "mag": 4.1, "time": 1504891315080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7297, 15.3343, 19.17 ] } }, + { "type": "Feature", "properties": { "id": "us2000ars4", "mag": 4.4, "time": 1504891219920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 54.7693, 14.6837, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16780813", "mag": 1.5, "time": 1504891126668, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.153, 61.7092, 3.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72888686", "mag": 1.23, "time": 1504891114230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.1045, 37.325167, -0.31 ] } }, + { "type": "Feature", "properties": { "id": "ci37757879", "mag": 2.31, "time": 1504890797650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.463833, 34.355833, 3.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai73", "mag": 4.9, "time": 1504890172380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6852, 15.6184, 20.97 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai6w", "mag": 4.8, "time": 1504890101520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3813, 15.1628, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai6n", "mag": 4.6, "time": 1504889103890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 130.804, -6.0426, 126.88 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai6c", "mag": 4.7, "time": 1504888948510, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8822, 15.7603, 70.11 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai66", "mag": 3.1, "time": 1504888942660, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4688, 42.6127, 7.46 ] } }, + { "type": "Feature", "properties": { "id": "ci37757839", "mag": 1.07, "time": 1504888838380, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.931, 35.8975, 5.55 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai5r", "mag": 5.0, "time": 1504887559080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1176, 15.3478, 50.28 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai7e", "mag": 2.6, "time": 1504887451250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.8013, 51.3347, 33.06 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai5q", "mag": 4.8, "time": 1504887267930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.834, 15.2659, 31.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000ars1", "mag": 4.4, "time": 1504887163560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 121.5842, 0.5634, 87.49 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai5f", "mag": 4.9, "time": 1504887145160, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4164, 15.3325, 55.79 ] } }, + { "type": "Feature", "properties": { "id": "us2000aixn", "mag": 4.1, "time": 1504887139190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.237, 15.3669, 61.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16821886", "mag": 1.0, "time": 1504887040916, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.7913, 61.8643, 40.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai53", "mag": 4.6, "time": 1504886882420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4908, 15.0663, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16780437", "mag": 1.7, "time": 1504886789015, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.1717, 61.2338, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000arsa", "mag": 4.8, "time": 1504886367500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -45.1832, 25.2517, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000arrz", "mag": 4.3, "time": 1504885790410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 121.1544, 13.7011, 115.66 ] } }, + { "type": "Feature", "properties": { "id": "ci37757791", "mag": 2.49, "time": 1504885701960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.863167, 36.514, 1.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72888591", "mag": 1.18, "time": 1504885591170, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.029167, 37.64, 1.33 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay69", "mag": 4.3, "time": 1504884967040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8299, 15.2537, 51.49 ] } }, + { "type": "Feature", "properties": { "id": "nc72888561", "mag": 2.76, "time": 1504884687580, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -126.4015, 40.656167, 4.61 ] } }, + { "type": "Feature", "properties": { "id": "nc72888556", "mag": 1.22, "time": 1504884477720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.594833, 36.036167, 3.51 ] } }, + { "type": "Feature", "properties": { "id": "nc72888551", "mag": 1.29, "time": 1504884449700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.600833, 36.033, 2.98 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai45", "mag": 4.4, "time": 1504884249230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 51.6373, 29.0196, 32.54 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai4f", "mag": 5.0, "time": 1504884005650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -172.4529, -15.2805, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ci37757767", "mag": 1.56, "time": 1504883892090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.447333, 34.149, 10.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72888536", "mag": 1.66, "time": 1504883570470, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.168167, 39.1465, -0.58 ] } }, + { "type": "Feature", "properties": { "id": "us2000arrw", "mag": 4.2, "time": 1504882974870, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7985, 15.5213, 35.36 ] } }, + { "type": "Feature", "properties": { "id": "ak16779960", "mag": 1.8, "time": 1504882678981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0626, 62.8988, 105.6 ] } }, + { "type": "Feature", "properties": { "id": "ci37757743", "mag": 0.97, "time": 1504882082250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.499333, 33.723667, 12.91 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai3n", "mag": 5.3, "time": 1504881901650, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3384, 15.544, 53.27 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai3i", "mag": 5.0, "time": 1504881612700, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4062, 15.406, 49.05 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai3c", "mag": 5.1, "time": 1504880703430, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1626, 15.9178, 78.53 ] } }, + { "type": "Feature", "properties": { "id": "ak16821881", "mag": 1.9, "time": 1504880601665, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.7019, 53.1531, 4.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai3a", "mag": 4.6, "time": 1504880185590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9379, 15.4789, 51.37 ] } }, + { "type": "Feature", "properties": { "id": "nc72888511", "mag": 1.64, "time": 1504879933970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.805, 37.519, 0.63 ] } }, + { "type": "Feature", "properties": { "id": "us2000arrt", "mag": 4.3, "time": 1504879797140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -92.5495, 15.2436, 49.04 ] } }, + { "type": "Feature", "properties": { "id": "nc72888506", "mag": 1.11, "time": 1504879682840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.807167, 37.5155, -1.34 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai2x", "mag": 4.4, "time": 1504878550770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3291, 15.5119, 43.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai2u", "mag": 4.5, "time": 1504878237250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3775, 15.3318, 55.57 ] } }, + { "type": "Feature", "properties": { "id": "ak16779589", "mag": 2.1, "time": 1504878197682, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.7176, 61.7913, 43.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72888501", "mag": 1.4, "time": 1504877974600, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.826833, 38.884833, 0.43 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai2s", "mag": 4.5, "time": 1504877794630, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2597, 15.3155, 57.11 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai2p", "mag": 4.3, "time": 1504877637550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3617, 15.3594, 72.43 ] } }, + { "type": "Feature", "properties": { "id": "ak16821879", "mag": 1.1, "time": 1504877280981, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.4859, 62.9279, 91.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai2h", "mag": 4.3, "time": 1504877227420, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2794, 15.5765, 57.44 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai2d", "mag": 4.9, "time": 1504877000620, "felt": 5, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 140.4519, 39.5355, 14.54 ] } }, + { "type": "Feature", "properties": { "id": "nc72888491", "mag": 1.84, "time": 1504876384490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.493333, 38.505333, 9.95 ] } }, + { "type": "Feature", "properties": { "id": "ak16821878", "mag": 1.4, "time": 1504875984627, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.1326, 61.9648, 66.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16821876", "mag": 2.2, "time": 1504875655387, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -168.9923, 52.3567, 17.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72888486", "mag": 2.07, "time": 1504875297970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.476833, 38.505667, 10.55 ] } }, + { "type": "Feature", "properties": { "id": "nc72888481", "mag": 2.29, "time": 1504875261290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.487833, 38.504167, 11.24 ] } }, + { "type": "Feature", "properties": { "id": "ak16779354", "mag": 1.2, "time": 1504874899621, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.8024, 62.2347, 27.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai1z", "mag": 4.7, "time": 1504874764610, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9526, 15.348, 66.08 ] } }, + { "type": "Feature", "properties": { "id": "nn00604198", "mag": 1.6, "time": 1504874486416, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.1528, 36.3422, 12.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16779312", "mag": 1.1, "time": 1504874405501, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.2249, 66.2606, 1.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16821873", "mag": 1.7, "time": 1504874360732, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -177.5174, 51.2619, 22.7 ] } }, + { "type": "Feature", "properties": { "id": "nn00604197", "mag": 1.1, "time": 1504874200883, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.2814, 37.8092, 5.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72888476", "mag": 1.21, "time": 1504873957930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.509333, 40.482667, 4.94 ] } }, + { "type": "Feature", "properties": { "id": "ci37757703", "mag": 1.39, "time": 1504873858920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.717833, 33.649333, 15.22 ] } }, + { "type": "Feature", "properties": { "id": "ci37757695", "mag": 1.17, "time": 1504872471560, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.568167, 33.822667, 8.77 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai1k", "mag": 5.2, "time": 1504872379780, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4203, 15.4936, 64.61 ] } }, + { "type": "Feature", "properties": { "id": "nn00604195", "mag": 1.1, "time": 1504872342696, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0794, 39.7864, 6.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai1f", "mag": 4.5, "time": 1504872210290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.752, 15.6687, 34.52 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai17", "mag": 4.7, "time": 1504871509040, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.251, 15.2604, 43.78 ] } }, + { "type": "Feature", "properties": { "id": "ci37757687", "mag": 1.13, "time": 1504871201290, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.5185, 33.500333, 13.87 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai11", "mag": 4.8, "time": 1504870992430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5788, 16.0581, 67.6 ] } }, + { "type": "Feature", "properties": { "id": "nc72888461", "mag": 1.42, "time": 1504869975320, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.437833, 39.504833, 12.47 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai0u", "mag": 5.0, "time": 1504869955970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7875, 15.7988, 32.83 ] } }, + { "type": "Feature", "properties": { "id": "nc72888456", "mag": 1.91, "time": 1504869902080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.485667, 38.504833, 10.49 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai0r", "mag": 3.1, "time": 1504869744270, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4645, 42.6225, 8.36 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai0n", "mag": 4.5, "time": 1504869089530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4825, 15.1089, 36.59 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai0k", "mag": 4.3, "time": 1504868775480, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.798, 15.8932, 52.08 ] } }, + { "type": "Feature", "properties": { "id": "ak16778868", "mag": 2.4, "time": 1504868579816, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.6965, 62.1823, 44.5 ] } }, + { "type": "Feature", "properties": { "id": "nc72888446", "mag": 1.29, "time": 1504868153570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.486333, 38.5055, 8.02 ] } }, + { "type": "Feature", "properties": { "id": "nc72888436", "mag": 1.9, "time": 1504867751580, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.482833, 38.504333, 10.56 ] } }, + { "type": "Feature", "properties": { "id": "nc72888431", "mag": 1.71, "time": 1504867332410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.491833, 38.504667, 9.32 ] } }, + { "type": "Feature", "properties": { "id": "nc72888421", "mag": 1.08, "time": 1504867024130, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.489, 38.504333, 8.33 ] } }, + { "type": "Feature", "properties": { "id": "ak16821868", "mag": 2.1, "time": 1504866678618, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -160.4655, 55.6664, 99.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16821867", "mag": 1.4, "time": 1504866626331, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -147.0732, 60.0832, 7.7 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai08", "mag": 4.7, "time": 1504866065090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 125.9223, 5.4358, 106.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16778797", "mag": 1.0, "time": 1504865774499, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.3276, 61.5525, 10.3 ] } }, + { "type": "Feature", "properties": { "id": "nn00604189", "mag": 1.2, "time": 1504865677094, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -120.0784, 39.7853, 6.9 ] } }, + { "type": "Feature", "properties": { "id": "nc72888411", "mag": 1.53, "time": 1504865468770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.476167, 38.507167, 9.38 ] } }, + { "type": "Feature", "properties": { "id": "hv61901161", "mag": 1.74, "time": 1504864814220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.466833, 19.2065, 36.007 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70234788", "mag": 2.39, "time": 1504864780960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.7805, 37.3255, 5.78 ] } }, + { "type": "Feature", "properties": { "id": "ak16780611", "mag": 2.4, "time": 1504864612255, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1592, 61.3969, 4.3 ] } }, + { "type": "Feature", "properties": { "id": "ak16778631", "mag": 2.2, "time": 1504864578261, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -140.1624, 61.4081, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "uw61305087", "mag": 2.01, "time": 1504864189490, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.050833, 48.9275, 23.48 ] } }, + { "type": "Feature", "properties": { "id": "ak16821863", "mag": 1.7, "time": 1504863670078, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -178.4879, 51.7374, 21.1 ] } }, + { "type": "Feature", "properties": { "id": "ak16821862", "mag": 1.8, "time": 1504862106783, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.9215, 58.7206, 119.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahzn", "mag": 4.6, "time": 1504861954060, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4387, 15.3946, 52.08 ] } }, + { "type": "Feature", "properties": { "id": "nc72888396", "mag": 1.27, "time": 1504861876770, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8075, 37.512833, 1.14 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahzl", "mag": 4.5, "time": 1504861821720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4897, 15.3898, 66.84 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahzj", "mag": 4.5, "time": 1504861699670, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5329, 15.609, 39.64 ] } }, + { "type": "Feature", "properties": { "id": "ci37757655", "mag": 1.16, "time": 1504861667220, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.622833, 33.107167, 12.71 ] } }, + { "type": "Feature", "properties": { "id": "ak16778553", "mag": 1.9, "time": 1504861559880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.5627, 66.997, 11.1 ] } }, + { "type": "Feature", "properties": { "id": "nc72888391", "mag": 2.09, "time": 1504860900670, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -123.456, 39.646667, 9.55 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay4f", "mag": 4.1, "time": 1504860843930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7484, 15.3716, 56.33 ] } }, + { "type": "Feature", "properties": { "id": "nc72888386", "mag": 2.1, "time": 1504860440750, "felt": 7, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.938, 37.831333, 7.32 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay4d", "mag": 4.4, "time": 1504860354710, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.834, 15.3232, 49.34 ] } }, + { "type": "Feature", "properties": { "id": "us2000arrb", "mag": 4.6, "time": 1504860180930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0811, 15.785, 52.87 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahzq", "mag": 4.5, "time": 1504860168930, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9132, 15.2837, 68.08 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahz5", "mag": 5.3, "time": 1504859674330, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1725, 15.2148, 50.77 ] } }, + { "type": "Feature", "properties": { "id": "ak16821859", "mag": 2.1, "time": 1504859557955, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -159.0839, 54.9712, 35.5 ] } }, + { "type": "Feature", "properties": { "id": "nn00604302", "mag": 1.1, "time": 1504859552745, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.4838, 37.3947, 8.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16778352", "mag": 1.2, "time": 1504859550711, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.4759, 63.0882, 87.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahz3", "mag": 4.3, "time": 1504859478950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3904, 15.121, 30.23 ] } }, + { "type": "Feature", "properties": { "id": "nn00604182", "mag": 1.0, "time": 1504858881802, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0405, 37.2978, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahz1", "mag": 4.3, "time": 1504858630350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6852, 15.833, 76.27 ] } }, + { "type": "Feature", "properties": { "id": "uu60239147", "mag": 2.45, "time": 1504858591000, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.444167, 42.664333, 8.83 ] } }, + { "type": "Feature", "properties": { "id": "us2000al72", "mag": 2.9, "time": 1504858190760, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.2139, 52.5352, 91.97 ] } }, + { "type": "Feature", "properties": { "id": "uu60239137", "mag": 1.54, "time": 1504858110210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -110.647, 44.396167, 2.58 ] } }, + { "type": "Feature", "properties": { "id": "us2000arui", "mag": 4.2, "time": 1504858026090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4738, 14.8297, 45.65 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahyr", "mag": 4.3, "time": 1504857969210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.0003, 15.7457, 35.1 ] } }, + { "type": "Feature", "properties": { "id": "us2000arul", "mag": 4.3, "time": 1504857669250, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.801, 14.8524, 28.84 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahyk", "mag": 4.5, "time": 1504857596840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7758, 15.5339, 42.45 ] } }, + { "type": "Feature", "properties": { "id": "nn00604180", "mag": 1.2, "time": 1504857534482, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.0136, 37.3074, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16821856", "mag": 1.2, "time": 1504857418267, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -157.4697, 58.6313, 13.4 ] } }, + { "type": "Feature", "properties": { "id": "nn00604280", "mag": 1.0, "time": 1504857267736, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -119.7805, 38.6696, 7.4 ] } }, + { "type": "Feature", "properties": { "id": "us2000aruq", "mag": 4.3, "time": 1504857079940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6759, 15.5537, 36.84 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahyf", "mag": 3.2, "time": 1504857069370, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4101, 42.5653, 6.35 ] } }, + { "type": "Feature", "properties": { "id": "ci37757631", "mag": 1.01, "time": 1504856868740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -117.778, 36.031333, 2.15 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay0x", "mag": 4.1, "time": 1504856777400, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7738, 15.4661, 38.21 ] } }, + { "type": "Feature", "properties": { "id": "ak16821855", "mag": 1.3, "time": 1504856435979, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.538, 63.3273, 125.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahy9", "mag": 4.4, "time": 1504856316640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6365, 15.5777, 47.53 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahy5", "mag": 3.2, "time": 1504855878650, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.446, 42.6598, 6.58 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahy6", "mag": 4.4, "time": 1504855839640, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7956, 15.6082, 34.65 ] } }, + { "type": "Feature", "properties": { "id": "us2000arrn", "mag": 4.1, "time": 1504855556590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2068, 15.1108, 51.65 ] } }, + { "type": "Feature", "properties": { "id": "us2000al71", "mag": 3.0, "time": 1504855456090, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -164.0677, 53.8832, 50.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16778144", "mag": 3.2, "time": 1504855447301, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -135.611, 66.2631, 33.8 ] } }, + { "type": "Feature", "properties": { "id": "us2000arri", "mag": 4.2, "time": 1504855233030, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9743, 15.126, 35.68 ] } }, + { "type": "Feature", "properties": { "id": "nc72888356", "mag": 1.89, "time": 1504854775740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -121.3305, 41.068, 11.84 ] } }, + { "type": "Feature", "properties": { "id": "mb80253029", "mag": 1.45, "time": 1504854704970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.500667, 45.881, 8.81 ] } }, + { "type": "Feature", "properties": { "id": "ak16778123", "mag": 2.3, "time": 1504854630925, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -142.7701, 57.7458, 12.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72888351", "mag": 1.26, "time": 1504854591960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.882167, 37.522833, -2.2 ] } }, + { "type": "Feature", "properties": { "id": "hv61901091", "mag": 1.09, "time": 1504854245900, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.447167, 19.4775, 2.47 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay45", "mag": 4.2, "time": 1504854208800, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7971, 14.6019, 44.25 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahxm", "mag": 4.2, "time": 1504854069790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8774, 14.8705, 34.98 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay43", "mag": 4.1, "time": 1504853757100, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8976, 15.4459, 61.28 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahxh", "mag": 3.6, "time": 1504853614760, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -104.9507, 36.9956, 6.27 ] } }, + { "type": "Feature", "properties": { "id": "ak16821851", "mag": 1.1, "time": 1504853435000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.2544, 63.717, 83.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72888336", "mag": 0.98, "time": 1504853065280, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.982833, 37.5425, 1.67 ] } }, + { "type": "Feature", "properties": { "id": "ak16777966", "mag": 1.3, "time": 1504853023023, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -148.715, 63.9895, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000arut", "mag": 4.2, "time": 1504852684440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2381, 15.5108, 43.98 ] } }, + { "type": "Feature", "properties": { "id": "ci37757623", "mag": 0.96, "time": 1504852586240, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.789, 33.501333, 5.44 ] } }, + { "type": "Feature", "properties": { "id": "us2000arr6", "mag": 4.2, "time": 1504852477520, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.3508, 15.2654, 45.29 ] } }, + { "type": "Feature", "properties": { "id": "nc72888331", "mag": 1.19, "time": 1504852408190, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.736, 38.759167, 1.73 ] } }, + { "type": "Feature", "properties": { "id": "us2000arr7", "mag": 4.0, "time": 1504852398530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.7954, 14.8479, 70.92 ] } }, + { "type": "Feature", "properties": { "id": "nn00604169", "mag": 1.2, "time": 1504852379590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.2104, 36.4921, 0.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahxc", "mag": 4.7, "time": 1504852332790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 3.8455, 72.6309, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72888321", "mag": 1.8, "time": 1504852052730, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8065, 38.792167, 2.94 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahx3", "mag": 4.3, "time": 1504851979140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.627, 15.4476, 46.76 ] } }, + { "type": "Feature", "properties": { "id": "ak16777937", "mag": 2.1, "time": 1504851258875, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.4392, 60.165, 78.3 ] } }, + { "type": "Feature", "properties": { "id": "us2000arr1", "mag": 4.3, "time": 1504851196580, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9103, 15.3461, 69.88 ] } }, + { "type": "Feature", "properties": { "id": "ak16821848", "mag": 1.5, "time": 1504851158790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -152.7947, 60.1163, 106.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahwt", "mag": 4.6, "time": 1504850928420, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5535, 15.437, 48.5 ] } }, + { "type": "Feature", "properties": { "id": "us2000arr4", "mag": 4.3, "time": 1504850711370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.9041, 15.1749, 40.34 ] } }, + { "type": "Feature", "properties": { "id": "ak16777931", "mag": 1.3, "time": 1504850655355, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -156.0257, 67.0569, 3.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000arr2", "mag": 4.2, "time": 1504850627530, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -95.1989, 15.0884, 40.99 ] } }, + { "type": "Feature", "properties": { "id": "us2000arrk", "mag": 4.2, "time": 1504850557880, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7531, 15.4362, 36.4 ] } }, + { "type": "Feature", "properties": { "id": "nc72888301", "mag": 1.87, "time": 1504850251760, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802333, 38.820667, 3.26 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahwk", "mag": 4.6, "time": 1504850223990, "felt": 0, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.1219, 15.2941, 54.75 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahx1", "mag": 4.3, "time": 1504850059440, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9647, 15.304, 72.81 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay3u", "mag": 4.2, "time": 1504849825570, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.712, 15.4284, 47.14 ] } }, + { "type": "Feature", "properties": { "id": "nc72888296", "mag": 1.15, "time": 1504849761840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800667, 38.847667, 0.54 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay3t", "mag": 4.4, "time": 1504849737970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8795, 15.668, 47.2 ] } }, + { "type": "Feature", "properties": { "id": "nc72888271", "mag": 1.56, "time": 1504849628820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.8005, 38.846333, 0.64 ] } }, + { "type": "Feature", "properties": { "id": "nc72888266", "mag": 1.02, "time": 1504849513230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.801666, 38.847332, 0.61 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahw5", "mag": 5.0, "time": 1504849467850, "felt": 1, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.7228, 15.5333, 34.69 ] } }, + { "type": "Feature", "properties": { "id": "us2000arr3", "mag": 4.3, "time": 1504849426720, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0216, 15.4454, 53.87 ] } }, + { "type": "Feature", "properties": { "id": "nc72888261", "mag": 0.99, "time": 1504849348500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.761002, 38.832501, 0.49 ] } }, + { "type": "Feature", "properties": { "id": "nn00604165", "mag": 2.1, "time": 1504849234193, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -114.9828, 37.2854, 2.6 ] } }, + { "type": "Feature", "properties": { "id": "us2000arr0", "mag": 4.9, "time": 1504849156050, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9438, 15.1471, 68.27 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay3s", "mag": 4.7, "time": 1504849019590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.8391, 15.6629, 60.73 ] } }, + { "type": "Feature", "properties": { "id": "us2000arux", "mag": 5.1, "time": 1504848867960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.0987, 14.9089, 42.35 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai3y", "mag": 2.5, "time": 1504848837100, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -98.4714, 36.5024, 6.91 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahvy", "mag": 5.2, "time": 1504848817820, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.4082, 15.2843, 45.81 ] } }, + { "type": "Feature", "properties": { "id": "us2000arqy", "mag": 4.6, "time": 1504848547140, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.9331, 15.1504, 39.51 ] } }, + { "type": "Feature", "properties": { "id": "nc72888241", "mag": 1.03, "time": 1504848340890, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800835, 38.847832, 0.49 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahvs", "mag": 5.2, "time": 1504848276840, "felt": 3, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5946, 15.2029, 49.18 ] } }, + { "type": "Feature", "properties": { "id": "nc72888226", "mag": 1.48, "time": 1504848105550, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.802, 38.848167, 0.48 ] } }, + { "type": "Feature", "properties": { "id": "nn00604164", "mag": 1.9, "time": 1504848096515, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -115.8669, 37.2911, 8.9 ] } }, + { "type": "Feature", "properties": { "id": "us2000ay3q", "mag": 4.8, "time": 1504848059390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.6096, 15.9617, 41.51 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahvc", "mag": 5.3, "time": 1504847863090, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.5672, 15.5726, 51.13 ] } }, + { "type": "Feature", "properties": { "id": "nc71107624", "mag": 2.16, "time": 1504847827370, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.752167, 39.287167, 10.78 ] } }, + { "type": "Feature", "properties": { "id": "nc72888211", "mag": 1.01, "time": 1504847761210, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.765663, 38.848667, 6.01 ] } }, + { "type": "Feature", "properties": { "id": "nc72888201", "mag": 1.17, "time": 1504847709790, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.80883, 38.829666, 0.99 ] } }, + { "type": "Feature", "properties": { "id": "pr2017251000", "mag": 3.73, "time": 1504847643290, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -68.2905, 19.3283, 52.0 ] } }, + { "type": "Feature", "properties": { "id": "us2000arqw", "mag": 4.8, "time": 1504847625230, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -93.8789, 15.4565, 61.03 ] } }, + { "type": "Feature", "properties": { "id": "us2000arqv", "mag": 5.0, "time": 1504847479550, "felt": null, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ 128.5159, 2.4289, 235.24 ] } }, + { "type": "Feature", "properties": { "id": "nc71107629", "mag": 1.35, "time": 1504847454920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.805833, 38.815333, 2.23 ] } }, + { "type": "Feature", "properties": { "id": "nc72888186", "mag": 1.45, "time": 1504847378350, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.766, 38.8255, 0.39 ] } }, + { "type": "Feature", "properties": { "id": "nc72888181", "mag": 2.28, "time": 1504847361610, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7555, 38.775667, 0.02 ] } }, + { "type": "Feature", "properties": { "id": "nc72888171", "mag": 1.83, "time": 1504847323920, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.7715, 38.817333, -0.11 ] } }, + { "type": "Feature", "properties": { "id": "nc71107399", "mag": 1.12, "time": 1504847319000, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.771167, 38.819333, -0.31 ] } }, + { "type": "Feature", "properties": { "id": "nc72888156", "mag": 1.24, "time": 1504847297950, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.556, 38.807, 15.91 ] } }, + { "type": "Feature", "properties": { "id": "nc72888151", "mag": 1.36, "time": 1504847289840, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.806, 38.822, 1.41 ] } }, + { "type": "Feature", "properties": { "id": "nc72888176", "mag": 1.79, "time": 1504847279970, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.739667, 38.774, -0.49 ] } }, + { "type": "Feature", "properties": { "id": "nc72888146", "mag": 2.3, "time": 1504847258860, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.817833, 38.815167, 0.34 ] } }, + { "type": "Feature", "properties": { "id": "nc72888141", "mag": 2.42, "time": 1504847223340, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.800667, 38.83, 1.81 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahv7", "mag": 5.7, "time": 1504846893100, "felt": 26, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -94.2707, 15.1746, 35.87 ] } }, + { "type": "Feature", "properties": { "id": "ak16777708", "mag": 1.1, "time": 1504846594461, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -151.0631, 61.4229, 6.8 ] } }, + { "type": "Feature", "properties": { "id": "mb80252994", "mag": 1.72, "time": 1504846249390, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -112.541833, 46.857167, 12.55 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahv0", "mag": 8.1, "time": 1504846160000, "felt": 2494, "tsunami": 1 }, "geometry": { "type": "Point", "coordinates": [ -93.9067, 15.0356, 56.67 ] } }, + { "type": "Feature", "properties": { "id": "us2000ai6a", "mag": 2.5, "time": 1504846040410, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.4753, 53.7845, 22.98 ] } }, + { "type": "Feature", "properties": { "id": "nc72888131", "mag": 1.2, "time": 1504845594500, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.8105, 37.463833, -1.37 ] } }, + { "type": "Feature", "properties": { "id": "ak16821844", "mag": 2.0, "time": 1504845256450, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 178.621, 51.2706, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37757591", "mag": 1.24, "time": 1504844674340, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.899167, 34.321833, 9.91 ] } }, + { "type": "Feature", "properties": { "id": "ak16821842", "mag": 2.0, "time": 1504843966513, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ 179.0405, 51.3724, 44.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16821841", "mag": 2.4, "time": 1504843627204, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -165.0538, 52.2197, 10.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16821840", "mag": 1.4, "time": 1504843458180, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7807, 61.7731, 61.9 ] } }, + { "type": "Feature", "properties": { "id": "ak16821839", "mag": 1.1, "time": 1504843388032, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -149.5616, 61.4081, 45.5 ] } }, + { "type": "Feature", "properties": { "id": "ak16777570", "mag": 1.9, "time": 1504843130740, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -173.812, 51.8664, 11.6 ] } }, + { "type": "Feature", "properties": { "id": "ak16821837", "mag": 1.7, "time": 1504843122073, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.717, 58.7435, 117.7 ] } }, + { "type": "Feature", "properties": { "id": "ak16821836", "mag": 1.3, "time": 1504842507708, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.7323, 60.5323, 52.2 ] } }, + { "type": "Feature", "properties": { "id": "ci37757551", "mag": 1.47, "time": 1504841647940, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -116.7945, 33.496333, 3.33 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahus", "mag": 4.7, "time": 1504841042960, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.0592, 52.1619, 10.0 ] } }, + { "type": "Feature", "properties": { "id": "ak16777419", "mag": 1.0, "time": 1504839731548, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -153.81, 64.7157, 15.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16777418", "mag": 2.4, "time": 1504839437977, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -174.7414, 52.1837, 13.2 ] } }, + { "type": "Feature", "properties": { "id": "ak16821832", "mag": 2.4, "time": 1504839217735, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -169.2407, 52.3318, 38.5 ] } }, + { "type": "Feature", "properties": { "id": "hv61900746", "mag": 2.1, "time": 1504839173590, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -154.978833, 19.772, 43.163 ] } }, + { "type": "Feature", "properties": { "id": "ismpkansas70234763", "mag": 1.85, "time": 1504838718270, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.887167, 37.203, 6.15 ] } }, + { "type": "Feature", "properties": { "id": "ci37757519", "mag": 1.49, "time": 1504838267430, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -118.945167, 34.213667, 19.49 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahub", "mag": 4.3, "time": 1504837583700, "felt": 823, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -97.683, 36.6996, 6.073 ] } }, + { "type": "Feature", "properties": { "id": "ak16777416", "mag": 1.3, "time": 1504836895690, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -150.6982, 63.5777, 11.7 ] } }, + { "type": "Feature", "properties": { "id": "uw61304877", "mag": 1.15, "time": 1504836765080, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.568333, 48.699167, 3.29 ] } }, + { "type": "Feature", "properties": { "id": "us2000ahu8", "mag": 3.7, "time": 1504836433340, "felt": 2, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -111.4569, 42.6238, 5.0 ] } }, + { "type": "Feature", "properties": { "id": "nc72888096", "mag": 2.03, "time": 1504835142230, "felt": 4, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -122.053667, 37.835167, 7.59 ] } }, + { "type": "Feature", "properties": { "id": "ak16821829", "mag": 1.5, "time": 1504834613166, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -163.7652, 67.5597, 6.1 ] } }, + { "type": "Feature", "properties": { "id": "hv61900626", "mag": 2.91, "time": 1504833891990, "felt": null, "tsunami": 0 }, "geometry": { "type": "Point", "coordinates": [ -155.011833, 19.399333, 2.609 ] } } + ] + } \ No newline at end of file diff --git a/stories/MapAdaptor/components/images/layers.svg b/stories/MapAdaptor/components/images/layers.svg new file mode 100644 index 0000000000..615f4172d7 --- /dev/null +++ b/stories/MapAdaptor/components/images/layers.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stories/MapAdaptor/components/pointImage.tsx b/stories/MapAdaptor/components/pointImage.tsx new file mode 100644 index 0000000000..a9d4cdd306 --- /dev/null +++ b/stories/MapAdaptor/components/pointImage.tsx @@ -0,0 +1,79 @@ +import '!style-loader!css-loader!./css/l7.css'; +import { Marker, Popup, Scale, Zoom } from '@l7/component'; +import { Point } from '@l7/layers'; +import { Scene } from '@l7/scene'; +import * as React from 'react'; +import data from './data.json'; +export default class PointImage extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public componentDidMount() { + const scene = new Scene({ + center: [120.19382669582967, 30.258134], + id: 'map', + pitch: 0, + type: 'mapbox', + style: 'mapbox://styles/mapbox/dark-v10', + zoom: 1, + }); + scene.addImage( + '00', + 'https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*kzTMQqS2QdUAAAAAAAAAAABkARQnAQ', + ); + const pointLayer = new Point({}); + + // console.log(zoomControl); + // + pointLayer + .source(data) + // .color('blue') + .shape('00') + .size(40); + scene.addLayer(pointLayer); + scene.render(); + scene.on('loaded', () => { + const zoomControl = new Zoom({ + position: 'bottomright', + }); + const scaleControl = new Scale(); + const popup = new Popup({ + offsets: [0, 20], + }) + .setLnglat({ + lng: 120.19382669582967, + lat: 30.258134, + }) + .setText('hello') + .addTo(scene); + + const maker = new Marker(); + maker + .setLnglat({ + lng: 120.19382669582967, + lat: 30.258134, + }) + .addTo(scene); + scene.addControl(zoomControl); + scene.addControl(scaleControl); + }); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MultiPassRenderer/MultiPassRenderer.stories.tsx b/stories/MultiPassRenderer/MultiPassRenderer.stories.tsx new file mode 100644 index 0000000000..f29a258afc --- /dev/null +++ b/stories/MultiPassRenderer/MultiPassRenderer.stories.tsx @@ -0,0 +1,18 @@ +import { storiesOf } from '@storybook/react'; +import * as React from 'react'; +import Blur from './components/Blur'; +import ColorHalftone from './components/ColorHalftone'; +import HexagonalPixelate from './components/HexagonalPixelate'; +import Ink from './components/Ink'; +import Noise from './components/Noise'; +import Sepia from './components/Sepia'; +import TAA from './components/TAA'; +// @ts-ignore +storiesOf('MultiPassRenderer', module) + .add('ColorHalftone', () => ) + .add('HexagonalPixelate', () => ) + .add('Ink', () => ) + .add('Blur', () => ) + .add('Noise', () => ) + .add('Sepia', () => ) + .add('TAA(Temporal Anti-Aliasing)', () => ); diff --git a/stories/MultiPassRenderer/components/Blur.tsx b/stories/MultiPassRenderer/components/Blur.tsx new file mode 100644 index 0000000000..47bbeaebba --- /dev/null +++ b/stories/MultiPassRenderer/components/Blur.tsx @@ -0,0 +1,131 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +export default class Mapbox extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const data = await response.json(); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + const layer = new PolygonLayer({ + enablePicking: true, + enableHighlight: true, + passes: [ + [ + 'blurH', + { + blurRadius: 8, + }, + ], + [ + 'blurV', + { + blurRadius: 8, + }, + ], + ], + }); + + layer + .source(data) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + + scene.addLayer(layer); + scene.render(); + + this.scene = scene; + + /*** 运行时修改样式属性 ***/ + const gui = new dat.GUI(); + this.gui = gui; + const styleOptions = { + blurVRadius: 8, + blurHRadius: 8, + }; + const pointFolder = gui.addFolder('Blur 配置'); + pointFolder + .add(styleOptions, 'blurVRadius', 0, 100) + .onChange((blurRadius: number) => { + layer.style({ + passes: [ + [ + 'blurV', + { + blurRadius, + }, + ], + ], + }); + scene.render(); + }); + pointFolder + .add(styleOptions, 'blurHRadius', 0, 100) + .onChange((blurRadius: number) => { + layer.style({ + passes: [ + [ + 'blurH', + { + blurRadius, + }, + ], + ], + }); + scene.render(); + }); + pointFolder.open(); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MultiPassRenderer/components/ColorHalftone.tsx b/stories/MultiPassRenderer/components/ColorHalftone.tsx new file mode 100644 index 0000000000..7cf2f6c101 --- /dev/null +++ b/stories/MultiPassRenderer/components/ColorHalftone.tsx @@ -0,0 +1,153 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +export default class ColorHalftone extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const data = await response.json(); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + const layer = new PolygonLayer({ + enablePicking: true, + enableHighlight: true, + passes: [ + [ + 'colorHalftone', + { + size: 8, + }, + ], + ], + }); + + layer + .source(data) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + + scene.addLayer(layer); + scene.render(); + + this.scene = scene; + + /*** 运行时修改样式属性 ***/ + const gui = new dat.GUI(); + this.gui = gui; + const styleOptions = { + angle: 0, + size: 8, + centerX: 0.5, + centerY: 0.5, + }; + const pointFolder = gui.addFolder('ColorHalftone 配置'); + pointFolder + .add(styleOptions, 'centerX', 0, 1) + .onChange((centerX: number) => { + layer.style({ + passes: [ + [ + 'colorHalftone', + { + center: [centerX, styleOptions.centerY], + }, + ], + ], + }); + scene.render(); + }); + pointFolder + .add(styleOptions, 'centerY', 0, 1) + .onChange((centerY: number) => { + layer.style({ + passes: [ + [ + 'colorHalftone', + { + center: [styleOptions.centerX, centerY], + }, + ], + ], + }); + scene.render(); + }); + pointFolder.add(styleOptions, 'angle', 0, 10).onChange((angle: number) => { + layer.style({ + passes: [ + [ + 'colorHalftone', + { + angle, + }, + ], + ], + }); + scene.render(); + }); + pointFolder.add(styleOptions, 'size', 0, 20).onChange((size: number) => { + layer.style({ + passes: [ + [ + 'colorHalftone', + { + size, + }, + ], + ], + }); + scene.render(); + }); + pointFolder.open(); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MultiPassRenderer/components/HexagonalPixelate.tsx b/stories/MultiPassRenderer/components/HexagonalPixelate.tsx new file mode 100644 index 0000000000..8303d798b3 --- /dev/null +++ b/stories/MultiPassRenderer/components/HexagonalPixelate.tsx @@ -0,0 +1,139 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +export default class HexagonalPixelate extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const data = await response.json(); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + const layer = new PolygonLayer({ + enablePicking: true, + enableHighlight: true, + passes: [ + [ + 'hexagonalPixelate', + { + scale: 10, + }, + ], + ], + }); + + layer + .source(data) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + + scene.addLayer(layer); + scene.render(); + + this.scene = scene; + + /*** 运行时修改样式属性 ***/ + const gui = new dat.GUI(); + this.gui = gui; + const styleOptions = { + scale: 10, + centerX: 0.5, + centerY: 0.5, + }; + const pointFolder = gui.addFolder('HexagonalPixelate 配置'); + pointFolder + .add(styleOptions, 'centerX', 0, 1) + .onChange((centerX: number) => { + layer.style({ + passes: [ + [ + 'hexagonalPixelate', + { + center: [centerX, styleOptions.centerY], + }, + ], + ], + }); + scene.render(); + }); + pointFolder + .add(styleOptions, 'centerY', 0, 1) + .onChange((centerY: number) => { + layer.style({ + passes: [ + [ + 'hexagonalPixelate', + { + center: [styleOptions.centerX, centerY], + }, + ], + ], + }); + scene.render(); + }); + pointFolder.add(styleOptions, 'scale', 0, 50).onChange((scale: number) => { + layer.style({ + passes: [ + [ + 'hexagonalPixelate', + { + scale, + }, + ], + ], + }); + scene.render(); + }); + pointFolder.open(); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MultiPassRenderer/components/Ink.tsx b/stories/MultiPassRenderer/components/Ink.tsx new file mode 100644 index 0000000000..29723c9412 --- /dev/null +++ b/stories/MultiPassRenderer/components/Ink.tsx @@ -0,0 +1,109 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +export default class Ink extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const data = await response.json(); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + const layer = new PolygonLayer({ + enablePicking: true, + enableHighlight: true, + passes: [ + [ + 'ink', + { + strength: 0.6, + }, + ], + ], + }); + + layer + .source(data) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + + scene.addLayer(layer); + scene.render(); + + this.scene = scene; + + /*** 运行时修改样式属性 ***/ + const gui = new dat.GUI(); + this.gui = gui; + const styleOptions = { + strength: 0.6, + }; + const pointFolder = gui.addFolder('Ink 配置'); + pointFolder + .add(styleOptions, 'strength', 0, 1) + .onChange((strength: number) => { + layer.style({ + passes: [ + [ + 'ink', + { + strength, + }, + ], + ], + }); + scene.render(); + }); + pointFolder.open(); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MultiPassRenderer/components/Noise.tsx b/stories/MultiPassRenderer/components/Noise.tsx new file mode 100644 index 0000000000..7bb0df1d59 --- /dev/null +++ b/stories/MultiPassRenderer/components/Noise.tsx @@ -0,0 +1,100 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +export default class Noise extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const data = await response.json(); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + const layer = new PolygonLayer({ + enablePicking: true, + enableHighlight: true, + passes: ['noise'], + }); + + layer + .source(data) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + + scene.addLayer(layer); + scene.render(); + + this.scene = scene; + + /*** 运行时修改样式属性 ***/ + const gui = new dat.GUI(); + this.gui = gui; + const styleOptions = { + amount: 1, + }; + const pointFolder = gui.addFolder('Noise 配置'); + pointFolder.add(styleOptions, 'amount', 0, 1).onChange((amount: number) => { + layer.style({ + passes: [ + [ + 'noise', + { + amount, + }, + ], + ], + }); + scene.render(); + }); + pointFolder.open(); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MultiPassRenderer/components/Sepia.tsx b/stories/MultiPassRenderer/components/Sepia.tsx new file mode 100644 index 0000000000..fe859f8a42 --- /dev/null +++ b/stories/MultiPassRenderer/components/Sepia.tsx @@ -0,0 +1,100 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +export default class Sepia extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const data = await response.json(); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + const layer = new PolygonLayer({ + enablePicking: true, + enableHighlight: true, + passes: ['sepia'], + }); + + layer + .source(data) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + + scene.addLayer(layer); + scene.render(); + + this.scene = scene; + + /*** 运行时修改样式属性 ***/ + const gui = new dat.GUI(); + this.gui = gui; + const styleOptions = { + amount: 0.5, + }; + const pointFolder = gui.addFolder('Sepia 配置'); + pointFolder.add(styleOptions, 'amount', 0, 1).onChange((amount: number) => { + layer.style({ + passes: [ + [ + 'sepia', + { + amount, + }, + ], + ], + }); + scene.render(); + }); + pointFolder.open(); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/MultiPassRenderer/components/TAA.tsx b/stories/MultiPassRenderer/components/TAA.tsx new file mode 100644 index 0000000000..5c9ed0677b --- /dev/null +++ b/stories/MultiPassRenderer/components/TAA.tsx @@ -0,0 +1,105 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +export default class TAA extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const data = await response.json(); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + const layer = new PolygonLayer({ + enablePicking: true, + enableHighlight: true, + enableTAA: true, + jitterScale: 1, + // passes: [ + // 'blurH', + // [ + // 'blurV', + // { + // blurRadius: 8, + // }, + // ], + // ], + }); + + layer + .source(data) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + + scene.addLayer(layer); + scene.render(); + + this.scene = scene; + + /*** 运行时修改样式属性 ***/ + const gui = new dat.GUI(); + this.gui = gui; + const styleOptions = { + jitterScale: 1, + }; + const pointFolder = gui.addFolder('TAA 配置'); + pointFolder + .add(styleOptions, 'jitterScale', 0, 100) + .onChange((jitterScale: number) => { + layer.style({ + jitterScale, + }); + scene.render(); + }); + pointFolder.open(); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Picking/Picking.stories.tsx b/stories/Picking/Picking.stories.tsx new file mode 100644 index 0000000000..fca22b2492 --- /dev/null +++ b/stories/Picking/Picking.stories.tsx @@ -0,0 +1,10 @@ +import { storiesOf } from '@storybook/react'; +import * as React from 'react'; +import AdvancedAPI from './components/AdvancedAPI'; +import Highlight from './components/Highlight'; +import Tooltip from './components/Tooltip'; +// @ts-ignore +storiesOf('交互', module) + .add('拾取 & 高亮', () => ) + .add('拾取 & Tooltip', () => ) + .add('高级拾取 API', () => ); diff --git a/stories/Picking/components/AdvancedAPI.tsx b/stories/Picking/components/AdvancedAPI.tsx new file mode 100644 index 0000000000..1a99de0db4 --- /dev/null +++ b/stories/Picking/components/AdvancedAPI.tsx @@ -0,0 +1,120 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +export default class AdvancedAPI extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + const layer = new PolygonLayer({ + enablePicking: true, + enableHighlight: true, + highlightColor: [0, 0, 1, 1], + onHover: (pickedFeature) => { + // tslint:disable-next-line:no-console + console.log(pickedFeature); + }, + }); + + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + scene.addLayer(layer); + scene.render(); + + this.scene = scene; + + /*** 运行时修改样式属性 ***/ + const gui = new dat.GUI(); + this.gui = gui; + const styleOptions = { + enablePicking: true, + enableHighlight: true, + highlightColor: [0, 0, 255], + pickingX: window.innerWidth / 2, + pickingY: window.innerHeight / 2, + }; + const pointFolder = gui.addFolder('非鼠标 hover 交互'); + pointFolder + .add(styleOptions, 'enableHighlight') + .onChange((enableHighlight: boolean) => { + layer.style({ + enableHighlight, + }); + scene.render(); + }); + pointFolder + .add(styleOptions, 'pickingX', 0, window.innerWidth) + .onChange((pickingX: number) => { + layer.pick({ x: pickingX, y: styleOptions.pickingY }); + }); + pointFolder + .add(styleOptions, 'pickingY', 0, window.innerHeight) + .onChange((pickingY: number) => { + layer.pick({ x: styleOptions.pickingX, y: pickingY }); + }); + pointFolder + .addColor(styleOptions, 'highlightColor') + .onChange((highlightColor: number[]) => { + const [r, g, b] = highlightColor.map((c) => c / 255); + layer.style({ + highlightColor: [r, g, b, 1], + }); + scene.render(); + }); + pointFolder.open(); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Picking/components/Highlight.tsx b/stories/Picking/components/Highlight.tsx new file mode 100644 index 0000000000..6c004bd8cb --- /dev/null +++ b/stories/Picking/components/Highlight.tsx @@ -0,0 +1,117 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +export default class Highlight extends React.Component { + private gui: dat.GUI; + private $stats: Node; + private scene: Scene; + + public componentWillUnmount() { + if (this.gui) { + this.gui.destroy(); + } + if (this.$stats) { + document.body.removeChild(this.$stats); + } + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + const layer = new PolygonLayer({ + enablePicking: true, + enableHighlight: true, + highlightColor: [0, 0, 1, 1], + onHover: (pickedFeature) => { + // tslint:disable-next-line:no-console + // console.log(pickedFeature); + }, + }); + + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 1.0, + }); + scene.addLayer(layer); + scene.render(); + console.log(layer); + this.scene = scene; + + /*** 运行时修改样式属性 ***/ + const gui = new dat.GUI(); + this.gui = gui; + const styleOptions = { + enablePicking: true, + enableHighlight: true, + highlightColor: [0, 0, 255], + }; + const pointFolder = gui.addFolder('拾取 & 高亮'); + // pointFolder + // .add(styleOptions, 'enablePicking') + // .onChange((enablePicking: boolean) => { + // // FIXME: 该配置项会影响到初始化阶段 PixelPickingPass 的添加,暂不支持在运行时更改 + // layer.style({ + // enablePicking, + // }); + // scene.render(); + // }); + pointFolder + .add(styleOptions, 'enableHighlight') + .onChange((enableHighlight: boolean) => { + layer.style({ + enableHighlight, + }); + scene.render(); + }); + pointFolder + .addColor(styleOptions, 'highlightColor') + .onChange((highlightColor: number[]) => { + const [r, g, b] = highlightColor.map((c) => c / 255); + layer.style({ + highlightColor: [r, g, b, 1], + }); + scene.render(); + }); + pointFolder.open(); + } + + public render() { + return ( +
+ ); + } +} diff --git a/stories/Picking/components/Tooltip.tsx b/stories/Picking/components/Tooltip.tsx new file mode 100644 index 0000000000..d833036b65 --- /dev/null +++ b/stories/Picking/components/Tooltip.tsx @@ -0,0 +1,71 @@ +// @ts-ignore +import { PolygonLayer } from '@l7/layers'; +// @ts-ignore +import { Scene } from '@l7/scene'; +import * as dat from 'dat.gui'; +import * as React from 'react'; + +export default class Mapbox extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + id: 'map', + type: 'mapbox', + style: 'mapbox://styles/mapbox/streets-v9', + center: [110.19382669582967, 50.258134], + pitch: 0, + zoom: 3, + }); + const layer = new PolygonLayer({ + enablePicking: true, + enableHighlight: false, + onHover: (pickedFeature) => { + // tslint:disable-next-line:no-console + // console.log(pickedFeature); + }, + }); + + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + scene.addLayer(layer); + scene.render(); + + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000000..6936cb3f22 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, + "rootDir": "./", + "baseUrl": "./", + "paths": { + "@l7/*": ["packages/*/src"], + "*": ["node_modules", "packages"] + } + }, + "exclude": ["**/*.story.*", "**/*.spec.*", "dist"], + "include": [] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..3347c231f5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "noEmit": true, + "strict": true, + "strictPropertyInitialization": false, + "downlevelIteration": true, + "jsx": "react", + "target": "es5", + "lib": ["es6", "dom"], + "types": ["reflect-metadata", "jest"], + "module": "esnext", + "moduleResolution": "node", + "esModuleInterop": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "resolveJsonModule": true, + "rootDir": "./", + "baseUrl": "./", + "paths": { + "@l7/*": ["packages/*/src"], + "*": ["node_modules", "packages"] + } + }, + "awesomeTypescriptLoaderOptions": { + "useBabel": true, + "babelCore": "@babel/core", + "useCache": false + }, + "include": ["packages"], + "exclude": ["node_modules", "packages/**/dist"], +} \ No newline at end of file diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000000..25de824011 --- /dev/null +++ b/tslint.json @@ -0,0 +1,24 @@ +{ + "extends": [ + "tslint:latest", + "tslint-react", + "tslint-plugin-prettier", + "tslint-config-prettier" + ], + "rules": { + "prettier": true, + "quotemark": [ + true, + "single", + "avoid-escape", + "avoid-template", + "jsx-double" + ], + "no-bitwise": false, + "object-literal-sort-keys": false, + "no-implicit-dependencies": false + }, + "globals": { + "AMap": true + } +} diff --git a/tslint.prod.json b/tslint.prod.json new file mode 100644 index 0000000000..24d12a308b --- /dev/null +++ b/tslint.prod.json @@ -0,0 +1,9 @@ +{ + "extends": ["./tslint.json"], + "rules": { + "no-implicit-dependencies": true + }, + "linterOptions": { + "exclude": ["**/*.d.ts", "**/*.{test,story}.ts{,x}"] + } +} diff --git a/tslint.test.json b/tslint.test.json new file mode 100644 index 0000000000..f07a4a2a3c --- /dev/null +++ b/tslint.test.json @@ -0,0 +1,9 @@ +{ + "extends": ["./tslint.json"], + "rules": { + "no-implicit-dependencies": [false, "dev"] + }, + "linterOptions": { + "exclude": ["**/*.d.ts"] + } +} \ No newline at end of file