shadow-zone / commit
Add seismic shadow zone SPA
.gitignore | 4 + .gitlab-ci.yml | 13 + package-lock.json | 1002 +++++++++++ package.json | 16 + scripts/fetch-earthquake-data.mjs | 301 ++++ src/controls.ts | 102 ++ src/data/chile-2010.json | 3513 +++++++++++++++++++++++++++++++++++++ src/data/okhotsk-2013.json | 2491 ++++++++++++++++++++++++++ src/data/tohoku-2011.json | 3513 +++++++++++++++++++++++++++++++++++++ src/earth.ts | 189 ++ src/earthquakeData.ts | 58 + src/main.ts | 165 ++ src/rayTracer.ts | 190 ++ src/renderer.ts | 186 ++ src/shadowZone.ts | 75 + src/validator.ts | 183 ++ tsconfig.json | 12 + vite.config.ts | 8 + 18 files changed, 12021 insertions(+) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3aee1b3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.playwright-mcp/ +.screenshots/ +.temp/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..915efe1 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,13 @@ +image: node:20 + +pages: + stage: deploy + script: + - npm ci + - npm run build + - mv dist public + artifacts: + paths: + - public + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b271170 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1002 @@ +{ + "name": "shadow-zone", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "shadow-zone", + "version": "0.0.1", + "devDependencies": { + "typescript": "^5.4.0", + "vite": "^5.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", + "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", + "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", + "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", + "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", + "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", + "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", + "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", + "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", + "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", + "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", + "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", + "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", + "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", + "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", + "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", + "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", + "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", + "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", + "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", + "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", + "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", + "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", + "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", + "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", + "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d82570e --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "shadow-zone", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc --noEmit && vite build", + "preview": "vite preview", + "fetch-data": "node scripts/fetch-earthquake-data.mjs" + }, + "devDependencies": { + "typescript": "^5.4.0", + "vite": "^5.2.0" + } +} diff --git a/scripts/fetch-earthquake-data.mjs b/scripts/fetch-earthquake-data.mjs new file mode 100644 index 0000000..761b028 --- /dev/null +++ b/scripts/fetch-earthquake-data.mjs @@ -0,0 +1,301 @@ +#!/usr/bin/env node +/** + * Fetch real seismic phase arrival data from public sources and write formatted + * JSON into src/data/ for use by the validation module. + * + * Data source: USGS ComCat (QuakeML product) + * 1. GET /fdsnws/event/1/query?format=geojson&eventid=<id> + * → find products['phase-data'][0].contents['quakeml.xml'].url + * 2. Parse QuakeML: match <pick> publicIDs with <arrival> pickIDs to get + * station, epicentral distance (degrees), and observed travel time. + * + * Usage: + * node scripts/fetch-earthquake-data.mjs + * node scripts/fetch-earthquake-data.mjs --event tohoku-2011 + * node scripts/fetch-earthquake-data.mjs --max-stations 300 + * + * Writes: src/data/{id}.json + */ + +import { writeFileSync, mkdirSync } from 'fs'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const OUT_DIR = join(__dirname, '..', 'src', 'data'); + +mkdirSync(OUT_DIR, { recursive: true }); + +// ── CLI args ────────────────────────────────────────────────────────────────── +const args = process.argv.slice(2); +const filterEvent = argVal(args, '--event'); +const maxStations = parseInt(argVal(args, '--max-stations') ?? '500', 10); + +function argVal(arr, flag) { + const i = arr.indexOf(flag); + return i !== -1 ? arr[i + 1] : null; +} + +// ── Event registry ──────────────────────────────────────────────────────────── +const EVENTS = [ + { + id: 'tohoku-2011', + name: '2011 Tōhoku, Japan (Mw 9.1)', + originTime: '2011-03-11T05:46:24Z', + latitude: 38.297, + longitude: 142.373, + depthKm: 29, + magnitudeMw: 9.1, + usgsId: 'official20110311054624120_30', + note: 'Largest recorded earthquake in Japan. Shallow source, excellent global coverage. Clear P shadow zone near 105°–140°.', + }, + { + id: 'chile-2010', + name: '2010 Maule, Chile (Mw 8.8)', + originTime: '2010-02-27T06:34:11Z', + latitude: -35.909, + longitude: -72.733, + depthKm: 22, + magnitudeMw: 8.8, + usgsId: 'official20100227063411530_30', + note: 'Megathrust earthquake, shallow source. Complementary geometry to Tōhoku — stations in shadow zone are different parts of the global network.', + }, + { + id: 'okhotsk-2013', + name: '2013 Sea of Okhotsk (Mw 8.3, depth 608 km)', + originTime: '2013-05-24T05:44:49Z', + latitude: 54.874, + longitude: 153.281, + depthKm: 608, + magnitudeMw: 8.3, + usgsId: 'usb000h4jh', + note: 'Very deep focus earthquake. Rays launch from 608 km depth, altering shadow zone geometry. Good for demonstrating that depth matters in the model.', + }, +]; + +// ── Main ────────────────────────────────────────────────────────────────────── +const toFetch = filterEvent ? EVENTS.filter(e => e.id === filterEvent) : EVENTS; + +if (toFetch.length === 0) { + console.error(`Unknown event id: ${filterEvent}`); + console.error('Available:', EVENTS.map(e => e.id).join(', ')); + process.exit(1); +} + +for (const event of toFetch) { + console.log(`\n── ${event.id} ──────────────────────────────────`); + try { + const arrivals = await fetchArrivals(event, maxStations); + const dataset = { ...event, arrivals }; + const outPath = join(OUT_DIR, `${event.id}.json`); + writeFileSync(outPath, JSON.stringify(dataset, null, 2)); + console.log(`✅ Wrote ${arrivals.length} arrivals → ${outPath}`); + if (arrivals.length === 0) { + console.warn(' ⚠️ No arrivals found — check the usgsId or run with --debug'); + } + } catch (err) { + console.error(`❌ Failed: ${err.message}`); + if (process.env.DEBUG) console.error(err.stack); + } +} + +// ── USGS ComCat + QuakeML parser ────────────────────────────────────────────── + +async function fetchArrivals(event, maxStations) { + // Step 1: get the QuakeML URL from the event detail + const detailUrl = + `https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&eventid=${event.usgsId}`; + console.log(` Fetching event detail from USGS…`); + const detail = await fetchJSON(detailUrl); + + // Search all phase-data product variants for a quakeml.xml content. + // 'trump-phase-data' is sometimes present but with empty contents, so we + // scan all candidates and take the first that has a real quakeml.xml. + const allProducts = [ + ...(detail?.properties?.products?.['phase-data'] ?? []), + ...(detail?.properties?.products?.['trump-phase-data'] ?? []), + ]; + + if (allProducts.length === 0) { + throw new Error('No phase-data product found in ComCat response'); + } + + let quakemlUrl = null; + for (const product of allProducts) { + const contents = product?.contents; + if (!contents || typeof contents !== 'object' || Array.isArray(contents)) continue; + const qml = Object.entries(contents).find(([k]) => k.endsWith('quakeml.xml')); + if (qml) { + quakemlUrl = qml[1].url; + break; + } + } + if (!quakemlUrl) { + throw new Error('quakeml.xml not found in any phase-data product'); + } + + console.log(` Downloading QuakeML (${quakemlUrl.split('/').slice(-3).join('/')})…`); + const xml = await fetchText(quakemlUrl); + console.log(` Parsing (${(xml.length / 1024).toFixed(0)} KB)…`); + + return parseQuakeML(xml, event.originTime, maxStations); +} + +/** + * Parse USGS QuakeML to extract P/S travel times. + * + * QuakeML structure: + * <pick publicID=".../<sta>/<phase>"> + * <time><value>ISO8601</value></time> + * <waveformID networkCode="IU" stationCode="ANMO" /> + * <phaseHint>P</phaseHint> + * </pick> + * + * <arrival publicID="..."> + * <pickID>.../<sta>/<phase></pickID> ← matches pick publicID + * <phase>P</phase> + * <distance>28.14</distance> ← degrees + * </arrival> + * + * Travel time = pick.time − origin.time. + */ +function parseQuakeML(xml, fallbackOriginTime, maxStations) { + // Extract origin time (prefer the first reviewed origin) + const originTimeStr = extractOriginTime(xml) ?? fallbackOriginTime; + const originMs = new Date(originTimeStr).getTime(); + if (isNaN(originMs)) throw new Error(`Bad origin time: ${originTimeStr}`); + console.log(` Origin time: ${originTimeStr}`); + + // Build pick map: publicID → { time, network, station, phaseHint } + const picks = new Map(); + for (const block of iterXmlElements(xml, 'pick')) { + const pid = extractAttr(block, 'publicID'); + // <time><value>ISO8601</value></time> — nested, so use a two-level match + const timeStr = extractNestedTag(block, 'time', 'value'); + const network = extractAttr(block, 'networkCode') ?? ''; + const station = extractAttr(block, 'stationCode') ?? ''; + const phase = extractTag(block, 'phaseHint') ?? ''; + + if (!pid || !timeStr) continue; + const tMs = new Date(timeStr).getTime(); + if (isNaN(tMs)) continue; + + picks.set(pid, { tMs, network, station, phase }); + } + console.log(` Parsed ${picks.size} picks`); + + // Process arrivals — each arrival references a pick and adds distance + const stationMap = new Map(); // key: net.sta → record + + for (const block of iterXmlElements(xml, 'arrival')) { + const pickId = extractTag(block, 'pickID'); + const phase = extractTag(block, 'phase') ?? ''; + const distStr = extractTag(block, 'distance'); + + if (!pickId || !distStr) continue; + + const distDeg = parseFloat(distStr); + if (isNaN(distDeg) || distDeg <= 0 || distDeg > 180) continue; + + const pick = picks.get(pickId); + if (!pick) continue; + + // Accept direct P/S phases only (not PP, PKP, PcP, etc.) + const isP = /^P[ng]?$/.test(phase); + const isS = /^S[ng]?$/.test(phase); + if (!isP && !isS) continue; + + const travelSec = (pick.tMs - originMs) / 1000; + if (travelSec <= 0 || travelSec > 4000) continue; + + const key = `${pick.network}.${pick.station}`; + if (!stationMap.has(key)) { + stationMap.set(key, { + station: pick.station, + network: pick.network, + distanceDeg: parseFloat(distDeg.toFixed(2)), + pTravelTimeSec: null, + sTravelTimeSec: null, + }); + } + + const rec = stationMap.get(key); + if (isP && (rec.pTravelTimeSec === null || travelSec < rec.pTravelTimeSec)) { + rec.pTravelTimeSec = Math.round(travelSec * 10) / 10; + } + if (isS && (rec.sTravelTimeSec === null || travelSec < rec.sTravelTimeSec)) { + rec.sTravelTimeSec = Math.round(travelSec * 10) / 10; + } + } + + const result = [...stationMap.values()] + .filter(r => r.pTravelTimeSec !== null || r.sTravelTimeSec !== null) + .sort((a, b) => a.distanceDeg - b.distanceDeg) + .slice(0, maxStations); + + const pCount = result.filter(r => r.pTravelTimeSec !== null).length; + const sCount = result.filter(r => r.sTravelTimeSec !== null).length; + console.log(` P: ${pCount}, S: ${sCount}, total stations: ${result.length}`); + return result; +} + +// ── Minimal XML helpers (no library dependency) ─────────────────────────────── + +/** Iterate over all <tagName ...>...</tagName> blocks in XML text. */ +function* iterXmlElements(xml, tagName) { + const open = new RegExp(`<${tagName}[\\s>]`, 'g'); + const close = `</${tagName}>`; + let match; + while ((match = open.exec(xml)) !== null) { + // Rewind 1 to include the '<' + const start = match.index; + const end = xml.indexOf(close, start); + if (end === -1) continue; + yield xml.slice(start, end + close.length); + } +} + +/** + * Extract text of the first <outer><inner>TEXT</inner></outer> nested pair. + * Handles the common QuakeML pattern where values are doubly-wrapped. + */ +function extractNestedTag(xml, outer, inner) { + const re = new RegExp(`<${outer}[^>]*>\\s*<${inner}[^>]*>([^<]+)</${inner}>`); + const m = xml.match(re); + return m ? m[1].trim() : null; +} + +/** Extract text of the first <tag>TEXT</tag> (no nested tags inside). */ +function extractTag(xml, tag) { + const m = xml.match(new RegExp(`<${tag}[^>]*>([^<]+)</${tag}>`)); + return m ? m[1].trim() : null; +} + +/** Extract a named attribute value from anywhere in the string. */ +function extractAttr(xml, attr) { + const m = xml.match(new RegExp(`\\b${attr}="([^"]*)"`)); + return m ? m[1] : null; +} + +/** Extract the preferred origin time from the first <origin> block. */ +function extractOriginTime(xml) { + for (const block of iterXmlElements(xml, 'origin')) { + const t = extractNestedTag(block, 'time', 'value'); + if (t) return t; + } + return null; +} + +// ── HTTP helpers ────────────────────────────────────────────────────────────── + +async function fetchJSON(url) { + const res = await fetch(url, { headers: { 'User-Agent': 'shadow-zone-edu/1.0' } }); + if (!res.ok) throw new Error(`HTTP ${res.status} for ${url}`); + return res.json(); +} + +async function fetchText(url) { + const res = await fetch(url, { headers: { 'User-Agent': 'shadow-zone-edu/1.0' } }); + if (!res.ok) throw new Error(`HTTP ${res.status} for ${url}`); + return res.text(); +} diff --git a/src/controls.ts b/src/controls.ts new file mode 100644 index 0000000..45d0e6f --- /dev/null +++ b/src/controls.ts @@ -0,0 +1,102 @@ +import { PRESETS } from './earth'; +import { EARTHQUAKE_DATASETS } from './earthquakeData'; + +export interface AppState { + outerCoreRadius: number; + outerCoreVTop: number; + outerCoreVBottom: number; + innerCoreRadius: number; + innerCoreV: number; + waveType: 'P' | 'S' | 'both'; + numRays: number; + preset: string; + /** Currently selected earthquake dataset id, or '' for none */ + earthquakeId: string; +} + +function el<T extends HTMLElement>(id: string): T { + return document.getElementById(id) as T; +} + +function syncDisplay(inputId: string, displayId: string, decimals = 0) { + const input = el<HTMLInputElement>(inputId); + const display = el<HTMLSpanElement>(displayId); + display.textContent = parseFloat(input.value).toFixed(decimals); +} + +export function initControls(onChange: (state: AppState) => void): AppState { + const state: AppState = { ...PRESETS['earth'], earthquakeId: '' }; + + // Populate earthquake selector dynamically + const eqSelect = el<HTMLSelectElement>('earthquake-select'); + const noneOpt = document.createElement('option'); + noneOpt.value = ''; + noneOpt.textContent = '— None —'; + eqSelect.appendChild(noneOpt); + for (const ds of EARTHQUAKE_DATASETS) { + const opt = document.createElement('option'); + opt.value = ds.id; + opt.textContent = ds.name; + eqSelect.appendChild(opt); + } + + function readState(): AppState { + return { + outerCoreRadius: parseFloat(el<HTMLInputElement>('outer-core-radius').value), + outerCoreVTop: parseFloat(el<HTMLInputElement>('outer-core-v-top').value), + outerCoreVBottom: parseFloat(el<HTMLInputElement>('outer-core-v-bottom').value), + innerCoreRadius: parseFloat(el<HTMLInputElement>('inner-core-radius').value), + innerCoreV: parseFloat(el<HTMLInputElement>('inner-core-v').value), + waveType: el<HTMLSelectElement>('wave-type').value as AppState['waveType'], + numRays: parseInt(el<HTMLInputElement>('num-rays').value, 10), + preset: el<HTMLSelectElement>('preset').value, + earthquakeId: el<HTMLSelectElement>('earthquake-select').value, + }; + } + + function applyStateToDOM(s: AppState) { + el<HTMLInputElement>('outer-core-radius').value = String(s.outerCoreRadius); + el<HTMLInputElement>('outer-core-v-top').value = String(s.outerCoreVTop); + el<HTMLInputElement>('outer-core-v-bottom').value = String(s.outerCoreVBottom); + el<HTMLInputElement>('inner-core-radius').value = String(s.innerCoreRadius); + el<HTMLInputElement>('inner-core-v').value = String(s.innerCoreV); + el<HTMLSelectElement>('wave-type').value = s.waveType; + el<HTMLInputElement>('num-rays').value = String(s.numRays); + el<HTMLSelectElement>('preset').value = s.preset; + + syncDisplay('outer-core-radius', 'outer-core-radius-val', 0); + syncDisplay('outer-core-v-top', 'outer-core-v-top-val', 1); + syncDisplay('outer-core-v-bottom', 'outer-core-v-bottom-val', 1); + syncDisplay('inner-core-radius', 'inner-core-radius-val', 0); + syncDisplay('inner-core-v', 'inner-core-v-val', 1); + syncDisplay('num-rays', 'num-rays-val', 0); + } + + function fire() { + const s = readState(); + Object.assign(state, s); + applyStateToDOM(s); + onChange(s); + } + + // Preset change: load preset values into DOM then fire + el('preset').addEventListener('change', () => { + const preset = PRESETS[el<HTMLSelectElement>('preset').value]; + if (preset) { + applyStateToDOM(preset); + Object.assign(state, preset); + } + fire(); + }); + + const sliders = ['outer-core-radius', 'outer-core-v-top', 'outer-core-v-bottom', + 'inner-core-radius', 'inner-core-v', 'num-rays']; + for (const id of sliders) { + el(id).addEventListener('input', fire); + } + el('wave-type').addEventListener('change', fire); + el('earthquake-select').addEventListener('change', fire); + + applyStateToDOM(state); + return state; +} diff --git a/src/data/chile-2010.json b/src/data/chile-2010.json new file mode 100644 index 0000000..ed3d80d --- /dev/null +++ b/src/data/chile-2010.json @@ -0,0 +1,3513 @@ +{ + "id": "chile-2010", + "name": "2010 Maule, Chile (Mw 8.8)", + "originTime": "2010-02-27T06:34:11Z", + "latitude": -35.909, + "longitude": -72.733, + "depthKm": 22, + "magnitudeMw": 8.8, + "usgsId": "official20100227063411530_30", + "note": "Megathrust earthquake, shallow source. Complementary geometry to Tōhoku — stations in shadow zone are different parts of the global network.", + "arrivals": [ + { + "station": "LNV", + "network": "IR", + "distanceDeg": 2.48, + "pTravelTimeSec": 39.8, + "sTravelTimeSec": null + }, + { + "station": "CACH", + "network": "IR", + "distanceDeg": 2.75, + "pTravelTimeSec": 44.3, + "sTravelTimeSec": null + }, + { + "station": "CHCH", + "network": "IR", + "distanceDeg": 2.86, + "pTravelTimeSec": 46.1, + "sTravelTimeSec": null + }, + { + "station": "TACH", + "network": "IR", + "distanceDeg": 2.94, + "pTravelTimeSec": 46.6, + "sTravelTimeSec": null + }, + { + "station": "SAN", + "network": "IR", + "distanceDeg": 3.24, + "pTravelTimeSec": 51.1, + "sTravelTimeSec": null + }, + { + "station": "FSR", + "network": "IR", + "distanceDeg": 3.28, + "pTravelTimeSec": 53.8, + "sTravelTimeSec": null + }, + { + "station": "CLCH", + "network": "IR", + "distanceDeg": 3.34, + "pTravelTimeSec": 52.7, + "sTravelTimeSec": null + }, + { + "station": "PEL", + "network": "IR", + "distanceDeg": 3.49, + "pTravelTimeSec": 54.3, + "sTravelTimeSec": null + }, + { + "station": "ROCH", + "network": "IR", + "distanceDeg": 3.51, + "pTravelTimeSec": 54.9, + "sTravelTimeSec": null + }, + { + "station": "VLCH", + "network": "IR", + "distanceDeg": 3.69, + "pTravelTimeSec": 52.8, + "sTravelTimeSec": null + }, + { + "station": "PLCA", + "network": "IR", + "distanceDeg": 4.96, + "pTravelTimeSec": 71.8, + "sTravelTimeSec": null + }, + { + "station": "CFAA", + "network": "IR", + "distanceDeg": 5.94, + "pTravelTimeSec": 86.6, + "sTravelTimeSec": null + }, + { + "station": "FUTA", + "network": "IR", + "distanceDeg": 7.1, + "pTravelTimeSec": 101.2, + "sTravelTimeSec": null + }, + { + "station": "TRQA", + "network": "IR", + "distanceDeg": 8.94, + "pTravelTimeSec": 129.5, + "sTravelTimeSec": null + }, + { + "station": "LVC", + "network": "IR", + "distanceDeg": 13.9, + "pTravelTimeSec": 194.7, + "sTravelTimeSec": null + }, + { + "station": "CPUP", + "network": "IR", + "distanceDeg": 16.49, + "pTravelTimeSec": 225.7, + "sTravelTimeSec": null + }, + { + "station": "EFI", + "network": "IR", + "distanceDeg": 18.81, + "pTravelTimeSec": 253.8, + "sTravelTimeSec": null + }, + { + "station": "USHA", + "network": "IR", + "distanceDeg": 18.96, + "pTravelTimeSec": 258.4, + "sTravelTimeSec": null + }, + { + "station": "LPAZ", + "network": "IR", + "distanceDeg": 20.2, + "pTravelTimeSec": 276.3, + "sTravelTimeSec": null + }, + { + "station": "SIV", + "network": "IR", + "distanceDeg": 22.65, + "pTravelTimeSec": 299.6, + "sTravelTimeSec": null + }, + { + "station": "NNA", + "network": "IR", + "distanceDeg": 24.29, + "pTravelTimeSec": 315.2, + "sTravelTimeSec": null + }, + { + "station": "SAML", + "network": "IR", + "distanceDeg": 28.46, + "pTravelTimeSec": 353.4, + "sTravelTimeSec": null + }, + { + "station": "PMSA", + "network": "IR", + "distanceDeg": 29.18, + "pTravelTimeSec": 357.6, + "sTravelTimeSec": null + }, + { + "station": "ATAH", + "network": "IR", + "distanceDeg": 29.42, + "pTravelTimeSec": 363, + "sTravelTimeSec": null + }, + { + "station": "BDFB", + "network": "IR", + "distanceDeg": 30.13, + "pTravelTimeSec": 367.6, + "sTravelTimeSec": null + }, + { + "station": "HOPE", + "network": "IR", + "distanceDeg": 30.96, + "pTravelTimeSec": 373.9, + "sTravelTimeSec": null + }, + { + "station": "RPN", + "network": "IR", + "distanceDeg": 32.14, + "pTravelTimeSec": 386.4, + "sTravelTimeSec": null + }, + { + "station": "OTAV", + "network": "IR", + "distanceDeg": 36.54, + "pTravelTimeSec": 425.8, + "sTravelTimeSec": null + }, + { + "station": "ROSC", + "network": "IR", + "distanceDeg": 40.78, + "pTravelTimeSec": 461.9, + "sTravelTimeSec": null + }, + { + "station": "SDV", + "network": "IR", + "distanceDeg": 44.82, + "pTravelTimeSec": 491.9, + "sTravelTimeSec": null + }, + { + "station": "RCBR", + "network": "IR", + "distanceDeg": 45.37, + "pTravelTimeSec": 497.3, + "sTravelTimeSec": null + }, + { + "station": "BCIP", + "network": "IR", + "distanceDeg": 45.52, + "pTravelTimeSec": 498.4, + "sTravelTimeSec": null + }, + { + "station": "JTS", + "network": "IR", + "distanceDeg": 47.54, + "pTravelTimeSec": 514.7, + "sTravelTimeSec": null + }, + { + "station": "VNA3", + "network": "IR", + "distanceDeg": 47.68, + "pTravelTimeSec": 512.9, + "sTravelTimeSec": null + }, + { + "station": "TRIS", + "network": "IR", + "distanceDeg": 47.91, + "pTravelTimeSec": 518.5, + "sTravelTimeSec": null + }, + { + "station": "VNA1", + "network": "IR", + "distanceDeg": 48.02, + "pTravelTimeSec": 516, + "sTravelTimeSec": null + }, + { + "station": "VNA2", + "network": "IR", + "distanceDeg": 48.35, + "pTravelTimeSec": 518.5, + "sTravelTimeSec": null + }, + { + "station": "GRGR", + "network": "IR", + "distanceDeg": 49.15, + "pTravelTimeSec": 525.7, + "sTravelTimeSec": null + }, + { + "station": "PTCN", + "network": "IR", + "distanceDeg": 49.83, + "pTravelTimeSec": 531.1, + "sTravelTimeSec": null + }, + { + "station": "SNAA", + "network": "IR", + "distanceDeg": 49.9, + "pTravelTimeSec": 530, + "sTravelTimeSec": null + }, + { + "station": "BBGH", + "network": "IR", + "distanceDeg": 50.59, + "pTravelTimeSec": 538.4, + "sTravelTimeSec": null + }, + { + "station": "FDF", + "network": "IR", + "distanceDeg": 51.78, + "pTravelTimeSec": 544.9, + "sTravelTimeSec": null + }, + { + "station": "APG", + "network": "IR", + "distanceDeg": 53.49, + "pTravelTimeSec": 559.2, + "sTravelTimeSec": null + }, + { + "station": "ICMP", + "network": "IR", + "distanceDeg": 54.05, + "pTravelTimeSec": 561.4, + "sTravelTimeSec": null + }, + { + "station": "CRPR", + "network": "IR", + "distanceDeg": 54.11, + "pTravelTimeSec": 562.1, + "sTravelTimeSec": null + }, + { + "station": "QSPA", + "network": "IR", + "distanceDeg": 54.12, + "pTravelTimeSec": 562.2, + "sTravelTimeSec": null + }, + { + "station": "SEUS", + "network": "IR", + "distanceDeg": 54.14, + "pTravelTimeSec": 562.4, + "sTravelTimeSec": null + }, + { + "station": "OBIP", + "network": "IR", + "distanceDeg": 54.2, + "pTravelTimeSec": 562.4, + "sTravelTimeSec": null + }, + { + "station": "SABA", + "network": "IR", + "distanceDeg": 54.22, + "pTravelTimeSec": 563.5, + "sTravelTimeSec": null + }, + { + "station": "CELP", + "network": "IR", + "distanceDeg": 54.23, + "pTravelTimeSec": 562.8, + "sTravelTimeSec": null + }, + { + "station": "MTDJ", + "network": "IR", + "distanceDeg": 54.23, + "pTravelTimeSec": 564.1, + "sTravelTimeSec": null + }, + { + "station": "CPD", + "network": "IR", + "distanceDeg": 54.27, + "pTravelTimeSec": 563.1, + "sTravelTimeSec": null + }, + { + "station": "LSP", + "network": "IR", + "distanceDeg": 54.28, + "pTravelTimeSec": 563.6, + "sTravelTimeSec": null + }, + { + "station": "MPR", + "network": "IR", + "distanceDeg": 54.31, + "pTravelTimeSec": 563.4, + "sTravelTimeSec": null + }, + { + "station": "HUMP", + "network": "IR", + "distanceDeg": 54.38, + "pTravelTimeSec": 563.5, + "sTravelTimeSec": null + }, + { + "station": "LRS", + "network": "IR", + "distanceDeg": 54.42, + "pTravelTimeSec": 563.9, + "sTravelTimeSec": null + }, + { + "station": "AOPR", + "network": "IR", + "distanceDeg": 54.48, + "pTravelTimeSec": 564.2, + "sTravelTimeSec": null + }, + { + "station": "CBYP", + "network": "IR", + "distanceDeg": 54.5, + "pTravelTimeSec": 564.1, + "sTravelTimeSec": null + }, + { + "station": "PCDR", + "network": "IR", + "distanceDeg": 54.5, + "pTravelTimeSec": 565, + "sTravelTimeSec": null + }, + { + "station": "AGP", + "network": "IR", + "distanceDeg": 54.5, + "pTravelTimeSec": 570, + "sTravelTimeSec": null + }, + { + "station": "ANWB", + "network": "IR", + "distanceDeg": 54.52, + "pTravelTimeSec": 564, + "sTravelTimeSec": null + }, + { + "station": "AGPR", + "network": "IR", + "distanceDeg": 54.57, + "pTravelTimeSec": 564.3, + "sTravelTimeSec": null + }, + { + "station": "SMRT", + "network": "IR", + "distanceDeg": 54.67, + "pTravelTimeSec": 566.8, + "sTravelTimeSec": null + }, + { + "station": "STVI", + "network": "IR", + "distanceDeg": 54.69, + "pTravelTimeSec": 565.2, + "sTravelTimeSec": null + }, + { + "station": "SDDR", + "network": "IR", + "distanceDeg": 54.82, + "pTravelTimeSec": 565.6, + "sTravelTimeSec": null + }, + { + "station": "SMN1", + "network": "IR", + "distanceDeg": 55.11, + "pTravelTimeSec": 569.3, + "sTravelTimeSec": null + }, + { + "station": "GTBY", + "network": "IR", + "distanceDeg": 55.78, + "pTravelTimeSec": 574.7, + "sTravelTimeSec": null + }, + { + "station": "GRTK", + "network": "IR", + "distanceDeg": 57.34, + "pTravelTimeSec": 586.6, + "sTravelTimeSec": null + }, + { + "station": "TEIG", + "network": "IR", + "distanceDeg": 57.9, + "pTravelTimeSec": 589.7, + "sTravelTimeSec": null + }, + { + "station": "ASCN", + "network": "IR", + "distanceDeg": 60.06, + "pTravelTimeSec": 605.8, + "sTravelTimeSec": null + }, + { + "station": "SBA", + "network": "IR", + "distanceDeg": 60.86, + "pTravelTimeSec": 611.2, + "sTravelTimeSec": null + }, + { + "station": "VNDA", + "network": "IR", + "distanceDeg": 61.89, + "pTravelTimeSec": 620.1, + "sTravelTimeSec": null + }, + { + "station": "SHEL", + "network": "IR", + "distanceDeg": 62.43, + "pTravelTimeSec": 622.1, + "sTravelTimeSec": null + }, + { + "station": "TAOE", + "network": "IR", + "distanceDeg": 66.47, + "pTravelTimeSec": 648.4, + "sTravelTimeSec": null + }, + { + "station": "KVTX", + "network": "IR", + "distanceDeg": 67.57, + "pTravelTimeSec": 655.6, + "sTravelTimeSec": null + }, + { + "station": "TIGA", + "network": "IR", + "distanceDeg": 67.95, + "pTravelTimeSec": 655.9, + "sTravelTimeSec": null + }, + { + "station": "BRAL", + "network": "IR", + "distanceDeg": 68.09, + "pTravelTimeSec": 658.5, + "sTravelTimeSec": null + }, + { + "station": "BBSR", + "network": "IR", + "distanceDeg": 68.57, + "pTravelTimeSec": 660, + "sTravelTimeSec": null + }, + { + "station": "SACV", + "network": "IR", + "distanceDeg": 68.92, + "pTravelTimeSec": 663.1, + "sTravelTimeSec": null + }, + { + "station": "RGRS", + "network": "IR", + "distanceDeg": 69.01, + "pTravelTimeSec": 663.1, + "sTravelTimeSec": null + }, + { + "station": "HKT", + "network": "IR", + "distanceDeg": 69.17, + "pTravelTimeSec": 664.3, + "sTravelTimeSec": null + }, + { + "station": "NHSC", + "network": "IR", + "distanceDeg": 69.2, + "pTravelTimeSec": 664.8, + "sTravelTimeSec": null + }, + { + "station": "PPT", + "network": "IR", + "distanceDeg": 69.27, + "pTravelTimeSec": 666.9, + "sTravelTimeSec": null + }, + { + "station": "GOGA", + "network": "IR", + "distanceDeg": 69.87, + "pTravelTimeSec": 667.9, + "sTravelTimeSec": null + }, + { + "station": "VBMS", + "network": "IR", + "distanceDeg": 69.96, + "pTravelTimeSec": 669.8, + "sTravelTimeSec": null + }, + { + "station": "LRAL", + "network": "IR", + "distanceDeg": 70.05, + "pTravelTimeSec": 669.4, + "sTravelTimeSec": null + }, + { + "station": "NATX", + "network": "IR", + "distanceDeg": 70.54, + "pTravelTimeSec": 673.3, + "sTravelTimeSec": null + }, + { + "station": "JCT", + "network": "IR", + "distanceDeg": 70.91, + "pTravelTimeSec": 675, + "sTravelTimeSec": null + }, + { + "station": "CNNC", + "network": "IR", + "distanceDeg": 71.15, + "pTravelTimeSec": 676.4, + "sTravelTimeSec": null + }, + { + "station": "TX31", + "network": "IR", + "distanceDeg": 71.25, + "pTravelTimeSec": 676.4, + "sTravelTimeSec": null + }, + { + "station": "TXAR", + "network": "IR", + "distanceDeg": 71.25, + "pTravelTimeSec": 677.3, + "sTravelTimeSec": null + }, + { + "station": "KMSC", + "network": "IR", + "distanceDeg": 71.33, + "pTravelTimeSec": 676.9, + "sTravelTimeSec": null + }, + { + "station": "MAW", + "network": "IR", + "distanceDeg": 71.35, + "pTravelTimeSec": 676.5, + "sTravelTimeSec": null + }, + { + "station": "WHTX", + "network": "IR", + "distanceDeg": 71.56, + "pTravelTimeSec": 678.8, + "sTravelTimeSec": null + }, + { + "station": "OXF", + "network": "IR", + "distanceDeg": 71.94, + "pTravelTimeSec": 680.5, + "sTravelTimeSec": null + }, + { + "station": "SWET", + "network": "IR", + "distanceDeg": 72, + "pTravelTimeSec": 681.4, + "sTravelTimeSec": null + }, + { + "station": "CPCT", + "network": "IR", + "distanceDeg": 72.02, + "pTravelTimeSec": 683.4, + "sTravelTimeSec": null + }, + { + "station": "TKL", + "network": "IR", + "distanceDeg": 72.13, + "pTravelTimeSec": 681.3, + "sTravelTimeSec": null + }, + { + "station": "ELIM", + "network": "IR", + "distanceDeg": 72.49, + "pTravelTimeSec": 685.3, + "sTravelTimeSec": null + }, + { + "station": "CER", + "network": "IR", + "distanceDeg": 72.82, + "pTravelTimeSec": 687.7, + "sTravelTimeSec": null + }, + { + "station": "UALR", + "network": "IR", + "distanceDeg": 72.83, + "pTravelTimeSec": 685.8, + "sTravelTimeSec": null + }, + { + "station": "ABTX", + "network": "IR", + "distanceDeg": 72.83, + "pTravelTimeSec": 686.3, + "sTravelTimeSec": null + }, + { + "station": "MIAR", + "network": "IR", + "distanceDeg": 72.9, + "pTravelTimeSec": 686.3, + "sTravelTimeSec": null + }, + { + "station": "TZTN", + "network": "IR", + "distanceDeg": 72.97, + "pTravelTimeSec": 686.5, + "sTravelTimeSec": null + }, + { + "station": "HBAR", + "network": "IR", + "distanceDeg": 73.2, + "pTravelTimeSec": 687.1, + "sTravelTimeSec": null + }, + { + "station": "WVT", + "network": "IR", + "distanceDeg": 73.21, + "pTravelTimeSec": 687.9, + "sTravelTimeSec": null + }, + { + "station": "HALT", + "network": "IR", + "distanceDeg": 73.28, + "pTravelTimeSec": 688.9, + "sTravelTimeSec": null + }, + { + "station": "VWCC", + "network": "IR", + "distanceDeg": 73.29, + "pTravelTimeSec": 688.7, + "sTravelTimeSec": null + }, + { + "station": "BLA", + "network": "IR", + "distanceDeg": 73.3, + "pTravelTimeSec": 689.1, + "sTravelTimeSec": null + }, + { + "station": "BBTS", + "network": "IR", + "distanceDeg": 73.36, + "pTravelTimeSec": 690.8, + "sTravelTimeSec": null + }, + { + "station": "KOMG", + "network": "IR", + "distanceDeg": 73.41, + "pTravelTimeSec": 690.7, + "sTravelTimeSec": null + }, + { + "station": "URVA", + "network": "IR", + "distanceDeg": 73.45, + "pTravelTimeSec": 690.4, + "sTravelTimeSec": null + }, + { + "station": "JSRW", + "network": "IR", + "distanceDeg": 73.59, + "pTravelTimeSec": 690.8, + "sTravelTimeSec": null + }, + { + "station": "GLAT", + "network": "IR", + "distanceDeg": 73.62, + "pTravelTimeSec": 691.8, + "sTravelTimeSec": null + }, + { + "station": "PVMO", + "network": "IR", + "distanceDeg": 73.84, + "pTravelTimeSec": 692.2, + "sTravelTimeSec": null + }, + { + "station": "MNTX", + "network": "IR", + "distanceDeg": 74.02, + "pTravelTimeSec": 692.3, + "sTravelTimeSec": null + }, + { + "station": "CBN", + "network": "IR", + "distanceDeg": 74.07, + "pTravelTimeSec": 693.8, + "sTravelTimeSec": null + }, + { + "station": "GDL2", + "network": "IR", + "distanceDeg": 74.08, + "pTravelTimeSec": 694.1, + "sTravelTimeSec": null + }, + { + "station": "PARMO", + "network": "IR", + "distanceDeg": 74.09, + "pTravelTimeSec": 693.5, + "sTravelTimeSec": null + }, + { + "station": "PBMO", + "network": "IR", + "distanceDeg": 74.34, + "pTravelTimeSec": 694.5, + "sTravelTimeSec": null + }, + { + "station": "SUR", + "network": "IR", + "distanceDeg": 74.43, + "pTravelTimeSec": 696.6, + "sTravelTimeSec": null + }, + { + "station": "CPRX", + "network": "IR", + "distanceDeg": 74.65, + "pTravelTimeSec": 697.8, + "sTravelTimeSec": null + }, + { + "station": "W34A", + "network": "IR", + "distanceDeg": 74.68, + "pTravelTimeSec": 696.7, + "sTravelTimeSec": null + }, + { + "station": "TUL1", + "network": "IR", + "distanceDeg": 74.76, + "pTravelTimeSec": 697.2, + "sTravelTimeSec": null + }, + { + "station": "USIN", + "network": "IR", + "distanceDeg": 74.97, + "pTravelTimeSec": 698.1, + "sTravelTimeSec": null + }, + { + "station": "WCI", + "network": "IR", + "distanceDeg": 75.01, + "pTravelTimeSec": 698.1, + "sTravelTimeSec": null + }, + { + "station": "SIUC", + "network": "IR", + "distanceDeg": 75.01, + "pTravelTimeSec": 698.2, + "sTravelTimeSec": null + }, + { + "station": "MSTX", + "network": "IR", + "distanceDeg": 75.1, + "pTravelTimeSec": 699.2, + "sTravelTimeSec": null + }, + { + "station": "V34A", + "network": "IR", + "distanceDeg": 75.17, + "pTravelTimeSec": 699.4, + "sTravelTimeSec": null + }, + { + "station": "SDMD", + "network": "IR", + "distanceDeg": 75.25, + "pTravelTimeSec": 700.6, + "sTravelTimeSec": null + }, + { + "station": "RAR", + "network": "IR", + "distanceDeg": 75.39, + "pTravelTimeSec": 702.9, + "sTravelTimeSec": null + }, + { + "station": "AMTX", + "network": "IR", + "distanceDeg": 75.57, + "pTravelTimeSec": 702.3, + "sTravelTimeSec": null + }, + { + "station": "121A", + "network": "IR", + "distanceDeg": 75.71, + "pTravelTimeSec": 704.1, + "sTravelTimeSec": null + }, + { + "station": "U34A", + "network": "IR", + "distanceDeg": 75.73, + "pTravelTimeSec": 703.1, + "sTravelTimeSec": null + }, + { + "station": "OLIL", + "network": "IR", + "distanceDeg": 75.8, + "pTravelTimeSec": 702, + "sTravelTimeSec": null + }, + { + "station": "MVL", + "network": "IR", + "distanceDeg": 75.81, + "pTravelTimeSec": 718.5, + "sTravelTimeSec": null + }, + { + "station": "BLO", + "network": "IR", + "distanceDeg": 75.97, + "pTravelTimeSec": 703.5, + "sTravelTimeSec": null + }, + { + "station": "SLM", + "network": "IR", + "distanceDeg": 76.09, + "pTravelTimeSec": 704.8, + "sTravelTimeSec": null + }, + { + "station": "LIC", + "network": "IR", + "distanceDeg": 76.11, + "pTravelTimeSec": 706.1, + "sTravelTimeSec": null + }, + { + "station": "LUPA", + "network": "IR", + "distanceDeg": 76.38, + "pTravelTimeSec": 718.5, + "sTravelTimeSec": null + }, + { + "station": "BRNJ", + "network": "IR", + "distanceDeg": 76.44, + "pTravelTimeSec": 709.9, + "sTravelTimeSec": null + }, + { + "station": "SSPA", + "network": "IR", + "distanceDeg": 76.52, + "pTravelTimeSec": 707.5, + "sTravelTimeSec": null + }, + { + "station": "DBIC", + "network": "IR", + "distanceDeg": 76.53, + "pTravelTimeSec": 708.5, + "sTravelTimeSec": null + }, + { + "station": "ACSO", + "network": "IR", + "distanceDeg": 76.54, + "pTravelTimeSec": 707, + "sTravelTimeSec": null + }, + { + "station": "CPNY", + "network": "IR", + "distanceDeg": 76.54, + "pTravelTimeSec": 708.7, + "sTravelTimeSec": null + }, + { + "station": "BNM", + "network": "IR", + "distanceDeg": 76.67, + "pTravelTimeSec": 709.6, + "sTravelTimeSec": null + }, + { + "station": "PAL", + "network": "IR", + "distanceDeg": 76.76, + "pTravelTimeSec": 718.5, + "sTravelTimeSec": null + }, + { + "station": "TUC", + "network": "IR", + "distanceDeg": 76.77, + "pTravelTimeSec": 709.7, + "sTravelTimeSec": null + }, + { + "station": "LENM", + "network": "IR", + "distanceDeg": 76.82, + "pTravelTimeSec": 710.2, + "sTravelTimeSec": null + }, + { + "station": "LPM", + "network": "IR", + "distanceDeg": 76.82, + "pTravelTimeSec": 710.3, + "sTravelTimeSec": null + }, + { + "station": "ODNJ", + "network": "IR", + "distanceDeg": 76.85, + "pTravelTimeSec": 718.5, + "sTravelTimeSec": null + }, + { + "station": "UPI", + "network": "IR", + "distanceDeg": 76.96, + "pTravelTimeSec": 711, + "sTravelTimeSec": null + }, + { + "station": "WIN", + "network": "IR", + "distanceDeg": 77.06, + "pTravelTimeSec": 712.6, + "sTravelTimeSec": null + }, + { + "station": "YLE", + "network": "IR", + "distanceDeg": 77.06, + "pTravelTimeSec": 718.5, + "sTravelTimeSec": null + }, + { + "station": "LAZ", + "network": "IR", + "distanceDeg": 77.09, + "pTravelTimeSec": 712.2, + "sTravelTimeSec": null + }, + { + "station": "SFIN", + "network": "IR", + "distanceDeg": 77.24, + "pTravelTimeSec": 710.1, + "sTravelTimeSec": null + }, + { + "station": "ANMO", + "network": "IR", + "distanceDeg": 77.32, + "pTravelTimeSec": 713.1, + "sTravelTimeSec": null + }, + { + "station": "KSPA", + "network": "IR", + "distanceDeg": 77.35, + "pTravelTimeSec": 728.5, + "sTravelTimeSec": null + }, + { + "station": "214A", + "network": "IR", + "distanceDeg": 77.36, + "pTravelTimeSec": 713.5, + "sTravelTimeSec": null + }, + { + "station": "BRYW", + "network": "IR", + "distanceDeg": 77.67, + "pTravelTimeSec": 715.3, + "sTravelTimeSec": null + }, + { + "station": "ALLY", + "network": "IR", + "distanceDeg": 77.68, + "pTravelTimeSec": 713.9, + "sTravelTimeSec": null + }, + { + "station": "GRM", + "network": "IR", + "distanceDeg": 77.88, + "pTravelTimeSec": 715.4, + "sTravelTimeSec": null + }, + { + "station": "CASY", + "network": "IR", + "distanceDeg": 77.89, + "pTravelTimeSec": 713.6, + "sTravelTimeSec": null + }, + { + "station": "KSU1", + "network": "IR", + "distanceDeg": 77.98, + "pTravelTimeSec": 715.7, + "sTravelTimeSec": null + }, + { + "station": "BINY", + "network": "IR", + "distanceDeg": 78, + "pTravelTimeSec": 715.6, + "sTravelTimeSec": null + }, + { + "station": "QUA2", + "network": "IR", + "distanceDeg": 78.03, + "pTravelTimeSec": 728.5, + "sTravelTimeSec": null + }, + { + "station": "ERPA", + "network": "IR", + "distanceDeg": 78.13, + "pTravelTimeSec": 716, + "sTravelTimeSec": null + }, + { + "station": "WES", + "network": "IR", + "distanceDeg": 78.14, + "pTravelTimeSec": 728.5, + "sTravelTimeSec": null + }, + { + "station": "HRV", + "network": "IR", + "distanceDeg": 78.26, + "pTravelTimeSec": 718.6, + "sTravelTimeSec": null + }, + { + "station": "TRY", + "network": "IR", + "distanceDeg": 78.48, + "pTravelTimeSec": 719.3, + "sTravelTimeSec": null + }, + { + "station": "AAM", + "network": "IR", + "distanceDeg": 78.66, + "pTravelTimeSec": 718.6, + "sTravelTimeSec": null + }, + { + "station": "HVD", + "network": "IR", + "distanceDeg": 78.73, + "pTravelTimeSec": 721.6, + "sTravelTimeSec": null + }, + { + "station": "W18A", + "network": "IR", + "distanceDeg": 78.75, + "pTravelTimeSec": 721.2, + "sTravelTimeSec": null + }, + { + "station": "ACCN", + "network": "IR", + "distanceDeg": 79.13, + "pTravelTimeSec": 722.2, + "sTravelTimeSec": null + }, + { + "station": "GLA", + "network": "IR", + "distanceDeg": 79.2, + "pTravelTimeSec": 723.7, + "sTravelTimeSec": null + }, + { + "station": "FFD", + "network": "IR", + "distanceDeg": 79.22, + "pTravelTimeSec": 738.5, + "sTravelTimeSec": null + }, + { + "station": "TSUM", + "network": "IR", + "distanceDeg": 79.31, + "pTravelTimeSec": 723.9, + "sTravelTimeSec": null + }, + { + "station": "MCQ", + "network": "IR", + "distanceDeg": 79.34, + "pTravelTimeSec": 726.1, + "sTravelTimeSec": null + }, + { + "station": "HNH", + "network": "IR", + "distanceDeg": 79.45, + "pTravelTimeSec": 738.5, + "sTravelTimeSec": null + }, + { + "station": "SDCO", + "network": "IR", + "distanceDeg": 79.46, + "pTravelTimeSec": 724.7, + "sTravelTimeSec": null + }, + { + "station": "KSCO", + "network": "IR", + "distanceDeg": 79.64, + "pTravelTimeSec": 725.5, + "sTravelTimeSec": null + }, + { + "station": "BOSA", + "network": "IR", + "distanceDeg": 79.71, + "pTravelTimeSec": 725.4, + "sTravelTimeSec": null + }, + { + "station": "NCB", + "network": "IR", + "distanceDeg": 79.72, + "pTravelTimeSec": 724.9, + "sTravelTimeSec": null + }, + { + "station": "MDV", + "network": "IR", + "distanceDeg": 79.74, + "pTravelTimeSec": 725.7, + "sTravelTimeSec": null + }, + { + "station": "BAR", + "network": "IR", + "distanceDeg": 79.77, + "pTravelTimeSec": 726.5, + "sTravelTimeSec": null + }, + { + "station": "WUAZ", + "network": "IR", + "distanceDeg": 79.77, + "pTravelTimeSec": 726.8, + "sTravelTimeSec": null + }, + { + "station": "SCIA", + "network": "IR", + "distanceDeg": 79.85, + "pTravelTimeSec": 725.5, + "sTravelTimeSec": null + }, + { + "station": "LBNH", + "network": "IR", + "distanceDeg": 79.99, + "pTravelTimeSec": 727.7, + "sTravelTimeSec": null + }, + { + "station": "MVCO", + "network": "IR", + "distanceDeg": 80.07, + "pTravelTimeSec": 728.2, + "sTravelTimeSec": null + }, + { + "station": "JFWS", + "network": "IR", + "distanceDeg": 80.24, + "pTravelTimeSec": 727.7, + "sTravelTimeSec": null + }, + { + "station": "PTN", + "network": "IR", + "distanceDeg": 80.34, + "pTravelTimeSec": 738.5, + "sTravelTimeSec": null + }, + { + "station": "WVL", + "network": "IR", + "distanceDeg": 80.36, + "pTravelTimeSec": 738.5, + "sTravelTimeSec": null + }, + { + "station": "LONY", + "network": "IR", + "distanceDeg": 80.38, + "pTravelTimeSec": 728.7, + "sTravelTimeSec": null + }, + { + "station": "PFO", + "network": "IR", + "distanceDeg": 80.43, + "pTravelTimeSec": 730.7, + "sTravelTimeSec": null + }, + { + "station": "BGNE", + "network": "IR", + "distanceDeg": 80.55, + "pTravelTimeSec": 729.4, + "sTravelTimeSec": null + }, + { + "station": "FRNY", + "network": "IR", + "distanceDeg": 80.58, + "pTravelTimeSec": 738.5, + "sTravelTimeSec": null + }, + { + "station": "SWZ", + "network": "IR", + "distanceDeg": 80.59, + "pTravelTimeSec": 730.4, + "sTravelTimeSec": null + }, + { + "station": "EMMW", + "network": "IR", + "distanceDeg": 80.61, + "pTravelTimeSec": 738.5, + "sTravelTimeSec": null + }, + { + "station": "BFZ", + "network": "IR", + "distanceDeg": 80.68, + "pTravelTimeSec": 738.5, + "sTravelTimeSec": null + }, + { + "station": "ODZ", + "network": "IR", + "distanceDeg": 80.9, + "pTravelTimeSec": 731.7, + "sTravelTimeSec": null + }, + { + "station": "PV01", + "network": "IR", + "distanceDeg": 80.92, + "pTravelTimeSec": 732.6, + "sTravelTimeSec": null + }, + { + "station": "LDFC", + "network": "IR", + "distanceDeg": 81.02, + "pTravelTimeSec": 734, + "sTravelTimeSec": null + }, + { + "station": "PV05", + "network": "IR", + "distanceDeg": 81.07, + "pTravelTimeSec": 733.4, + "sTravelTimeSec": null + }, + { + "station": "KHZ", + "network": "IR", + "distanceDeg": 81.1, + "pTravelTimeSec": 732.7, + "sTravelTimeSec": null + }, + { + "station": "SNZO", + "network": "IR", + "distanceDeg": 81.17, + "pTravelTimeSec": 736.1, + "sTravelTimeSec": null + }, + { + "station": "OGNE", + "network": "IR", + "distanceDeg": 81.22, + "pTravelTimeSec": 733.7, + "sTravelTimeSec": null + }, + { + "station": "SMCO", + "network": "IR", + "distanceDeg": 81.26, + "pTravelTimeSec": 734.9, + "sTravelTimeSec": null + }, + { + "station": "PV04", + "network": "IR", + "distanceDeg": 81.28, + "pTravelTimeSec": 734.5, + "sTravelTimeSec": null + }, + { + "station": "PV10", + "network": "IR", + "distanceDeg": 81.31, + "pTravelTimeSec": 734.1, + "sTravelTimeSec": null + }, + { + "station": "ISCO", + "network": "IR", + "distanceDeg": 81.34, + "pTravelTimeSec": 734.7, + "sTravelTimeSec": null + }, + { + "station": "KSD", + "network": "IR", + "distanceDeg": 81.5, + "pTravelTimeSec": 736.7, + "sTravelTimeSec": null + }, + { + "station": "BKZ", + "network": "IR", + "distanceDeg": 81.51, + "pTravelTimeSec": 748.5, + "sTravelTimeSec": null + }, + { + "station": "SEK", + "network": "IR", + "distanceDeg": 81.57, + "pTravelTimeSec": 734.9, + "sTravelTimeSec": null + }, + { + "station": "EKU", + "network": "IR", + "distanceDeg": 81.57, + "pTravelTimeSec": 736.7, + "sTravelTimeSec": null + }, + { + "station": "RPZ", + "network": "IR", + "distanceDeg": 81.58, + "pTravelTimeSec": 736.4, + "sTravelTimeSec": null + }, + { + "station": "KNB", + "network": "IR", + "distanceDeg": 81.65, + "pTravelTimeSec": 737.2, + "sTravelTimeSec": null + }, + { + "station": "WHZ", + "network": "IR", + "distanceDeg": 81.69, + "pTravelTimeSec": 735.1, + "sTravelTimeSec": null + }, + { + "station": "MWC", + "network": "IR", + "distanceDeg": 81.69, + "pTravelTimeSec": 737.1, + "sTravelTimeSec": null + }, + { + "station": "RUDU", + "network": "IR", + "distanceDeg": 81.71, + "pTravelTimeSec": 737.7, + "sTravelTimeSec": null + }, + { + "station": "PASC", + "network": "IR", + "distanceDeg": 81.71, + "pTravelTimeSec": 737.7, + "sTravelTimeSec": null + }, + { + "station": "URZ", + "network": "IR", + "distanceDeg": 81.72, + "pTravelTimeSec": 737, + "sTravelTimeSec": null + }, + { + "station": "BFSD", + "network": "IR", + "distanceDeg": 81.83, + "pTravelTimeSec": 737.3, + "sTravelTimeSec": null + }, + { + "station": "GSC", + "network": "IR", + "distanceDeg": 81.98, + "pTravelTimeSec": 738.7, + "sTravelTimeSec": null + }, + { + "station": "MMU", + "network": "IR", + "distanceDeg": 82.04, + "pTravelTimeSec": 738.5, + "sTravelTimeSec": null + }, + { + "station": "LBTB", + "network": "IR", + "distanceDeg": 82.05, + "pTravelTimeSec": 737.8, + "sTravelTimeSec": null + }, + { + "station": "PRYS", + "network": "IR", + "distanceDeg": 82.21, + "pTravelTimeSec": 738.8, + "sTravelTimeSec": null + }, + { + "station": "SHPR", + "network": "IR", + "distanceDeg": 82.23, + "pTravelTimeSec": 740, + "sTravelTimeSec": null + }, + { + "station": "ICU", + "network": "IR", + "distanceDeg": 82.23, + "pTravelTimeSec": 740.1, + "sTravelTimeSec": null + }, + { + "station": "OSI", + "network": "IR", + "distanceDeg": 82.33, + "pTravelTimeSec": 740.2, + "sTravelTimeSec": null + }, + { + "station": "CCUT", + "network": "IR", + "distanceDeg": 82.33, + "pTravelTimeSec": 741.1, + "sTravelTimeSec": null + }, + { + "station": "ECSD", + "network": "IR", + "distanceDeg": 82.35, + "pTravelTimeSec": 738.9, + "sTravelTimeSec": null + }, + { + "station": "DCZ", + "network": "IR", + "distanceDeg": 82.38, + "pTravelTimeSec": 743.9, + "sTravelTimeSec": null + }, + { + "station": "KSR", + "network": "IR", + "distanceDeg": 82.51, + "pTravelTimeSec": 740.3, + "sTravelTimeSec": null + }, + { + "station": "SRU", + "network": "IR", + "distanceDeg": 82.52, + "pTravelTimeSec": 740.7, + "sTravelTimeSec": null + }, + { + "station": "PQI", + "network": "IR", + "distanceDeg": 82.53, + "pTravelTimeSec": 748.5, + "sTravelTimeSec": null + }, + { + "station": "O20A", + "network": "IR", + "distanceDeg": 82.56, + "pTravelTimeSec": 741, + "sTravelTimeSec": null + }, + { + "station": "ARUT", + "network": "IR", + "distanceDeg": 82.57, + "pTravelTimeSec": 741.5, + "sTravelTimeSec": null + }, + { + "station": "OWUT", + "network": "IR", + "distanceDeg": 82.59, + "pTravelTimeSec": 742, + "sTravelTimeSec": null + }, + { + "station": "PHWY", + "network": "IR", + "distanceDeg": 82.63, + "pTravelTimeSec": 741.3, + "sTravelTimeSec": null + }, + { + "station": "DWU", + "network": "IR", + "distanceDeg": 82.65, + "pTravelTimeSec": 740.2, + "sTravelTimeSec": null + }, + { + "station": "MSU", + "network": "IR", + "distanceDeg": 82.66, + "pTravelTimeSec": 742.2, + "sTravelTimeSec": null + }, + { + "station": "KLOF", + "network": "IR", + "distanceDeg": 82.73, + "pTravelTimeSec": 742.4, + "sTravelTimeSec": null + }, + { + "station": "ROA", + "network": "IR", + "distanceDeg": 82.94, + "pTravelTimeSec": 743.5, + "sTravelTimeSec": null + }, + { + "station": "SPMN", + "network": "IR", + "distanceDeg": 82.95, + "pTravelTimeSec": 741.2, + "sTravelTimeSec": null + }, + { + "station": "TMUT", + "network": "IR", + "distanceDeg": 82.95, + "pTravelTimeSec": 743.6, + "sTravelTimeSec": null + }, + { + "station": "ISA", + "network": "IR", + "distanceDeg": 83.06, + "pTravelTimeSec": 744.4, + "sTravelTimeSec": null + }, + { + "station": "ARGU", + "network": "IR", + "distanceDeg": 83.14, + "pTravelTimeSec": 744.6, + "sTravelTimeSec": null + }, + { + "station": "IMU", + "network": "IR", + "distanceDeg": 83.17, + "pTravelTimeSec": 745, + "sTravelTimeSec": null + }, + { + "station": "ERPM", + "network": "IR", + "distanceDeg": 83.19, + "pTravelTimeSec": 744.5, + "sTravelTimeSec": null + }, + { + "station": "FLU", + "network": "IR", + "distanceDeg": 83.4, + "pTravelTimeSec": 745.9, + "sTravelTimeSec": null + }, + { + "station": "RWWY", + "network": "IR", + "distanceDeg": 83.57, + "pTravelTimeSec": 758.5, + "sTravelTimeSec": null + }, + { + "station": "SLR", + "network": "IR", + "distanceDeg": 83.58, + "pTravelTimeSec": 746.5, + "sTravelTimeSec": null + }, + { + "station": "BRSD", + "network": "IR", + "distanceDeg": 83.6, + "pTravelTimeSec": 745.7, + "sTravelTimeSec": null + }, + { + "station": "MPU", + "network": "IR", + "distanceDeg": 83.73, + "pTravelTimeSec": 747.1, + "sTravelTimeSec": null + }, + { + "station": "NLU", + "network": "IR", + "distanceDeg": 83.85, + "pTravelTimeSec": 748, + "sTravelTimeSec": null + }, + { + "station": "WMUT", + "network": "IR", + "distanceDeg": 83.86, + "pTravelTimeSec": 747.9, + "sTravelTimeSec": null + }, + { + "station": "DAU", + "network": "IR", + "distanceDeg": 83.93, + "pTravelTimeSec": 750.8, + "sTravelTimeSec": null + }, + { + "station": "R11A", + "network": "IR", + "distanceDeg": 83.95, + "pTravelTimeSec": 749, + "sTravelTimeSec": null + }, + { + "station": "RAO", + "network": "IR", + "distanceDeg": 84.15, + "pTravelTimeSec": 752.3, + "sTravelTimeSec": null + }, + { + "station": "JLU", + "network": "IR", + "distanceDeg": 84.17, + "pTravelTimeSec": 749.3, + "sTravelTimeSec": null + }, + { + "station": "K22A", + "network": "IR", + "distanceDeg": 84.19, + "pTravelTimeSec": 749.1, + "sTravelTimeSec": null + }, + { + "station": "FSU", + "network": "IR", + "distanceDeg": 84.19, + "pTravelTimeSec": 749.9, + "sTravelTimeSec": null + }, + { + "station": "DUG", + "network": "IR", + "distanceDeg": 84.35, + "pTravelTimeSec": 750.3, + "sTravelTimeSec": null + }, + { + "station": "CTU", + "network": "IR", + "distanceDeg": 84.36, + "pTravelTimeSec": 749.8, + "sTravelTimeSec": null + }, + { + "station": "TPH", + "network": "IR", + "distanceDeg": 84.45, + "pTravelTimeSec": 751.1, + "sTravelTimeSec": null + }, + { + "station": "TCUT", + "network": "IR", + "distanceDeg": 84.6, + "pTravelTimeSec": 751.5, + "sTravelTimeSec": null + }, + { + "station": "SAIU", + "network": "IR", + "distanceDeg": 84.67, + "pTravelTimeSec": 751.3, + "sTravelTimeSec": null + }, + { + "station": "FPU", + "network": "IR", + "distanceDeg": 84.68, + "pTravelTimeSec": 751.9, + "sTravelTimeSec": null + }, + { + "station": "RSSD", + "network": "IR", + "distanceDeg": 84.72, + "pTravelTimeSec": 751.3, + "sTravelTimeSec": null + }, + { + "station": "MCU", + "network": "IR", + "distanceDeg": 84.93, + "pTravelTimeSec": 753, + "sTravelTimeSec": null + }, + { + "station": "RSUT", + "network": "IR", + "distanceDeg": 85.05, + "pTravelTimeSec": 753.5, + "sTravelTimeSec": null + }, + { + "station": "BGU", + "network": "IR", + "distanceDeg": 85.06, + "pTravelTimeSec": 753.4, + "sTravelTimeSec": null + }, + { + "station": "GZU", + "network": "IR", + "distanceDeg": 85.08, + "pTravelTimeSec": 753.7, + "sTravelTimeSec": null + }, + { + "station": "SPUT", + "network": "IR", + "distanceDeg": 85.16, + "pTravelTimeSec": 754, + "sTravelTimeSec": null + }, + { + "station": "NV11", + "network": "IR", + "distanceDeg": 85.16, + "pTravelTimeSec": 755.1, + "sTravelTimeSec": null + }, + { + "station": "EPU", + "network": "IR", + "distanceDeg": 85.22, + "pTravelTimeSec": 754.2, + "sTravelTimeSec": null + }, + { + "station": "NV01", + "network": "IR", + "distanceDeg": 85.23, + "pTravelTimeSec": 754.5, + "sTravelTimeSec": null + }, + { + "station": "NVAR", + "network": "IR", + "distanceDeg": 85.23, + "pTravelTimeSec": 755.3, + "sTravelTimeSec": null + }, + { + "station": "BMUT", + "network": "IR", + "distanceDeg": 85.25, + "pTravelTimeSec": 754.3, + "sTravelTimeSec": null + }, + { + "station": "HDU", + "network": "IR", + "distanceDeg": 85.32, + "pTravelTimeSec": 754.6, + "sTravelTimeSec": null + }, + { + "station": "LTU", + "network": "IR", + "distanceDeg": 85.32, + "pTravelTimeSec": 754.6, + "sTravelTimeSec": null + }, + { + "station": "EYMN", + "network": "IR", + "distanceDeg": 85.33, + "pTravelTimeSec": 753.4, + "sTravelTimeSec": null + }, + { + "station": "PDAR", + "network": "IR", + "distanceDeg": 85.34, + "pTravelTimeSec": 754.2, + "sTravelTimeSec": null + }, + { + "station": "BW06", + "network": "IR", + "distanceDeg": 85.34, + "pTravelTimeSec": 754.4, + "sTravelTimeSec": null + }, + { + "station": "SAO", + "network": "IR", + "distanceDeg": 85.37, + "pTravelTimeSec": 756, + "sTravelTimeSec": null + }, + { + "station": "MTUT", + "network": "IR", + "distanceDeg": 85.5, + "pTravelTimeSec": 755.3, + "sTravelTimeSec": null + }, + { + "station": "TOA0", + "network": "IR", + "distanceDeg": 85.59, + "pTravelTimeSec": 756, + "sTravelTimeSec": null + }, + { + "station": "TORD", + "network": "IR", + "distanceDeg": 85.59, + "pTravelTimeSec": 756.2, + "sTravelTimeSec": null + }, + { + "station": "BEI", + "network": "IR", + "distanceDeg": 85.6, + "pTravelTimeSec": 756, + "sTravelTimeSec": null + }, + { + "station": "HVU", + "network": "IR", + "distanceDeg": 85.69, + "pTravelTimeSec": 756.4, + "sTravelTimeSec": null + }, + { + "station": "ELK", + "network": "IR", + "distanceDeg": 85.81, + "pTravelTimeSec": 757.5, + "sTravelTimeSec": null + }, + { + "station": "OUZ", + "network": "IR", + "distanceDeg": 85.84, + "pTravelTimeSec": 760.2, + "sTravelTimeSec": null + }, + { + "station": "CMB", + "network": "IR", + "distanceDeg": 85.88, + "pTravelTimeSec": 757.8, + "sTravelTimeSec": null + }, + { + "station": "AHID", + "network": "IR", + "distanceDeg": 85.9, + "pTravelTimeSec": 757.3, + "sTravelTimeSec": null + }, + { + "station": "DRLN", + "network": "IR", + "distanceDeg": 86.1, + "pTravelTimeSec": 758.5, + "sTravelTimeSec": null + }, + { + "station": "REDW", + "network": "IR", + "distanceDeg": 86.33, + "pTravelTimeSec": 768.5, + "sTravelTimeSec": null + }, + { + "station": "SNOW", + "network": "IR", + "distanceDeg": 86.38, + "pTravelTimeSec": 768.5, + "sTravelTimeSec": null + }, + { + "station": "BMN", + "network": "IR", + "distanceDeg": 86.39, + "pTravelTimeSec": 759.6, + "sTravelTimeSec": null + }, + { + "station": "LOHW", + "network": "IR", + "distanceDeg": 86.45, + "pTravelTimeSec": 768.5, + "sTravelTimeSec": null + }, + { + "station": "TPAW", + "network": "IR", + "distanceDeg": 86.47, + "pTravelTimeSec": 760.4, + "sTravelTimeSec": null + }, + { + "station": "SAC", + "network": "IR", + "distanceDeg": 86.49, + "pTravelTimeSec": 764.5, + "sTravelTimeSec": null + }, + { + "station": "AGMN", + "network": "IR", + "distanceDeg": 86.51, + "pTravelTimeSec": 759.6, + "sTravelTimeSec": null + }, + { + "station": "FXWY", + "network": "IR", + "distanceDeg": 86.63, + "pTravelTimeSec": 760.9, + "sTravelTimeSec": null + }, + { + "station": "XMAS", + "network": "IR", + "distanceDeg": 86.78, + "pTravelTimeSec": 766.6, + "sTravelTimeSec": null + }, + { + "station": "IMW", + "network": "IR", + "distanceDeg": 86.82, + "pTravelTimeSec": 762.2, + "sTravelTimeSec": null + }, + { + "station": "MSNA", + "network": "IR", + "distanceDeg": 86.89, + "pTravelTimeSec": 761.8, + "sTravelTimeSec": null + }, + { + "station": "FLWY", + "network": "IR", + "distanceDeg": 86.9, + "pTravelTimeSec": 762.9, + "sTravelTimeSec": null + }, + { + "station": "H17A", + "network": "IR", + "distanceDeg": 87.12, + "pTravelTimeSec": 764.8, + "sTravelTimeSec": null + }, + { + "station": "MCID", + "network": "IR", + "distanceDeg": 87.16, + "pTravelTimeSec": 764.1, + "sTravelTimeSec": null + }, + { + "station": "MOPA", + "network": "IR", + "distanceDeg": 87.17, + "pTravelTimeSec": 765.3, + "sTravelTimeSec": null + }, + { + "station": "LKWY", + "network": "IR", + "distanceDeg": 87.21, + "pTravelTimeSec": 764.6, + "sTravelTimeSec": null + }, + { + "station": "YFT", + "network": "IR", + "distanceDeg": 87.26, + "pTravelTimeSec": 765.3, + "sTravelTimeSec": null + }, + { + "station": "RLMT", + "network": "IR", + "distanceDeg": 87.3, + "pTravelTimeSec": 764, + "sTravelTimeSec": null + }, + { + "station": "YNR", + "network": "IR", + "distanceDeg": 87.44, + "pTravelTimeSec": 766.2, + "sTravelTimeSec": null + }, + { + "station": "YPM", + "network": "IR", + "distanceDeg": 87.45, + "pTravelTimeSec": 765.9, + "sTravelTimeSec": null + }, + { + "station": "YMR", + "network": "IR", + "distanceDeg": 87.5, + "pTravelTimeSec": 766.1, + "sTravelTimeSec": null + }, + { + "station": "YHH", + "network": "IR", + "distanceDeg": 87.56, + "pTravelTimeSec": 766.2, + "sTravelTimeSec": null + }, + { + "station": "LAO", + "network": "IR", + "distanceDeg": 87.71, + "pTravelTimeSec": 765.6, + "sTravelTimeSec": null + }, + { + "station": "QLMT", + "network": "IR", + "distanceDeg": 87.8, + "pTravelTimeSec": 767.9, + "sTravelTimeSec": null + }, + { + "station": "HLID", + "network": "IR", + "distanceDeg": 87.84, + "pTravelTimeSec": 767.3, + "sTravelTimeSec": null + }, + { + "station": "HOPS", + "network": "IR", + "distanceDeg": 87.92, + "pTravelTimeSec": 767.7, + "sTravelTimeSec": null + }, + { + "station": "MFID", + "network": "IR", + "distanceDeg": 88.28, + "pTravelTimeSec": 770.1, + "sTravelTimeSec": null + }, + { + "station": "MCMT", + "network": "IR", + "distanceDeg": 88.32, + "pTravelTimeSec": 770.4, + "sTravelTimeSec": null + }, + { + "station": "ULM", + "network": "IR", + "distanceDeg": 88.36, + "pTravelTimeSec": 768.2, + "sTravelTimeSec": null + }, + { + "station": "BOZ", + "network": "IR", + "distanceDeg": 88.58, + "pTravelTimeSec": 770.4, + "sTravelTimeSec": null + }, + { + "station": "WVOR", + "network": "IR", + "distanceDeg": 88.64, + "pTravelTimeSec": 771.1, + "sTravelTimeSec": null + }, + { + "station": "DLMT", + "network": "IR", + "distanceDeg": 88.68, + "pTravelTimeSec": 778.5, + "sTravelTimeSec": null + }, + { + "station": "KCPM", + "network": "IR", + "distanceDeg": 88.71, + "pTravelTimeSec": 773, + "sTravelTimeSec": null + }, + { + "station": "DGMT", + "network": "IR", + "distanceDeg": 88.72, + "pTravelTimeSec": 770.8, + "sTravelTimeSec": null + }, + { + "station": "PAF", + "network": "IR", + "distanceDeg": 88.82, + "pTravelTimeSec": 774.7, + "sTravelTimeSec": null + }, + { + "station": "LCCM", + "network": "IR", + "distanceDeg": 88.83, + "pTravelTimeSec": 772.1, + "sTravelTimeSec": null + }, + { + "station": "WDC", + "network": "IR", + "distanceDeg": 88.91, + "pTravelTimeSec": 771.8, + "sTravelTimeSec": null + }, + { + "station": "AFI", + "network": "IR", + "distanceDeg": 88.92, + "pTravelTimeSec": 776.7, + "sTravelTimeSec": null + }, + { + "station": "MOD", + "network": "IR", + "distanceDeg": 88.94, + "pTravelTimeSec": 773.4, + "sTravelTimeSec": null + }, + { + "station": "LRM", + "network": "IR", + "distanceDeg": 89.02, + "pTravelTimeSec": 773.2, + "sTravelTimeSec": null + }, + { + "station": "KMRM", + "network": "IR", + "distanceDeg": 89.18, + "pTravelTimeSec": 776.4, + "sTravelTimeSec": null + }, + { + "station": "LKVW", + "network": "IR", + "distanceDeg": 89.22, + "pTravelTimeSec": 774.5, + "sTravelTimeSec": null + }, + { + "station": "HRY", + "network": "IR", + "distanceDeg": 89.57, + "pTravelTimeSec": 775, + "sTravelTimeSec": null + }, + { + "station": "KHMM", + "network": "IR", + "distanceDeg": 89.7, + "pTravelTimeSec": 780.6, + "sTravelTimeSec": null + }, + { + "station": "LSZ", + "network": "IR", + "distanceDeg": 89.8, + "pTravelTimeSec": 778, + "sTravelTimeSec": null + }, + { + "station": "K05A", + "network": "IR", + "distanceDeg": 89.86, + "pTravelTimeSec": 777.5, + "sTravelTimeSec": null + }, + { + "station": "YBH", + "network": "IR", + "distanceDeg": 89.89, + "pTravelTimeSec": 777.7, + "sTravelTimeSec": null + }, + { + "station": "EGMT", + "network": "IR", + "distanceDeg": 90.01, + "pTravelTimeSec": 776, + "sTravelTimeSec": null + }, + { + "station": "BMO", + "network": "IR", + "distanceDeg": 90.06, + "pTravelTimeSec": 777.2, + "sTravelTimeSec": null + }, + { + "station": "CHMT", + "network": "IR", + "distanceDeg": 90.25, + "pTravelTimeSec": 778.1, + "sTravelTimeSec": null + }, + { + "station": "I07A", + "network": "IR", + "distanceDeg": 90.34, + "pTravelTimeSec": 779.5, + "sTravelTimeSec": null + }, + { + "station": "MSO", + "network": "IR", + "distanceDeg": 90.42, + "pTravelTimeSec": 778.6, + "sTravelTimeSec": null + }, + { + "station": "SLMT", + "network": "IR", + "distanceDeg": 90.61, + "pTravelTimeSec": 780.2, + "sTravelTimeSec": null + }, + { + "station": "HUMO", + "network": "IR", + "distanceDeg": 90.7, + "pTravelTimeSec": 783.6, + "sTravelTimeSec": null + }, + { + "station": "PINOR", + "network": "IR", + "distanceDeg": 90.71, + "pTravelTimeSec": 781.6, + "sTravelTimeSec": null + }, + { + "station": "SCHQ", + "network": "IR", + "distanceDeg": 90.74, + "pTravelTimeSec": 779.2, + "sTravelTimeSec": null + }, + { + "station": "F10A", + "network": "IR", + "distanceDeg": 90.96, + "pTravelTimeSec": 781.7, + "sTravelTimeSec": null + }, + { + "station": "KBO", + "network": "IR", + "distanceDeg": 90.97, + "pTravelTimeSec": 783.8, + "sTravelTimeSec": null + }, + { + "station": "SWMT", + "network": "IR", + "distanceDeg": 91.02, + "pTravelTimeSec": 782, + "sTravelTimeSec": null + }, + { + "station": "G08A", + "network": "IR", + "distanceDeg": 91.1, + "pTravelTimeSec": 783, + "sTravelTimeSec": null + }, + { + "station": "JTMT", + "network": "IR", + "distanceDeg": 91.32, + "pTravelTimeSec": 782.7, + "sTravelTimeSec": null + }, + { + "station": "YBMT", + "network": "IR", + "distanceDeg": 91.33, + "pTravelTimeSec": 783.4, + "sTravelTimeSec": null + }, + { + "station": "KEBM", + "network": "IR", + "distanceDeg": 91.54, + "pTravelTimeSec": 798.5, + "sTravelTimeSec": null + }, + { + "station": "BLMT", + "network": "IR", + "distanceDeg": 91.58, + "pTravelTimeSec": 786.5, + "sTravelTimeSec": null + }, + { + "station": "BSMT", + "network": "IR", + "distanceDeg": 91.6, + "pTravelTimeSec": 784.2, + "sTravelTimeSec": null + }, + { + "station": "CROR", + "network": "IR", + "distanceDeg": 91.7, + "pTravelTimeSec": 786, + "sTravelTimeSec": null + }, + { + "station": "G06A", + "network": "IR", + "distanceDeg": 91.75, + "pTravelTimeSec": 786.3, + "sTravelTimeSec": null + }, + { + "station": "E09A", + "network": "IR", + "distanceDeg": 91.76, + "pTravelTimeSec": 784.8, + "sTravelTimeSec": null + }, + { + "station": "H04A", + "network": "IR", + "distanceDeg": 91.98, + "pTravelTimeSec": 785.7, + "sTravelTimeSec": null + }, + { + "station": "BLTW", + "network": "IR", + "distanceDeg": 92.1, + "pTravelTimeSec": 787.9, + "sTravelTimeSec": null + }, + { + "station": "H2OWA", + "network": "IR", + "distanceDeg": 92.18, + "pTravelTimeSec": 787.9, + "sTravelTimeSec": null + }, + { + "station": "HAWA", + "network": "IR", + "distanceDeg": 92.22, + "pTravelTimeSec": 787.4, + "sTravelTimeSec": null + }, + { + "station": "WALA", + "network": "IR", + "distanceDeg": 92.3, + "pTravelTimeSec": 787.7, + "sTravelTimeSec": null + }, + { + "station": "SNIWA", + "network": "IR", + "distanceDeg": 92.33, + "pTravelTimeSec": 789.6, + "sTravelTimeSec": null + }, + { + "station": "WRD", + "network": "IR", + "distanceDeg": 92.4, + "pTravelTimeSec": 789.2, + "sTravelTimeSec": null + }, + { + "station": "COR", + "network": "IR", + "distanceDeg": 92.4, + "pTravelTimeSec": 790, + "sTravelTimeSec": null + }, + { + "station": "E07A", + "network": "IR", + "distanceDeg": 92.49, + "pTravelTimeSec": 788.9, + "sTravelTimeSec": null + }, + { + "station": "D08A", + "network": "IR", + "distanceDeg": 92.52, + "pTravelTimeSec": 788.5, + "sTravelTimeSec": null + }, + { + "station": "FHE", + "network": "IR", + "distanceDeg": 92.66, + "pTravelTimeSec": 792, + "sTravelTimeSec": null + }, + { + "station": "OD2", + "network": "IR", + "distanceDeg": 92.7, + "pTravelTimeSec": 789.6, + "sTravelTimeSec": null + }, + { + "station": "NEW", + "network": "IR", + "distanceDeg": 92.8, + "pTravelTimeSec": 788.9, + "sTravelTimeSec": null + }, + { + "station": "C09A", + "network": "IR", + "distanceDeg": 92.87, + "pTravelTimeSec": 790.5, + "sTravelTimeSec": null + }, + { + "station": "ASR", + "network": "IR", + "distanceDeg": 92.89, + "pTravelTimeSec": 791, + "sTravelTimeSec": null + }, + { + "station": "EBG", + "network": "IR", + "distanceDeg": 93.06, + "pTravelTimeSec": 792.1, + "sTravelTimeSec": null + }, + { + "station": "F04A", + "network": "IR", + "distanceDeg": 93.07, + "pTravelTimeSec": 798.5, + "sTravelTimeSec": null + }, + { + "station": "TAU", + "network": "IR", + "distanceDeg": 93.22, + "pTravelTimeSec": 793.4, + "sTravelTimeSec": null + }, + { + "station": "LTY", + "network": "IR", + "distanceDeg": 93.38, + "pTravelTimeSec": 792.7, + "sTravelTimeSec": null + }, + { + "station": "LON", + "network": "IR", + "distanceDeg": 93.45, + "pTravelTimeSec": 792, + "sTravelTimeSec": null + }, + { + "station": "WTV", + "network": "IR", + "distanceDeg": 93.45, + "pTravelTimeSec": 792.7, + "sTravelTimeSec": null + }, + { + "station": "FMW", + "network": "IR", + "distanceDeg": 93.54, + "pTravelTimeSec": 795.2, + "sTravelTimeSec": null + }, + { + "station": "F03A", + "network": "IR", + "distanceDeg": 93.56, + "pTravelTimeSec": 798.5, + "sTravelTimeSec": null + }, + { + "station": "MDT", + "network": "IR", + "distanceDeg": 93.69, + "pTravelTimeSec": 795.3, + "sTravelTimeSec": null + }, + { + "station": "B08A", + "network": "IR", + "distanceDeg": 93.73, + "pTravelTimeSec": 793.8, + "sTravelTimeSec": null + }, + { + "station": "D05A", + "network": "IR", + "distanceDeg": 93.87, + "pTravelTimeSec": 795.1, + "sTravelTimeSec": null + }, + { + "station": "FFC", + "network": "IR", + "distanceDeg": 93.88, + "pTravelTimeSec": 794.7, + "sTravelTimeSec": null + }, + { + "station": "E03A", + "network": "IR", + "distanceDeg": 94.04, + "pTravelTimeSec": 796.2, + "sTravelTimeSec": null + }, + { + "station": "MSVF", + "network": "IR", + "distanceDeg": 94.26, + "pTravelTimeSec": 802, + "sTravelTimeSec": null + }, + { + "station": "TAM", + "network": "IR", + "distanceDeg": 94.37, + "pTravelTimeSec": 798.3, + "sTravelTimeSec": null + }, + { + "station": "B06A", + "network": "IR", + "distanceDeg": 94.72, + "pTravelTimeSec": 808.5, + "sTravelTimeSec": null + }, + { + "station": "NLWA", + "network": "IR", + "distanceDeg": 94.83, + "pTravelTimeSec": 799.7, + "sTravelTimeSec": null + }, + { + "station": "CMW", + "network": "IR", + "distanceDeg": 94.9, + "pTravelTimeSec": 799.4, + "sTravelTimeSec": null + }, + { + "station": "OBC", + "network": "IR", + "distanceDeg": 95.42, + "pTravelTimeSec": 805.9, + "sTravelTimeSec": null + }, + { + "station": "PGC", + "network": "IR", + "distanceDeg": 95.63, + "pTravelTimeSec": 805.4, + "sTravelTimeSec": null + }, + { + "station": "EDM", + "network": "IR", + "distanceDeg": 95.65, + "pTravelTimeSec": 801.2, + "sTravelTimeSec": null + }, + { + "station": "POHA", + "network": "IR", + "distanceDeg": 95.71, + "pTravelTimeSec": 818.5, + "sTravelTimeSec": null + }, + { + "station": "FCC", + "network": "IR", + "distanceDeg": 96.17, + "pTravelTimeSec": 804, + "sTravelTimeSec": null + }, + { + "station": "MTE", + "network": "IR", + "distanceDeg": 96.96, + "pTravelTimeSec": 810.6, + "sTravelTimeSec": null + }, + { + "station": "PAB", + "network": "IR", + "distanceDeg": 98.24, + "pTravelTimeSec": 815.8, + "sTravelTimeSec": null + }, + { + "station": "ESDC", + "network": "IR", + "distanceDeg": 98.55, + "pTravelTimeSec": 816.2, + "sTravelTimeSec": null + }, + { + "station": "ESLA", + "network": "IR", + "distanceDeg": 98.55, + "pTravelTimeSec": 816.9, + "sTravelTimeSec": null + }, + { + "station": "KIP", + "network": "IR", + "distanceDeg": 98.56, + "pTravelTimeSec": 828.5, + "sTravelTimeSec": null + }, + { + "station": "ES19", + "network": "IR", + "distanceDeg": 98.6, + "pTravelTimeSec": 818.2, + "sTravelTimeSec": null + }, + { + "station": "ABPO", + "network": "IR", + "distanceDeg": 101.21, + "pTravelTimeSec": 838.5, + "sTravelTimeSec": null + }, + { + "station": "ARMA", + "network": "IR", + "distanceDeg": 101.71, + "pTravelTimeSec": 838.5, + "sTravelTimeSec": null + }, + { + "station": "SJPF", + "network": "IR", + "distanceDeg": 102.31, + "pTravelTimeSec": 835.5, + "sTravelTimeSec": null + }, + { + "station": "ETSF", + "network": "IR", + "distanceDeg": 102.57, + "pTravelTimeSec": 836.7, + "sTravelTimeSec": null + }, + { + "station": "EPF", + "network": "IR", + "distanceDeg": 103.17, + "pTravelTimeSec": 839.4, + "sTravelTimeSec": null + }, + { + "station": "QUIF", + "network": "IR", + "distanceDeg": 104.22, + "pTravelTimeSec": 843, + "sTravelTimeSec": null + }, + { + "station": "ROSF", + "network": "IR", + "distanceDeg": 104.42, + "pTravelTimeSec": 843.7, + "sTravelTimeSec": null + }, + { + "station": "MTLF", + "network": "IR", + "distanceDeg": 104.46, + "pTravelTimeSec": 844.4, + "sTravelTimeSec": null + }, + { + "station": "LFF", + "network": "IR", + "distanceDeg": 104.55, + "pTravelTimeSec": 845, + "sTravelTimeSec": null + }, + { + "station": "CRAG", + "network": "IR", + "distanceDeg": 104.68, + "pTravelTimeSec": 858.5, + "sTravelTimeSec": null + }, + { + "station": "MFF", + "network": "IR", + "distanceDeg": 105.04, + "pTravelTimeSec": 847.1, + "sTravelTimeSec": null + }, + { + "station": "RJF", + "network": "IR", + "distanceDeg": 105.21, + "pTravelTimeSec": 847.7, + "sTravelTimeSec": null + }, + { + "station": "CAF", + "network": "IR", + "distanceDeg": 105.3, + "pTravelTimeSec": 848.5, + "sTravelTimeSec": null + }, + { + "station": "GRR", + "network": "IR", + "distanceDeg": 105.73, + "pTravelTimeSec": 849.6, + "sTravelTimeSec": null + }, + { + "station": "LASF", + "network": "IR", + "distanceDeg": 105.85, + "pTravelTimeSec": 850.9, + "sTravelTimeSec": null + }, + { + "station": "FLN", + "network": "IR", + "distanceDeg": 106.15, + "pTravelTimeSec": 851.8, + "sTravelTimeSec": null + }, + { + "station": "TCF", + "network": "IR", + "distanceDeg": 106.17, + "pTravelTimeSec": 852, + "sTravelTimeSec": null + }, + { + "station": "LDF", + "network": "IR", + "distanceDeg": 106.24, + "pTravelTimeSec": 852.1, + "sTravelTimeSec": null + }, + { + "station": "BBOO", + "network": "IR", + "distanceDeg": 106.27, + "pTravelTimeSec": 1118.5, + "sTravelTimeSec": null + }, + { + "station": "SIT", + "network": "IR", + "distanceDeg": 106.67, + "pTravelTimeSec": 1118.5, + "sTravelTimeSec": null + }, + { + "station": "BGF", + "network": "IR", + "distanceDeg": 106.69, + "pTravelTimeSec": 854.5, + "sTravelTimeSec": null + }, + { + "station": "VSL", + "network": "IR", + "distanceDeg": 106.71, + "pTravelTimeSec": 1118.5, + "sTravelTimeSec": null + }, + { + "station": "VIVF", + "network": "IR", + "distanceDeg": 106.77, + "pTravelTimeSec": 855.3, + "sTravelTimeSec": null + }, + { + "station": "SMRF", + "network": "IR", + "distanceDeg": 106.82, + "pTravelTimeSec": 856, + "sTravelTimeSec": null + }, + { + "station": "HYF", + "network": "IR", + "distanceDeg": 106.98, + "pTravelTimeSec": 855.8, + "sTravelTimeSec": null + }, + { + "station": "LMR", + "network": "IR", + "distanceDeg": 107.02, + "pTravelTimeSec": 856.6, + "sTravelTimeSec": null + }, + { + "station": "AVF", + "network": "IR", + "distanceDeg": 107.11, + "pTravelTimeSec": 856.2, + "sTravelTimeSec": null + }, + { + "station": "FRF", + "network": "IR", + "distanceDeg": 107.23, + "pTravelTimeSec": 857.5, + "sTravelTimeSec": null + }, + { + "station": "SMF", + "network": "IR", + "distanceDeg": 107.3, + "pTravelTimeSec": 857.4, + "sTravelTimeSec": null + }, + { + "station": "SSF", + "network": "IR", + "distanceDeg": 107.35, + "pTravelTimeSec": 857, + "sTravelTimeSec": null + }, + { + "station": "ORIF", + "network": "IR", + "distanceDeg": 107.52, + "pTravelTimeSec": 859.2, + "sTravelTimeSec": null + }, + { + "station": "LOR", + "network": "IR", + "distanceDeg": 107.66, + "pTravelTimeSec": 858.5, + "sTravelTimeSec": null + }, + { + "station": "SBF", + "network": "IR", + "distanceDeg": 107.87, + "pTravelTimeSec": 860.3, + "sTravelTimeSec": null + }, + { + "station": "MBDF", + "network": "IR", + "distanceDeg": 107.95, + "pTravelTimeSec": 861.1, + "sTravelTimeSec": null + }, + { + "station": "WDD", + "network": "IR", + "distanceDeg": 108.23, + "pTravelTimeSec": 1118.5, + "sTravelTimeSec": null + }, + { + "station": "LPL", + "network": "IR", + "distanceDeg": 108.35, + "pTravelTimeSec": 863.1, + "sTravelTimeSec": null + }, + { + "station": "LPG", + "network": "IR", + "distanceDeg": 108.35, + "pTravelTimeSec": 863.3, + "sTravelTimeSec": null + }, + { + "station": "SFTF", + "network": "IR", + "distanceDeg": 108.85, + "pTravelTimeSec": 863.8, + "sTravelTimeSec": null + }, + { + "station": "MEZF", + "network": "IR", + "distanceDeg": 109.02, + "pTravelTimeSec": 864.8, + "sTravelTimeSec": null + }, + { + "station": "EDI", + "network": "IR", + "distanceDeg": 109.09, + "pTravelTimeSec": 1118.5, + "sTravelTimeSec": null + }, + { + "station": "BAIF", + "network": "IR", + "distanceDeg": 109.41, + "pTravelTimeSec": 866.2, + "sTravelTimeSec": null + }, + { + "station": "PAGF", + "network": "IR", + "distanceDeg": 109.42, + "pTravelTimeSec": 866.7, + "sTravelTimeSec": null + }, + { + "station": "HAU", + "network": "IR", + "distanceDeg": 109.48, + "pTravelTimeSec": 866.6, + "sTravelTimeSec": null + }, + { + "station": "GIVF", + "network": "IR", + "distanceDeg": 109.76, + "pTravelTimeSec": 868.1, + "sTravelTimeSec": null + }, + { + "station": "VLC", + "network": "IR", + "distanceDeg": 109.83, + "pTravelTimeSec": 1118.5, + "sTravelTimeSec": null + }, + { + "station": "CDF", + "network": "IR", + "distanceDeg": 110.22, + "pTravelTimeSec": 870.1, + "sTravelTimeSec": null + }, + { + "station": "CEL", + "network": "IR", + "distanceDeg": 110.39, + "pTravelTimeSec": 1118.5, + "sTravelTimeSec": null + }, + { + "station": "FUORN", + "network": "IR", + "distanceDeg": 111.02, + "pTravelTimeSec": 1118.5, + "sTravelTimeSec": null + }, + { + "station": "TIP", + "network": "IR", + "distanceDeg": 111.44, + "pTravelTimeSec": 879.3, + "sTravelTimeSec": null + }, + { + "station": "STU", + "network": "IR", + "distanceDeg": 111.5, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "RAGM", + "network": "IR", + "distanceDeg": 112.56, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "FURI", + "network": "IR", + "distanceDeg": 112.61, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "MID", + "network": "IR", + "distanceDeg": 112.74, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "HNR", + "network": "IR", + "distanceDeg": 112.76, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "CTAO", + "network": "IR", + "distanceDeg": 112.94, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "DIV", + "network": "IR", + "distanceDeg": 113.42, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "VLS", + "network": "IR", + "distanceDeg": 113.58, + "pTravelTimeSec": 888.4, + "sTravelTimeSec": null + }, + { + "station": "KEK", + "network": "IR", + "distanceDeg": 113.76, + "pTravelTimeSec": 889.3, + "sTravelTimeSec": null + }, + { + "station": "PYL", + "network": "IR", + "distanceDeg": 113.79, + "pTravelTimeSec": 888.3, + "sTravelTimeSec": null + }, + { + "station": "IGT", + "network": "IR", + "distanceDeg": 114.04, + "pTravelTimeSec": 889.5, + "sTravelTimeSec": null + }, + { + "station": "ITM", + "network": "IR", + "distanceDeg": 114.05, + "pTravelTimeSec": 890.8, + "sTravelTimeSec": null + }, + { + "station": "RLS", + "network": "IR", + "distanceDeg": 114.14, + "pTravelTimeSec": 888.9, + "sTravelTimeSec": null + }, + { + "station": "KHC", + "network": "IR", + "distanceDeg": 114.2, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "DSL", + "network": "IR", + "distanceDeg": 114.38, + "pTravelTimeSec": 891, + "sTravelTimeSec": null + }, + { + "station": "SEW", + "network": "IR", + "distanceDeg": 114.43, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "VLX", + "network": "IR", + "distanceDeg": 114.46, + "pTravelTimeSec": 893, + "sTravelTimeSec": null + }, + { + "station": "VLI", + "network": "IR", + "distanceDeg": 114.55, + "pTravelTimeSec": 891.5, + "sTravelTimeSec": null + }, + { + "station": "LAKA", + "network": "IR", + "distanceDeg": 114.58, + "pTravelTimeSec": 892.5, + "sTravelTimeSec": null + }, + { + "station": "KLV", + "network": "IR", + "distanceDeg": 114.61, + "pTravelTimeSec": 893.1, + "sTravelTimeSec": null + }, + { + "station": "GUR", + "network": "IR", + "distanceDeg": 114.69, + "pTravelTimeSec": 893, + "sTravelTimeSec": null + }, + { + "station": "SML", + "network": "IR", + "distanceDeg": 114.82, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "CLL", + "network": "IR", + "distanceDeg": 114.87, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "SII", + "network": "IR", + "distanceDeg": 114.89, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "DSF", + "network": "IR", + "distanceDeg": 115.04, + "pTravelTimeSec": 894.8, + "sTravelTimeSec": null + }, + { + "station": "RC01", + "network": "IR", + "distanceDeg": 115.05, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "DID", + "network": "IR", + "distanceDeg": 115.13, + "pTravelTimeSec": 894.8, + "sTravelTimeSec": null + }, + { + "station": "LTK", + "network": "IR", + "distanceDeg": 115.17, + "pTravelTimeSec": 892.5, + "sTravelTimeSec": null + }, + { + "station": "AGG", + "network": "IR", + "distanceDeg": 115.18, + "pTravelTimeSec": 895.4, + "sTravelTimeSec": null + }, + { + "station": "AXAR", + "network": "IR", + "distanceDeg": 115.29, + "pTravelTimeSec": 895.7, + "sTravelTimeSec": null + }, + { + "station": "FNA", + "network": "IR", + "distanceDeg": 115.32, + "pTravelTimeSec": 894.4, + "sTravelTimeSec": null + }, + { + "station": "KZN", + "network": "IR", + "distanceDeg": 115.38, + "pTravelTimeSec": 894.8, + "sTravelTimeSec": null + }, + { + "station": "LKR", + "network": "IR", + "distanceDeg": 115.48, + "pTravelTimeSec": 895.8, + "sTravelTimeSec": null + }, + { + "station": "FYTO", + "network": "IR", + "distanceDeg": 115.78, + "pTravelTimeSec": 897.4, + "sTravelTimeSec": null + }, + { + "station": "LIT", + "network": "IR", + "distanceDeg": 115.78, + "pTravelTimeSec": 898.1, + "sTravelTimeSec": null + }, + { + "station": "SKO", + "network": "IR", + "distanceDeg": 115.89, + "pTravelTimeSec": 897.7, + "sTravelTimeSec": null + }, + { + "station": "XOR", + "network": "IR", + "distanceDeg": 115.93, + "pTravelTimeSec": 895.3, + "sTravelTimeSec": null + }, + { + "station": "NEO", + "network": "IR", + "distanceDeg": 115.93, + "pTravelTimeSec": 898.8, + "sTravelTimeSec": null + }, + { + "station": "GRG", + "network": "IR", + "distanceDeg": 116.1, + "pTravelTimeSec": 899.5, + "sTravelTimeSec": null + }, + { + "station": "ZKR", + "network": "IR", + "distanceDeg": 116.18, + "pTravelTimeSec": 900.2, + "sTravelTimeSec": null + }, + { + "station": "AOS", + "network": "IR", + "distanceDeg": 116.33, + "pTravelTimeSec": 900.1, + "sTravelTimeSec": null + }, + { + "station": "DPC", + "network": "IR", + "distanceDeg": 116.33, + "pTravelTimeSec": 1128.5, + "sTravelTimeSec": null + }, + { + "station": "THE", + "network": "IR", + "distanceDeg": 116.34, + "pTravelTimeSec": 900.5, + "sTravelTimeSec": null + }, + { + "station": "VAY", + "network": "IR", + "distanceDeg": 116.37, + "pTravelTimeSec": 901.1, + "sTravelTimeSec": null + } + ] +} \ No newline at end of file diff --git a/src/data/okhotsk-2013.json b/src/data/okhotsk-2013.json new file mode 100644 index 0000000..7689683 --- /dev/null +++ b/src/data/okhotsk-2013.json @@ -0,0 +1,2491 @@ +{ + "id": "okhotsk-2013", + "name": "2013 Sea of Okhotsk (Mw 8.3, depth 608 km)", + "originTime": "2013-05-24T05:44:49Z", + "latitude": 54.874, + "longitude": 153.281, + "depthKm": 608, + "magnitudeMw": 8.3, + "usgsId": "usb000h4jh", + "note": "Very deep focus earthquake. Rays launch from 608 km depth, altering shadow zone geometry. Good for demonstrating that depth matters in the model.", + "arrivals": [ + { + "station": "PETK", + "network": "IR", + "distanceDeg": 3.19, + "pTravelTimeSec": 79.3, + "sTravelTimeSec": null + }, + { + "station": "PEA0B", + "network": "IR", + "distanceDeg": 3.19, + "pTravelTimeSec": 79.7, + "sTravelTimeSec": null + }, + { + "station": "PEA1", + "network": "IR", + "distanceDeg": 3.19, + "pTravelTimeSec": 80.4, + "sTravelTimeSec": null + }, + { + "station": "PET", + "network": "IR", + "distanceDeg": 3.71, + "pTravelTimeSec": 82.3, + "sTravelTimeSec": null + }, + { + "station": "MA2", + "network": "IR", + "distanceDeg": 4.88, + "pTravelTimeSec": 93.1, + "sTravelTimeSec": null + }, + { + "station": "YSS", + "network": "IR", + "distanceDeg": 10.32, + "pTravelTimeSec": 143.8, + "sTravelTimeSec": null + }, + { + "station": "SMY", + "network": "IR", + "distanceDeg": 12.52, + "pTravelTimeSec": 163, + "sTravelTimeSec": null + }, + { + "station": "ASAJ", + "network": "IR", + "distanceDeg": 12.79, + "pTravelTimeSec": 165.6, + "sTravelTimeSec": null + }, + { + "station": "KLR", + "network": "IR", + "distanceDeg": 14.34, + "pTravelTimeSec": 182.9, + "sTravelTimeSec": null + }, + { + "station": "ERM", + "network": "IR", + "distanceDeg": 14.49, + "pTravelTimeSec": 179.4, + "sTravelTimeSec": null + }, + { + "station": "BILL", + "network": "IR", + "distanceDeg": 14.6, + "pTravelTimeSec": 183.7, + "sTravelTimeSec": null + }, + { + "station": "USA0B", + "network": "IR", + "distanceDeg": 17.37, + "pTravelTimeSec": 209.7, + "sTravelTimeSec": null + }, + { + "station": "USRK", + "network": "IR", + "distanceDeg": 17.37, + "pTravelTimeSec": 210.1, + "sTravelTimeSec": null + }, + { + "station": "KIWB", + "network": "IR", + "distanceDeg": 17.87, + "pTravelTimeSec": 212, + "sTravelTimeSec": null + }, + { + "station": "ADK", + "network": "IR", + "distanceDeg": 18.13, + "pTravelTimeSec": 214, + "sTravelTimeSec": null + }, + { + "station": "MDJ", + "network": "IR", + "distanceDeg": 18.32, + "pTravelTimeSec": 218.3, + "sTravelTimeSec": null + }, + { + "station": "GSTR", + "network": "IR", + "distanceDeg": 18.41, + "pTravelTimeSec": 216.8, + "sTravelTimeSec": null + }, + { + "station": "GAMB", + "network": "IR", + "distanceDeg": 19.73, + "pTravelTimeSec": 230.7, + "sTravelTimeSec": null + }, + { + "station": "TIXI", + "network": "IR", + "distanceDeg": 19.78, + "pTravelTimeSec": 232.4, + "sTravelTimeSec": null + }, + { + "station": "MAJO", + "network": "IR", + "distanceDeg": 21.05, + "pTravelTimeSec": 243.8, + "sTravelTimeSec": null + }, + { + "station": "MJB9", + "network": "IR", + "distanceDeg": 21.05, + "pTravelTimeSec": 243.9, + "sTravelTimeSec": null + }, + { + "station": "HIA", + "network": "IR", + "distanceDeg": 21.19, + "pTravelTimeSec": 244.5, + "sTravelTimeSec": null + }, + { + "station": "NIKH", + "network": "IR", + "distanceDeg": 22.23, + "pTravelTimeSec": 251.2, + "sTravelTimeSec": null + }, + { + "station": "INU", + "network": "IR", + "distanceDeg": 22.53, + "pTravelTimeSec": 256.7, + "sTravelTimeSec": null + }, + { + "station": "UNV", + "network": "IR", + "distanceDeg": 23.27, + "pTravelTimeSec": 260.7, + "sTravelTimeSec": null + }, + { + "station": "AKUT", + "network": "IR", + "distanceDeg": 23.58, + "pTravelTimeSec": 264, + "sTravelTimeSec": null + }, + { + "station": "JHJ2", + "network": "IR", + "distanceDeg": 23.73, + "pTravelTimeSec": 267.9, + "sTravelTimeSec": null + }, + { + "station": "RDOG", + "network": "IR", + "distanceDeg": 24.09, + "pTravelTimeSec": 270.2, + "sTravelTimeSec": null + }, + { + "station": "KS15", + "network": "IR", + "distanceDeg": 24.49, + "pTravelTimeSec": 275.2, + "sTravelTimeSec": null + }, + { + "station": "KSAR", + "network": "IR", + "distanceDeg": 24.53, + "pTravelTimeSec": 274.6, + "sTravelTimeSec": null + }, + { + "station": "FALS", + "network": "IR", + "distanceDeg": 24.66, + "pTravelTimeSec": 273, + "sTravelTimeSec": null + }, + { + "station": "SDPT", + "network": "IR", + "distanceDeg": 26.11, + "pTravelTimeSec": 284.8, + "sTravelTimeSec": null + }, + { + "station": "JNU", + "network": "IR", + "distanceDeg": 26.83, + "pTravelTimeSec": 294.9, + "sTravelTimeSec": null + }, + { + "station": "CHGN", + "network": "IR", + "distanceDeg": 26.92, + "pTravelTimeSec": 292.4, + "sTravelTimeSec": null + }, + { + "station": "SVW2", + "network": "IR", + "distanceDeg": 27.19, + "pTravelTimeSec": 297.8, + "sTravelTimeSec": null + }, + { + "station": "IMAR", + "network": "IR", + "distanceDeg": 27.51, + "pTravelTimeSec": 298.5, + "sTravelTimeSec": null + }, + { + "station": "BJT", + "network": "IR", + "distanceDeg": 28.73, + "pTravelTimeSec": 311.1, + "sTravelTimeSec": null + }, + { + "station": "MLY", + "network": "IR", + "distanceDeg": 28.83, + "pTravelTimeSec": 311.8, + "sTravelTimeSec": null + }, + { + "station": "COLD", + "network": "IR", + "distanceDeg": 28.87, + "pTravelTimeSec": 311.8, + "sTravelTimeSec": null + }, + { + "station": "TOLK", + "network": "IR", + "distanceDeg": 29.06, + "pTravelTimeSec": 313.6, + "sTravelTimeSec": null + }, + { + "station": "TLY", + "network": "IR", + "distanceDeg": 29.31, + "pTravelTimeSec": 317.9, + "sTravelTimeSec": null + }, + { + "station": "OHAK", + "network": "IR", + "distanceDeg": 29.32, + "pTravelTimeSec": 314.5, + "sTravelTimeSec": null + }, + { + "station": "KDAK", + "network": "IR", + "distanceDeg": 29.51, + "pTravelTimeSec": 316.1, + "sTravelTimeSec": null + }, + { + "station": "SONM", + "network": "IR", + "distanceDeg": 29.6, + "pTravelTimeSec": 319.3, + "sTravelTimeSec": null + }, + { + "station": "BRLK", + "network": "IR", + "distanceDeg": 29.77, + "pTravelTimeSec": 318.8, + "sTravelTimeSec": null + }, + { + "station": "MCK", + "network": "IR", + "distanceDeg": 29.8, + "pTravelTimeSec": 319.8, + "sTravelTimeSec": null + }, + { + "station": "MDM", + "network": "IR", + "distanceDeg": 29.9, + "pTravelTimeSec": 320.9, + "sTravelTimeSec": null + }, + { + "station": "RC01", + "network": "IR", + "distanceDeg": 29.99, + "pTravelTimeSec": 320.6, + "sTravelTimeSec": null + }, + { + "station": "COLA", + "network": "IR", + "distanceDeg": 30.07, + "pTravelTimeSec": 322.7, + "sTravelTimeSec": null + }, + { + "station": "CCB", + "network": "IR", + "distanceDeg": 30.13, + "pTravelTimeSec": 322.9, + "sTravelTimeSec": null + }, + { + "station": "PMR", + "network": "IR", + "distanceDeg": 30.15, + "pTravelTimeSec": 321.7, + "sTravelTimeSec": null + }, + { + "station": "ILAR", + "network": "IR", + "distanceDeg": 30.49, + "pTravelTimeSec": 325.2, + "sTravelTimeSec": null + }, + { + "station": "HDA", + "network": "IR", + "distanceDeg": 30.53, + "pTravelTimeSec": 325.7, + "sTravelTimeSec": null + }, + { + "station": "DHY", + "network": "IR", + "distanceDeg": 30.61, + "pTravelTimeSec": 326.6, + "sTravelTimeSec": null + }, + { + "station": "SCM", + "network": "IR", + "distanceDeg": 30.93, + "pTravelTimeSec": 329.7, + "sTravelTimeSec": null + }, + { + "station": "GLI", + "network": "IR", + "distanceDeg": 31.29, + "pTravelTimeSec": 332.2, + "sTravelTimeSec": null + }, + { + "station": "PAX", + "network": "IR", + "distanceDeg": 31.48, + "pTravelTimeSec": 333.5, + "sTravelTimeSec": null + }, + { + "station": "RIDG", + "network": "IR", + "distanceDeg": 31.58, + "pTravelTimeSec": 334.3, + "sTravelTimeSec": null + }, + { + "station": "HARP", + "network": "IR", + "distanceDeg": 31.77, + "pTravelTimeSec": 336.7, + "sTravelTimeSec": null + }, + { + "station": "DIV", + "network": "IR", + "distanceDeg": 31.83, + "pTravelTimeSec": 337.1, + "sTravelTimeSec": null + }, + { + "station": "MENT", + "network": "IR", + "distanceDeg": 32.27, + "pTravelTimeSec": 340.9, + "sTravelTimeSec": null + }, + { + "station": "EGAK", + "network": "IR", + "distanceDeg": 32.89, + "pTravelTimeSec": 345.4, + "sTravelTimeSec": null + }, + { + "station": "SSE", + "network": "IR", + "distanceDeg": 32.9, + "pTravelTimeSec": 346.1, + "sTravelTimeSec": null + }, + { + "station": "BALM", + "network": "IR", + "distanceDeg": 33.45, + "pTravelTimeSec": 351.4, + "sTravelTimeSec": null + }, + { + "station": "DAWY", + "network": "IR", + "distanceDeg": 33.82, + "pTravelTimeSec": 353.6, + "sTravelTimeSec": null + }, + { + "station": "CTGM", + "network": "IR", + "distanceDeg": 33.94, + "pTravelTimeSec": 355.8, + "sTravelTimeSec": null + }, + { + "station": "EPYK", + "network": "IR", + "distanceDeg": 34.27, + "pTravelTimeSec": 358, + "sTravelTimeSec": null + }, + { + "station": "PCA", + "network": "IR", + "distanceDeg": 34.75, + "pTravelTimeSec": 362.1, + "sTravelTimeSec": null + }, + { + "station": "INK", + "network": "IR", + "distanceDeg": 34.96, + "pTravelTimeSec": 363.3, + "sTravelTimeSec": null + }, + { + "station": "WAKE", + "network": "IR", + "distanceDeg": 36.99, + "pTravelTimeSec": 379.7, + "sTravelTimeSec": null + }, + { + "station": "YOJ", + "network": "IR", + "distanceDeg": 37.71, + "pTravelTimeSec": 383.4, + "sTravelTimeSec": null + }, + { + "station": "BESE", + "network": "IR", + "distanceDeg": 37.89, + "pTravelTimeSec": 388.2, + "sTravelTimeSec": null + }, + { + "station": "TATO", + "network": "IR", + "distanceDeg": 37.94, + "pTravelTimeSec": 388.3, + "sTravelTimeSec": null + }, + { + "station": "YHNB", + "network": "IR", + "distanceDeg": 38.25, + "pTravelTimeSec": 389.8, + "sTravelTimeSec": null + }, + { + "station": "JIS", + "network": "IR", + "distanceDeg": 38.25, + "pTravelTimeSec": 391, + "sTravelTimeSec": null + }, + { + "station": "ZAA0", + "network": "IR", + "distanceDeg": 38.36, + "pTravelTimeSec": 390.7, + "sTravelTimeSec": null + }, + { + "station": "ZALV", + "network": "IR", + "distanceDeg": 38.36, + "pTravelTimeSec": 391, + "sTravelTimeSec": null + }, + { + "station": "ZAA1", + "network": "IR", + "distanceDeg": 38.36, + "pTravelTimeSec": 391.1, + "sTravelTimeSec": null + }, + { + "station": "SIT", + "network": "IR", + "distanceDeg": 38.37, + "pTravelTimeSec": 392, + "sTravelTimeSec": null + }, + { + "station": "SARN", + "network": "IR", + "distanceDeg": 38.55, + "pTravelTimeSec": 392, + "sTravelTimeSec": null + }, + { + "station": "NACB", + "network": "IR", + "distanceDeg": 38.59, + "pTravelTimeSec": 390.8, + "sTravelTimeSec": null + }, + { + "station": "ANA2", + "network": "IR", + "distanceDeg": 38.91, + "pTravelTimeSec": 395.1, + "sTravelTimeSec": null + }, + { + "station": "SSLB", + "network": "IR", + "distanceDeg": 39.21, + "pTravelTimeSec": 397.7, + "sTravelTimeSec": null + }, + { + "station": "YULB", + "network": "IR", + "distanceDeg": 39.4, + "pTravelTimeSec": 398.8, + "sTravelTimeSec": null + }, + { + "station": "ENH", + "network": "IR", + "distanceDeg": 39.59, + "pTravelTimeSec": 401.5, + "sTravelTimeSec": null + }, + { + "station": "TPUB", + "network": "IR", + "distanceDeg": 39.78, + "pTravelTimeSec": 402.1, + "sTravelTimeSec": null + }, + { + "station": "KNMB", + "network": "IR", + "distanceDeg": 39.8, + "pTravelTimeSec": 402.5, + "sTravelTimeSec": null + }, + { + "station": "TWG", + "network": "IR", + "distanceDeg": 40, + "pTravelTimeSec": 403.7, + "sTravelTimeSec": null + }, + { + "station": "WRAK", + "network": "IR", + "distanceDeg": 40.11, + "pTravelTimeSec": 406.9, + "sTravelTimeSec": null + }, + { + "station": "DLBC", + "network": "IR", + "distanceDeg": 40.2, + "pTravelTimeSec": 407.3, + "sTravelTimeSec": null + }, + { + "station": "GUMO", + "network": "IR", + "distanceDeg": 41.72, + "pTravelTimeSec": 416.1, + "sTravelTimeSec": null + }, + { + "station": "DIB", + "network": "IR", + "distanceDeg": 41.75, + "pTravelTimeSec": 418.6, + "sTravelTimeSec": null + }, + { + "station": "WMQ", + "network": "IR", + "distanceDeg": 42.57, + "pTravelTimeSec": 426.7, + "sTravelTimeSec": null + }, + { + "station": "RES", + "network": "IR", + "distanceDeg": 43.14, + "pTravelTimeSec": 429, + "sTravelTimeSec": null + }, + { + "station": "KURK", + "network": "IR", + "distanceDeg": 43.31, + "pTravelTimeSec": 431, + "sTravelTimeSec": null + }, + { + "station": "HKPS", + "network": "IR", + "distanceDeg": 43.69, + "pTravelTimeSec": 433.9, + "sTravelTimeSec": null + }, + { + "station": "MK31", + "network": "IR", + "distanceDeg": 43.72, + "pTravelTimeSec": 434, + "sTravelTimeSec": null + }, + { + "station": "MKAR", + "network": "IR", + "distanceDeg": 43.72, + "pTravelTimeSec": 434, + "sTravelTimeSec": null + }, + { + "station": "MAKZ", + "network": "IR", + "distanceDeg": 43.88, + "pTravelTimeSec": 435.1, + "sTravelTimeSec": null + }, + { + "station": "KBS", + "network": "IR", + "distanceDeg": 44.47, + "pTravelTimeSec": 438.7, + "sTravelTimeSec": null + }, + { + "station": "YKA", + "network": "IR", + "distanceDeg": 44.54, + "pTravelTimeSec": 439.1, + "sTravelTimeSec": null + }, + { + "station": "YKB5", + "network": "IR", + "distanceDeg": 44.54, + "pTravelTimeSec": 439.5, + "sTravelTimeSec": null + }, + { + "station": "SPA0", + "network": "IR", + "distanceDeg": 44.62, + "pTravelTimeSec": 439.7, + "sTravelTimeSec": null + }, + { + "station": "BRVK", + "network": "IR", + "distanceDeg": 46.08, + "pTravelTimeSec": 451.9, + "sTravelTimeSec": null + }, + { + "station": "KMI", + "network": "IR", + "distanceDeg": 47.32, + "pTravelTimeSec": 461.9, + "sTravelTimeSec": null + }, + { + "station": "KWAJ", + "network": "IR", + "distanceDeg": 47.38, + "pTravelTimeSec": 462.1, + "sTravelTimeSec": null + }, + { + "station": "JOHN", + "network": "IR", + "distanceDeg": 47.61, + "pTravelTimeSec": 463, + "sTravelTimeSec": null + }, + { + "station": "PATS", + "network": "IR", + "distanceDeg": 48.09, + "pTravelTimeSec": 466.9, + "sTravelTimeSec": null + }, + { + "station": "QIZ", + "network": "IR", + "distanceDeg": 48.56, + "pTravelTimeSec": 471.7, + "sTravelTimeSec": null + }, + { + "station": "PGC", + "network": "IR", + "distanceDeg": 49.05, + "pTravelTimeSec": 473.5, + "sTravelTimeSec": null + }, + { + "station": "ARU", + "network": "IR", + "distanceDeg": 49.26, + "pTravelTimeSec": 474.8, + "sTravelTimeSec": null + }, + { + "station": "KIP", + "network": "IR", + "distanceDeg": 49.37, + "pTravelTimeSec": 476.1, + "sTravelTimeSec": null + }, + { + "station": "LVZ", + "network": "IR", + "distanceDeg": 49.38, + "pTravelTimeSec": 475.4, + "sTravelTimeSec": null + }, + { + "station": "TARG", + "network": "IR", + "distanceDeg": 49.45, + "pTravelTimeSec": 478.8, + "sTravelTimeSec": null + }, + { + "station": "HON", + "network": "IR", + "distanceDeg": 49.46, + "pTravelTimeSec": 476.6, + "sTravelTimeSec": null + }, + { + "station": "KDJ", + "network": "IR", + "distanceDeg": 49.53, + "pTravelTimeSec": 478.2, + "sTravelTimeSec": null + }, + { + "station": "KEV", + "network": "IR", + "distanceDeg": 49.73, + "pTravelTimeSec": 477.5, + "sTravelTimeSec": null + }, + { + "station": "SLVN", + "network": "IR", + "distanceDeg": 49.74, + "pTravelTimeSec": 479.6, + "sTravelTimeSec": null + }, + { + "station": "BOOM", + "network": "IR", + "distanceDeg": 49.95, + "pTravelTimeSec": 482.3, + "sTravelTimeSec": null + }, + { + "station": "B06A", + "network": "IR", + "distanceDeg": 50.12, + "pTravelTimeSec": 481.3, + "sTravelTimeSec": null + }, + { + "station": "LSA", + "network": "IR", + "distanceDeg": 50.38, + "pTravelTimeSec": 486.3, + "sTravelTimeSec": null + }, + { + "station": "AAK", + "network": "IR", + "distanceDeg": 50.64, + "pTravelTimeSec": 486.1, + "sTravelTimeSec": null + }, + { + "station": "NRN", + "network": "IR", + "distanceDeg": 50.66, + "pTravelTimeSec": 487, + "sTravelTimeSec": null + }, + { + "station": "LTY", + "network": "IR", + "distanceDeg": 51.37, + "pTravelTimeSec": 489.8, + "sTravelTimeSec": null + }, + { + "station": "POHA", + "network": "IR", + "distanceDeg": 52.06, + "pTravelTimeSec": 495.3, + "sTravelTimeSec": null + }, + { + "station": "MLH", + "network": "IR", + "distanceDeg": 52.35, + "pTravelTimeSec": 497.9, + "sTravelTimeSec": null + }, + { + "station": "ARSB", + "network": "IR", + "distanceDeg": 52.36, + "pTravelTimeSec": 499.2, + "sTravelTimeSec": null + }, + { + "station": "AIN", + "network": "IR", + "distanceDeg": 52.41, + "pTravelTimeSec": 498.1, + "sTravelTimeSec": null + }, + { + "station": "NEW", + "network": "IR", + "distanceDeg": 52.44, + "pTravelTimeSec": 497.7, + "sTravelTimeSec": null + }, + { + "station": "KKAR", + "network": "IR", + "distanceDeg": 52.45, + "pTravelTimeSec": 498.1, + "sTravelTimeSec": null + }, + { + "station": "KK31", + "network": "IR", + "distanceDeg": 52.45, + "pTravelTimeSec": 498.5, + "sTravelTimeSec": null + }, + { + "station": "UWE", + "network": "IR", + "distanceDeg": 52.46, + "pTravelTimeSec": 498.2, + "sTravelTimeSec": null + }, + { + "station": "SUMG", + "network": "IR", + "distanceDeg": 52.57, + "pTravelTimeSec": 499, + "sTravelTimeSec": null + }, + { + "station": "DAV", + "network": "IR", + "distanceDeg": 52.57, + "pTravelTimeSec": 500.1, + "sTravelTimeSec": null + }, + { + "station": "ABKAR", + "network": "IR", + "distanceDeg": 53.49, + "pTravelTimeSec": 505.3, + "sTravelTimeSec": null + }, + { + "station": "PINE", + "network": "IR", + "distanceDeg": 53.61, + "pTravelTimeSec": 508.1, + "sTravelTimeSec": null + }, + { + "station": "KHMM", + "network": "IR", + "distanceDeg": 54.19, + "pTravelTimeSec": 512.1, + "sTravelTimeSec": null + }, + { + "station": "CHTO", + "network": "IR", + "distanceDeg": 54.47, + "pTravelTimeSec": 513.6, + "sTravelTimeSec": null + }, + { + "station": "FFC", + "network": "IR", + "distanceDeg": 54.6, + "pTravelTimeSec": 512.9, + "sTravelTimeSec": null + }, + { + "station": "KMRM", + "network": "IR", + "distanceDeg": 54.68, + "pTravelTimeSec": 515.7, + "sTravelTimeSec": null + }, + { + "station": "CMAR", + "network": "IR", + "distanceDeg": 54.76, + "pTravelTimeSec": 515.7, + "sTravelTimeSec": null + }, + { + "station": "CM31", + "network": "IR", + "distanceDeg": 54.76, + "pTravelTimeSec": 516, + "sTravelTimeSec": null + }, + { + "station": "SCO", + "network": "IR", + "distanceDeg": 54.88, + "pTravelTimeSec": 514.6, + "sTravelTimeSec": null + }, + { + "station": "ILULI", + "network": "IR", + "distanceDeg": 54.93, + "pTravelTimeSec": 514.2, + "sTravelTimeSec": null + }, + { + "station": "DLV", + "network": "IR", + "distanceDeg": 55.28, + "pTravelTimeSec": 519.4, + "sTravelTimeSec": null + }, + { + "station": "HOPS", + "network": "IR", + "distanceDeg": 55.88, + "pTravelTimeSec": 523, + "sTravelTimeSec": null + }, + { + "station": "FIA1", + "network": "IR", + "distanceDeg": 56.75, + "pTravelTimeSec": 526.7, + "sTravelTimeSec": null + }, + { + "station": "FINES", + "network": "IR", + "distanceDeg": 56.75, + "pTravelTimeSec": 527.5, + "sTravelTimeSec": null + }, + { + "station": "FIA0", + "network": "IR", + "distanceDeg": 56.75, + "pTravelTimeSec": 527.7, + "sTravelTimeSec": null + }, + { + "station": "MANU", + "network": "IR", + "distanceDeg": 56.95, + "pTravelTimeSec": 530, + "sTravelTimeSec": null + }, + { + "station": "MCMT", + "network": "IR", + "distanceDeg": 56.95, + "pTravelTimeSec": 530.3, + "sTravelTimeSec": null + }, + { + "station": "SFJD", + "network": "IR", + "distanceDeg": 57.12, + "pTravelTimeSec": 528.9, + "sTravelTimeSec": null + }, + { + "station": "RUBR", + "network": "IR", + "distanceDeg": 57.41, + "pTravelTimeSec": 533.9, + "sTravelTimeSec": null + }, + { + "station": "NIL", + "network": "IR", + "distanceDeg": 57.71, + "pTravelTimeSec": 535.5, + "sTravelTimeSec": null + }, + { + "station": "TNTI", + "network": "IR", + "distanceDeg": 57.94, + "pTravelTimeSec": 536.5, + "sTravelTimeSec": null + }, + { + "station": "YMR", + "network": "IR", + "distanceDeg": 57.99, + "pTravelTimeSec": 538.1, + "sTravelTimeSec": null + }, + { + "station": "OBN", + "network": "IR", + "distanceDeg": 58.72, + "pTravelTimeSec": 541, + "sTravelTimeSec": null + }, + { + "station": "MOOW", + "network": "IR", + "distanceDeg": 58.77, + "pTravelTimeSec": 543.4, + "sTravelTimeSec": null + }, + { + "station": "NVAR", + "network": "IR", + "distanceDeg": 58.85, + "pTravelTimeSec": 542.7, + "sTravelTimeSec": null + }, + { + "station": "NV01", + "network": "IR", + "distanceDeg": 58.85, + "pTravelTimeSec": 543.3, + "sTravelTimeSec": null + }, + { + "station": "RABL", + "network": "IR", + "distanceDeg": 58.88, + "pTravelTimeSec": 542.8, + "sTravelTimeSec": null + }, + { + "station": "REDW", + "network": "IR", + "distanceDeg": 59.01, + "pTravelTimeSec": 544.6, + "sTravelTimeSec": null + }, + { + "station": "KBL", + "network": "IR", + "distanceDeg": 59.4, + "pTravelTimeSec": 545.2, + "sTravelTimeSec": null + }, + { + "station": "PDAR", + "network": "IR", + "distanceDeg": 60.08, + "pTravelTimeSec": 550.5, + "sTravelTimeSec": null + }, + { + "station": "BW06", + "network": "IR", + "distanceDeg": 60.08, + "pTravelTimeSec": 550.8, + "sTravelTimeSec": null + }, + { + "station": "PD31", + "network": "IR", + "distanceDeg": 60.08, + "pTravelTimeSec": 551.1, + "sTravelTimeSec": null + }, + { + "station": "FAKI", + "network": "IR", + "distanceDeg": 60.17, + "pTravelTimeSec": 550.8, + "sTravelTimeSec": null + }, + { + "station": "R11A", + "network": "IR", + "distanceDeg": 60.34, + "pTravelTimeSec": 552.5, + "sTravelTimeSec": null + }, + { + "station": "NC303", + "network": "IR", + "distanceDeg": 60.36, + "pTravelTimeSec": 551.6, + "sTravelTimeSec": null + }, + { + "station": "DUG", + "network": "IR", + "distanceDeg": 60.39, + "pTravelTimeSec": 553.1, + "sTravelTimeSec": null + }, + { + "station": "TCUT", + "network": "IR", + "distanceDeg": 60.41, + "pTravelTimeSec": 553.9, + "sTravelTimeSec": null + }, + { + "station": "NB201", + "network": "IR", + "distanceDeg": 60.54, + "pTravelTimeSec": 553.2, + "sTravelTimeSec": null + }, + { + "station": "ISA", + "network": "IR", + "distanceDeg": 60.81, + "pTravelTimeSec": 555.1, + "sTravelTimeSec": null + }, + { + "station": "DAC", + "network": "IR", + "distanceDeg": 60.82, + "pTravelTimeSec": 558.3, + "sTravelTimeSec": null + }, + { + "station": "LUWI", + "network": "IR", + "distanceDeg": 61.1, + "pTravelTimeSec": 555.4, + "sTravelTimeSec": null + }, + { + "station": "RSSD", + "network": "IR", + "distanceDeg": 61.67, + "pTravelTimeSec": 561.1, + "sTravelTimeSec": null + }, + { + "station": "SBUM", + "network": "IR", + "distanceDeg": 61.95, + "pTravelTimeSec": 564.4, + "sTravelTimeSec": null + }, + { + "station": "AGMN", + "network": "IR", + "distanceDeg": 61.97, + "pTravelTimeSec": 561.8, + "sTravelTimeSec": null + }, + { + "station": "GSC", + "network": "IR", + "distanceDeg": 61.98, + "pTravelTimeSec": 563.3, + "sTravelTimeSec": null + }, + { + "station": "PASC", + "network": "IR", + "distanceDeg": 62.09, + "pTravelTimeSec": 563.8, + "sTravelTimeSec": null + }, + { + "station": "KONO", + "network": "IR", + "distanceDeg": 62.16, + "pTravelTimeSec": 563.8, + "sTravelTimeSec": null + }, + { + "station": "IVI", + "network": "IR", + "distanceDeg": 63.01, + "pTravelTimeSec": 568.2, + "sTravelTimeSec": null + }, + { + "station": "PHWY", + "network": "IR", + "distanceDeg": 63.18, + "pTravelTimeSec": 570.5, + "sTravelTimeSec": null + }, + { + "station": "PFO", + "network": "IR", + "distanceDeg": 63.45, + "pTravelTimeSec": 572.1, + "sTravelTimeSec": null + }, + { + "station": "PV09", + "network": "IR", + "distanceDeg": 63.53, + "pTravelTimeSec": 573.2, + "sTravelTimeSec": null + }, + { + "station": "SUW", + "network": "IR", + "distanceDeg": 63.92, + "pTravelTimeSec": 574.3, + "sTravelTimeSec": null + }, + { + "station": "BAR", + "network": "IR", + "distanceDeg": 64.04, + "pTravelTimeSec": 576.6, + "sTravelTimeSec": null + }, + { + "station": "PMG", + "network": "IR", + "distanceDeg": 64.26, + "pTravelTimeSec": 577.4, + "sTravelTimeSec": null + }, + { + "station": "HNR", + "network": "IR", + "distanceDeg": 64.34, + "pTravelTimeSec": 577.2, + "sTravelTimeSec": null + }, + { + "station": "KNTN", + "network": "IR", + "distanceDeg": 64.34, + "pTravelTimeSec": 578.1, + "sTravelTimeSec": null + }, + { + "station": "MVCO", + "network": "IR", + "distanceDeg": 64.84, + "pTravelTimeSec": 581.4, + "sTravelTimeSec": null + }, + { + "station": "KIEV", + "network": "IR", + "distanceDeg": 64.88, + "pTravelTimeSec": 580, + "sTravelTimeSec": null + }, + { + "station": "AKBB", + "network": "IR", + "distanceDeg": 64.88, + "pTravelTimeSec": 580.3, + "sTravelTimeSec": null + }, + { + "station": "KULM", + "network": "IR", + "distanceDeg": 64.89, + "pTravelTimeSec": 581.8, + "sTravelTimeSec": null + }, + { + "station": "KIV", + "network": "IR", + "distanceDeg": 65.28, + "pTravelTimeSec": 584.4, + "sTravelTimeSec": null + }, + { + "station": "ECSD", + "network": "IR", + "distanceDeg": 65.3, + "pTravelTimeSec": 583.4, + "sTravelTimeSec": null + }, + { + "station": "IPM", + "network": "IR", + "distanceDeg": 65.39, + "pTravelTimeSec": 584.9, + "sTravelTimeSec": null + }, + { + "station": "113A", + "network": "IR", + "distanceDeg": 65.54, + "pTravelTimeSec": 586, + "sTravelTimeSec": null + }, + { + "station": "SCHQ", + "network": "IR", + "distanceDeg": 65.8, + "pTravelTimeSec": 585.6, + "sTravelTimeSec": null + }, + { + "station": "KAPI", + "network": "IR", + "distanceDeg": 65.84, + "pTravelTimeSec": 587.4, + "sTravelTimeSec": null + }, + { + "station": "RGN", + "network": "IR", + "distanceDeg": 66.05, + "pTravelTimeSec": 588.4, + "sTravelTimeSec": null + }, + { + "station": "XMAS", + "network": "IR", + "distanceDeg": 66.1, + "pTravelTimeSec": 588.7, + "sTravelTimeSec": null + }, + { + "station": "TBLG", + "network": "IR", + "distanceDeg": 66.16, + "pTravelTimeSec": 589.8, + "sTravelTimeSec": null + }, + { + "station": "MYKOM", + "network": "IR", + "distanceDeg": 66.34, + "pTravelTimeSec": 591.5, + "sTravelTimeSec": null + }, + { + "station": "BGNE", + "network": "IR", + "distanceDeg": 66.48, + "pTravelTimeSec": 1089.9, + "sTravelTimeSec": null + }, + { + "station": "FUNA", + "network": "IR", + "distanceDeg": 66.83, + "pTravelTimeSec": 593.1, + "sTravelTimeSec": null + }, + { + "station": "LHMI", + "network": "IR", + "distanceDeg": 66.84, + "pTravelTimeSec": 595.2, + "sTravelTimeSec": null + }, + { + "station": "AKH", + "network": "IR", + "distanceDeg": 66.97, + "pTravelTimeSec": 595.4, + "sTravelTimeSec": null + }, + { + "station": "GNI", + "network": "IR", + "distanceDeg": 67.43, + "pTravelTimeSec": 598.3, + "sTravelTimeSec": null + }, + { + "station": "TUC", + "network": "IR", + "distanceDeg": 67.47, + "pTravelTimeSec": 597.3, + "sTravelTimeSec": null + }, + { + "station": "ANMO", + "network": "IR", + "distanceDeg": 67.64, + "pTravelTimeSec": 598.6, + "sTravelTimeSec": null + }, + { + "station": "PSI", + "network": "IR", + "distanceDeg": 67.98, + "pTravelTimeSec": 600.1, + "sTravelTimeSec": null + }, + { + "station": "LPM", + "network": "IR", + "distanceDeg": 68.05, + "pTravelTimeSec": 602.3, + "sTravelTimeSec": null + }, + { + "station": "OJC", + "network": "IR", + "distanceDeg": 68.26, + "pTravelTimeSec": 602.6, + "sTravelTimeSec": null + }, + { + "station": "MMRI", + "network": "IR", + "distanceDeg": 68.41, + "pTravelTimeSec": 601.9, + "sTravelTimeSec": null + }, + { + "station": "ESK", + "network": "IR", + "distanceDeg": 68.47, + "pTravelTimeSec": 602.5, + "sTravelTimeSec": null + }, + { + "station": "SOEI", + "network": "IR", + "distanceDeg": 68.85, + "pTravelTimeSec": 604.3, + "sTravelTimeSec": null + }, + { + "station": "BUR08", + "network": "IR", + "distanceDeg": 68.86, + "pTravelTimeSec": 605.5, + "sTravelTimeSec": null + }, + { + "station": "BURAR", + "network": "IR", + "distanceDeg": 68.88, + "pTravelTimeSec": 604.8, + "sTravelTimeSec": null + }, + { + "station": "BKNI", + "network": "IR", + "distanceDeg": 68.97, + "pTravelTimeSec": 607.1, + "sTravelTimeSec": null + }, + { + "station": "CLL", + "network": "IR", + "distanceDeg": 69.1, + "pTravelTimeSec": 606.4, + "sTravelTimeSec": null + }, + { + "station": "COEN", + "network": "IR", + "distanceDeg": 69.11, + "pTravelTimeSec": 607.1, + "sTravelTimeSec": null + }, + { + "station": "MORC", + "network": "IR", + "distanceDeg": 69.3, + "pTravelTimeSec": 608.1, + "sTravelTimeSec": null + }, + { + "station": "GSI", + "network": "IR", + "distanceDeg": 69.86, + "pTravelTimeSec": 611.9, + "sTravelTimeSec": null + }, + { + "station": "SNOP", + "network": "IR", + "distanceDeg": 69.99, + "pTravelTimeSec": 611.7, + "sTravelTimeSec": null + }, + { + "station": "MTN", + "network": "IR", + "distanceDeg": 70.01, + "pTravelTimeSec": 612.6, + "sTravelTimeSec": null + }, + { + "station": "PSZ", + "network": "IR", + "distanceDeg": 70.29, + "pTravelTimeSec": 614.5, + "sTravelTimeSec": null + }, + { + "station": "MLR", + "network": "IR", + "distanceDeg": 70.48, + "pTravelTimeSec": 615.9, + "sTravelTimeSec": null + }, + { + "station": "SIRT", + "network": "IR", + "distanceDeg": 70.62, + "pTravelTimeSec": 616.5, + "sTravelTimeSec": null + }, + { + "station": "KHC", + "network": "IR", + "distanceDeg": 70.96, + "pTravelTimeSec": 618.1, + "sTravelTimeSec": null + }, + { + "station": "L46A", + "network": "IR", + "distanceDeg": 70.98, + "pTravelTimeSec": null, + "sTravelTimeSec": 1141.2 + }, + { + "station": "GRA1", + "network": "IR", + "distanceDeg": 71.03, + "pTravelTimeSec": 618.4, + "sTravelTimeSec": null + }, + { + "station": "GRFO", + "network": "IR", + "distanceDeg": 71.03, + "pTravelTimeSec": 618.4, + "sTravelTimeSec": null + }, + { + "station": "JAGI", + "network": "IR", + "distanceDeg": 71.08, + "pTravelTimeSec": 615.9, + "sTravelTimeSec": null + }, + { + "station": "GEC2", + "network": "IR", + "distanceDeg": 71.19, + "pTravelTimeSec": 618.7, + "sTravelTimeSec": null + }, + { + "station": "GERES", + "network": "IR", + "distanceDeg": 71.19, + "pTravelTimeSec": 618.9, + "sTravelTimeSec": null + }, + { + "station": "SMRI", + "network": "IR", + "distanceDeg": 71.26, + "pTravelTimeSec": 619.7, + "sTravelTimeSec": null + }, + { + "station": "ILGA", + "network": "IR", + "distanceDeg": 71.41, + "pTravelTimeSec": 622, + "sTravelTimeSec": null + }, + { + "station": "UCC", + "network": "IR", + "distanceDeg": 71.52, + "pTravelTimeSec": 620.5, + "sTravelTimeSec": null + }, + { + "station": "PLVO", + "network": "IR", + "distanceDeg": 71.7, + "pTravelTimeSec": 621.5, + "sTravelTimeSec": null + }, + { + "station": "UGM", + "network": "IR", + "distanceDeg": 72, + "pTravelTimeSec": 622.4, + "sTravelTimeSec": null + }, + { + "station": "MNAI", + "network": "IR", + "distanceDeg": 72.15, + "pTravelTimeSec": 622.8, + "sTravelTimeSec": null + }, + { + "station": "WLF", + "network": "IR", + "distanceDeg": 72.22, + "pTravelTimeSec": 624.9, + "sTravelTimeSec": null + }, + { + "station": "CCM", + "network": "IR", + "distanceDeg": 72.27, + "pTravelTimeSec": 624.5, + "sTravelTimeSec": null + }, + { + "station": "STU", + "network": "IR", + "distanceDeg": 72.37, + "pTravelTimeSec": 625.5, + "sTravelTimeSec": null + }, + { + "station": "BR101", + "network": "IR", + "distanceDeg": 72.56, + "pTravelTimeSec": 627.7, + "sTravelTimeSec": null + }, + { + "station": "ANTO", + "network": "IR", + "distanceDeg": 72.78, + "pTravelTimeSec": 628.7, + "sTravelTimeSec": null + }, + { + "station": "CISI", + "network": "IR", + "distanceDeg": 72.81, + "pTravelTimeSec": 626.9, + "sTravelTimeSec": null + }, + { + "station": "LONY", + "network": "IR", + "distanceDeg": 72.89, + "pTravelTimeSec": 628.2, + "sTravelTimeSec": null + }, + { + "station": "BATG", + "network": "IR", + "distanceDeg": 72.94, + "pTravelTimeSec": 628.8, + "sTravelTimeSec": null + }, + { + "station": "BFO", + "network": "IR", + "distanceDeg": 72.99, + "pTravelTimeSec": 629.3, + "sTravelTimeSec": null + }, + { + "station": "MOQ", + "network": "IR", + "distanceDeg": 72.99, + "pTravelTimeSec": 629.6, + "sTravelTimeSec": null + }, + { + "station": "OLIL", + "network": "IR", + "distanceDeg": 73.03, + "pTravelTimeSec": 628.6, + "sTravelTimeSec": null + }, + { + "station": "ERPA", + "network": "IR", + "distanceDeg": 73.26, + "pTravelTimeSec": 630.5, + "sTravelTimeSec": null + }, + { + "station": "X37A", + "network": "IR", + "distanceDeg": 73.3, + "pTravelTimeSec": 632.8, + "sTravelTimeSec": null + }, + { + "station": "ECH", + "network": "IR", + "distanceDeg": 73.37, + "pTravelTimeSec": 631.8, + "sTravelTimeSec": null + }, + { + "station": "LTX", + "network": "IR", + "distanceDeg": 73.54, + "pTravelTimeSec": 633.5, + "sTravelTimeSec": null + }, + { + "station": "TXAR", + "network": "IR", + "distanceDeg": 73.54, + "pTravelTimeSec": 633.6, + "sTravelTimeSec": null + }, + { + "station": "ALLY", + "network": "IR", + "distanceDeg": 73.62, + "pTravelTimeSec": 632.9, + "sTravelTimeSec": null + }, + { + "station": "VTS", + "network": "IR", + "distanceDeg": 73.94, + "pTravelTimeSec": 634.5, + "sTravelTimeSec": null + }, + { + "station": "BLY", + "network": "IR", + "distanceDeg": 73.96, + "pTravelTimeSec": 634.2, + "sTravelTimeSec": null + }, + { + "station": "PALK", + "network": "IR", + "distanceDeg": 74.05, + "pTravelTimeSec": 636, + "sTravelTimeSec": null + }, + { + "station": "FUORN", + "network": "IR", + "distanceDeg": 74.12, + "pTravelTimeSec": 636.7, + "sTravelTimeSec": null + }, + { + "station": "WCI", + "network": "IR", + "distanceDeg": 74.21, + "pTravelTimeSec": 636.1, + "sTravelTimeSec": null + }, + { + "station": "SLBS", + "network": "IR", + "distanceDeg": 74.75, + "pTravelTimeSec": 640.8, + "sTravelTimeSec": null + }, + { + "station": "BALB", + "network": "IR", + "distanceDeg": 74.89, + "pTravelTimeSec": 640.3, + "sTravelTimeSec": null + }, + { + "station": "CTAO", + "network": "IR", + "distanceDeg": 74.91, + "pTravelTimeSec": 640, + "sTravelTimeSec": null + }, + { + "station": "EMMW", + "network": "IR", + "distanceDeg": 74.94, + "pTravelTimeSec": 640.5, + "sTravelTimeSec": null + }, + { + "station": "SENIN", + "network": "IR", + "distanceDeg": 75.08, + "pTravelTimeSec": 641.3, + "sTravelTimeSec": null + }, + { + "station": "SSPA", + "network": "IR", + "distanceDeg": 75.32, + "pTravelTimeSec": 642, + "sTravelTimeSec": null + }, + { + "station": "WVT", + "network": "IR", + "distanceDeg": 75.36, + "pTravelTimeSec": 642.6, + "sTravelTimeSec": null + }, + { + "station": "O56A", + "network": "IR", + "distanceDeg": 75.4, + "pTravelTimeSec": null, + "sTravelTimeSec": 1182.2 + }, + { + "station": "HRV", + "network": "IR", + "distanceDeg": 75.74, + "pTravelTimeSec": 645.1, + "sTravelTimeSec": null + }, + { + "station": "FNA", + "network": "IR", + "distanceDeg": 76.2, + "pTravelTimeSec": 647.6, + "sTravelTimeSec": null + }, + { + "station": "WRAB", + "network": "IR", + "distanceDeg": 76.25, + "pTravelTimeSec": 647.5, + "sTravelTimeSec": null + }, + { + "station": "XMIS", + "network": "IR", + "distanceDeg": 76.36, + "pTravelTimeSec": 647.4, + "sTravelTimeSec": null + }, + { + "station": "VLC", + "network": "IR", + "distanceDeg": 76.39, + "pTravelTimeSec": 649.4, + "sTravelTimeSec": null + }, + { + "station": "FITZ", + "network": "IR", + "distanceDeg": 76.41, + "pTravelTimeSec": 648.3, + "sTravelTimeSec": null + }, + { + "station": "CSS", + "network": "IR", + "distanceDeg": 76.75, + "pTravelTimeSec": 650.4, + "sTravelTimeSec": null + }, + { + "station": "PSUB", + "network": "IR", + "distanceDeg": 76.79, + "pTravelTimeSec": 651, + "sTravelTimeSec": null + }, + { + "station": "HKT", + "network": "IR", + "distanceDeg": 76.91, + "pTravelTimeSec": 651.3, + "sTravelTimeSec": null + }, + { + "station": "SWET", + "network": "IR", + "distanceDeg": 76.94, + "pTravelTimeSec": 650.9, + "sTravelTimeSec": null + }, + { + "station": "V51A", + "network": "IR", + "distanceDeg": 77.08, + "pTravelTimeSec": 652, + "sTravelTimeSec": null + }, + { + "station": "X48A", + "network": "IR", + "distanceDeg": 77.12, + "pTravelTimeSec": null, + "sTravelTimeSec": 1198.6 + }, + { + "station": "W50A", + "network": "IR", + "distanceDeg": 77.21, + "pTravelTimeSec": null, + "sTravelTimeSec": 1199.2 + }, + { + "station": "CPCT", + "network": "IR", + "distanceDeg": 77.32, + "pTravelTimeSec": 653.3, + "sTravelTimeSec": null + }, + { + "station": "U54A", + "network": "IR", + "distanceDeg": 77.47, + "pTravelTimeSec": 654.3, + "sTravelTimeSec": null + }, + { + "station": "DZM", + "network": "IR", + "distanceDeg": 77.48, + "pTravelTimeSec": 655.1, + "sTravelTimeSec": null + }, + { + "station": "CBN", + "network": "IR", + "distanceDeg": 77.65, + "pTravelTimeSec": 654.9, + "sTravelTimeSec": null + }, + { + "station": "R58B", + "network": "IR", + "distanceDeg": 77.69, + "pTravelTimeSec": 654.8, + "sTravelTimeSec": null + }, + { + "station": "V53A", + "network": "IR", + "distanceDeg": 77.82, + "pTravelTimeSec": 655.8, + "sTravelTimeSec": null + }, + { + "station": "W52A", + "network": "IR", + "distanceDeg": 77.87, + "pTravelTimeSec": 656.1, + "sTravelTimeSec": null + }, + { + "station": "OUENC", + "network": "IR", + "distanceDeg": 77.88, + "pTravelTimeSec": 657.1, + "sTravelTimeSec": null + }, + { + "station": "T57A", + "network": "IR", + "distanceDeg": 78.03, + "pTravelTimeSec": 656.8, + "sTravelTimeSec": null + }, + { + "station": "PINNC", + "network": "IR", + "distanceDeg": 78.15, + "pTravelTimeSec": 658.2, + "sTravelTimeSec": null + }, + { + "station": "BG3", + "network": "IR", + "distanceDeg": 78.36, + "pTravelTimeSec": 658.9, + "sTravelTimeSec": null + }, + { + "station": "V56A", + "network": "IR", + "distanceDeg": 78.6, + "pTravelTimeSec": 660, + "sTravelTimeSec": null + }, + { + "station": "T59A", + "network": "IR", + "distanceDeg": 78.68, + "pTravelTimeSec": 659.4, + "sTravelTimeSec": null + }, + { + "station": "KARP", + "network": "IR", + "distanceDeg": 78.75, + "pTravelTimeSec": 659.6, + "sTravelTimeSec": null + }, + { + "station": "Y52A", + "network": "IR", + "distanceDeg": 78.88, + "pTravelTimeSec": 661.4, + "sTravelTimeSec": null + }, + { + "station": "PAULI", + "network": "IR", + "distanceDeg": 78.95, + "pTravelTimeSec": 661.6, + "sTravelTimeSec": null + }, + { + "station": "TIP", + "network": "IR", + "distanceDeg": 79.16, + "pTravelTimeSec": 663.7, + "sTravelTimeSec": null + }, + { + "station": "ITM", + "network": "IR", + "distanceDeg": 79.24, + "pTravelTimeSec": 662.9, + "sTravelTimeSec": null + }, + { + "station": "BIRD", + "network": "IR", + "distanceDeg": 79.64, + "pTravelTimeSec": 665.7, + "sTravelTimeSec": null + }, + { + "station": "IDI", + "network": "IR", + "distanceDeg": 79.85, + "pTravelTimeSec": null, + "sTravelTimeSec": 1214.6 + }, + { + "station": "EIDS", + "network": "IR", + "distanceDeg": 79.95, + "pTravelTimeSec": 667.5, + "sTravelTimeSec": null + }, + { + "station": "ASAR", + "network": "IR", + "distanceDeg": 79.98, + "pTravelTimeSec": 667.3, + "sTravelTimeSec": null + }, + { + "station": "AS31", + "network": "IR", + "distanceDeg": 79.98, + "pTravelTimeSec": 667.4, + "sTravelTimeSec": null + }, + { + "station": "NIUE", + "network": "IR", + "distanceDeg": 80.09, + "pTravelTimeSec": 668.4, + "sTravelTimeSec": null + }, + { + "station": "253A", + "network": "IR", + "distanceDeg": 80.41, + "pTravelTimeSec": null, + "sTravelTimeSec": 1234.9 + }, + { + "station": "PSA00", + "network": "IR", + "distanceDeg": 81.33, + "pTravelTimeSec": 672.9, + "sTravelTimeSec": null + }, + { + "station": "VAE", + "network": "IR", + "distanceDeg": 81.45, + "pTravelTimeSec": 675.9, + "sTravelTimeSec": null + }, + { + "station": "MOIG", + "network": "IR", + "distanceDeg": 82.71, + "pTravelTimeSec": 683.4, + "sTravelTimeSec": null + }, + { + "station": "MTE", + "network": "IR", + "distanceDeg": 83.66, + "pTravelTimeSec": 684.9, + "sTravelTimeSec": null + }, + { + "station": "COI", + "network": "IR", + "distanceDeg": 83.97, + "pTravelTimeSec": 687.8, + "sTravelTimeSec": null + }, + { + "station": "PAB", + "network": "IR", + "distanceDeg": 83.99, + "pTravelTimeSec": 687.3, + "sTravelTimeSec": null + }, + { + "station": "TAOE", + "network": "IR", + "distanceDeg": 84.17, + "pTravelTimeSec": 688.3, + "sTravelTimeSec": null + }, + { + "station": "KEST", + "network": "IR", + "distanceDeg": 84.55, + "pTravelTimeSec": 692, + "sTravelTimeSec": null + }, + { + "station": "DWPF", + "network": "IR", + "distanceDeg": 84.99, + "pTravelTimeSec": 693.1, + "sTravelTimeSec": null + }, + { + "station": "CART", + "network": "IR", + "distanceDeg": 85.27, + "pTravelTimeSec": 693.1, + "sTravelTimeSec": null + }, + { + "station": "RAR", + "network": "IR", + "distanceDeg": 85.76, + "pTravelTimeSec": 696.4, + "sTravelTimeSec": null + }, + { + "station": "LHI", + "network": "IR", + "distanceDeg": 86.21, + "pTravelTimeSec": 699.5, + "sTravelTimeSec": null + }, + { + "station": "ROSA", + "network": "IR", + "distanceDeg": 86.75, + "pTravelTimeSec": 701.2, + "sTravelTimeSec": null + }, + { + "station": "PPT", + "network": "IR", + "distanceDeg": 86.93, + "pTravelTimeSec": 703.2, + "sTravelTimeSec": null + }, + { + "station": "PPTF", + "network": "IR", + "distanceDeg": 86.95, + "pTravelTimeSec": 702.9, + "sTravelTimeSec": null + }, + { + "station": "STKA", + "network": "IR", + "distanceDeg": 86.99, + "pTravelTimeSec": 701.6, + "sTravelTimeSec": null + }, + { + "station": "PFVI", + "network": "IR", + "distanceDeg": 87.05, + "pTravelTimeSec": 701.9, + "sTravelTimeSec": null + }, + { + "station": "BBSR", + "network": "IR", + "distanceDeg": 87.18, + "pTravelTimeSec": 703.5, + "sTravelTimeSec": null + }, + { + "station": "RAO", + "network": "IR", + "distanceDeg": 87.39, + "pTravelTimeSec": 703.8, + "sTravelTimeSec": null + }, + { + "station": "CMLA", + "network": "IR", + "distanceDeg": 87.71, + "pTravelTimeSec": 705.9, + "sTravelTimeSec": null + }, + { + "station": "FORT", + "network": "IR", + "distanceDeg": 88.03, + "pTravelTimeSec": 705.8, + "sTravelTimeSec": null + }, + { + "station": "BBOO", + "network": "IR", + "distanceDeg": 88.59, + "pTravelTimeSec": 708.2, + "sTravelTimeSec": null + }, + { + "station": "CAN", + "network": "IR", + "distanceDeg": 89.92, + "pTravelTimeSec": 716, + "sTravelTimeSec": null + }, + { + "station": "DGAR", + "network": "IR", + "distanceDeg": 90.73, + "pTravelTimeSec": 719.1, + "sTravelTimeSec": null + }, + { + "station": "OUZ", + "network": "IR", + "distanceDeg": 91.45, + "pTravelTimeSec": 723.2, + "sTravelTimeSec": null + }, + { + "station": "ATD", + "network": "IR", + "distanceDeg": 92.01, + "pTravelTimeSec": 726.1, + "sTravelTimeSec": null + }, + { + "station": "PMOZ", + "network": "IR", + "distanceDeg": 92.25, + "pTravelTimeSec": 725.8, + "sTravelTimeSec": null + }, + { + "station": "NWAO", + "network": "IR", + "distanceDeg": 92.78, + "pTravelTimeSec": 727.9, + "sTravelTimeSec": null + }, + { + "station": "FSCY", + "network": "IR", + "distanceDeg": 92.82, + "pTravelTimeSec": 729.3, + "sTravelTimeSec": null + }, + { + "station": "TGUH", + "network": "IR", + "distanceDeg": 94.54, + "pTravelTimeSec": 737, + "sTravelTimeSec": null + }, + { + "station": "HIZ", + "network": "IR", + "distanceDeg": 94.87, + "pTravelTimeSec": 738.5, + "sTravelTimeSec": null + }, + { + "station": "URZ", + "network": "IR", + "distanceDeg": 95.02, + "pTravelTimeSec": 739.9, + "sTravelTimeSec": null + }, + { + "station": "BKZ", + "network": "IR", + "distanceDeg": 95.79, + "pTravelTimeSec": 743.1, + "sTravelTimeSec": null + }, + { + "station": "FURI", + "network": "IR", + "distanceDeg": 96.41, + "pTravelTimeSec": 747.2, + "sTravelTimeSec": null + }, + { + "station": "MACI", + "network": "IR", + "distanceDeg": 96.73, + "pTravelTimeSec": 746.8, + "sTravelTimeSec": null + }, + { + "station": "BFZ", + "network": "IR", + "distanceDeg": 97.22, + "pTravelTimeSec": 750.4, + "sTravelTimeSec": null + }, + { + "station": "SDDR", + "network": "IR", + "distanceDeg": 97.24, + "pTravelTimeSec": 749.8, + "sTravelTimeSec": null + }, + { + "station": "MJAR", + "network": "IR", + "distanceDeg": 121.05, + "pTravelTimeSec": 243.5, + "sTravelTimeSec": null + }, + { + "station": "BCAR", + "network": "IR", + "distanceDeg": 121.05, + "pTravelTimeSec": 347.3, + "sTravelTimeSec": null + }, + { + "station": "ARCES", + "network": "IR", + "distanceDeg": 121.05, + "pTravelTimeSec": 480.9, + "sTravelTimeSec": null + }, + { + "station": "AKASG", + "network": "IR", + "distanceDeg": 121.05, + "pTravelTimeSec": 580.2, + "sTravelTimeSec": null + }, + { + "station": "BRTR", + "network": "IR", + "distanceDeg": 121.05, + "pTravelTimeSec": 627.6, + "sTravelTimeSec": null + }, + { + "station": "ESDC", + "network": "IR", + "distanceDeg": 121.05, + "pTravelTimeSec": 685.9, + "sTravelTimeSec": null + }, + { + "station": "SIV", + "network": "IR", + "distanceDeg": 133.04, + "pTravelTimeSec": 909, + "sTravelTimeSec": null + } + ] +} \ No newline at end of file diff --git a/src/data/tohoku-2011.json b/src/data/tohoku-2011.json new file mode 100644 index 0000000..0ab9448 --- /dev/null +++ b/src/data/tohoku-2011.json @@ -0,0 +1,3513 @@ +{ + "id": "tohoku-2011", + "name": "2011 Tōhoku, Japan (Mw 9.1)", + "originTime": "2011-03-11T05:46:24Z", + "latitude": 38.297, + "longitude": 142.373, + "depthKm": 29, + "magnitudeMw": 9.1, + "usgsId": "official20110311054624120_30", + "note": "Largest recorded earthquake in Japan. Shallow source, excellent global coverage. Clear P shadow zone near 105°–140°.", + "arrivals": [ + { + "station": "MJAR", + "network": "IR", + "distanceDeg": 3.75, + "pTravelTimeSec": 56.9, + "sTravelTimeSec": null + }, + { + "station": "MAJO", + "network": "IR", + "distanceDeg": 3.75, + "pTravelTimeSec": 57.1, + "sTravelTimeSec": null + }, + { + "station": "ERM", + "network": "IR", + "distanceDeg": 3.76, + "pTravelTimeSec": 54.9, + "sTravelTimeSec": null + }, + { + "station": "INU", + "network": "IR", + "distanceDeg": 5.21, + "pTravelTimeSec": 77, + "sTravelTimeSec": null + }, + { + "station": "JHJ2", + "network": "IR", + "distanceDeg": 5.58, + "pTravelTimeSec": 78.5, + "sTravelTimeSec": null + }, + { + "station": "ASAJ", + "network": "IR", + "distanceDeg": 5.82, + "pTravelTimeSec": 84, + "sTravelTimeSec": null + }, + { + "station": "YSS", + "network": "IR", + "distanceDeg": 8.66, + "pTravelTimeSec": 123.4, + "sTravelTimeSec": null + }, + { + "station": "JNU", + "network": "IR", + "distanceDeg": 10.67, + "pTravelTimeSec": 153.8, + "sTravelTimeSec": null + }, + { + "station": "CBIJ", + "network": "IR", + "distanceDeg": 11.17, + "pTravelTimeSec": 153.1, + "sTravelTimeSec": null + }, + { + "station": "MDJ", + "network": "IR", + "distanceDeg": 11.47, + "pTravelTimeSec": 163.1, + "sTravelTimeSec": null + }, + { + "station": "KSAR", + "network": "IR", + "distanceDeg": 11.49, + "pTravelTimeSec": 164.2, + "sTravelTimeSec": null + }, + { + "station": "INCN", + "network": "IR", + "distanceDeg": 12.46, + "pTravelTimeSec": 176.7, + "sTravelTimeSec": null + }, + { + "station": "KLR", + "network": "IR", + "distanceDeg": 13.34, + "pTravelTimeSec": 185.8, + "sTravelTimeSec": null + }, + { + "station": "JOW", + "network": "IR", + "distanceDeg": 16.47, + "pTravelTimeSec": 227, + "sTravelTimeSec": null + }, + { + "station": "PETK", + "network": "IR", + "distanceDeg": 18.21, + "pTravelTimeSec": 247, + "sTravelTimeSec": null + }, + { + "station": "PET", + "network": "IR", + "distanceDeg": 18.54, + "pTravelTimeSec": 254.8, + "sTravelTimeSec": null + }, + { + "station": "HIA", + "network": "IR", + "distanceDeg": 19.6, + "pTravelTimeSec": 264, + "sTravelTimeSec": null + }, + { + "station": "BJT", + "network": "IR", + "distanceDeg": 20.37, + "pTravelTimeSec": 272, + "sTravelTimeSec": null + }, + { + "station": "YOJ", + "network": "IR", + "distanceDeg": 21.47, + "pTravelTimeSec": 282.6, + "sTravelTimeSec": null + }, + { + "station": "SARN", + "network": "IR", + "distanceDeg": 21.72, + "pTravelTimeSec": 289.3, + "sTravelTimeSec": null + }, + { + "station": "MA2", + "network": "IR", + "distanceDeg": 21.96, + "pTravelTimeSec": 289.8, + "sTravelTimeSec": null + }, + { + "station": "ANA2", + "network": "IR", + "distanceDeg": 22.07, + "pTravelTimeSec": 293.6, + "sTravelTimeSec": null + }, + { + "station": "TATO", + "network": "IR", + "distanceDeg": 22.13, + "pTravelTimeSec": 292, + "sTravelTimeSec": null + }, + { + "station": "YHNB", + "network": "IR", + "distanceDeg": 22.41, + "pTravelTimeSec": 294.7, + "sTravelTimeSec": null + }, + { + "station": "NACB", + "network": "IR", + "distanceDeg": 22.6, + "pTravelTimeSec": 294.6, + "sTravelTimeSec": null + }, + { + "station": "SSLB", + "network": "IR", + "distanceDeg": 23.29, + "pTravelTimeSec": 302.6, + "sTravelTimeSec": null + }, + { + "station": "YULB", + "network": "IR", + "distanceDeg": 23.33, + "pTravelTimeSec": 302.4, + "sTravelTimeSec": null + }, + { + "station": "TPUB", + "network": "IR", + "distanceDeg": 23.84, + "pTravelTimeSec": 308.6, + "sTravelTimeSec": null + }, + { + "station": "TWG", + "network": "IR", + "distanceDeg": 23.88, + "pTravelTimeSec": 309.9, + "sTravelTimeSec": null + }, + { + "station": "GUMO", + "network": "IR", + "distanceDeg": 24.71, + "pTravelTimeSec": 316.2, + "sTravelTimeSec": null + }, + { + "station": "YAK", + "network": "IR", + "distanceDeg": 25.02, + "pTravelTimeSec": 320.1, + "sTravelTimeSec": null + }, + { + "station": "SEY", + "network": "IR", + "distanceDeg": 25.41, + "pTravelTimeSec": 324.1, + "sTravelTimeSec": null + }, + { + "station": "SMY", + "network": "IR", + "distanceDeg": 26.24, + "pTravelTimeSec": 332.2, + "sTravelTimeSec": null + }, + { + "station": "ULN", + "network": "IR", + "distanceDeg": 27.3, + "pTravelTimeSec": 341.7, + "sTravelTimeSec": null + }, + { + "station": "SONM", + "network": "IR", + "distanceDeg": 27.74, + "pTravelTimeSec": 346.4, + "sTravelTimeSec": null + }, + { + "station": "ENH", + "network": "IR", + "distanceDeg": 28.22, + "pTravelTimeSec": 349.5, + "sTravelTimeSec": null + }, + { + "station": "TLY", + "network": "IR", + "distanceDeg": 30.1, + "pTravelTimeSec": 366.6, + "sTravelTimeSec": null + }, + { + "station": "TGY", + "network": "IR", + "distanceDeg": 30.68, + "pTravelTimeSec": 373.8, + "sTravelTimeSec": null + }, + { + "station": "BILL", + "network": "IR", + "distanceDeg": 32.6, + "pTravelTimeSec": 387.4, + "sTravelTimeSec": null + }, + { + "station": "ATKA", + "network": "IR", + "distanceDeg": 33.06, + "pTravelTimeSec": 392.7, + "sTravelTimeSec": null + }, + { + "station": "TIXI", + "network": "IR", + "distanceDeg": 34.13, + "pTravelTimeSec": 401.6, + "sTravelTimeSec": null + }, + { + "station": "QIZ", + "network": "IR", + "distanceDeg": 34.15, + "pTravelTimeSec": 405, + "sTravelTimeSec": null + }, + { + "station": "PATS", + "network": "IR", + "distanceDeg": 34.49, + "pTravelTimeSec": 405.9, + "sTravelTimeSec": null + }, + { + "station": "DAV", + "network": "IR", + "distanceDeg": 34.61, + "pTravelTimeSec": 407.8, + "sTravelTimeSec": null + }, + { + "station": "MIDW", + "network": "IR", + "distanceDeg": 34.9, + "pTravelTimeSec": 405.8, + "sTravelTimeSec": null + }, + { + "station": "NIKH", + "network": "IR", + "distanceDeg": 36.38, + "pTravelTimeSec": 421.8, + "sTravelTimeSec": null + }, + { + "station": "KWAJ", + "network": "IR", + "distanceDeg": 37.13, + "pTravelTimeSec": 423.9, + "sTravelTimeSec": null + }, + { + "station": "GAMB", + "network": "IR", + "distanceDeg": 37.24, + "pTravelTimeSec": 428.3, + "sTravelTimeSec": null + }, + { + "station": "AKUT", + "network": "IR", + "distanceDeg": 38.28, + "pTravelTimeSec": 445.9, + "sTravelTimeSec": null + }, + { + "station": "MYLDM", + "network": "IR", + "distanceDeg": 39.47, + "pTravelTimeSec": 448.2, + "sTravelTimeSec": null + }, + { + "station": "FALS", + "network": "IR", + "distanceDeg": 39.68, + "pTravelTimeSec": 450.4, + "sTravelTimeSec": null + }, + { + "station": "TNTI", + "network": "IR", + "distanceDeg": 39.81, + "pTravelTimeSec": 449.8, + "sTravelTimeSec": null + }, + { + "station": "KKM", + "network": "IR", + "distanceDeg": 39.92, + "pTravelTimeSec": 450.5, + "sTravelTimeSec": null + }, + { + "station": "MANU", + "network": "IR", + "distanceDeg": 40.4, + "pTravelTimeSec": 454.9, + "sTravelTimeSec": null + }, + { + "station": "JAY", + "network": "IR", + "distanceDeg": 40.64, + "pTravelTimeSec": 457.6, + "sTravelTimeSec": null + }, + { + "station": "SDPT", + "network": "IR", + "distanceDeg": 41.38, + "pTravelTimeSec": 461.8, + "sTravelTimeSec": null + }, + { + "station": "ZALV", + "network": "IR", + "distanceDeg": 41.64, + "pTravelTimeSec": 465, + "sTravelTimeSec": null + }, + { + "station": "FAKI", + "network": "IR", + "distanceDeg": 42.07, + "pTravelTimeSec": 467.4, + "sTravelTimeSec": null + }, + { + "station": "CHGN", + "network": "IR", + "distanceDeg": 42.53, + "pTravelTimeSec": 472.1, + "sTravelTimeSec": null + }, + { + "station": "CMAR", + "network": "IR", + "distanceDeg": 42.56, + "pTravelTimeSec": 473.3, + "sTravelTimeSec": null + }, + { + "station": "LSA", + "network": "IR", + "distanceDeg": 42.86, + "pTravelTimeSec": 476.7, + "sTravelTimeSec": null + }, + { + "station": "LUWI", + "network": "IR", + "distanceDeg": 43.12, + "pTravelTimeSec": 476.3, + "sTravelTimeSec": null + }, + { + "station": "RABL", + "network": "IR", + "distanceDeg": 43.24, + "pTravelTimeSec": 479.9, + "sTravelTimeSec": null + }, + { + "station": "TTA", + "network": "IR", + "distanceDeg": 43.95, + "pTravelTimeSec": 484.8, + "sTravelTimeSec": null + }, + { + "station": "SVW2", + "network": "IR", + "distanceDeg": 44.06, + "pTravelTimeSec": 484.1, + "sTravelTimeSec": null + }, + { + "station": "MKAR", + "network": "IR", + "distanceDeg": 44.11, + "pTravelTimeSec": 486, + "sTravelTimeSec": null + }, + { + "station": "MAKZ", + "network": "IR", + "distanceDeg": 44.31, + "pTravelTimeSec": 487.7, + "sTravelTimeSec": null + }, + { + "station": "SBUM", + "network": "IR", + "distanceDeg": 45.09, + "pTravelTimeSec": 492.6, + "sTravelTimeSec": null + }, + { + "station": "OHAK", + "network": "IR", + "distanceDeg": 45.31, + "pTravelTimeSec": 493.6, + "sTravelTimeSec": null + }, + { + "station": "RSO", + "network": "IR", + "distanceDeg": 45.44, + "pTravelTimeSec": 495.6, + "sTravelTimeSec": null + }, + { + "station": "KDAK", + "network": "IR", + "distanceDeg": 45.65, + "pTravelTimeSec": 495.1, + "sTravelTimeSec": null + }, + { + "station": "PPLA", + "network": "IR", + "distanceDeg": 45.7, + "pTravelTimeSec": 498.8, + "sTravelTimeSec": null + }, + { + "station": "KURK", + "network": "IR", + "distanceDeg": 45.76, + "pTravelTimeSec": 497.7, + "sTravelTimeSec": null + }, + { + "station": "CAST", + "network": "IR", + "distanceDeg": 45.76, + "pTravelTimeSec": 499.4, + "sTravelTimeSec": null + }, + { + "station": "SPU", + "network": "IR", + "distanceDeg": 45.77, + "pTravelTimeSec": 498.4, + "sTravelTimeSec": null + }, + { + "station": "HOM", + "network": "IR", + "distanceDeg": 46.03, + "pTravelTimeSec": 500.4, + "sTravelTimeSec": null + }, + { + "station": "TARA", + "network": "IR", + "distanceDeg": 46.22, + "pTravelTimeSec": 497.8, + "sTravelTimeSec": null + }, + { + "station": "BPAW", + "network": "IR", + "distanceDeg": 46.25, + "pTravelTimeSec": 502.4, + "sTravelTimeSec": null + }, + { + "station": "KTH", + "network": "IR", + "distanceDeg": 46.28, + "pTravelTimeSec": 503.6, + "sTravelTimeSec": null + }, + { + "station": "MLY", + "network": "IR", + "distanceDeg": 46.38, + "pTravelTimeSec": 502.6, + "sTravelTimeSec": null + }, + { + "station": "BRLK", + "network": "IR", + "distanceDeg": 46.41, + "pTravelTimeSec": 503.3, + "sTravelTimeSec": null + }, + { + "station": "TRF", + "network": "IR", + "distanceDeg": 46.56, + "pTravelTimeSec": 503.9, + "sTravelTimeSec": null + }, + { + "station": "COLD", + "network": "IR", + "distanceDeg": 46.68, + "pTravelTimeSec": 505.8, + "sTravelTimeSec": null + }, + { + "station": "RC01", + "network": "IR", + "distanceDeg": 46.9, + "pTravelTimeSec": 506.3, + "sTravelTimeSec": null + }, + { + "station": "KSM", + "network": "IR", + "distanceDeg": 46.97, + "pTravelTimeSec": 509.2, + "sTravelTimeSec": null + }, + { + "station": "SEW", + "network": "IR", + "distanceDeg": 47.1, + "pTravelTimeSec": 508.6, + "sTravelTimeSec": null + }, + { + "station": "JOHN", + "network": "IR", + "distanceDeg": 47.15, + "pTravelTimeSec": 510.7, + "sTravelTimeSec": null + }, + { + "station": "PMR", + "network": "IR", + "distanceDeg": 47.16, + "pTravelTimeSec": 508.4, + "sTravelTimeSec": null + }, + { + "station": "MCK", + "network": "IR", + "distanceDeg": 47.16, + "pTravelTimeSec": 510.1, + "sTravelTimeSec": null + }, + { + "station": "SAUI", + "network": "IR", + "distanceDeg": 47.18, + "pTravelTimeSec": 525.9, + "sTravelTimeSec": null + }, + { + "station": "RND", + "network": "IR", + "distanceDeg": 47.21, + "pTravelTimeSec": 509.9, + "sTravelTimeSec": null + }, + { + "station": "MDM", + "network": "IR", + "distanceDeg": 47.44, + "pTravelTimeSec": 511.4, + "sTravelTimeSec": null + }, + { + "station": "WRH", + "network": "IR", + "distanceDeg": 47.51, + "pTravelTimeSec": 511.9, + "sTravelTimeSec": null + }, + { + "station": "SML", + "network": "IR", + "distanceDeg": 47.53, + "pTravelTimeSec": 525.9, + "sTravelTimeSec": null + }, + { + "station": "COLA", + "network": "IR", + "distanceDeg": 47.61, + "pTravelTimeSec": 513.8, + "sTravelTimeSec": null + }, + { + "station": "CCB", + "network": "IR", + "distanceDeg": 47.63, + "pTravelTimeSec": 513.7, + "sTravelTimeSec": null + }, + { + "station": "PMG", + "network": "IR", + "distanceDeg": 47.66, + "pTravelTimeSec": 514.1, + "sTravelTimeSec": null + }, + { + "station": "DHY", + "network": "IR", + "distanceDeg": 47.89, + "pTravelTimeSec": 516.1, + "sTravelTimeSec": null + }, + { + "station": "KAPI", + "network": "IR", + "distanceDeg": 47.93, + "pTravelTimeSec": 516.7, + "sTravelTimeSec": null + }, + { + "station": "SCM", + "network": "IR", + "distanceDeg": 48, + "pTravelTimeSec": 525.9, + "sTravelTimeSec": null + }, + { + "station": "HDA", + "network": "IR", + "distanceDeg": 48.01, + "pTravelTimeSec": 525.9, + "sTravelTimeSec": null + }, + { + "station": "ILAR", + "network": "IR", + "distanceDeg": 48.02, + "pTravelTimeSec": 513.8, + "sTravelTimeSec": null + }, + { + "station": "FYU", + "network": "IR", + "distanceDeg": 48.64, + "pTravelTimeSec": 521.2, + "sTravelTimeSec": null + }, + { + "station": "KLU", + "network": "IR", + "distanceDeg": 48.7, + "pTravelTimeSec": 535.9, + "sTravelTimeSec": null + }, + { + "station": "MID", + "network": "IR", + "distanceDeg": 48.74, + "pTravelTimeSec": 535.9, + "sTravelTimeSec": null + }, + { + "station": "PAX", + "network": "IR", + "distanceDeg": 48.77, + "pTravelTimeSec": 522.9, + "sTravelTimeSec": null + }, + { + "station": "DIV", + "network": "IR", + "distanceDeg": 48.81, + "pTravelTimeSec": 535.9, + "sTravelTimeSec": null + }, + { + "station": "EYAK", + "network": "IR", + "distanceDeg": 48.89, + "pTravelTimeSec": 524, + "sTravelTimeSec": null + }, + { + "station": "DOT", + "network": "IR", + "distanceDeg": 49.33, + "pTravelTimeSec": 526.2, + "sTravelTimeSec": null + }, + { + "station": "BMRM", + "network": "IR", + "distanceDeg": 49.4, + "pTravelTimeSec": 527.4, + "sTravelTimeSec": null + }, + { + "station": "RAGM", + "network": "IR", + "distanceDeg": 49.44, + "pTravelTimeSec": 530, + "sTravelTimeSec": null + }, + { + "station": "MENT", + "network": "IR", + "distanceDeg": 49.57, + "pTravelTimeSec": 529.1, + "sTravelTimeSec": null + }, + { + "station": "TKM2", + "network": "IR", + "distanceDeg": 49.71, + "pTravelTimeSec": 529.9, + "sTravelTimeSec": null + }, + { + "station": "VOSK", + "network": "IR", + "distanceDeg": 50.02, + "pTravelTimeSec": 530.9, + "sTravelTimeSec": null + }, + { + "station": "KULM", + "network": "IR", + "distanceDeg": 50.11, + "pTravelTimeSec": 532.2, + "sTravelTimeSec": null + }, + { + "station": "HNR", + "network": "IR", + "distanceDeg": 50.24, + "pTravelTimeSec": 533.1, + "sTravelTimeSec": null + }, + { + "station": "BVAR", + "network": "IR", + "distanceDeg": 50.29, + "pTravelTimeSec": 533.2, + "sTravelTimeSec": null + }, + { + "station": "MMRI", + "network": "IR", + "distanceDeg": 50.33, + "pTravelTimeSec": 535.8, + "sTravelTimeSec": null + }, + { + "station": "BRVK", + "network": "IR", + "distanceDeg": 50.35, + "pTravelTimeSec": 533.7, + "sTravelTimeSec": null + }, + { + "station": "IPM", + "network": "IR", + "distanceDeg": 50.37, + "pTravelTimeSec": 534.4, + "sTravelTimeSec": null + }, + { + "station": "EGAK", + "network": "IR", + "distanceDeg": 50.47, + "pTravelTimeSec": 535.1, + "sTravelTimeSec": null + }, + { + "station": "AAK", + "network": "IR", + "distanceDeg": 50.57, + "pTravelTimeSec": 535.3, + "sTravelTimeSec": null + }, + { + "station": "MYKOM", + "network": "IR", + "distanceDeg": 50.62, + "pTravelTimeSec": 536.7, + "sTravelTimeSec": null + }, + { + "station": "SOEI", + "network": "IR", + "distanceDeg": 50.71, + "pTravelTimeSec": 537, + "sTravelTimeSec": null + }, + { + "station": "EKS2", + "network": "IR", + "distanceDeg": 51.06, + "pTravelTimeSec": 539.5, + "sTravelTimeSec": null + }, + { + "station": "ZRNK", + "network": "IR", + "distanceDeg": 51.12, + "pTravelTimeSec": 539.6, + "sTravelTimeSec": null + }, + { + "station": "BATI", + "network": "IR", + "distanceDeg": 51.32, + "pTravelTimeSec": 547.5, + "sTravelTimeSec": null + }, + { + "station": "DAWY", + "network": "IR", + "distanceDeg": 51.33, + "pTravelTimeSec": 542.3, + "sTravelTimeSec": null + }, + { + "station": "KEKH", + "network": "IR", + "distanceDeg": 51.86, + "pTravelTimeSec": 546.2, + "sTravelTimeSec": null + }, + { + "station": "MTN", + "network": "IR", + "distanceDeg": 51.95, + "pTravelTimeSec": 545.9, + "sTravelTimeSec": null + }, + { + "station": "COEN", + "network": "IR", + "distanceDeg": 51.98, + "pTravelTimeSec": 546.3, + "sTravelTimeSec": null + }, + { + "station": "YKU2", + "network": "IR", + "distanceDeg": 52.08, + "pTravelTimeSec": 555.9, + "sTravelTimeSec": null + }, + { + "station": "LHMI", + "network": "IR", + "distanceDeg": 52.71, + "pTravelTimeSec": 554.9, + "sTravelTimeSec": null + }, + { + "station": "INK", + "network": "IR", + "distanceDeg": 52.92, + "pTravelTimeSec": 554.4, + "sTravelTimeSec": null + }, + { + "station": "KKAR", + "network": "IR", + "distanceDeg": 53.16, + "pTravelTimeSec": 555.1, + "sTravelTimeSec": null + }, + { + "station": "PSI", + "network": "IR", + "distanceDeg": 53.17, + "pTravelTimeSec": 553.4, + "sTravelTimeSec": null + }, + { + "station": "OPA", + "network": "IR", + "distanceDeg": 53.35, + "pTravelTimeSec": 556.3, + "sTravelTimeSec": null + }, + { + "station": "JAGI", + "network": "IR", + "distanceDeg": 53.45, + "pTravelTimeSec": 558.5, + "sTravelTimeSec": null + }, + { + "station": "KIP", + "network": "IR", + "distanceDeg": 53.49, + "pTravelTimeSec": 557.5, + "sTravelTimeSec": null + }, + { + "station": "BKNI", + "network": "IR", + "distanceDeg": 53.54, + "pTravelTimeSec": 557.9, + "sTravelTimeSec": null + }, + { + "station": "SMRI", + "network": "IR", + "distanceDeg": 54.02, + "pTravelTimeSec": 562.6, + "sTravelTimeSec": null + }, + { + "station": "SKAG", + "network": "IR", + "distanceDeg": 54.23, + "pTravelTimeSec": 562.8, + "sTravelTimeSec": null + }, + { + "station": "UGM", + "network": "IR", + "distanceDeg": 54.71, + "pTravelTimeSec": 565.7, + "sTravelTimeSec": null + }, + { + "station": "GSI", + "network": "IR", + "distanceDeg": 55.1, + "pTravelTimeSec": 567.7, + "sTravelTimeSec": null + }, + { + "station": "HLK", + "network": "IR", + "distanceDeg": 55.24, + "pTravelTimeSec": 571.1, + "sTravelTimeSec": null + }, + { + "station": "LEM", + "network": "IR", + "distanceDeg": 55.32, + "pTravelTimeSec": 572.7, + "sTravelTimeSec": null + }, + { + "station": "CISI", + "network": "IR", + "distanceDeg": 55.82, + "pTravelTimeSec": 573.2, + "sTravelTimeSec": null + }, + { + "station": "ARU", + "network": "IR", + "distanceDeg": 55.92, + "pTravelTimeSec": 574.4, + "sTravelTimeSec": null + }, + { + "station": "MNAI", + "network": "IR", + "distanceDeg": 55.98, + "pTravelTimeSec": 576.1, + "sTravelTimeSec": null + }, + { + "station": "KKH", + "network": "IR", + "distanceDeg": 56.02, + "pTravelTimeSec": 577, + "sTravelTimeSec": null + }, + { + "station": "HPAH", + "network": "IR", + "distanceDeg": 56.06, + "pTravelTimeSec": 577.8, + "sTravelTimeSec": null + }, + { + "station": "KHU", + "network": "IR", + "distanceDeg": 56.56, + "pTravelTimeSec": 580, + "sTravelTimeSec": null + }, + { + "station": "CRAG", + "network": "IR", + "distanceDeg": 56.62, + "pTravelTimeSec": 581.2, + "sTravelTimeSec": null + }, + { + "station": "HPO", + "network": "IR", + "distanceDeg": 56.69, + "pTravelTimeSec": 581.4, + "sTravelTimeSec": null + }, + { + "station": "UWE", + "network": "IR", + "distanceDeg": 56.71, + "pTravelTimeSec": 595.9, + "sTravelTimeSec": null + }, + { + "station": "WRAK", + "network": "IR", + "distanceDeg": 56.91, + "pTravelTimeSec": 581.1, + "sTravelTimeSec": null + }, + { + "station": "DLBC", + "network": "IR", + "distanceDeg": 57.17, + "pTravelTimeSec": 583.2, + "sTravelTimeSec": null + }, + { + "station": "ABKAR", + "network": "IR", + "distanceDeg": 57.71, + "pTravelTimeSec": 586.8, + "sTravelTimeSec": null + }, + { + "station": "FUNA", + "network": "IR", + "distanceDeg": 57.86, + "pTravelTimeSec": 589.7, + "sTravelTimeSec": null + }, + { + "station": "CTAO", + "network": "IR", + "distanceDeg": 58.19, + "pTravelTimeSec": 590.3, + "sTravelTimeSec": null + }, + { + "station": "CTA", + "network": "IR", + "distanceDeg": 58.19, + "pTravelTimeSec": 592.1, + "sTravelTimeSec": null + }, + { + "station": "FITZ", + "network": "IR", + "distanceDeg": 58.26, + "pTravelTimeSec": 591.9, + "sTravelTimeSec": null + }, + { + "station": "AKTO", + "network": "IR", + "distanceDeg": 58.4, + "pTravelTimeSec": 592.7, + "sTravelTimeSec": null + }, + { + "station": "WRAB", + "network": "IR", + "distanceDeg": 58.41, + "pTravelTimeSec": 591.5, + "sTravelTimeSec": null + }, + { + "station": "WRA", + "network": "IR", + "distanceDeg": 58.42, + "pTravelTimeSec": 589.4, + "sTravelTimeSec": null + }, + { + "station": "XMIS", + "network": "IR", + "distanceDeg": 59.42, + "pTravelTimeSec": 600, + "sTravelTimeSec": null + }, + { + "station": "SPITS", + "network": "IR", + "distanceDeg": 59.43, + "pTravelTimeSec": 599.7, + "sTravelTimeSec": null + }, + { + "station": "BBB", + "network": "IR", + "distanceDeg": 60.63, + "pTravelTimeSec": 607.1, + "sTravelTimeSec": null + }, + { + "station": "RES", + "network": "IR", + "distanceDeg": 61.19, + "pTravelTimeSec": 610.2, + "sTravelTimeSec": null + }, + { + "station": "LVZ", + "network": "IR", + "distanceDeg": 61.27, + "pTravelTimeSec": 612.7, + "sTravelTimeSec": null + }, + { + "station": "ASAR", + "network": "IR", + "distanceDeg": 62.15, + "pTravelTimeSec": 618.8, + "sTravelTimeSec": null + }, + { + "station": "YKA", + "network": "IR", + "distanceDeg": 62.34, + "pTravelTimeSec": 619.2, + "sTravelTimeSec": null + }, + { + "station": "KEV", + "network": "IR", + "distanceDeg": 62.53, + "pTravelTimeSec": 621.8, + "sTravelTimeSec": null + }, + { + "station": "MBWA", + "network": "IR", + "distanceDeg": 62.85, + "pTravelTimeSec": 621.9, + "sTravelTimeSec": null + }, + { + "station": "ARCES", + "network": "IR", + "distanceDeg": 63.08, + "pTravelTimeSec": 623.4, + "sTravelTimeSec": null + }, + { + "station": "PALK", + "network": "IR", + "distanceDeg": 63.38, + "pTravelTimeSec": 626.5, + "sTravelTimeSec": null + }, + { + "station": "EIDS", + "network": "IR", + "distanceDeg": 63.85, + "pTravelTimeSec": 629.8, + "sTravelTimeSec": null + }, + { + "station": "PGC", + "network": "IR", + "distanceDeg": 64.92, + "pTravelTimeSec": 637, + "sTravelTimeSec": null + }, + { + "station": "MSVF", + "network": "IR", + "distanceDeg": 65.02, + "pTravelTimeSec": 638.1, + "sTravelTimeSec": null + }, + { + "station": "NLWA", + "network": "IR", + "distanceDeg": 65.31, + "pTravelTimeSec": 640.4, + "sTravelTimeSec": null + }, + { + "station": "XMAS", + "network": "IR", + "distanceDeg": 65.61, + "pTravelTimeSec": 640.8, + "sTravelTimeSec": null + }, + { + "station": "CMW", + "network": "IR", + "distanceDeg": 65.8, + "pTravelTimeSec": 642.2, + "sTravelTimeSec": null + }, + { + "station": "COCO", + "network": "IR", + "distanceDeg": 65.83, + "pTravelTimeSec": 643.9, + "sTravelTimeSec": null + }, + { + "station": "JCW", + "network": "IR", + "distanceDeg": 66.02, + "pTravelTimeSec": 642.4, + "sTravelTimeSec": null + }, + { + "station": "RPW", + "network": "IR", + "distanceDeg": 66.13, + "pTravelTimeSec": 644.9, + "sTravelTimeSec": null + }, + { + "station": "BLH", + "network": "IR", + "distanceDeg": 66.15, + "pTravelTimeSec": 645.9, + "sTravelTimeSec": null + }, + { + "station": "LCW", + "network": "IR", + "distanceDeg": 66.36, + "pTravelTimeSec": 648.5, + "sTravelTimeSec": null + }, + { + "station": "GPW", + "network": "IR", + "distanceDeg": 66.51, + "pTravelTimeSec": 648.3, + "sTravelTimeSec": null + }, + { + "station": "WRW", + "network": "IR", + "distanceDeg": 66.8, + "pTravelTimeSec": 650, + "sTravelTimeSec": null + }, + { + "station": "MTMW", + "network": "IR", + "distanceDeg": 66.99, + "pTravelTimeSec": 651, + "sTravelTimeSec": null + }, + { + "station": "AFI", + "network": "IR", + "distanceDeg": 67.37, + "pTravelTimeSec": 652.7, + "sTravelTimeSec": null + }, + { + "station": "OBN", + "network": "IR", + "distanceDeg": 67.54, + "pTravelTimeSec": 653.1, + "sTravelTimeSec": null + }, + { + "station": "TDH", + "network": "IR", + "distanceDeg": 67.63, + "pTravelTimeSec": 652.7, + "sTravelTimeSec": null + }, + { + "station": "SAW", + "network": "IR", + "distanceDeg": 67.73, + "pTravelTimeSec": 655, + "sTravelTimeSec": null + }, + { + "station": "VFP", + "network": "IR", + "distanceDeg": 67.81, + "pTravelTimeSec": 658.2, + "sTravelTimeSec": null + }, + { + "station": "EDM", + "network": "IR", + "distanceDeg": 67.89, + "pTravelTimeSec": 655, + "sTravelTimeSec": null + }, + { + "station": "FINES", + "network": "IR", + "distanceDeg": 68.05, + "pTravelTimeSec": 655.7, + "sTravelTimeSec": null + }, + { + "station": "HUMO", + "network": "IR", + "distanceDeg": 68.35, + "pTravelTimeSec": 658.3, + "sTravelTimeSec": null + }, + { + "station": "HAWA", + "network": "IR", + "distanceDeg": 68.36, + "pTravelTimeSec": 659.5, + "sTravelTimeSec": null + }, + { + "station": "VTHM", + "network": "IR", + "distanceDeg": 68.42, + "pTravelTimeSec": 660.1, + "sTravelTimeSec": null + }, + { + "station": "JCC", + "network": "IR", + "distanceDeg": 68.63, + "pTravelTimeSec": 675.9, + "sTravelTimeSec": null + }, + { + "station": "NEW", + "network": "IR", + "distanceDeg": 68.7, + "pTravelTimeSec": 659.9, + "sTravelTimeSec": null + }, + { + "station": "ARMA", + "network": "IR", + "distanceDeg": 68.91, + "pTravelTimeSec": 662.6, + "sTravelTimeSec": null + }, + { + "station": "YBH", + "network": "IR", + "distanceDeg": 68.97, + "pTravelTimeSec": 664, + "sTravelTimeSec": null + }, + { + "station": "KMRM", + "network": "IR", + "distanceDeg": 69.16, + "pTravelTimeSec": 665.6, + "sTravelTimeSec": null + }, + { + "station": "SUMG", + "network": "IR", + "distanceDeg": 69.42, + "pTravelTimeSec": 664.5, + "sTravelTimeSec": null + }, + { + "station": "K05A", + "network": "IR", + "distanceDeg": 69.56, + "pTravelTimeSec": 666.1, + "sTravelTimeSec": null + }, + { + "station": "WDC", + "network": "IR", + "distanceDeg": 69.71, + "pTravelTimeSec": 667.2, + "sTravelTimeSec": null + }, + { + "station": "STKA", + "network": "IR", + "distanceDeg": 69.82, + "pTravelTimeSec": 667.3, + "sTravelTimeSec": null + }, + { + "station": "WALA", + "network": "IR", + "distanceDeg": 69.99, + "pTravelTimeSec": 666.8, + "sTravelTimeSec": null + }, + { + "station": "BSMT", + "network": "IR", + "distanceDeg": 70.22, + "pTravelTimeSec": 671.4, + "sTravelTimeSec": null + }, + { + "station": "HOPS", + "network": "IR", + "distanceDeg": 70.24, + "pTravelTimeSec": 685.9, + "sTravelTimeSec": null + }, + { + "station": "BLMT", + "network": "IR", + "distanceDeg": 70.36, + "pTravelTimeSec": 672.6, + "sTravelTimeSec": null + }, + { + "station": "MOD", + "network": "IR", + "distanceDeg": 70.38, + "pTravelTimeSec": 671.4, + "sTravelTimeSec": null + }, + { + "station": "JTMT", + "network": "IR", + "distanceDeg": 70.56, + "pTravelTimeSec": 673.2, + "sTravelTimeSec": null + }, + { + "station": "YBMT", + "network": "IR", + "distanceDeg": 70.64, + "pTravelTimeSec": 673, + "sTravelTimeSec": null + }, + { + "station": "KIV", + "network": "IR", + "distanceDeg": 70.65, + "pTravelTimeSec": 672.4, + "sTravelTimeSec": null + }, + { + "station": "KVAR", + "network": "IR", + "distanceDeg": 70.65, + "pTravelTimeSec": 673, + "sTravelTimeSec": null + }, + { + "station": "KBZ", + "network": "IR", + "distanceDeg": 70.66, + "pTravelTimeSec": 672.2, + "sTravelTimeSec": null + }, + { + "station": "MCCM", + "network": "IR", + "distanceDeg": 70.84, + "pTravelTimeSec": 673.9, + "sTravelTimeSec": null + }, + { + "station": "SWMT", + "network": "IR", + "distanceDeg": 70.85, + "pTravelTimeSec": 673.1, + "sTravelTimeSec": null + }, + { + "station": "ORV", + "network": "IR", + "distanceDeg": 70.94, + "pTravelTimeSec": 672.3, + "sTravelTimeSec": null + }, + { + "station": "BBOO", + "network": "IR", + "distanceDeg": 70.99, + "pTravelTimeSec": 672.1, + "sTravelTimeSec": null + }, + { + "station": "WVOR", + "network": "IR", + "distanceDeg": 71.1, + "pTravelTimeSec": 674.2, + "sTravelTimeSec": null + }, + { + "station": "LHI", + "network": "IR", + "distanceDeg": 71.18, + "pTravelTimeSec": 676.9, + "sTravelTimeSec": null + }, + { + "station": "WSAR", + "network": "IR", + "distanceDeg": 71.28, + "pTravelTimeSec": 677.8, + "sTravelTimeSec": null + }, + { + "station": "MSO", + "network": "IR", + "distanceDeg": 71.29, + "pTravelTimeSec": 677.3, + "sTravelTimeSec": null + }, + { + "station": "GNI", + "network": "IR", + "distanceDeg": 71.56, + "pTravelTimeSec": 678.8, + "sTravelTimeSec": null + }, + { + "station": "CHMT", + "network": "IR", + "distanceDeg": 71.62, + "pTravelTimeSec": 679.3, + "sTravelTimeSec": null + }, + { + "station": "UOSS", + "network": "IR", + "distanceDeg": 72.15, + "pTravelTimeSec": 681.6, + "sTravelTimeSec": null + }, + { + "station": "MFID", + "network": "IR", + "distanceDeg": 72.22, + "pTravelTimeSec": 680.9, + "sTravelTimeSec": null + }, + { + "station": "FFC", + "network": "IR", + "distanceDeg": 72.23, + "pTravelTimeSec": 680.1, + "sTravelTimeSec": null + }, + { + "station": "CMB", + "network": "IR", + "distanceDeg": 72.52, + "pTravelTimeSec": 682.4, + "sTravelTimeSec": null + }, + { + "station": "FCC", + "network": "IR", + "distanceDeg": 72.53, + "pTravelTimeSec": 683.9, + "sTravelTimeSec": null + }, + { + "station": "SAO", + "network": "IR", + "distanceDeg": 72.56, + "pTravelTimeSec": 683.7, + "sTravelTimeSec": null + }, + { + "station": "LRM", + "network": "IR", + "distanceDeg": 72.72, + "pTravelTimeSec": 683.5, + "sTravelTimeSec": null + }, + { + "station": "EGMT", + "network": "IR", + "distanceDeg": 72.82, + "pTravelTimeSec": 684.3, + "sTravelTimeSec": null + }, + { + "station": "WAKR", + "network": "IR", + "distanceDeg": 72.86, + "pTravelTimeSec": 685.5, + "sTravelTimeSec": null + }, + { + "station": "DLMT", + "network": "IR", + "distanceDeg": 72.91, + "pTravelTimeSec": 685.2, + "sTravelTimeSec": null + }, + { + "station": "HLID", + "network": "IR", + "distanceDeg": 72.96, + "pTravelTimeSec": 685, + "sTravelTimeSec": null + }, + { + "station": "MCMT", + "network": "IR", + "distanceDeg": 73.1, + "pTravelTimeSec": 687.2, + "sTravelTimeSec": null + }, + { + "station": "HFS", + "network": "IR", + "distanceDeg": 73.25, + "pTravelTimeSec": 687.1, + "sTravelTimeSec": null + }, + { + "station": "BOZ", + "network": "IR", + "distanceDeg": 73.28, + "pTravelTimeSec": 688.8, + "sTravelTimeSec": null + }, + { + "station": "NOA", + "network": "IR", + "distanceDeg": 73.32, + "pTravelTimeSec": 687.6, + "sTravelTimeSec": null + }, + { + "station": "CAN", + "network": "IR", + "distanceDeg": 73.51, + "pTravelTimeSec": 690.8, + "sTravelTimeSec": null + }, + { + "station": "NVAR", + "network": "IR", + "distanceDeg": 73.63, + "pTravelTimeSec": 689.3, + "sTravelTimeSec": null + }, + { + "station": "AKASG", + "network": "IR", + "distanceDeg": 73.76, + "pTravelTimeSec": 690.3, + "sTravelTimeSec": null + }, + { + "station": "KIEV", + "network": "IR", + "distanceDeg": 73.78, + "pTravelTimeSec": 690.3, + "sTravelTimeSec": null + }, + { + "station": "QLMT", + "network": "IR", + "distanceDeg": 73.89, + "pTravelTimeSec": 692.8, + "sTravelTimeSec": null + }, + { + "station": "ELK", + "network": "IR", + "distanceDeg": 74.16, + "pTravelTimeSec": 692.4, + "sTravelTimeSec": null + }, + { + "station": "YMR", + "network": "IR", + "distanceDeg": 74.25, + "pTravelTimeSec": 694.9, + "sTravelTimeSec": null + }, + { + "station": "GCMT", + "network": "IR", + "distanceDeg": 74.27, + "pTravelTimeSec": 694.3, + "sTravelTimeSec": null + }, + { + "station": "YFT", + "network": "IR", + "distanceDeg": 74.46, + "pTravelTimeSec": 695.9, + "sTravelTimeSec": null + }, + { + "station": "SFJD", + "network": "IR", + "distanceDeg": 74.56, + "pTravelTimeSec": 695.6, + "sTravelTimeSec": null + }, + { + "station": "NWAO", + "network": "IR", + "distanceDeg": 74.62, + "pTravelTimeSec": 697.2, + "sTravelTimeSec": null + }, + { + "station": "H17A", + "network": "IR", + "distanceDeg": 74.64, + "pTravelTimeSec": 696.6, + "sTravelTimeSec": null + }, + { + "station": "FLWY", + "network": "IR", + "distanceDeg": 74.77, + "pTravelTimeSec": 705.9, + "sTravelTimeSec": null + }, + { + "station": "FXWY", + "network": "IR", + "distanceDeg": 74.86, + "pTravelTimeSec": 697.2, + "sTravelTimeSec": null + }, + { + "station": "KONO", + "network": "IR", + "distanceDeg": 74.91, + "pTravelTimeSec": 698.9, + "sTravelTimeSec": null + }, + { + "station": "RLMT", + "network": "IR", + "distanceDeg": 74.91, + "pTravelTimeSec": 698.9, + "sTravelTimeSec": null + }, + { + "station": "MOOW", + "network": "IR", + "distanceDeg": 74.95, + "pTravelTimeSec": 697.8, + "sTravelTimeSec": null + }, + { + "station": "HVU", + "network": "IR", + "distanceDeg": 75, + "pTravelTimeSec": 697.6, + "sTravelTimeSec": null + }, + { + "station": "LOHW", + "network": "IR", + "distanceDeg": 75.11, + "pTravelTimeSec": 700.1, + "sTravelTimeSec": null + }, + { + "station": "SNOW", + "network": "IR", + "distanceDeg": 75.12, + "pTravelTimeSec": 699.5, + "sTravelTimeSec": null + }, + { + "station": "REDW", + "network": "IR", + "distanceDeg": 75.13, + "pTravelTimeSec": 700.2, + "sTravelTimeSec": null + }, + { + "station": "ISA", + "network": "IR", + "distanceDeg": 75.15, + "pTravelTimeSec": 699.5, + "sTravelTimeSec": null + }, + { + "station": "AHID", + "network": "IR", + "distanceDeg": 75.36, + "pTravelTimeSec": 700.7, + "sTravelTimeSec": null + }, + { + "station": "DAC", + "network": "IR", + "distanceDeg": 75.36, + "pTravelTimeSec": 700.8, + "sTravelTimeSec": null + }, + { + "station": "FRB", + "network": "IR", + "distanceDeg": 75.37, + "pTravelTimeSec": 698.1, + "sTravelTimeSec": null + }, + { + "station": "DGMT", + "network": "IR", + "distanceDeg": 75.38, + "pTravelTimeSec": 700.1, + "sTravelTimeSec": null + }, + { + "station": "BGU", + "network": "IR", + "distanceDeg": 75.38, + "pTravelTimeSec": 702.2, + "sTravelTimeSec": null + }, + { + "station": "R11A", + "network": "IR", + "distanceDeg": 75.39, + "pTravelTimeSec": 699.1, + "sTravelTimeSec": null + }, + { + "station": "SPUT", + "network": "IR", + "distanceDeg": 75.48, + "pTravelTimeSec": 701.4, + "sTravelTimeSec": null + }, + { + "station": "LAO", + "network": "IR", + "distanceDeg": 75.52, + "pTravelTimeSec": 700.9, + "sTravelTimeSec": null + }, + { + "station": "TPNV", + "network": "IR", + "distanceDeg": 75.82, + "pTravelTimeSec": 702.4, + "sTravelTimeSec": null + }, + { + "station": "HWUT", + "network": "IR", + "distanceDeg": 75.82, + "pTravelTimeSec": 702.5, + "sTravelTimeSec": null + }, + { + "station": "DUG", + "network": "IR", + "distanceDeg": 75.96, + "pTravelTimeSec": 703, + "sTravelTimeSec": null + }, + { + "station": "TCUT", + "network": "IR", + "distanceDeg": 76.22, + "pTravelTimeSec": 715.9, + "sTravelTimeSec": null + }, + { + "station": "PASC", + "network": "IR", + "distanceDeg": 76.23, + "pTravelTimeSec": 706.6, + "sTravelTimeSec": null + }, + { + "station": "PDAR", + "network": "IR", + "distanceDeg": 76.24, + "pTravelTimeSec": 703.8, + "sTravelTimeSec": null + }, + { + "station": "BW06", + "network": "IR", + "distanceDeg": 76.24, + "pTravelTimeSec": 706.4, + "sTravelTimeSec": null + }, + { + "station": "CTU", + "network": "IR", + "distanceDeg": 76.28, + "pTravelTimeSec": 707.2, + "sTravelTimeSec": null + }, + { + "station": "BORG", + "network": "IR", + "distanceDeg": 76.49, + "pTravelTimeSec": 708, + "sTravelTimeSec": null + }, + { + "station": "JLU", + "network": "IR", + "distanceDeg": 76.52, + "pTravelTimeSec": 708.5, + "sTravelTimeSec": null + }, + { + "station": "NLU", + "network": "IR", + "distanceDeg": 76.55, + "pTravelTimeSec": 708.3, + "sTravelTimeSec": null + }, + { + "station": "RAO", + "network": "IR", + "distanceDeg": 76.77, + "pTravelTimeSec": 710.1, + "sTravelTimeSec": null + }, + { + "station": "SHPR", + "network": "IR", + "distanceDeg": 76.78, + "pTravelTimeSec": 707.7, + "sTravelTimeSec": null + }, + { + "station": "MPU", + "network": "IR", + "distanceDeg": 76.78, + "pTravelTimeSec": 709.5, + "sTravelTimeSec": null + }, + { + "station": "CCUT", + "network": "IR", + "distanceDeg": 77.26, + "pTravelTimeSec": 725.9, + "sTravelTimeSec": null + }, + { + "station": "MSU", + "network": "IR", + "distanceDeg": 77.39, + "pTravelTimeSec": 711.7, + "sTravelTimeSec": null + }, + { + "station": "TMUT", + "network": "IR", + "distanceDeg": 77.48, + "pTravelTimeSec": 712.8, + "sTravelTimeSec": null + }, + { + "station": "P17A", + "network": "IR", + "distanceDeg": 77.65, + "pTravelTimeSec": 712.6, + "sTravelTimeSec": null + }, + { + "station": "LCMT", + "network": "IR", + "distanceDeg": 77.67, + "pTravelTimeSec": 712.8, + "sTravelTimeSec": null + }, + { + "station": "MTPU", + "network": "IR", + "distanceDeg": 77.68, + "pTravelTimeSec": 715.6, + "sTravelTimeSec": null + }, + { + "station": "PFO", + "network": "IR", + "distanceDeg": 77.71, + "pTravelTimeSec": 713.2, + "sTravelTimeSec": null + }, + { + "station": "RGN", + "network": "IR", + "distanceDeg": 77.71, + "pTravelTimeSec": 714.6, + "sTravelTimeSec": null + }, + { + "station": "Q16A", + "network": "IR", + "distanceDeg": 77.75, + "pTravelTimeSec": 713.8, + "sTravelTimeSec": null + }, + { + "station": "P18A", + "network": "IR", + "distanceDeg": 77.85, + "pTravelTimeSec": 714.9, + "sTravelTimeSec": null + }, + { + "station": "KNB", + "network": "IR", + "distanceDeg": 77.93, + "pTravelTimeSec": 714.5, + "sTravelTimeSec": null + }, + { + "station": "PKCU", + "network": "IR", + "distanceDeg": 77.98, + "pTravelTimeSec": 716.6, + "sTravelTimeSec": null + }, + { + "station": "SRU", + "network": "IR", + "distanceDeg": 78.01, + "pTravelTimeSec": 714.4, + "sTravelTimeSec": null + }, + { + "station": "K22A", + "network": "IR", + "distanceDeg": 78.02, + "pTravelTimeSec": 716, + "sTravelTimeSec": null + }, + { + "station": "ULM", + "network": "IR", + "distanceDeg": 78.03, + "pTravelTimeSec": 714.6, + "sTravelTimeSec": null + }, + { + "station": "MDND", + "network": "IR", + "distanceDeg": 78.05, + "pTravelTimeSec": 717.4, + "sTravelTimeSec": null + }, + { + "station": "TIRR", + "network": "IR", + "distanceDeg": 78.35, + "pTravelTimeSec": 716.7, + "sTravelTimeSec": null + }, + { + "station": "RSSD", + "network": "IR", + "distanceDeg": 78.38, + "pTravelTimeSec": 716.4, + "sTravelTimeSec": null + }, + { + "station": "OJC", + "network": "IR", + "distanceDeg": 78.41, + "pTravelTimeSec": 717.1, + "sTravelTimeSec": null + }, + { + "station": "W13A", + "network": "IR", + "distanceDeg": 78.46, + "pTravelTimeSec": 716.7, + "sTravelTimeSec": null + }, + { + "station": "BRTR", + "network": "IR", + "distanceDeg": 78.58, + "pTravelTimeSec": 718.7, + "sTravelTimeSec": null + }, + { + "station": "U15A", + "network": "IR", + "distanceDeg": 78.64, + "pTravelTimeSec": 718.1, + "sTravelTimeSec": null + }, + { + "station": "OUZ", + "network": "IR", + "distanceDeg": 78.66, + "pTravelTimeSec": 720.3, + "sTravelTimeSec": null + }, + { + "station": "O20A", + "network": "IR", + "distanceDeg": 78.7, + "pTravelTimeSec": 717.7, + "sTravelTimeSec": null + }, + { + "station": "Y12C", + "network": "IR", + "distanceDeg": 78.89, + "pTravelTimeSec": 719.4, + "sTravelTimeSec": null + }, + { + "station": "MLR", + "network": "IR", + "distanceDeg": 78.91, + "pTravelTimeSec": 720.4, + "sTravelTimeSec": null + }, + { + "station": "ANTO", + "network": "IR", + "distanceDeg": 78.98, + "pTravelTimeSec": 721.3, + "sTravelTimeSec": null + }, + { + "station": "DGAR", + "network": "IR", + "distanceDeg": 79.12, + "pTravelTimeSec": 722.5, + "sTravelTimeSec": null + }, + { + "station": "PV09", + "network": "IR", + "distanceDeg": 79.24, + "pTravelTimeSec": 724.5, + "sTravelTimeSec": null + }, + { + "station": "PV10", + "network": "IR", + "distanceDeg": 79.37, + "pTravelTimeSec": 723.2, + "sTravelTimeSec": null + }, + { + "station": "AGMN", + "network": "IR", + "distanceDeg": 79.47, + "pTravelTimeSec": 723.7, + "sTravelTimeSec": null + }, + { + "station": "PHWY", + "network": "IR", + "distanceDeg": 79.51, + "pTravelTimeSec": 725, + "sTravelTimeSec": null + }, + { + "station": "N23A", + "network": "IR", + "distanceDeg": 79.51, + "pTravelTimeSec": 725.9, + "sTravelTimeSec": null + }, + { + "station": "PV05", + "network": "IR", + "distanceDeg": 79.53, + "pTravelTimeSec": 723.1, + "sTravelTimeSec": null + }, + { + "station": "Y14A", + "network": "IR", + "distanceDeg": 79.76, + "pTravelTimeSec": 725.1, + "sTravelTimeSec": null + }, + { + "station": "WUAZ", + "network": "IR", + "distanceDeg": 79.79, + "pTravelTimeSec": 724.4, + "sTravelTimeSec": null + }, + { + "station": "PV01", + "network": "IR", + "distanceDeg": 79.81, + "pTravelTimeSec": 724.3, + "sTravelTimeSec": null + }, + { + "station": "113A", + "network": "IR", + "distanceDeg": 80, + "pTravelTimeSec": 725.8, + "sTravelTimeSec": null + }, + { + "station": "SMCO", + "network": "IR", + "distanceDeg": 80.06, + "pTravelTimeSec": 725.9, + "sTravelTimeSec": null + }, + { + "station": "PSZ", + "network": "IR", + "distanceDeg": 80.07, + "pTravelTimeSec": 727, + "sTravelTimeSec": null + }, + { + "station": "RAR", + "network": "IR", + "distanceDeg": 80.29, + "pTravelTimeSec": 729.7, + "sTravelTimeSec": null + }, + { + "station": "CLL", + "network": "IR", + "distanceDeg": 80.38, + "pTravelTimeSec": 727.6, + "sTravelTimeSec": null + }, + { + "station": "ISCO", + "network": "IR", + "distanceDeg": 80.43, + "pTravelTimeSec": 730.2, + "sTravelTimeSec": null + }, + { + "station": "X16A", + "network": "IR", + "distanceDeg": 80.45, + "pTravelTimeSec": 729.5, + "sTravelTimeSec": null + }, + { + "station": "VRAC", + "network": "IR", + "distanceDeg": 80.47, + "pTravelTimeSec": 729.1, + "sTravelTimeSec": null + }, + { + "station": "MVCO", + "network": "IR", + "distanceDeg": 80.47, + "pTravelTimeSec": 730, + "sTravelTimeSec": null + }, + { + "station": "RAYN", + "network": "IR", + "distanceDeg": 80.88, + "pTravelTimeSec": 730.8, + "sTravelTimeSec": null + }, + { + "station": "TAU", + "network": "IR", + "distanceDeg": 80.95, + "pTravelTimeSec": 732.3, + "sTravelTimeSec": null + }, + { + "station": "W18A", + "network": "IR", + "distanceDeg": 81.07, + "pTravelTimeSec": 734.2, + "sTravelTimeSec": null + }, + { + "station": "S22A", + "network": "IR", + "distanceDeg": 81.1, + "pTravelTimeSec": 731.8, + "sTravelTimeSec": null + }, + { + "station": "Q24A", + "network": "IR", + "distanceDeg": 81.26, + "pTravelTimeSec": 734.7, + "sTravelTimeSec": null + }, + { + "station": "X18A", + "network": "IR", + "distanceDeg": 81.32, + "pTravelTimeSec": 734.6, + "sTravelTimeSec": null + }, + { + "station": "ASF", + "network": "IR", + "distanceDeg": 81.43, + "pTravelTimeSec": 734.1, + "sTravelTimeSec": null + }, + { + "station": "OGNE", + "network": "IR", + "distanceDeg": 81.64, + "pTravelTimeSec": 736.6, + "sTravelTimeSec": null + }, + { + "station": "EYMN", + "network": "IR", + "distanceDeg": 81.67, + "pTravelTimeSec": 735.8, + "sTravelTimeSec": null + }, + { + "station": "MMAI", + "network": "IR", + "distanceDeg": 81.85, + "pTravelTimeSec": 736.3, + "sTravelTimeSec": null + }, + { + "station": "KHC", + "network": "IR", + "distanceDeg": 81.86, + "pTravelTimeSec": 735.3, + "sTravelTimeSec": null + }, + { + "station": "SDCO", + "network": "IR", + "distanceDeg": 81.88, + "pTravelTimeSec": 736, + "sTravelTimeSec": null + }, + { + "station": "CSS", + "network": "IR", + "distanceDeg": 81.88, + "pTravelTimeSec": 736.2, + "sTravelTimeSec": null + }, + { + "station": "GERES", + "network": "IR", + "distanceDeg": 82.04, + "pTravelTimeSec": 736.4, + "sTravelTimeSec": null + }, + { + "station": "ALN", + "network": "IR", + "distanceDeg": 82.07, + "pTravelTimeSec": 738.1, + "sTravelTimeSec": null + }, + { + "station": "HIZ", + "network": "IR", + "distanceDeg": 82.07, + "pTravelTimeSec": 738.2, + "sTravelTimeSec": null + }, + { + "station": "EKA", + "network": "IR", + "distanceDeg": 82.19, + "pTravelTimeSec": 737.7, + "sTravelTimeSec": null + }, + { + "station": "ESK", + "network": "IR", + "distanceDeg": 82.22, + "pTravelTimeSec": 739.3, + "sTravelTimeSec": null + }, + { + "station": "TUC", + "network": "IR", + "distanceDeg": 82.23, + "pTravelTimeSec": 737.4, + "sTravelTimeSec": null + }, + { + "station": "GRFO", + "network": "IR", + "distanceDeg": 82.36, + "pTravelTimeSec": 739.5, + "sTravelTimeSec": null + }, + { + "station": "MXZ", + "network": "IR", + "distanceDeg": 82.44, + "pTravelTimeSec": 745.9, + "sTravelTimeSec": null + }, + { + "station": "ECSD", + "network": "IR", + "distanceDeg": 82.46, + "pTravelTimeSec": 740, + "sTravelTimeSec": null + }, + { + "station": "SMTH", + "network": "IR", + "distanceDeg": 82.65, + "pTravelTimeSec": 740.2, + "sTravelTimeSec": null + }, + { + "station": "GADA", + "network": "IR", + "distanceDeg": 82.65, + "pTravelTimeSec": 740.9, + "sTravelTimeSec": null + }, + { + "station": "KSCO", + "network": "IR", + "distanceDeg": 82.66, + "pTravelTimeSec": 741.9, + "sTravelTimeSec": null + }, + { + "station": "EZN", + "network": "IR", + "distanceDeg": 82.67, + "pTravelTimeSec": 742.3, + "sTravelTimeSec": null + }, + { + "station": "KAVA", + "network": "IR", + "distanceDeg": 82.82, + "pTravelTimeSec": 742.9, + "sTravelTimeSec": null + }, + { + "station": "NVR", + "network": "IR", + "distanceDeg": 82.91, + "pTravelTimeSec": 741.2, + "sTravelTimeSec": null + }, + { + "station": "T25A", + "network": "IR", + "distanceDeg": 82.93, + "pTravelTimeSec": 742.9, + "sTravelTimeSec": null + }, + { + "station": "PRK", + "network": "IR", + "distanceDeg": 83.1, + "pTravelTimeSec": 743.3, + "sTravelTimeSec": null + }, + { + "station": "SPMN", + "network": "IR", + "distanceDeg": 83.16, + "pTravelTimeSec": 744, + "sTravelTimeSec": null + }, + { + "station": "ANMO", + "network": "IR", + "distanceDeg": 83.19, + "pTravelTimeSec": 742.5, + "sTravelTimeSec": null + }, + { + "station": "BKZ", + "network": "IR", + "distanceDeg": 83.21, + "pTravelTimeSec": 742.5, + "sTravelTimeSec": null + }, + { + "station": "SRS", + "network": "IR", + "distanceDeg": 83.22, + "pTravelTimeSec": 741.6, + "sTravelTimeSec": null + }, + { + "station": "FETY", + "network": "IR", + "distanceDeg": 83.31, + "pTravelTimeSec": 742.6, + "sTravelTimeSec": null + }, + { + "station": "SIGR", + "network": "IR", + "distanceDeg": 83.36, + "pTravelTimeSec": 745, + "sTravelTimeSec": null + }, + { + "station": "BGNE", + "network": "IR", + "distanceDeg": 83.37, + "pTravelTimeSec": 744.9, + "sTravelTimeSec": null + }, + { + "station": "YER", + "network": "IR", + "distanceDeg": 83.44, + "pTravelTimeSec": 748.1, + "sTravelTimeSec": null + }, + { + "station": "Y22D", + "network": "IR", + "distanceDeg": 83.5, + "pTravelTimeSec": 755.9, + "sTravelTimeSec": null + }, + { + "station": "KNT", + "network": "IR", + "distanceDeg": 83.55, + "pTravelTimeSec": 742.3, + "sTravelTimeSec": null + }, + { + "station": "SOH", + "network": "IR", + "distanceDeg": 83.56, + "pTravelTimeSec": 744.7, + "sTravelTimeSec": null + }, + { + "station": "OUR", + "network": "IR", + "distanceDeg": 83.57, + "pTravelTimeSec": 746.4, + "sTravelTimeSec": null + }, + { + "station": "VAY", + "network": "IR", + "distanceDeg": 83.6, + "pTravelTimeSec": 747.4, + "sTravelTimeSec": null + }, + { + "station": "SKO", + "network": "IR", + "distanceDeg": 83.71, + "pTravelTimeSec": 747.8, + "sTravelTimeSec": null + }, + { + "station": "319A", + "network": "IR", + "distanceDeg": 83.81, + "pTravelTimeSec": 744.7, + "sTravelTimeSec": null + }, + { + "station": "PLG", + "network": "IR", + "distanceDeg": 83.83, + "pTravelTimeSec": 747.1, + "sTravelTimeSec": null + }, + { + "station": "CHOS", + "network": "IR", + "distanceDeg": 83.83, + "pTravelTimeSec": 747.5, + "sTravelTimeSec": null + }, + { + "station": "HORT", + "network": "IR", + "distanceDeg": 83.85, + "pTravelTimeSec": 746.1, + "sTravelTimeSec": null + }, + { + "station": "SMG", + "network": "IR", + "distanceDeg": 83.86, + "pTravelTimeSec": 747.1, + "sTravelTimeSec": null + }, + { + "station": "STU", + "network": "IR", + "distanceDeg": 83.88, + "pTravelTimeSec": 747.2, + "sTravelTimeSec": null + }, + { + "station": "THE", + "network": "IR", + "distanceDeg": 83.9, + "pTravelTimeSec": 748.2, + "sTravelTimeSec": null + }, + { + "station": "SCHQ", + "network": "IR", + "distanceDeg": 83.91, + "pTravelTimeSec": 746.4, + "sTravelTimeSec": null + }, + { + "station": "GRG", + "network": "IR", + "distanceDeg": 83.96, + "pTravelTimeSec": 745, + "sTravelTimeSec": null + }, + { + "station": "CWF", + "network": "IR", + "distanceDeg": 84, + "pTravelTimeSec": 747.7, + "sTravelTimeSec": null + }, + { + "station": "PAIG", + "network": "IR", + "distanceDeg": 84.03, + "pTravelTimeSec": 747.8, + "sTravelTimeSec": null + }, + { + "station": "BODT", + "network": "IR", + "distanceDeg": 84.05, + "pTravelTimeSec": 748.2, + "sTravelTimeSec": null + }, + { + "station": "COWI", + "network": "IR", + "distanceDeg": 84.12, + "pTravelTimeSec": 747.3, + "sTravelTimeSec": null + }, + { + "station": "ARG", + "network": "IR", + "distanceDeg": 84.16, + "pTravelTimeSec": 749.5, + "sTravelTimeSec": null + }, + { + "station": "WLF", + "network": "IR", + "distanceDeg": 84.26, + "pTravelTimeSec": 748.5, + "sTravelTimeSec": null + }, + { + "station": "HSIG", + "network": "IR", + "distanceDeg": 84.26, + "pTravelTimeSec": 749.1, + "sTravelTimeSec": null + }, + { + "station": "EIL", + "network": "IR", + "distanceDeg": 84.32, + "pTravelTimeSec": 749.5, + "sTravelTimeSec": null + }, + { + "station": "CBKS", + "network": "IR", + "distanceDeg": 84.39, + "pTravelTimeSec": 750.1, + "sTravelTimeSec": null + }, + { + "station": "THZ", + "network": "IR", + "distanceDeg": 84.4, + "pTravelTimeSec": 749.8, + "sTravelTimeSec": null + }, + { + "station": "NIS1", + "network": "IR", + "distanceDeg": 84.44, + "pTravelTimeSec": 751.3, + "sTravelTimeSec": null + }, + { + "station": "TTG", + "network": "IR", + "distanceDeg": 84.45, + "pTravelTimeSec": 750.2, + "sTravelTimeSec": null + }, + { + "station": "AOS", + "network": "IR", + "distanceDeg": 84.46, + "pTravelTimeSec": 749.5, + "sTravelTimeSec": null + }, + { + "station": "BIA", + "network": "IR", + "distanceDeg": 84.47, + "pTravelTimeSec": 750.6, + "sTravelTimeSec": null + }, + { + "station": "TRI", + "network": "IR", + "distanceDeg": 84.48, + "pTravelTimeSec": 750, + "sTravelTimeSec": null + }, + { + "station": "BFZ", + "network": "IR", + "distanceDeg": 84.49, + "pTravelTimeSec": 750.2, + "sTravelTimeSec": null + }, + { + "station": "SRIG", + "network": "IR", + "distanceDeg": 84.49, + "pTravelTimeSec": 765.9, + "sTravelTimeSec": null + }, + { + "station": "LIT", + "network": "IR", + "distanceDeg": 84.53, + "pTravelTimeSec": 749.5, + "sTravelTimeSec": null + }, + { + "station": "PPT", + "network": "IR", + "distanceDeg": 84.53, + "pTravelTimeSec": 751.3, + "sTravelTimeSec": null + }, + { + "station": "SNZO", + "network": "IR", + "distanceDeg": 84.55, + "pTravelTimeSec": 765.9, + "sTravelTimeSec": null + }, + { + "station": "BFO", + "network": "IR", + "distanceDeg": 84.57, + "pTravelTimeSec": 750.2, + "sTravelTimeSec": null + }, + { + "station": "FNA", + "network": "IR", + "distanceDeg": 84.61, + "pTravelTimeSec": 749.5, + "sTravelTimeSec": null + }, + { + "station": "XOR", + "network": "IR", + "distanceDeg": 84.69, + "pTravelTimeSec": 746.6, + "sTravelTimeSec": null + }, + { + "station": "NEO", + "network": "IR", + "distanceDeg": 84.72, + "pTravelTimeSec": 750.6, + "sTravelTimeSec": null + }, + { + "station": "KZN", + "network": "IR", + "distanceDeg": 84.76, + "pTravelTimeSec": 750.2, + "sTravelTimeSec": null + }, + { + "station": "FYTO", + "network": "IR", + "distanceDeg": 84.8, + "pTravelTimeSec": 749.5, + "sTravelTimeSec": null + }, + { + "station": "DSB", + "network": "IR", + "distanceDeg": 84.89, + "pTravelTimeSec": 751.6, + "sTravelTimeSec": null + }, + { + "station": "TIR", + "network": "IR", + "distanceDeg": 84.96, + "pTravelTimeSec": 753.4, + "sTravelTimeSec": null + }, + { + "station": "APE", + "network": "IR", + "distanceDeg": 85.05, + "pTravelTimeSec": 753, + "sTravelTimeSec": null + }, + { + "station": "LTZ", + "network": "IR", + "distanceDeg": 85.15, + "pTravelTimeSec": 754.2, + "sTravelTimeSec": null + }, + { + "station": "FOZ", + "network": "IR", + "distanceDeg": 85.16, + "pTravelTimeSec": 754.4, + "sTravelTimeSec": null + }, + { + "station": "KARP", + "network": "IR", + "distanceDeg": 85.19, + "pTravelTimeSec": 756, + "sTravelTimeSec": null + }, + { + "station": "FUORN", + "network": "IR", + "distanceDeg": 85.21, + "pTravelTimeSec": 753.2, + "sTravelTimeSec": null + }, + { + "station": "DAVOX", + "network": "IR", + "distanceDeg": 85.24, + "pTravelTimeSec": 753.2, + "sTravelTimeSec": null + }, + { + "station": "ATAL", + "network": "IR", + "distanceDeg": 85.27, + "pTravelTimeSec": 754.1, + "sTravelTimeSec": null + }, + { + "station": "PTL", + "network": "IR", + "distanceDeg": 85.28, + "pTravelTimeSec": 755.8, + "sTravelTimeSec": null + }, + { + "station": "LKR", + "network": "IR", + "distanceDeg": 85.31, + "pTravelTimeSec": 752.7, + "sTravelTimeSec": null + }, + { + "station": "ATHU", + "network": "IR", + "distanceDeg": 85.38, + "pTravelTimeSec": 755.5, + "sTravelTimeSec": null + }, + { + "station": "ATH", + "network": "IR", + "distanceDeg": 85.42, + "pTravelTimeSec": 755.5, + "sTravelTimeSec": null + }, + { + "station": "VLY", + "network": "IR", + "distanceDeg": 85.46, + "pTravelTimeSec": 754.6, + "sTravelTimeSec": null + }, + { + "station": "SCIA", + "network": "IR", + "distanceDeg": 85.48, + "pTravelTimeSec": 756.3, + "sTravelTimeSec": null + }, + { + "station": "THR2", + "network": "IR", + "distanceDeg": 85.55, + "pTravelTimeSec": 762.6, + "sTravelTimeSec": null + }, + { + "station": "OXZ", + "network": "IR", + "distanceDeg": 85.58, + "pTravelTimeSec": 755, + "sTravelTimeSec": null + }, + { + "station": "THR3", + "network": "IR", + "distanceDeg": 85.59, + "pTravelTimeSec": 757.1, + "sTravelTimeSec": null + }, + { + "station": "SANT", + "network": "IR", + "distanceDeg": 85.59, + "pTravelTimeSec": 757.5, + "sTravelTimeSec": null + }, + { + "station": "THR6", + "network": "IR", + "distanceDeg": 85.63, + "pTravelTimeSec": 757.1, + "sTravelTimeSec": null + }, + { + "station": "RPZ", + "network": "IR", + "distanceDeg": 85.67, + "pTravelTimeSec": 756.1, + "sTravelTimeSec": null + }, + { + "station": "TUE", + "network": "IR", + "distanceDeg": 85.7, + "pTravelTimeSec": 756.7, + "sTravelTimeSec": null + }, + { + "station": "JAN", + "network": "IR", + "distanceDeg": 85.72, + "pTravelTimeSec": 755.1, + "sTravelTimeSec": null + }, + { + "station": "DSF", + "network": "IR", + "distanceDeg": 85.74, + "pTravelTimeSec": 756.8, + "sTravelTimeSec": null + }, + { + "station": "EVR", + "network": "IR", + "distanceDeg": 85.76, + "pTravelTimeSec": 755.5, + "sTravelTimeSec": null + }, + { + "station": "LTK", + "network": "IR", + "distanceDeg": 85.79, + "pTravelTimeSec": 756.1, + "sTravelTimeSec": null + }, + { + "station": "KSU1", + "network": "IR", + "distanceDeg": 85.86, + "pTravelTimeSec": 756.5, + "sTravelTimeSec": null + }, + { + "station": "KALE", + "network": "IR", + "distanceDeg": 85.97, + "pTravelTimeSec": 754.1, + "sTravelTimeSec": null + }, + { + "station": "DSL", + "network": "IR", + "distanceDeg": 85.97, + "pTravelTimeSec": 755.1, + "sTravelTimeSec": null + }, + { + "station": "CRLZ", + "network": "IR", + "distanceDeg": 85.98, + "pTravelTimeSec": 765.9, + "sTravelTimeSec": null + }, + { + "station": "DID", + "network": "IR", + "distanceDeg": 86.01, + "pTravelTimeSec": 755.8, + "sTravelTimeSec": null + }, + { + "station": "ZKR", + "network": "IR", + "distanceDeg": 86.04, + "pTravelTimeSec": 760, + "sTravelTimeSec": null + }, + { + "station": "MNTX", + "network": "IR", + "distanceDeg": 86.05, + "pTravelTimeSec": 757.9, + "sTravelTimeSec": null + }, + { + "station": "LBZ", + "network": "IR", + "distanceDeg": 86.06, + "pTravelTimeSec": 758.1, + "sTravelTimeSec": null + }, + { + "station": "IGT", + "network": "IR", + "distanceDeg": 86.08, + "pTravelTimeSec": 755.8, + "sTravelTimeSec": null + }, + { + "station": "MSTX", + "network": "IR", + "distanceDeg": 86.08, + "pTravelTimeSec": 758.2, + "sTravelTimeSec": null + }, + { + "station": "AMTX", + "network": "IR", + "distanceDeg": 86.08, + "pTravelTimeSec": 758.2, + "sTravelTimeSec": null + }, + { + "station": "JFWS", + "network": "IR", + "distanceDeg": 86.11, + "pTravelTimeSec": 758.8, + "sTravelTimeSec": null + }, + { + "station": "MQZ", + "network": "IR", + "distanceDeg": 86.11, + "pTravelTimeSec": 765.9, + "sTravelTimeSec": null + }, + { + "station": "LAKA", + "network": "IR", + "distanceDeg": 86.16, + "pTravelTimeSec": 758.9, + "sTravelTimeSec": null + }, + { + "station": "WKZ", + "network": "IR", + "distanceDeg": 86.17, + "pTravelTimeSec": 765.9, + "sTravelTimeSec": null + }, + { + "station": "GUR", + "network": "IR", + "distanceDeg": 86.19, + "pTravelTimeSec": 758.2, + "sTravelTimeSec": null + }, + { + "station": "KLV", + "network": "IR", + "distanceDeg": 86.21, + "pTravelTimeSec": 757.2, + "sTravelTimeSec": null + }, + { + "station": "KEK", + "network": "IR", + "distanceDeg": 86.22, + "pTravelTimeSec": 758.9, + "sTravelTimeSec": null + }, + { + "station": "NPS", + "network": "IR", + "distanceDeg": 86.29, + "pTravelTimeSec": 760.7, + "sTravelTimeSec": null + }, + { + "station": "DCZ", + "network": "IR", + "distanceDeg": 86.33, + "pTravelTimeSec": 761.9, + "sTravelTimeSec": null + }, + { + "station": "LAST", + "network": "IR", + "distanceDeg": 86.43, + "pTravelTimeSec": 761.4, + "sTravelTimeSec": null + }, + { + "station": "MLZ", + "network": "IR", + "distanceDeg": 86.45, + "pTravelTimeSec": 760.9, + "sTravelTimeSec": null + }, + { + "station": "LKD2", + "network": "IR", + "distanceDeg": 86.46, + "pTravelTimeSec": 759.6, + "sTravelTimeSec": null + }, + { + "station": "RLS", + "network": "IR", + "distanceDeg": 86.57, + "pTravelTimeSec": 761, + "sTravelTimeSec": null + }, + { + "station": "VLX", + "network": "IR", + "distanceDeg": 86.58, + "pTravelTimeSec": 759.3, + "sTravelTimeSec": null + }, + { + "station": "SENIN", + "network": "IR", + "distanceDeg": 86.59, + "pTravelTimeSec": 759.5, + "sTravelTimeSec": null + }, + { + "station": "IDI", + "network": "IR", + "distanceDeg": 86.68, + "pTravelTimeSec": 760.7, + "sTravelTimeSec": null + }, + { + "station": "VLI", + "network": "IR", + "distanceDeg": 86.75, + "pTravelTimeSec": 759.3, + "sTravelTimeSec": null + }, + { + "station": "ODZ", + "network": "IR", + "distanceDeg": 86.79, + "pTravelTimeSec": 760.9, + "sTravelTimeSec": null + }, + { + "station": "DYA", + "network": "IR", + "distanceDeg": 86.8, + "pTravelTimeSec": 761.8, + "sTravelTimeSec": null + }, + { + "station": "PYZ", + "network": "IR", + "distanceDeg": 86.87, + "pTravelTimeSec": 775.9, + "sTravelTimeSec": null + }, + { + "station": "WHZ", + "network": "IR", + "distanceDeg": 86.91, + "pTravelTimeSec": 775.9, + "sTravelTimeSec": null + }, + { + "station": "SIVA", + "network": "IR", + "distanceDeg": 86.92, + "pTravelTimeSec": 761.7, + "sTravelTimeSec": null + }, + { + "station": "VLS", + "network": "IR", + "distanceDeg": 86.95, + "pTravelTimeSec": 763.3, + "sTravelTimeSec": null + }, + { + "station": "VLDQ", + "network": "IR", + "distanceDeg": 86.96, + "pTravelTimeSec": 760.6, + "sTravelTimeSec": null + }, + { + "station": "ITM", + "network": "IR", + "distanceDeg": 86.97, + "pTravelTimeSec": 763.4, + "sTravelTimeSec": null + }, + { + "station": "VAM", + "network": "IR", + "distanceDeg": 86.99, + "pTravelTimeSec": 761.1, + "sTravelTimeSec": null + }, + { + "station": "KYTH", + "network": "IR", + "distanceDeg": 87.01, + "pTravelTimeSec": 761.4, + "sTravelTimeSec": null + }, + { + "station": "GLMI", + "network": "IR", + "distanceDeg": 87.04, + "pTravelTimeSec": 763.1, + "sTravelTimeSec": null + }, + { + "station": "ANKY", + "network": "IR", + "distanceDeg": 87.16, + "pTravelTimeSec": 764.8, + "sTravelTimeSec": null + }, + { + "station": "VLC", + "network": "IR", + "distanceDeg": 87.16, + "pTravelTimeSec": 764.8, + "sTravelTimeSec": null + }, + { + "station": "DAMY", + "network": "IR", + "distanceDeg": 87.22, + "pTravelTimeSec": 764.2, + "sTravelTimeSec": null + }, + { + "station": "PYL", + "network": "IR", + "distanceDeg": 87.28, + "pTravelTimeSec": 762.8, + "sTravelTimeSec": null + }, + { + "station": "U34A", + "network": "IR", + "distanceDeg": 87.32, + "pTravelTimeSec": 763.8, + "sTravelTimeSec": null + }, + { + "station": "GVD", + "network": "IR", + "distanceDeg": 87.46, + "pTravelTimeSec": 766.2, + "sTravelTimeSec": null + }, + { + "station": "V34A", + "network": "IR", + "distanceDeg": 87.77, + "pTravelTimeSec": 767.1, + "sTravelTimeSec": null + }, + { + "station": "WMOK", + "network": "IR", + "distanceDeg": 87.85, + "pTravelTimeSec": 767.7, + "sTravelTimeSec": null + }, + { + "station": "LPIG", + "network": "IR", + "distanceDeg": 87.91, + "pTravelTimeSec": 766.9, + "sTravelTimeSec": null + }, + { + "station": "BNI", + "network": "IR", + "distanceDeg": 87.93, + "pTravelTimeSec": 766.9, + "sTravelTimeSec": null + }, + { + "station": "CUC", + "network": "IR", + "distanceDeg": 87.99, + "pTravelTimeSec": 767.9, + "sTravelTimeSec": null + }, + { + "station": "W34A", + "network": "IR", + "distanceDeg": 88.06, + "pTravelTimeSec": 768.5, + "sTravelTimeSec": null + }, + { + "station": "TIP", + "network": "IR", + "distanceDeg": 88.16, + "pTravelTimeSec": 767.2, + "sTravelTimeSec": null + }, + { + "station": "HDIL", + "network": "IR", + "distanceDeg": 88.4, + "pTravelTimeSec": 770.5, + "sTravelTimeSec": null + }, + { + "station": "SLBS", + "network": "IR", + "distanceDeg": 88.43, + "pTravelTimeSec": 769.9, + "sTravelTimeSec": null + }, + { + "station": "SSB", + "network": "IR", + "distanceDeg": 88.55, + "pTravelTimeSec": 769.3, + "sTravelTimeSec": null + }, + { + "station": "TUL1", + "network": "IR", + "distanceDeg": 88.66, + "pTravelTimeSec": 770.1, + "sTravelTimeSec": null + }, + { + "station": "TXAR", + "network": "IR", + "distanceDeg": 88.75, + "pTravelTimeSec": 771.2, + "sTravelTimeSec": null + }, + { + "station": "ABTX", + "network": "IR", + "distanceDeg": 88.88, + "pTravelTimeSec": 772.2, + "sTravelTimeSec": null + }, + { + "station": "SADO", + "network": "IR", + "distanceDeg": 89.23, + "pTravelTimeSec": 774.1, + "sTravelTimeSec": null + }, + { + "station": "CEL", + "network": "IR", + "distanceDeg": 89.29, + "pTravelTimeSec": 775.3, + "sTravelTimeSec": null + }, + { + "station": "HHAR", + "network": "IR", + "distanceDeg": 89.37, + "pTravelTimeSec": 774.2, + "sTravelTimeSec": null + } + ] +} \ No newline at end of file diff --git a/src/earth.ts b/src/earth.ts new file mode 100644 index 0000000..464cdf7 --- /dev/null +++ b/src/earth.ts @@ -0,0 +1,189 @@ +import type { AppState } from './controls'; + +// Map a P-wave velocity (km/s) to a fill colour. +// Range 1–15.5 km/s → very dark brown (slow) to bright yellow (fast). +// Same velocity always produces the same colour, regardless of which layer it +// comes from — so equal-speed regions look identical on screen. +function velocityToColor(v: number): string { + const t = Math.max(0, Math.min(1, (v - 1.0) / 14.5)); + const hue = Math.round(22 + t * 26); // 22° (red-orange) → 48° (golden yellow) + const sat = Math.round(65 + t * 30); // 65% → 95% + const lit = Math.round(14 + t * 48); // 14% → 62% + return `hsl(${hue}, ${sat}%, ${lit}%)`; +} + +export interface EarthLayer { + rMin: number; + rMax: number; + vP: (r: number) => number; + vS: (r: number) => number; + name: string; + color: string; +} + +export interface EarthModel { + radius: number; + layers: EarthLayer[]; + vAt(r: number, wave: 'P' | 'S'): number; + layerAt(r: number): EarthLayer; +} + +export const R_EARTH = 6371; + +export function buildEarthModel(state: AppState): EarthModel { + const { outerCoreRadius, outerCoreVTop, outerCoreVBottom, innerCoreRadius, innerCoreV } = state; + + // Clamp inner core so it fits inside outer core + const icr = Math.min(innerCoreRadius, outerCoreRadius - 1); + + // Mantle: linear velocity with depth (increases going down, i.e. as r decreases). + // Lower mantle: 3480–5701 km v_P = 13.7 → 10.7 (with r) + // Upper mantle: 5701–6371 km v_P = 10.5 → 7.5 (with r) + // We parameterise generically so the CMB velocity matches outerCoreRadius. + const CMB = outerCoreRadius; + + // Fixed mantle model (not user-controlled) referenced from plan.md PREM table. + // Lower mantle base at CMB: 13.7 km/s, top at 5701: 10.7 km/s + // Upper mantle base at 5701: 10.5 km/s, top at surface: 7.5 km/s + const LM_RMIN = CMB; + const LM_RMAX = 5701; + + const layers: EarthLayer[] = []; + + // ── Inner core ─────────────────────────────────────────────────────────── + if (icr > 0) { + layers.push({ + rMin: 0, + rMax: icr, + vP: () => innerCoreV, + vS: () => 3.5, + name: 'Inner Core', + color: velocityToColor(innerCoreV), + }); + } + + // ── Outer core ─────────────────────────────────────────────────────────── + // Velocity varies linearly from outerCoreVBottom at r=icr to outerCoreVTop at r=CMB. + // Treated as liquid (vS=0) when outerCoreVTop < 10 km/s; solid otherwise. + const ocRange = CMB - icr; + const ocMidV = ocRange <= 0 ? outerCoreVTop + : (outerCoreVBottom + outerCoreVTop) / 2; + const ocIsSolid = outerCoreVTop >= 10; + layers.push({ + rMin: icr, + rMax: CMB, + vP: (r) => { + if (ocRange <= 0) return outerCoreVTop; + const t = (r - icr) / ocRange; // 0 at inner boundary, 1 at CMB + return outerCoreVBottom + t * (outerCoreVTop - outerCoreVBottom); + }, + vS: ocIsSolid + ? (r) => { + if (ocRange <= 0) return outerCoreVTop * 0.6; + const t = (r - icr) / ocRange; + return (outerCoreVBottom + t * (outerCoreVTop - outerCoreVBottom)) * 0.6; + } + : () => 0, + name: 'Outer Core', + color: velocityToColor(ocMidV), + }); + + // ── Mantle (lower + upper) ─────────────────────────────────────────────── + // For presets that change outerCoreRadius, the lower mantle simply starts at CMB. + // If CMB > 5701 there is no lower mantle, only upper. + if (CMB < LM_RMAX) { + const lmRmin = CMB; + const lmRmax = Math.min(LM_RMAX, R_EARTH); + const vLmBot = 13.7; + const vLmTop = 10.7; + layers.push({ + rMin: lmRmin, + rMax: lmRmax, + vP: (r) => { + const t = (r - lmRmin) / (lmRmax - lmRmin); + return vLmBot + t * (vLmTop - vLmBot); + }, + vS: (r) => { + const t = (r - lmRmin) / (lmRmax - lmRmin); + return 7.3 + t * (6.5 - 7.3); + }, + name: 'Lower Mantle', + color: velocityToColor((vLmBot + vLmTop) / 2), + }); + } + + // Upper mantle (only if CMB < R_EARTH) + const umRmin = Math.max(CMB, LM_RMAX); + if (umRmin < R_EARTH) { + const umRmax = R_EARTH; + const vUmBot = CMB >= LM_RMAX ? 13.7 - 3.0 * (CMB - LM_RMIN) / (LM_RMAX - LM_RMIN) : 10.5; + const vUmTop = 7.5; + layers.push({ + rMin: umRmin, + rMax: umRmax, + vP: (r) => { + const t = (r - umRmin) / (umRmax - umRmin); + return vUmBot + t * (vUmTop - vUmBot); + }, + vS: (r) => { + const t = (r - umRmin) / (umRmax - umRmin); + return 4.5 + t * (5.5 - 4.5); + }, + name: 'Upper Mantle', + color: velocityToColor((vUmBot + vUmTop) / 2), + }); + } + + // Sort layers innermost → outermost + layers.sort((a, b) => a.rMin - b.rMin); + + const model: EarthModel = { + radius: R_EARTH, + layers, + vAt(r: number, wave: 'P' | 'S'): number { + const layer = this.layerAt(r); + return wave === 'P' ? layer.vP(r) : layer.vS(r); + }, + layerAt(r: number): EarthLayer { + // Walk from inner to outer + for (const l of this.layers) { + if (r <= l.rMax) return l; + } + return this.layers[this.layers.length - 1]; + }, + }; + + return model; +} + +// ── Presets ─────────────────────────────────────────────────────────────────── + +const BASE: AppState = { + outerCoreRadius: 3480, + outerCoreVTop: 8.0, + outerCoreVBottom: 10.4, + innerCoreRadius: 1220, + innerCoreV: 11.3, + waveType: 'P', + numRays: 60, + preset: 'earth', + earthquakeId: '', +}; + +export const PRESETS: Record<string, AppState> = { + earth: { ...BASE, preset: 'earth' }, + solid: { + // Solid (no liquid outer core): velocities increase with depth continuously. + // outerCoreVTop matches the lower mantle at the CMB (13.7) — no P-wave discontinuity. + // outerCoreVTop >= 10 triggers solid vS behaviour in buildEarthModel. + ...BASE, + outerCoreVTop: 13.7, + outerCoreVBottom: 14.5, + innerCoreV: 14.5, + preset: 'solid', + }, + 'water-core': { ...BASE, outerCoreVTop: 1.5, outerCoreVBottom: 1.8, preset: 'water-core' }, + 'giant-core': { ...BASE, outerCoreRadius: 5000, innerCoreRadius: 1220, preset: 'giant-core' }, + 'tiny-core': { ...BASE, outerCoreRadius: 500, innerCoreRadius: 200, preset: 'tiny-core' }, + 'fast-core': { ...BASE, outerCoreVTop: 15.0, outerCoreVBottom: 14.0, innerCoreV: 14.5, preset: 'fast-core' }, +}; diff --git a/src/earthquakeData.ts b/src/earthquakeData.ts new file mode 100644 index 0000000..4e6c5bf --- /dev/null +++ b/src/earthquakeData.ts @@ -0,0 +1,58 @@ +/** + * Types for pre-fetched real-world seismic datasets. + * JSON files in src/data/ are populated by scripts/fetch-earthquake-data.mjs. + */ + +export interface PhaseArrival { + /** FDSN station code, e.g. "ANMO" */ + station: string; + /** FDSN network code, e.g. "IU" */ + network: string; + /** Epicentral distance in degrees */ + distanceDeg: number; + /** Observed P travel time in seconds (arrival_time - origin_time). null if phase not picked. */ + pTravelTimeSec: number | null; + /** Observed S travel time in seconds. null if not picked or in shadow. */ + sTravelTimeSec: number | null; +} + +export interface EarthquakeDataset { + /** Short unique identifier, e.g. "tohoku-2011" */ + id: string; + /** Human-readable name */ + name: string; + /** ISO8601 origin time */ + originTime: string; + /** Epicenter latitude */ + latitude: number; + /** Epicenter longitude */ + longitude: number; + /** Hypocenter depth in km */ + depthKm: number; + /** Moment magnitude */ + magnitudeMw: number; + /** USGS ComCat event ID, e.g. "official20110311054624120_30" */ + usgsId: string; + /** Short description of what makes this event interesting for shadow zone study */ + note: string; + /** Phase arrival observations from global network */ + arrivals: PhaseArrival[]; +} + +// ── Dataset registry ────────────────────────────────────────────────────────── +// Each dataset JSON is imported statically so Vite bundles it. +// Run `npm run fetch-data` to (re-)populate the JSON files. + +import tohoku from './data/tohoku-2011.json'; +import chile from './data/chile-2010.json'; +import okhotsk from './data/okhotsk-2013.json'; + +export const EARTHQUAKE_DATASETS: EarthquakeDataset[] = [ + tohoku as EarthquakeDataset, + chile as EarthquakeDataset, + okhotsk as EarthquakeDataset, +]; + +export function getDataset(id: string): EarthquakeDataset | undefined { + return EARTHQUAKE_DATASETS.find(d => d.id === id); +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..7a32802 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,165 @@ +import { initControls } from './controls'; +import { buildEarthModel } from './earth'; +import type { EarthModel } from './earth'; +import { traceAllRays } from './rayTracer'; +import type { RayPath } from './rayTracer'; +import { findShadowZone } from './shadowZone'; +import type { ShadowZoneResult } from './shadowZone'; +import { Renderer } from './renderer'; +import { getDataset } from './earthquakeData'; +import { validateModel, fitnessLabel, countShadowZoneMismatches } from './validator'; + +const canvas = document.getElementById('canvas') as HTMLCanvasElement; +const canvasWrap = canvas.parentElement as HTMLDivElement; +const renderer = new Renderer(canvas); +const shadowInfoEl = document.getElementById('shadow-zone-info') as HTMLDivElement; +const validationEl = document.getElementById('validation-info') as HTMLDivElement; + +// Restore collapsed/expanded state of the About section +const descDetails = document.getElementById('description-details') as HTMLDetailsElement; +descDetails.open = localStorage.getItem('descOpen') !== '0'; // default: open +descDetails.addEventListener('toggle', () => { + localStorage.setItem('descOpen', descDetails.open ? '1' : '0'); +}); + +// Cached render state — updated on every physics change, reused on resize +let cachedModel: EarthModel | null = null; +let cachedRays: RayPath[] = []; +let cachedShadow: ShadowZoneResult[] = []; + +function resizeCanvas(): void { + const size = Math.min(canvasWrap.clientWidth - 24, canvasWrap.clientHeight - 24); + if (size < 100) return; + if (canvas.width === size && canvas.height === size) return; + canvas.width = size; + canvas.height = size; + if (cachedModel) renderer.render(cachedModel, cachedRays, cachedShadow); +} +new ResizeObserver(resizeCanvas).observe(canvasWrap); + +function updateShadowInfo( + pShadows: ShadowZoneResult[], + sShadows: ShadowZoneResult[], + waveType: string, +): void { + const summary = (label: string, zones: ShadowZoneResult[]) => + zones.length === 0 + ? `No ${label} shadow zone` + : `${zones.length} ${label} shadow zone${zones.length > 1 ? 's' : ''}`; + + if (waveType === 'P') { + shadowInfoEl.textContent = summary('P-wave', pShadows); + } else if (waveType === 'S') { + shadowInfoEl.textContent = summary('S-wave', sShadows); + } else { + shadowInfoEl.textContent = + summary('P-wave', pShadows) + ' · ' + summary('S-wave', sShadows); + } +} + +function updateValidation( + model: ReturnType<typeof buildEarthModel>, + earthquakeId: string, +): void { + if (!earthquakeId) { + validationEl.style.display = 'none'; + return; + } + + const dataset = getDataset(earthquakeId); + if (!dataset) { + validationEl.style.display = 'none'; + return; + } + + validationEl.style.display = ''; + const result = validateModel(model, dataset); + const mismatch = countShadowZoneMismatches(model, dataset); + + if (result.noData) { + validationEl.innerHTML = + `<b>📡 ${dataset.name}</b><br/>` + + `<span style="color:#f0a040">No data yet. Run:</span><br/>` + + `<code>npm run fetch-data</code>`; + return; + } + + if (result.stationCount === 0) { + validationEl.innerHTML = + `<b>📡 ${dataset.name}</b><br/>No matched P arrivals.`; + return; + } + + const label = fitnessLabel(result); + validationEl.innerHTML = + `<b>📡 ${dataset.name}</b><br/>` + + `${label}<br/>` + + `RMS residual: <b>${result.rmsSec.toFixed(1)} s</b><br/>` + + `Mean residual: ${result.meanResidualSec.toFixed(1)} s<br/>` + + `Stations matched: ${result.stationCount}<br/>` + + `Hit rate ±5s: ${(result.hitRate5s * 100).toFixed(0)}%` + + (mismatch.total > 0 + ? `<br/>Shadow zone mismatches: ${mismatch.inShadow}/${mismatch.total}` + : ''); +} + +function doRender(newState: Parameters<typeof initControls>[0] extends (s: infer S) => void ? S : never): void { + const model = buildEarthModel(newState); + const rays = traceAllRays(model, newState.numRays, newState.waveType); + const pShadows = findShadowZone(model, 'P'); + const sShadows = newState.waveType !== 'P' ? findShadowZone(model, 'S') : []; + // Canvas shows the wave type that's currently displayed; 'both' defaults to P zones + const displayShadows = newState.waveType === 'S' ? sShadows : pShadows; + cachedModel = model; + cachedRays = rays; + cachedShadow = displayShadows; + renderer.render(model, rays, displayShadows); + updateShadowInfo(pShadows, sShadows, newState.waveType); + updateValidation(model, newState.earthquakeId); +} + +// ── Tooltip on shadow zone hover ────────────────────────────────────────────── + +const tooltipEl = document.createElement('div'); +tooltipEl.id = 'shadow-tooltip'; +document.body.appendChild(tooltipEl); + +function hitTestShadow( + mx: number, my: number, + shadows: ShadowZoneResult[], + cx: number, cy: number, + canvasScale: number, +): ShadowZoneResult | null { + const arcW = canvasScale * 0.05; + const dist = Math.sqrt((mx - cx) ** 2 + (my - cy) ** 2); + if (Math.abs(dist - canvasScale) > arcW * 1.5) return null; + // Angle from top (clockwise), normalised to [−π, π] + let topAngle = Math.atan2(my - cy, mx - cx) + Math.PI / 2; + if (topAngle > Math.PI) topAngle -= 2 * Math.PI; + const epicDist = Math.abs(topAngle) * 180 / Math.PI; + return shadows.find(z => epicDist >= z.start && epicDist <= z.end) ?? null; +} + +canvas.addEventListener('mousemove', (e) => { + const rect = canvas.getBoundingClientRect(); + const mx = (e.clientX - rect.left) * (canvas.width / rect.width); + const my = (e.clientY - rect.top) * (canvas.height / rect.height); + const canvasScale = Math.min(canvas.width, canvas.height) * 0.40; + const hit = hitTestShadow(mx, my, cachedShadow, canvas.width / 2, canvas.height / 2, canvasScale); + if (hit) { + tooltipEl.style.display = 'block'; + tooltipEl.style.left = (e.clientX + 14) + 'px'; + tooltipEl.style.top = (e.clientY - 10) + 'px'; + tooltipEl.textContent = + `Shadow zone: ${hit.start.toFixed(1)}°–${hit.end.toFixed(1)}° (${(hit.end - hit.start).toFixed(1)}° gap)`; + } else { + tooltipEl.style.display = 'none'; + } +}); + +canvas.addEventListener('mouseleave', () => { tooltipEl.style.display = 'none'; }); + +// ── Init ────────────────────────────────────────────────────────────────────── + +const state = initControls(doRender); +doRender(state); diff --git a/src/rayTracer.ts b/src/rayTracer.ts new file mode 100644 index 0000000..ac47935 --- /dev/null +++ b/src/rayTracer.ts @@ -0,0 +1,190 @@ +import type { EarthModel } from './earth'; +import { R_EARTH } from './earth'; + +export interface RayPoint { + r: number; + theta: number; +} + +export interface RayPath { + points: RayPoint[]; + rayParameter: number; + takeoffAngle: number; + epicentralDistance: number | null; + travelTimeSec: number | null; // total travel time in seconds; null if ray never resurfaces + wave: 'P' | 'S'; + blocked: boolean; +} + +const STEP = 5; // km +const MAX_STEPS = 60000; + +export function traceRay( + model: EarthModel, + rayParameter: number, + wave: 'P' | 'S', + takeoffAngle: number, + sourceDepthKm = 0, +): RayPath { + const p = rayParameter; + const points: RayPoint[] = []; + let blocked = false; + let travelTimeSec = 0; + + // Start slightly inside the surface (or at source depth) + let r = R_EARTH - sourceDepthKm - 0.1; + let theta = 0; + let sign = -1; // -1 = going down + + const v0 = model.vAt(r, wave); + if (v0 === 0) { + return { points, rayParameter: p, takeoffAngle, epicentralDistance: null, travelTimeSec: null, wave, blocked: false }; + } + const sinI0 = p * v0 / r; + if (sinI0 > 1) { + return { points, rayParameter: p, takeoffAngle, epicentralDistance: null, travelTimeSec: null, wave, blocked: false }; + } + + // For downgoing ray from a subsurface source, we also need to trace the upgoing + // leg to the surface on the source side (theta = 0 side). We start downward only — + // the upgoing leg is symmetric and the full path from source to receiver is traced + // as one continuous arc. + + let epicentralDistance: number | null = null; + + for (let step = 0; step < MAX_STEPS; step++) { + const v = model.vAt(r, wave); + + if (wave === 'S' && v === 0) { + blocked = true; + break; + } + + const sinI = p * v / r; + + if (sinI >= 1) { + sign = 1; + } + + // cosI → 0 at turning point (sinI = 1). Without a minimum, dr = 0 forever. + // A tiny minimum upward velocity lets the ray escape the turning point. + const rawCosI = Math.sqrt(Math.max(0, 1 - sinI * sinI)); + const cosI = sinI >= 1 ? Math.max(rawCosI, 0.001) : rawCosI; + const dr = sign * cosI * STEP; + const dtheta = (p * v / (r * r)) * STEP; + + const rNext = r + dr; + const layerNow = model.layerAt(r); + const layerNext = model.layerAt(rNext); + + let newR = rNext; + let newSign = sign; + + if (layerNow !== layerNext) { + const bR = sign < 0 ? layerNow.rMin : layerNow.rMax; + + const vOld = model.vAt(bR - 0.001 * sign, wave); + const vNew = model.vAt(bR + 0.001 * sign, wave); + + const sinIBound = p * vOld / bR; + const sinINew = sinIBound * (vNew / vOld); + + if (wave === 'S' && vNew === 0) { + const fracStep = Math.abs(bR - r) / (Math.abs(dr) + 1e-10); + travelTimeSec += fracStep * STEP / v; + points.push({ r: bR, theta: theta + dtheta * fracStep }); + blocked = true; + break; + } + + if (Math.abs(sinINew) > 1) { + newSign = -sign; + newR = r + newSign * cosI * STEP; + } + } + + points.push({ r, theta }); + travelTimeSec += STEP / v; + r = newR; + theta += dtheta; + sign = newSign; + + if (r >= R_EARTH) { + r = R_EARTH; + points.push({ r, theta }); + epicentralDistance = (theta * 180) / Math.PI; + break; + } + + if (r <= 1) break; + } + + return { + points, + rayParameter: p, + takeoffAngle, + epicentralDistance, + travelTimeSec: epicentralDistance !== null ? travelTimeSec : null, + wave, + blocked, + }; +} + +export function traceAllRays( + model: EarthModel, + numRays: number, + waveType: 'P' | 'S' | 'both', + sourceDepthKm = 0, +): RayPath[] { + const results: RayPath[] = []; + const waves: Array<'P' | 'S'> = waveType === 'both' ? ['P', 'S'] : [waveType]; + const sourceR = R_EARTH - sourceDepthKm; + + for (const wave of waves) { + const vSource = model.vAt(sourceR - 0.1, wave); + if (vSource === 0) continue; + + for (let i = 0; i < numRays; i++) { + // Non-linear distribution: t^0.6 biases toward larger takeoff angles + // (deeper, more diverse paths), reducing the dense cluster of near-identical + // shallow arcs near the epicenter. + const t = numRays > 1 ? i / (numRays - 1) : 0; + const angleDeg = 5 + Math.pow(t, 0.6) * 84; // 5° – 89° + const angleRad = (angleDeg * Math.PI) / 180; + const p = (sourceR * Math.sin(angleRad)) / vSource; + results.push(traceRay(model, p, wave, angleDeg, sourceDepthKm)); + } + } + + return results; +} + +/** + * Given a model, trace enough rays to build a travel-time lookup: + * epicentral distance (degrees) → travel time (seconds). + * Used for validation against real earthquake observations. + */ +export function buildTravelTimeCurve( + model: EarthModel, + wave: 'P' | 'S', + sourceDepthKm: number, + numRays = 720, +): Array<{ distanceDeg: number; travelTimeSec: number }> { + const curve: Array<{ distanceDeg: number; travelTimeSec: number }> = []; + const sourceR = R_EARTH - sourceDepthKm; + const vSource = model.vAt(sourceR - 0.1, wave); + if (vSource === 0) return curve; + + for (let i = 0; i < numRays; i++) { + const angleDeg = 0.5 + (i / (numRays - 1)) * 88.5; + const angleRad = (angleDeg * Math.PI) / 180; + const p = (sourceR * Math.sin(angleRad)) / vSource; + const ray = traceRay(model, p, wave, angleDeg, sourceDepthKm); + if (ray.epicentralDistance !== null && ray.travelTimeSec !== null) { + curve.push({ distanceDeg: ray.epicentralDistance, travelTimeSec: ray.travelTimeSec }); + } + } + + curve.sort((a, b) => a.distanceDeg - b.distanceDeg); + return curve; +} diff --git a/src/renderer.ts b/src/renderer.ts new file mode 100644 index 0000000..2aa4d7e --- /dev/null +++ b/src/renderer.ts @@ -0,0 +1,186 @@ +import type { EarthModel } from './earth'; +import type { RayPath } from './rayTracer'; +import type { ShadowZoneResult } from './shadowZone'; + +export class Renderer { + private ctx: CanvasRenderingContext2D; + private w: number; + private h: number; + + constructor(private canvas: HTMLCanvasElement) { + this.ctx = canvas.getContext('2d')!; + this.w = canvas.width; + this.h = canvas.height; + } + + // Subsample rays for display so near-duplicate paths are skipped. + // Sorts by representative angle and keeps rays with at least minSep° separation. + private subsampleRays(rays: RayPath[]): RayPath[] { + // Show small counts exactly as-is — user explicitly chose that number. + if (rays.length <= 50) return rays; + const norm = (d: number): number => { const n = d % 360; return n > 180 ? 360 - n : n; }; + // Scale min separation inversely with ray count so screen density is proportional + // to the slider value (5× more rays → ~5× denser). Floor of 0.3° prevents + // drawing exact-duplicate paths that trace the same route. + const minSep = Math.max(0.3, 180 / rays.length); + + const withAngle = rays + .map(r => { + if (r.epicentralDistance !== null && !r.blocked) { + return { ray: r, angle: norm(r.epicentralDistance) }; + } + if (r.blocked && r.points.length > 0) { + return { ray: r, angle: r.points[r.points.length - 1].theta * 180 / Math.PI }; + } + return null; + }) + .filter((x): x is { ray: RayPath; angle: number } => x !== null) + .sort((a, b) => a.angle - b.angle); + + const kept: RayPath[] = []; + let last = -Infinity; + for (const { ray, angle } of withAngle) { + if (angle - last >= minSep) { + kept.push(ray); + last = angle; + } + } + return kept; + } + + render(model: EarthModel, rays: RayPath[], shadows: ShadowZoneResult[]): void { + this.w = this.canvas.width; + this.h = this.canvas.height; + const ctx = this.ctx; + const cx = this.w / 2; + const cy = this.h / 2; + const scale = Math.min(this.w, this.h) * 0.40; + const R = model.radius; + + // Clear to transparent — page background shows through, no visible square + ctx.clearRect(0, 0, this.w, this.h); + + // Earth layers (inner → outer) + const layersSorted = [...model.layers].sort((a, b) => b.rMax - a.rMax); + for (const layer of layersSorted) { + ctx.beginPath(); + ctx.arc(cx, cy, (layer.rMax / R) * scale, 0, Math.PI * 2); + ctx.fillStyle = layer.color; + ctx.fill(); + } + + // Rays — drawn on both sides (rays radiate symmetrically from the epicenter) + for (const ray of this.subsampleRays(rays)) { + if (ray.points.length < 2) continue; + let strokeStyle: string; + if (ray.blocked) { + strokeStyle = 'rgba(255,100,100,0.45)'; + } else if (ray.wave === 'S') { + strokeStyle = 'rgba(100,255,150,0.50)'; + } else { + strokeStyle = 'rgba(100,150,255,0.50)'; + } + ctx.strokeStyle = strokeStyle; + ctx.lineWidth = 2; + for (const mirror of [1, -1] as const) { + ctx.beginPath(); + for (let i = 0; i < ray.points.length; i++) { + const { r, theta } = ray.points[i]; + const px = cx + mirror * (r / R) * scale * Math.sin(theta); + const py = cy - (r / R) * scale * Math.cos(theta); + if (i === 0) ctx.moveTo(px, py); + else ctx.lineTo(px, py); + } + ctx.stroke(); + } + } + + // Thin surface ring + ctx.beginPath(); + ctx.arc(cx, cy, scale, 0, Math.PI * 2); + ctx.strokeStyle = 'rgba(180,180,220,0.4)'; + ctx.lineWidth = 1; + ctx.stroke(); + + // Shadow zone arcs — drawn on top of the surface ring, centered on the surface + if (shadows.length > 0) { + const arcW = scale * 0.05; + ctx.lineWidth = arcW; + ctx.strokeStyle = 'rgba(255,60,60,0.70)'; + for (const shadow of shadows) { + for (const side of [1, -1]) { + const startAngle = -Math.PI / 2 + side * (shadow.start * Math.PI) / 180; + const endAngle = -Math.PI / 2 + side * (shadow.end * Math.PI) / 180; + ctx.beginPath(); + ctx.arc(cx, cy, scale, Math.min(startAngle, endAngle), Math.max(startAngle, endAngle)); + ctx.stroke(); + } + } + } + + // Angle labels + ctx.font = '11px system-ui'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + const labelAngles = [0, 30, 60, 90, 120, 150, 180]; + for (const deg of labelAngles) { + for (const side of [1, -1]) { + if (deg === 0 || deg === 180) { + if (side === -1) continue; // only draw once + } + const rad = (deg * Math.PI) / 180 * side; + const labelR = scale + 18; + const lx = cx + labelR * Math.sin(rad); + const ly = cy - labelR * Math.cos(rad); + ctx.fillStyle = '#8888aa'; + ctx.fillText(`${deg}°`, lx, ly); + } + } + + // Earthquake marker at top + const eqX = cx; + const eqY = cy - scale; + ctx.font = '16px system-ui'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'bottom'; + ctx.fillText('⚡', eqX, eqY - 4); + + // Layer name labels + ctx.textBaseline = 'middle'; + ctx.font = '11px system-ui'; + ctx.fillStyle = 'rgba(255,255,255,0.55)'; + for (const layer of model.layers) { + const midR = ((layer.rMin + layer.rMax) / 2 / R) * scale; + // Only label if the ring is wide enough + if ((layer.rMax - layer.rMin) / R * scale < 14) continue; + ctx.textAlign = 'center'; + ctx.fillText(layer.name, cx, cy + midR); + } + + // Legend — top-left corner of the canvas + const legendItems = [ + { color: 'rgba(100,150,255,0.90)', lineH: 2, label: 'P-waves' }, + { color: 'rgba(100,255,150,0.85)', lineH: 2, label: 'S-waves' }, + { color: 'rgba(255,60,60,0.80)', lineH: 6, label: 'Shadow zone' }, + ]; + const itemH = 15; + const swatchW = 18; + const lx0 = 12; + ctx.font = '11px system-ui'; + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + for (let i = 0; i < legendItems.length; i++) { + const item = legendItems[i]; + const ly = 12 + i * itemH; + ctx.strokeStyle = item.color; + ctx.lineWidth = item.lineH; + ctx.beginPath(); + ctx.moveTo(lx0, ly); + ctx.lineTo(lx0 + swatchW, ly); + ctx.stroke(); + ctx.fillStyle = 'rgba(200,200,220,0.85)'; + ctx.fillText(item.label, lx0 + swatchW + 6, ly); + } + + } +} diff --git a/src/shadowZone.ts b/src/shadowZone.ts new file mode 100644 index 0000000..3d3c125 --- /dev/null +++ b/src/shadowZone.ts @@ -0,0 +1,75 @@ +import type { EarthModel } from './earth'; +import { traceRay } from './rayTracer'; +import { R_EARTH } from './earth'; + +export interface ShadowZoneResult { + start: number; // degrees + end: number; // degrees +} + +export function findShadowZone( + model: EarthModel, + wave: 'P' | 'S', +): ShadowZoneResult[] { + const N = 360; + const vSurf = model.vAt(R_EARTH - 0.1, wave); + if (vSurf === 0) return []; + + const distances: number[] = []; + + for (let i = 0; i < N; i++) { + const angleDeg = 1 + (i / (N - 1)) * 88; + const angleRad = (angleDeg * Math.PI) / 180; + const p = (R_EARTH * Math.sin(angleRad)) / vSurf; + const ray = traceRay(model, p, wave, angleDeg); + if (ray.epicentralDistance !== null && !ray.blocked) { + // Normalize to [0°, 180°]: a ray arriving at >180° has wrapped past the + // antipode; the receiver sits at 360°−dist on the near arc. + let d = ray.epicentralDistance % 360; + if (d > 180) d = 360 - d; + distances.push(d); + } + } + + if (distances.length === 0) return []; + + distances.sort((a, b) => a - b); + + // S-waves are blocked by the liquid outer core and never arrive beyond ~105°. + // Without an endpoint, the gap-finder never sees the 105°→180° shadow zone. + if (wave === 'S') distances.push(180); + + // Collect ALL gaps ≥ 3°. + const MIN_GAP = 3; + const zones: ShadowZoneResult[] = []; + + for (let i = 1; i < distances.length; i++) { + const gap = distances[i] - distances[i - 1]; + if (gap >= MIN_GAP) { + zones.push({ start: distances[i - 1], end: distances[i] }); + } + } + + // Merge zones whose inter-zone gap is ≤ MERGE_THRESH so that physically + // contiguous shadow regions (e.g. the many small gaps a water core creates) + // appear as one arc instead of many overlapping ones. + return mergeZones(zones, 5); +} + +function mergeZones(zones: ShadowZoneResult[], threshDeg: number): ShadowZoneResult[] { + if (zones.length <= 1) return zones; + const sorted = [...zones].sort((a, b) => a.start - b.start); + const merged: ShadowZoneResult[] = []; + let cur = { ...sorted[0] }; + for (let i = 1; i < sorted.length; i++) { + const next = sorted[i]; + if (next.start - cur.end <= threshDeg) { + cur.end = Math.max(cur.end, next.end); + } else { + merged.push(cur); + cur = { ...next }; + } + } + merged.push(cur); + return merged; +} diff --git a/src/validator.ts b/src/validator.ts new file mode 100644 index 0000000..d188e20 --- /dev/null +++ b/src/validator.ts @@ -0,0 +1,183 @@ +import type { EarthquakeDataset, PhaseArrival } from './earthquakeData'; +import type { EarthModel } from './earth'; +import { buildTravelTimeCurve } from './rayTracer'; + +export interface StationResidual { + station: string; + network: string; + distanceDeg: number; + observedSec: number; + predictedSec: number; + residualSec: number; // predicted − observed +} + +export interface ValidationResult { + datasetId: string; + datasetName: string; + stationCount: number; + /** Root-mean-square of residuals in seconds. Lower = better fit to real Earth. */ + rmsSec: number; + meanResidualSec: number; + /** Fraction of arrivals within ±5s of observed (rough "hit rate"). */ + hitRate5s: number; + perStation: StationResidual[]; + /** True if the dataset has no arrivals (fetch script not yet run). */ + noData: boolean; +} + +/** + * Interpolate predicted travel time from the curve at a given epicentral distance. + * Returns null if the distance is inside the model's shadow zone (no ray arrives there). + */ +function interpolateTravelTime( + curve: Array<{ distanceDeg: number; travelTimeSec: number }>, + distanceDeg: number, +): number | null { + if (curve.length === 0) return null; + + // Find bracketing points + let lo = 0; + let hi = curve.length - 1; + + // Extrapolation guard + if (distanceDeg < curve[0].distanceDeg - 2 || distanceDeg > curve[hi].distanceDeg + 2) { + return null; + } + + // Binary search for the closest bracketing interval + while (lo < hi - 1) { + const mid = (lo + hi) >> 1; + if (curve[mid].distanceDeg < distanceDeg) lo = mid; + else hi = mid; + } + + // Check for gap (shadow zone): if the gap between lo and hi is large, no ray arrives + const gap = curve[hi].distanceDeg - curve[lo].distanceDeg; + if (gap > 5 && distanceDeg > curve[lo].distanceDeg + 0.5 && distanceDeg < curve[hi].distanceDeg - 0.5) { + return null; // in shadow zone + } + + const t = (distanceDeg - curve[lo].distanceDeg) / (curve[hi].distanceDeg - curve[lo].distanceDeg + 1e-10); + return curve[lo].travelTimeSec + t * (curve[hi].travelTimeSec - curve[lo].travelTimeSec); +} + +export function validateModel( + model: EarthModel, + dataset: EarthquakeDataset, +): ValidationResult { + if (dataset.arrivals.length === 0) { + return { + datasetId: dataset.id, + datasetName: dataset.name, + stationCount: 0, + rmsSec: NaN, + meanResidualSec: NaN, + hitRate5s: NaN, + perStation: [], + noData: true, + }; + } + + const curve = buildTravelTimeCurve(model, 'P', dataset.depthKm); + const perStation: StationResidual[] = []; + + for (const arrival of dataset.arrivals) { + if (arrival.pTravelTimeSec === null) continue; + const predicted = interpolateTravelTime(curve, arrival.distanceDeg); + if (predicted === null) continue; // model says shadow zone here + + perStation.push({ + station: arrival.station, + network: arrival.network, + distanceDeg: arrival.distanceDeg, + observedSec: arrival.pTravelTimeSec, + predictedSec: predicted, + residualSec: predicted - arrival.pTravelTimeSec, + }); + } + + if (perStation.length === 0) { + return { + datasetId: dataset.id, + datasetName: dataset.name, + stationCount: 0, + rmsSec: NaN, + meanResidualSec: NaN, + hitRate5s: NaN, + perStation: [], + noData: false, + }; + } + + const residuals = perStation.map(s => s.residualSec); + const mean = residuals.reduce((a, b) => a + b, 0) / residuals.length; + const rms = Math.sqrt(residuals.reduce((a, r) => a + r * r, 0) / residuals.length); + const hits = residuals.filter(r => Math.abs(r) <= 5).length; + + return { + datasetId: dataset.id, + datasetName: dataset.name, + stationCount: perStation.length, + rmsSec: rms, + meanResidualSec: mean, + hitRate5s: hits / perStation.length, + perStation, + noData: false, + }; +} + +/** + * Classify a model fitness score as a human-readable label. + * Thresholds are generous — even PREM won't be perfect against raw ISC picks. + */ +export function fitnessLabel(result: ValidationResult): string { + if (result.noData) return '(no data — run fetch script)'; + if (result.stationCount === 0) return 'No matched arrivals'; + const rms = result.rmsSec; + if (rms < 3) return '🟢 Excellent fit'; + if (rms < 8) return '🟡 Good fit'; + if (rms < 20) return '🟠 Fair fit'; + return '🔴 Poor fit'; +} + +/** + * Count observed arrivals that fall in the model's shadow zone — if the model + * is correct, this should be near zero. A water-core model would have many + * shadow-zone mismatches. + */ +export function countShadowZoneMismatches( + model: EarthModel, + dataset: EarthquakeDataset, +): { inShadow: number; total: number } { + const curve = buildTravelTimeCurve(model, 'P', dataset.depthKm); + let inShadow = 0; + let total = 0; + + for (const arrival of dataset.arrivals) { + if (arrival.pTravelTimeSec === null) continue; + total++; + const predicted = interpolateTravelTime(curve, arrival.distanceDeg); + if (predicted === null) inShadow++; + } + + return { inShadow, total }; +} + +/** + * Build a distance → observed travel time map from dataset arrivals, + * for use in the renderer's scatter plot overlay. + */ +export function getObservedPoints( + dataset: EarthquakeDataset, + wave: 'P' | 'S', +): Array<{ distanceDeg: number; travelTimeSec: number }> { + return dataset.arrivals + .filter((a: PhaseArrival) => { + const t = wave === 'P' ? a.pTravelTimeSec : a.sTravelTimeSec; + return t !== null; + }) + .map((a: PhaseArrival) => ({ + distanceDeg: a.distanceDeg, + travelTimeSec: (wave === 'P' ? a.pTravelTimeSec : a.sTravelTimeSec)!, + })); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8f46035 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "lib": ["ES2020", "DOM"] + }, + "include": ["src"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..14857fc --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite'; + +export default defineConfig({ + base: '/shadow-zone/', + build: { + outDir: 'dist', + }, +});