From 28f3243090fe2aa766d9df2f096e095811f04ac0 Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Tue, 29 Sep 2026 00:20:16 -0500 Subject: [PATCH 001/153] feat(cyclones): publish explicit selection to shared context --- scripts/package-boundaries.json | 2 + src/app/constructCatalog.js | 4 +- src/app/layers/cyclones.js | 11 +++++ src/layers/cyclones/index.js | 52 +++++++++++++++++++++ src/layers/cyclones/index.test.mjs | 72 +++++++++++++++++++++++++++++- 5 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 src/app/layers/cyclones.js diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index 276b9e0db..93bdcf7e1 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -1340,6 +1340,7 @@ "src/app/layers/alprCameras.js", "src/app/layers/bikeshare.js", "src/app/layers/cctv.js", + "src/app/layers/cyclones.js", "src/app/layers/earthquakes.js", "src/app/layers/firms.js", "src/app/layers/flights.js", @@ -2075,6 +2076,7 @@ "src/app/layers/alprCameras.js", "src/app/layers/bikeshare.js", "src/app/layers/cctv.js", + "src/app/layers/cyclones.js", "src/app/layers/earthquakes.js", "src/app/layers/firms.js", "src/app/layers/flights.js", diff --git a/src/app/constructCatalog.js b/src/app/constructCatalog.js index 7ed03d0d2..0437e1749 100644 --- a/src/app/constructCatalog.js +++ b/src/app/constructCatalog.js @@ -1,6 +1,6 @@ import { createWeatherClock } from '../layers/weather/clock.js'; import { createWeatherLayer } from '../layers/weather/index.js'; -import { createCyclonesLayer } from '../layers/cyclones/index.js'; +import { createApplicationCyclones } from './layers/cyclones.js'; import { createWindLayer } from '../layers/wind/index.js'; import { createLayerCatalog } from './catalog.js'; import { LAYER_STATE_REGISTRY } from '../data/layerState.js'; @@ -181,7 +181,7 @@ export function createApplicationCatalog({ id: 'weather-lightning', clock: weatherClock, }), - createCyclonesLayer({ feed: sources.cyclones }), + createApplicationCyclones({ feed: sources.cyclones }), ...createInfrastructureLayers(localGeoJsonServices), createApplicationCables({ source: sources.cables }), createApplicationFirms({ diff --git a/src/app/layers/cyclones.js b/src/app/layers/cyclones.js new file mode 100644 index 000000000..d671a11eb --- /dev/null +++ b/src/app/layers/cyclones.js @@ -0,0 +1,11 @@ +import { createCyclonesLayer } from '../../layers/cyclones/index.js'; +import * as context from '../../data/contextStore.js'; + +/** Wire cyclone selection into the application shared-context owner. */ +export function createApplicationCyclones(options) { + const browserContext = typeof window !== 'undefined' ? { context } : {}; + return createCyclonesLayer({ + ...browserContext, + ...options, + }); +} diff --git a/src/layers/cyclones/index.js b/src/layers/cyclones/index.js index 666614176..2738bebe0 100644 --- a/src/layers/cyclones/index.js +++ b/src/layers/cyclones/index.js @@ -37,6 +37,7 @@ export function createCyclonesLayer({ feed, hitTestOverlay = hitTestWorldOverlay, overlayHost, + context = null, cesium = Cesium, createRendering = createCycloneRendering, matchMedia = globalThis.matchMedia?.bind(globalThis), @@ -52,6 +53,8 @@ export function createCyclonesLayer({ selectedId = null, selectionIntent = 'auto', navigationGeneration = 0, + selectedContextStormId = null, + selectedContextEntity = null, clickHandler = null, removeClickCapture = null; let enabled = false, @@ -62,6 +65,46 @@ export function createCyclonesLayer({ const notify = () => listener?.(); const selected = () => snapshot?.storms.find((storm) => storm.id === selectedId) || null; + + function clearSelectedContext() { + context?.removeEntityContextsForLayer?.('weather-cyclones'); + selectedContextStormId = null; + selectedContextEntity = null; + } + + function publishSelectedContext({ announce = false } = {}) { + const storm = selected(); + if (!storm || !context) { + if (!storm) clearSelectedContext(); + return null; + } + selectedContextEntity ||= { show: true }; + const record = context.registerEntityContext?.(selectedContextEntity, { + id: `cyclone:${storm.id}`, + layerId: 'weather-cyclones', + layerName: 'Cyclone advisories', + source: 'NOAA NHC / CPHC', + label: `Cyclone · ${storm.name}`, + latitude: storm.position.latitude, + longitude: storm.position.longitude, + properties: { + classification: storm.classification, + basin: storm.basin, + advisoryNumber: storm.advisoryNumber, + issuedAt: storm.issuedAt, + positionAt: storm.positionAt, + windKt: storm.windKt, + pressureHpa: storm.pressureHpa, + movement: storm.movement, + advisoryUrl: storm.advisoryUrl, + }, + }); + if (!record) return null; + selectedContextStormId = storm.id; + if (announce) context.selectEntityContext?.(selectedContextEntity); + return record; + } + function select(id) { if (selectedId !== id) ++navigationGeneration; selectedId = id; @@ -206,6 +249,7 @@ export function createCyclonesLayer({ selectedId = null; selectionIntent = 'auto'; ++navigationGeneration; + clearSelectedContext(); rendering?.clear(); }, async update(_viewer, { signal } = {}) { @@ -229,6 +273,7 @@ export function createCyclonesLayer({ snapshot = next; selectedId = null; ++navigationGeneration; + clearSelectedContext(); error = next.reason || 'Cyclone advisories unavailable'; return true; } @@ -251,6 +296,10 @@ export function createCyclonesLayer({ : snapshot.storms[0]?.id || null, ); else rendering.setSelection(selectedId); + if (selectedContextStormId) { + if (selectedId === selectedContextStormId) publishSelectedContext(); + else clearSelectedContext(); + } return true; } catch (cause) { if (controller.signal.aborted || request !== controller) return false; @@ -260,6 +309,7 @@ export function createCyclonesLayer({ snapshot = null; selectedId = null; ++navigationGeneration; + clearSelectedContext(); return true; } finally { signal?.removeEventListener('abort', abort); @@ -275,6 +325,7 @@ export function createCyclonesLayer({ if (params.clear === true || params.stormId === null) { selectionIntent = 'cleared'; select(null); + clearSelectedContext(); notify(); } else if ( typeof params.stormId === 'string' && @@ -282,6 +333,7 @@ export function createCyclonesLayer({ ) { selectionIntent = 'user'; select(params.stormId); + publishSelectedContext({ announce: true }); notify(); } const storm = selected(); diff --git a/src/layers/cyclones/index.test.mjs b/src/layers/cyclones/index.test.mjs index 4127871f4..7d796bef7 100644 --- a/src/layers/cyclones/index.test.mjs +++ b/src/layers/cyclones/index.test.mjs @@ -338,7 +338,7 @@ test('a click on a storm card or lead-hour label selects that storm without pick }); function harness( feed = { getSnapshot: async () => snapshot() }, - { reducedMotion = false } = {}, + { reducedMotion = false, context = null } = {}, ) { const applied = [], navigation = [], @@ -368,6 +368,7 @@ function harness( }; const layer = createCyclonesLayer({ feed, + context, createRendering: () => rendering, matchMedia: () => ({ matches: reducedMotion }), openLink: (url) => opened.push(url), @@ -401,6 +402,75 @@ function harness( }, }; } +test('explicit cyclone selection publishes shared context without auto-claiming it', async () => { + let next = snapshot([storm(), storm('ep162026')]); + const records = new Map(); + let selectedContext = null; + let selectedEvents = 0; + const context = { + registerEntityContext(entity, metadata) { + entity.__gevContextId = metadata.id; + const record = { ...metadata, entity }; + records.set(metadata.id, record); + return record; + }, + selectEntityContext(entity) { + selectedContext = records.get(entity.__gevContextId) || null; + selectedEvents += 1; + return selectedContext; + }, + removeEntityContextsForLayer(layerId) { + for (const [id, record] of records) { + if (record.layerId === layerId) records.delete(id); + } + if (selectedContext?.layerId === layerId) selectedContext = null; + }, + }; + const h = harness({ getSnapshot: async () => next }, { context }); + h.layer.enable(); + await h.layer.update(); + + assert.equal( + selectedEvents, + 0, + 'the automatic first-storm row selection must not claim shared context', + ); + assert.equal(records.size, 0); + + h.layer.setParams({ stormId: 'ep162026' }); + assert.equal(selectedEvents, 1); + assert.equal(selectedContext?.layerId, 'weather-cyclones'); + assert.equal(selectedContext?.source, 'NOAA NHC / CPHC'); + assert.equal(selectedContext?.label, 'Cyclone · Another system'); + assert.equal(selectedContext?.latitude, 15.5); + assert.equal(selectedContext?.longitude, -125.8); + assert.equal(selectedContext?.properties.advisoryNumber, '10'); + + await h.layer.update(); + assert.equal( + selectedEvents, + 1, + 'refresh updates the selected record without re-announcing the click', + ); + + next = snapshot([storm()]); + await h.layer.update(); + assert.equal( + selectedContext, + null, + 'a vanished user-selected storm must clear instead of transferring context to the fallback row', + ); + assert.equal(records.size, 0); + + h.layer.setParams({ stormId: 'ep152026' }); + assert.equal(selectedEvents, 2); + h.layer.setParams({ clear: true }); + assert.equal(selectedContext, null); + assert.equal(records.size, 0); + + h.layer.destroy(); +}); + test('refresh preserves selection intent, including explicit clears and missing storms', async () => { let next = snapshot([storm(), storm('ep162026')]); const h = harness({ getSnapshot: async () => next }); From 81f49406b80f2f4c8076ed739360f79ab2e2c34f Mon Sep 17 00:00:00 2001 From: Wilmer Alzate Date: Wed, 30 Sep 2026 12:31:59 -0500 Subject: [PATCH 002/153] perf(flights): skip dead-reckoning contacts that stay behind the horizon The fleet tick dead-reckoned, floored and distance-tested every contact on every ~80 ms tick, then hid the ones behind the horizon. The worldwide feed carries ~13k contacts; zoomed in, well under 1% are on screen, so nearly all of that work produced a hidden billboard. A contact that is already hidden and still behind the horizon at its last position now re-reckons only on its turn in a staggered one-in-12-ticks rotation (about once a second, HIDDEN_CONTACT_DR_TICKS). Anything that position puts in view, and any contact with a fleet model, takes the full pass immediately, so on-screen behaviour is unchanged. Hidden-inclusive proximity queries (getNearby includeHidden, getAllPositions) read positions at most about a second old, well inside the 30 s poll's uncertainty. Measured in Chrome on a Radeon 780M, ~12.9k contacts, 56 on screen over Colombia at 4 km, same view before and after: fleet tick 7.66 -> 2.03 ms/frame, longest tick 50.9 -> ~16 ms frame 20.6 -> 14.0 ms, 42.9 -> 57.8 FPS Teleporting the camera to Madrid showed 975 contacts within 100 ms. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 7 ++++ docs/CURRENT-STATE.md | 2 +- scripts/format-scope.json | 1 + .../flights/hiddenContactRotation.test.mjs | 42 +++++++++++++++++++ src/layers/flights/policy.js | 31 ++++++++++++++ src/layers/flights/rendering.js | 24 +++++++++++ src/layers/flights/state.js | 4 ++ 7 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 src/layers/flights/hiddenContactRotation.test.mjs diff --git a/CHANGELOG.md b/CHANGELOG.md index 58103d04d..4cc44d40c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +- Stop dead-reckoning every flight hidden behind the horizon on every fleet + tick. With the worldwide feed (~13k contacts, ~56 on screen over Colombia at + 4 km), the fleet pass drops from 7.7 ms to 2.0 ms per frame and its longest + tick from 51 ms to about 16 ms; the scene goes from 43 to 58 FPS. Hidden + contacts re-reckon about once a second, staggered, and appear as soon as + their position is in view. + - Public Overpass instances are no longer used by default. Street Traffic roads come from TomTom flow tiles, OpenFreeMap vector tiles, or both, chosen on the layer row (TomTom / OSM / Hybrid) or with `?trafficRoads=`. With a diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 22ce1eb3b..ee4269a63 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -3469,7 +3469,7 @@ silently demoting every later lookup for the session. ### Motion & Symbology Correctness (June 10, 2026) -- **Flights (commercial + military)** render one poll interval behind real time (30s/15s) and interpolate between two known feed-stamped fixes (OpenSky `time_position`; adsb.lol `receipt − seen_pos`). The display latency is an intentional product decision — do not "fix" it away. The whole fleet dead-reckons at ~12Hz (1m² write gating); aircraft get a 3-poll grace period (faded icon) before removal. When a position epoch pauses, both layers coast for at least 60 seconds of contact grace with an absolute five-minute ceiling. Source backoff marks each contact and the cockpit `STALE`; the cockpit then holds the exact layer position instead of continuing inertial flight. Repeated-position kinematic changes create a forward-only synthetic fix rather than mutating history, and grounded history is lifted only when no owned 3D model already controls its datum. A nominally successful worldwide OpenSky response whose own snapshot epoch is more than two minutes old prefers the existing 250-nm viewport-scoped adsb.lol fallback and labels the source/coverage accordingly when that upstream is available. If the fallback is also unavailable, the layer's freshness/error fields use the source epoch—never the cache receipt time—so the UI reports an old snapshot rather than “just now.” +- **Flights (commercial + military)** render one poll interval behind real time (30s/15s) and interpolate between two known feed-stamped fixes (OpenSky `time_position`; adsb.lol `receipt − seen_pos`). The display latency is an intentional product decision — do not "fix" it away. The fleet dead-reckons at ~12Hz (1m² write gating); a contact already hidden behind the horizon whose last position still is re-reckons on a staggered one-in-12-ticks rotation (about once a second) instead, so the worldwide feed's ~13k contacts no longer cost a full pass when well under 1% are on screen. Anything that position puts in view, and any contact with a fleet model, takes the full pass immediately, and hidden-inclusive proximity queries read positions at most about a second old; aircraft get a 3-poll grace period (faded icon) before removal. When a position epoch pauses, both layers coast for at least 60 seconds of contact grace with an absolute five-minute ceiling. Source backoff marks each contact and the cockpit `STALE`; the cockpit then holds the exact layer position instead of continuing inertial flight. Repeated-position kinematic changes create a forward-only synthetic fix rather than mutating history, and grounded history is lifted only when no owned 3D model already controls its datum. A nominally successful worldwide OpenSky response whose own snapshot epoch is more than two minutes old prefers the existing 250-nm viewport-scoped adsb.lol fallback and labels the source/coverage accordingly when that upstream is available. If the fallback is also unavailable, the layer's freshness/error fields use the source epoch—never the cache receipt time—so the UI reports an old snapshot rather than “just now.” - **World-space headings at every angle** (`src/data/iconOrientation.js`): aircraft/vessel icon rotation uses the camera right/up basis per tick (alignedAxis always ZERO), which is exact at screen center and for orthographic/nadir views and remains stable through >180° tracked orbits. Perspective rays vary across the viewport, so off-center contacts at oblique pitch can diverge from an exact finite-difference window projection; a regression test pins that known regime, and field evidence decides whether to adopt exact projection with the basis method as fallback. Fleet rotations refresh on camera-pose change; tracked entities per frame. Billboards are horizon-culled via a shared EllipsoidalOccluder. - **Military/OpenSky reconciliation** (`src/data/militaryRegistry.js`): known-military ICAOs render amber in the flights layer (60s self-poll of the cached mil endpoint when the military layer is off) and are suppressed there while the military layer renders them. - **Satellites**: 838-sat core catalog (stations/visual/GPS/GLONASS/Galileo/GEO), tracking lands ~726km out via `viewFrom` (tracked entity owns a point graphic so the tracking camera engages), rings realign via primitive modelMatrix (no per-second rebuild flicker), optional `setParams({catalog:'dense'})` Starlink mode. diff --git a/scripts/format-scope.json b/scripts/format-scope.json index cd836a5cb..a12d5124f 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -308,6 +308,7 @@ "src/layers/flights/tracking.js", "src/layers/flights/rendering.js", "src/layers/flights/testing.js", + "src/layers/flights/hiddenContactRotation.test.mjs", "src/layers/flights/evidence.js", "src/layers/flights/ingestion.js", "src/layers/flights/queries.js", diff --git a/src/layers/flights/hiddenContactRotation.test.mjs b/src/layers/flights/hiddenContactRotation.test.mjs new file mode 100644 index 000000000..23e81c45b --- /dev/null +++ b/src/layers/flights/hiddenContactRotation.test.mjs @@ -0,0 +1,42 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { + FLEET_DR_INTERVAL_MS, + HIDDEN_CONTACT_DR_INTERVAL_MS, + HIDDEN_CONTACT_DR_TICKS, + hiddenContactDrPhase, +} from './policy.js'; + +// Contacts hidden behind the horizon re-reckon on one fleet tick per rotation +// instead of every tick. Their positions still feed hidden-inclusive proximity +// queries, so the rotation must reach every contact about once a second, and +// it must spread them across ticks so no single tick carries the whole fleet. + +const icao = (n) => n.toString(16).padStart(6, '0'); + +test('the rotation revisits each hidden contact about once a second', () => { + const periodMs = HIDDEN_CONTACT_DR_TICKS * FLEET_DR_INTERVAL_MS; + assert.ok(HIDDEN_CONTACT_DR_TICKS > 1); + assert.ok( + Math.abs(periodMs - HIDDEN_CONTACT_DR_INTERVAL_MS) <= FLEET_DR_INTERVAL_MS, + ); +}); + +test('a contact keeps the same slot, inside the rotation', () => { + for (let n = 0; n < 500; n++) { + const phase = hiddenContactDrPhase(icao(n * 7919)); + assert.ok(Number.isInteger(phase)); + assert.ok(phase >= 0 && phase < HIDDEN_CONTACT_DR_TICKS); + assert.equal(hiddenContactDrPhase(icao(n * 7919)), phase); + } +}); + +test('a worldwide fleet is spread evenly enough that no tick carries a burst', () => { + const fleet = 13000; + const perSlot = new Array(HIDDEN_CONTACT_DR_TICKS).fill(0); + // Real ICAO24 addresses cluster by national block; sample several blocks. + for (let n = 0; n < fleet; n++) + perSlot[hiddenContactDrPhase(icao(0x0a0000 + n * 53))]++; + const fair = fleet / HIDDEN_CONTACT_DR_TICKS; + for (const count of perSlot) assert.ok(count < fair * 1.5, `${count} > 1.5×`); +}); diff --git a/src/layers/flights/policy.js b/src/layers/flights/policy.js index f8358c98f..04313c367 100644 --- a/src/layers/flights/policy.js +++ b/src/layers/flights/policy.js @@ -200,6 +200,37 @@ export const FLEET_DR_INTERVAL_MS = 80; export const ROTATION_REFRESH_MS = 1000; +/** + * @constant {number} Dead-reckoning cadence (ms) for contacts hidden behind the + * horizon. The worldwide feed carries ~13k contacts and a zoomed-in view shows + * well under 1% of them; the rest still need positions for hidden-inclusive + * proximity queries, but ~1 s old (≈250 m for an airliner) is well inside the + * 30 s poll's own uncertainty. Each hidden contact is re-reckoned on one tick in + * every HIDDEN_CONTACT_DR_TICKS, staggered by id so no tick carries them all. + */ + +export const HIDDEN_CONTACT_DR_INTERVAL_MS = 1000; + +export const HIDDEN_CONTACT_DR_TICKS = Math.max( + 1, + Math.round(HIDDEN_CONTACT_DR_INTERVAL_MS / FLEET_DR_INTERVAL_MS), +); + +/** + * Stable slot in [0, HIDDEN_CONTACT_DR_TICKS) for a contact id, so each hidden + * contact re-reckons on the same tick of every rotation. + * @param {string} id Contact id (ICAO24). + * @returns {number} + */ + +export function hiddenContactDrPhase(id) { + const text = String(id); + let hash = 0; + for (let i = 0; i < text.length; i++) + hash = (hash * 31 + text.charCodeAt(i)) >>> 0; + return hash % HIDDEN_CONTACT_DR_TICKS; +} + /** Max course slew (deg/s) — well above real turns (≤4°/s), hides fix-boundary * steps. Scaled down toward COURSE_MIN_DPS at low speed (courseSlewCapDps). */ diff --git a/src/layers/flights/rendering.js b/src/layers/flights/rendering.js index 44e1b02c3..2048128dd 100644 --- a/src/layers/flights/rendering.js +++ b/src/layers/flights/rendering.js @@ -33,6 +33,8 @@ import { COURSE_SLEW_DT_MAX_SEC, ROTATION_REFRESH_MS, COURSE_MAX_DPS, + HIDDEN_CONTACT_DR_TICKS, + hiddenContactDrPhase, } from './policy.js'; export function createRendering({ @@ -811,6 +813,12 @@ export function createRendering({ } } + /** The contact's hidden-rotation slot, cached on its billboard. */ + function _hiddenDrPhase(bb, icao24) { + bb._gevHiddenDrPhase ??= hiddenContactDrPhase(icao24); + return bb._gevHiddenDrPhase; + } + function _fleetTick() { if ( !flightState._viewer || @@ -931,9 +939,25 @@ export function createRendering({ for (const icao of toRelease) _releaseModel(icao); } + const hiddenDrPhase = flightState._fleetTickSeq++ % HIDDEN_CONTACT_DR_TICKS; + for (const [icao24, bb] of flightState._billboards) { if (icao24 === flightState._trackedIcao) continue; // tracked entity owns its own motion + // A contact still behind the horizon at its last position would only be + // re-reckoned to be hidden again, so off its turn it keeps that position + // (see HIDDEN_CONTACT_DR_TICKS). Anything the stale position puts in view, + // and any contact with a fleet model, takes the full pass below at once. + if ( + !bb.show && + _hiddenDrPhase(bb, icao24) !== hiddenDrPhase && + !flightState._models.has(icao24) && + !occluder.isPointVisible( + flightState._cullPositions.get(icao24) || bb.position, + ) + ) + continue; + const info = flightState.records.data.get(icao24); const dr = parts.motion._deadReckon(icao24, flightState._scratchFleetPos); diff --git a/src/layers/flights/state.js b/src/layers/flights/state.js index 2978ceba4..d1adec064 100644 --- a/src/layers/flights/state.js +++ b/src/layers/flights/state.js @@ -204,6 +204,10 @@ export function createFlightState({ source, services }) { flightState._lastFleetTickMs = 0; + /** @type {number} Fleet ticks run; selects which hidden contacts re-reckon */ + + flightState._fleetTickSeq = 0; + /** @type {string} Camera pose signature at the last rotation pass */ flightState._lastCamPoseSig = ''; From aa745bcee5c4f76353c9426fb9055cb5737f0fc0 Mon Sep 17 00:00:00 2001 From: Trygve Hemminghytt <274629477+trygvehhh@users.noreply.github.com> Date: Wed, 7 Oct 2026 04:02:05 +0200 Subject: [PATCH 003/153] data: refresh Norway datacenters from Geofabrik extract Add a maintainer script that merges a pinned, MD5-verified Geofabrik Norway extract (osmium tags-filter telecom/building=data_center) into the bundled datacenter layer. Only features inside the Geofabrik Norway boundary are touched; unchanged features keep their original line. norway-261005 (OSM 2026-10-05) adds Troll Housing (w1551029155) and updates tags on four existing features. Provenance is recorded in the dataset README and the bundled count moves from 4,351 to 4,352. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 6 + DATA_SOURCES.md | 2 +- README.md | 2 +- docs/INFRASTRUCTURE-LAYERS.md | 2 +- scripts/build-datacenters-norway.py | 196 ++++++++++++++++++ src/data/infrastructure.test.mjs | 2 +- src/data/local_data/datacenters/README.md | 16 +- .../datacenters/datacenters.geojsonl | 9 +- 8 files changed, 226 insertions(+), 9 deletions(-) create mode 100644 scripts/build-datacenters-norway.py diff --git a/CHANGELOG.md b/CHANGELOG.md index b433f8c06..031e36751 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## [Unreleased] +- Refresh Norway's datacenters from a Geofabrik OpenStreetMap extract + (2026-10-05). Troll Housing joins the layer (4,352 features) and four + Norwegian sites pick up current OSM tags; no site moved or was removed. + `scripts/build-datacenters-norway.py` reproduces or `--verify`s the merge, + touching only features inside Geofabrik's Norway boundary, and the dataset + README records the extract, checksum and filter. - Add Norway's road cameras from Statens vegvesen as a CCTV pack. The camera list is one keyless GeoJSON request to the agency's OGC API view of its DATEX 3.1 CCTV table, so no DATEX account is needed. Every working camera diff --git a/DATA_SOURCES.md b/DATA_SOURCES.md index 734e35a69..b4f0dc0cc 100644 --- a/DATA_SOURCES.md +++ b/DATA_SOURCES.md @@ -112,7 +112,7 @@ The [Bhote Koshi event pack](public/events/bhote-koshi-2026/README.md), under `p | Dataset | Folder | License | Commercial use? | Attribution | | --------------------------------------------------------------------------- | --------------------------------- | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------------- | -| **Datacenters** (4,351) | `datacenters/` | **ODbL 1.0** (OpenStreetMap extract) | ✅ (attribution + share-alike on data) | © OpenStreetMap contributors (shared credit) | +| **Datacenters** (4,352) | `datacenters/` | **ODbL 1.0** (OpenStreetMap extract) | ✅ (attribution + share-alike on data) | © OpenStreetMap contributors (shared credit) | | **Dams** (704) | `dams/` | **ODbL 1.0** (OpenInfraMap / OSM extract) | ✅ (attribution + share-alike on data) | © OpenStreetMap contributors (shared credit) + Open Infrastructure Map | | **Military area names** (36,466) | `osm_military_names/` | **ODbL 1.0** (OpenStreetMap, via Overture Maps) | ✅ (attribution + share-alike on data) | © OpenStreetMap contributors (shared credit) + Overture Maps Foundation | | **TeleGeography Submarine Cable Map** (712 cables + 1,917 landing points) | `telegeography_submarine_cables/` | **CC BY-NC-SA 3.0** | ❌ **NonCommercial — remove for commercial use** | "© TeleGeography — submarinecablemap.com" | diff --git a/README.md b/README.md index 724ea18cb..0500645af 100644 --- a/README.md +++ b/README.md @@ -323,7 +323,7 @@ In the app, **Data Layers** groups them as Movement, Cameras, Infrastructure, Ev _The Space Missions layer replaying a Falcon 9 ascent — labeled `RECONSTRUCTED ESTIMATE`, scrubbable 0.25×–4×._ -**Also on the globe:** neighborhood overlays · an optional cockpit WX cloud effect. **Bundled static infrastructure:** Datacenters (4,351), Dams (704), and Submarine Cables (712). +**Also on the globe:** neighborhood overlays · an optional cockpit WX cloud effect. **Bundled static infrastructure:** Datacenters (4,352), Dams (704), and Submarine Cables (712). ![Diving into the Bahamas and revealing labeled submarine cable routes beneath the globe](docs/media/09-undersea-cables.gif) diff --git a/docs/INFRASTRUCTURE-LAYERS.md b/docs/INFRASTRUCTURE-LAYERS.md index 76567e605..1166a9e69 100644 --- a/docs/INFRASTRUCTURE-LAYERS.md +++ b/docs/INFRASTRUCTURE-LAYERS.md @@ -58,6 +58,6 @@ factory and supplies its existing functions. Other consumers should use the pack exports, which do not import standalone application globals. Dataset files and source/license notices remain under `src/data/local_data/`. -Their input counts are 4,351 datacenter features and 704 dam features. Cesium may +Their input counts are 4,352 datacenter features and 704 dam features. Cesium may expand multipart geometries into multiple entities; entity and stem counts are different measurements. This change does not refresh or relicense the datasets. diff --git a/scripts/build-datacenters-norway.py b/scripts/build-datacenters-norway.py new file mode 100644 index 000000000..01a891a8b --- /dev/null +++ b/scripts/build-datacenters-norway.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python3 +"""Maintainer-only Norway refresh of the bundled datacenter extract (osmium-tool). + +Downloads a pinned Geofabrik Norway extract, verifies its MD5, filters +telecom=data_center / building=data_center with osmium, and merges the result +into datacenters.geojsonl: features inside the Geofabrik Norway boundary are +added, updated or removed; every other line is kept byte-for-byte. +""" +import argparse +import hashlib +import json +import math +from pathlib import Path +import shutil +import subprocess +import urllib.request + +ROOT = Path(__file__).resolve().parent.parent +EXTRACT = 'norway-261005' +GEOFABRIK = 'https://download.geofabrik.de/europe/' +DATASET = ROOT / 'src/data/local_data/datacenters/datacenters.geojsonl' +CONTACT_TAGS = {'email', 'phone', 'fax', 'mobile', 'whatsapp', 'contact:email', 'contact:phone', + 'contact:fax', 'contact:mobile', 'contact:whatsapp'} +SAME_GEOMETRY_METERS = 0.05 + + +def fetch(url, target): + if not target.exists(): + with urllib.request.urlopen(url) as response, open(str(target) + '.part', 'wb') as out: + shutil.copyfileobj(response, out) + Path(str(target) + '.part').rename(target) + return target + + +def md5(path): + digest = hashlib.md5() + with open(path, 'rb') as handle: + for block in iter(lambda: handle.read(1 << 20), b''): + digest.update(block) + return digest.hexdigest() + + +def read_poly(path): + """Geofabrik .poly -> list of (ring, is_hole).""" + rings, ring, hole = [], None, False + for raw in path.read_text().splitlines()[1:]: + line = raw.strip() + if ring is None: + if line and line != 'END': + ring, hole = [], line.startswith('!') + elif line == 'END': + rings.append((ring, hole)) + ring = None + elif line: + lon, lat = (float(v) for v in line.split()) + ring.append((lon, lat)) + return rings + + +def inside(rings, lon, lat): + def in_ring(ring): + hit = False + for (x1, y1), (x2, y2) in zip(ring, ring[1:] + ring[:1]): + if (y1 > lat) != (y2 > lat) and lon < x1 + (lat - y1) * (x2 - x1) / (y2 - y1): + hit = not hit + return hit + return any(in_ring(r) for r, h in rings if not h) and not any(in_ring(r) for r, h in rings if h) + + +def points(coordinates): + if isinstance(coordinates[0], (int, float)): + return [coordinates] + return [p for part in coordinates for p in points(part)] + + +def osm_key(feature): + osm_id = feature['properties']['osm_id'] + if osm_id < 0: + return 'r%d' % -osm_id + return ('n' if feature['geometry']['type'] == 'Point' else 'w') + str(osm_id) + + +def export(osmium, pbf, cache): + filtered = cache / (EXTRACT + '-datacenters.osm.pbf') + exported = cache / (EXTRACT + '-datacenters.geojsonseq') + subprocess.run([osmium, 'tags-filter', '-O', '-o', str(filtered), str(pbf), + 'nwr/telecom=data_center', 'nwr/building=data_center'], check=True) + subprocess.run([osmium, 'export', '-O', '-f', 'geojsonseq', '--add-unique-id=type_id', + '-o', str(exported), str(filtered)], check=True) + fresh = {} + for line in exported.read_text().splitlines(): + line = line.lstrip('\x1e').strip() + if not line: + continue + feature = json.loads(line) + tags = {k: v for k, v in feature['properties'].items() if k not in CONTACT_TAGS} + if tags.get('telecom') != 'data_center' and tags.get('building') != 'data_center': + continue # untagged member ways exported only for geometry + key = feature['id'] + geometry = feature['geometry'] + if key[0] == 'a': # osmium area id: way * 2 or relation * 2 + 1 + number = int(key[1:]) + key = ('w%d' % (number // 2)) if number % 2 == 0 else ('r%d' % (number // 2)) + if key[0] == 'r': + tags = {**tags, 'type': 'multipolygon'} + if geometry['type'] == 'MultiPolygon' and len(geometry['coordinates']) == 1: + geometry = {'type': 'Polygon', 'coordinates': geometry['coordinates'][0]} + elif key in fresh or geometry['type'] == 'LineString': + continue # closed ways are taken from their area export + fresh[key] = {'geometry': geometry, 'tags': tags} + return fresh + + +def same_geometry(old, new): + """Same type and vertex set within tolerance; ring start and winding may differ.""" + if old['type'] != new['type']: + return False + a, b = points(old['coordinates']), points(new['coordinates']) + if len(a) != len(b): + return False + + def meters(p, q): + dx = (p[0] - q[0]) * 111320 * math.cos(math.radians(p[1])) + return math.hypot(dx, (p[1] - q[1]) * 110540) + return all(min(meters(p, q) for q in b) <= SAME_GEOMETRY_METERS for p in a) and \ + all(min(meters(q, p) for p in a) <= SAME_GEOMETRY_METERS for q in b) + + +def feature_line(key, sequence, fresh): + osm_id = int(key[1:]) * (-1 if key[0] == 'r' else 1) + feature = {'id': osm_id, 'type': 'Feature', 'geometry': fresh['geometry'], + 'properties': {'id': sequence, 'tags': fresh['tags'], 'type': 'data_center', + 'osm_id': osm_id}} + return json.dumps(feature, separators=(',', ':'), ensure_ascii=False) + + +def merge(lines, fresh, rings): + out, seen, sequence = [], set(), 0 + report = {'kept': 0, 'updated': [], 'removed': [], 'added': []} + for line in lines: + feature = json.loads(line) + sequence = max(sequence, feature['properties']['id']) + key = osm_key(feature) + if key in fresh: + seen.add(key) + old_tags = feature['properties']['tags'] + if old_tags == fresh[key]['tags'] and same_geometry(feature['geometry'], fresh[key]['geometry']): + out.append(line) + report['kept'] += 1 + else: + out.append(feature_line(key, feature['properties']['id'], fresh[key])) + report['updated'].append(key) + continue + lon, lat = points(feature['geometry']['coordinates'])[0][:2] + if inside(rings, lon, lat): + report['removed'].append(key) + continue + out.append(line) + for key in sorted(set(fresh) - seen, key=lambda k: (k[0], int(k[1:]))): + sequence += 1 + out.append(feature_line(key, sequence, fresh[key])) + report['added'].append(key) + if len({osm_key(json.loads(line)) for line in out}) != len(out): + raise ValueError('Duplicate OSM identity') + return out, report + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--cache', type=Path, required=True) + parser.add_argument('--osmium', default=shutil.which('osmium') or 'osmium') + parser.add_argument('--verify', action='store_true') + args = parser.parse_args() + args.cache.mkdir(parents=True, exist_ok=True) + pbf = fetch(GEOFABRIK + EXTRACT + '.osm.pbf', args.cache / (EXTRACT + '.osm.pbf')) + expected = fetch(GEOFABRIK + EXTRACT + '.osm.pbf.md5', + args.cache / (EXTRACT + '.osm.pbf.md5')).read_text().split()[0] + actual = md5(pbf) + if actual != expected: + raise RuntimeError('MD5 mismatch for %s: %s != %s' % (pbf.name, actual, expected)) + rings = read_poly(fetch(GEOFABRIK + 'norway.poly', args.cache / 'norway.poly')) + fresh = export(args.osmium, pbf, args.cache) + current = [line for line in DATASET.read_text().splitlines() if line.strip()] + merged, report = merge(current, fresh, rings) + payload = '\n'.join(merged) + '\n' + if args.verify: + if payload != DATASET.read_text(): + raise SystemExit('datacenters.geojsonl is not the %s merge' % EXTRACT) + else: + DATASET.write_text(payload) + print(json.dumps({'extract': EXTRACT, 'md5': actual, 'norway': len(fresh), + 'features': len(merged), **report})) + + +if __name__ == '__main__': + main() diff --git a/src/data/infrastructure.test.mjs b/src/data/infrastructure.test.mjs index 45fb3d317..c7f1b5a23 100644 --- a/src/data/infrastructure.test.mjs +++ b/src/data/infrastructure.test.mjs @@ -82,7 +82,7 @@ test('infrastructure factory preserves identity and creates independent state wi test('dataset URLs still name the complete bundled sources', () => { for (const [file, count] of [ - ['datacenters', 4351], + ['datacenters', 4352], ['dams', 704], ]) { const lines = readFileSync( diff --git a/src/data/local_data/datacenters/README.md b/src/data/local_data/datacenters/README.md index 454a15007..ef0720ae4 100644 --- a/src/data/local_data/datacenters/README.md +++ b/src/data/local_data/datacenters/README.md @@ -5,7 +5,7 @@ layer. - Source: OpenStreetMap contributors - License: Open Database License (ODbL) 1.0 -- Feature count: 4,351 +- Feature count: 4,352 - Runtime file: `datacenters.geojsonl` The public-release snapshot removes contact-oriented tags such as email, phone, @@ -16,3 +16,17 @@ ODbL 1.0 with the required OpenStreetMap attribution. The original extraction date and query were not recorded alongside this snapshot. Future refreshes should record both before replacing the file. + +## Norway refresh + +Features inside the Geofabrik Norway boundary (`norway.poly`, which includes +Svalbard) were refreshed separately, so this file mixes two vintages: Norway +reflects OSM as of the extract below, everything else the original snapshot. + +- Extract: Geofabrik `norway-261005.osm.pbf`, OSM data + 2026-10-05T20:21:35Z, MD5 `1d2cfdeb98980fce11b8891d0f9146c0` +- Filter: `osmium tags-filter nwr/telecom=data_center nwr/building=data_center` +- Contact tags are dropped as above; unchanged features keep their original + line, so geometry is only rewritten when tags or vertices actually changed. +- Rebuild or check: `python3 scripts/build-datacenters-norway.py --cache ` + (add `--verify` to check without writing; requires `osmium-tool`) diff --git a/src/data/local_data/datacenters/datacenters.geojsonl b/src/data/local_data/datacenters/datacenters.geojsonl index f7f5fc89f..b02bd57b3 100644 --- a/src/data/local_data/datacenters/datacenters.geojsonl +++ b/src/data/local_data/datacenters/datacenters.geojsonl @@ -3770,15 +3770,15 @@ {"id":939340882,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[21.021364183,52.315373019],[21.02232433,52.315435883],[21.022363641,52.315209656],[21.021403578,52.315146875],[21.021364183,52.315373019]]]},"properties":{"id":11407,"tags":{"name":"T-Mobile Warszawa-Szlachecka","telecom":"data_center","building":"office","building:levels":"3"},"type":"data_center","osm_id":939340882}} {"id":1005973518,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[21.021325375,52.315595978],[21.022285857,52.315658423],[21.02232433,52.315435883],[21.021364183,52.315373019],[21.021325375,52.315595978]]]},"properties":{"id":11976,"tags":{"telecom":"data_center","building":"office","building:levels":"3"},"type":"data_center","osm_id":1005973518}} {"id":1156823776,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[21.115130857,52.235385942],[21.115189866,52.236349777],[21.115232027,52.236667954],[21.115818174,52.237174556],[21.116175578,52.237468677],[21.117262124,52.236985628],[21.11728157,52.236976576],[21.117262795,52.236960985],[21.117340495,52.236926033],[21.117360276,52.2369433],[21.117447532,52.236904491],[21.11804097,52.236654459],[21.118030996,52.236645742],[21.118041054,52.236641719],[21.116603055,52.235624072],[21.116518984,52.235676375],[21.115986231,52.235696659],[21.115954966,52.235361551],[21.115130857,52.235385942]]]},"properties":{"id":15342,"tags":{"name":"Atman Data Center Warsaw-1","telecom":"data_center","website":"https://www.atman.pl"},"type":"data_center","osm_id":1156823776}} -{"id":7405586142,"type":"Feature","geometry":{"type":"Point","coordinates":[5.598350034,58.860111293]},"properties":{"id":24849,"tags":{"name":"Maan Group","telecom":"data_center","operator":"Privat"},"type":"data_center","osm_id":7405586142}} +{"id":7405586142,"type":"Feature","geometry":{"type":"Point","coordinates":[5.5983501,58.8601113]},"properties":{"id":24849,"tags":{"name":"Maan Group","opening_hours":"24/7","operator":"Privat","telecom":"data_center"},"type":"data_center","osm_id":7405586142}} {"id":481615983,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[9.572510149,56.481777951],[9.574069938,56.484921751],[9.57465357,56.48483349],[9.574639572,56.484805243],[9.574700676,56.484795939],[9.574714925,56.484824857],[9.575298557,56.484736595],[9.57454888,56.483225422],[9.574609229,56.483216369],[9.574510155,56.483016629],[9.574449722,56.483025849],[9.573738769,56.481592795],[9.573155137,56.481680972],[9.573170643,56.481712321],[9.573109539,56.481721625],[9.573093781,56.48168969],[9.572510149,56.481777951]]]},"properties":{"id":7881,"tags":{"telecom":"data_center","building":"data_center","operator":"Apple","wikidata":"Q19721053","wikipedia":"en:Foulum Data Center","description":"Apple Datacenter"},"type":"data_center","osm_id":481615983}} {"id":618756435,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[10.500360092,57.318668738],[10.500399236,57.318671672],[10.500382891,57.318734871],[10.500552038,57.318744175],[10.500545249,57.318787677],[10.500501495,57.318785666],[10.500458999,57.318957746],[10.500970295,57.31899647],[10.501009187,57.318847189],[10.501084959,57.318852888],[10.50111966,57.318719197],[10.500843896,57.318698159],[10.500865521,57.318615178],[10.500859235,57.318614759],[10.500869461,57.318575699],[10.500954537,57.318582153],[10.501022347,57.31832223],[10.500736691,57.318300437],[10.500669133,57.318559689],[10.500674162,57.318560025],[10.500664272,57.318598498],[10.500383981,57.318577124],[10.500360092,57.318668738]]]},"properties":{"id":8842,"tags":{"ref":"AAL01-01","name":"Prime Data Centers - Saeby Campus AAL01","telecom":"data_center","website":"https://primedatacenters.com/locations/saeby/","building":"industrial","operator":"Prime Data Centers"},"type":"data_center","osm_id":618756435}} -{"id":-14367602,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[11.002243225,59.633471864],[11.003903261,59.633446551],[11.007046726,59.633399696],[11.006983443,59.632420941],[11.006982772,59.63227057],[11.006911023,59.632265289],[11.006852936,59.632253973],[11.006765848,59.632228576],[11.00671782,59.632205275],[11.006119687,59.632213573],[11.006119352,59.632202592],[11.006118933,59.63219245],[11.005930424,59.632194378],[11.005923635,59.632120869],[11.005980799,59.632120031],[11.005979542,59.632104524],[11.005977027,59.63206865],[11.00597225,59.631998242],[11.005412171,59.632035541],[11.005286945,59.632043839],[11.00527848,59.632044342],[11.003707962,59.632147272],[11.003107483,59.63219178],[11.002741864,59.632235533],[11.002729375,59.63223788],[11.002345987,59.632309294],[11.002308352,59.632316251],[11.002302066,59.632477351],[11.002277088,59.632913881],[11.002243225,59.633471864]]]},"properties":{"id":107,"tags":{"name":"STACK Infrastructure OSL04","type":"multipolygon","telecom":"data_center","website":"https://www.stackinfra.com","operator":"Stack Infrastructure","operator:wikidata":"Q115477173"},"type":"data_center","osm_id":-14367602}} +{"id":-14367602,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[11.0022433,59.6334719],[11.0022771,59.6329139],[11.0023021,59.6324774],[11.0023084,59.6323163],[11.002346,59.6323093],[11.0027294,59.6322379],[11.0027419,59.6322356],[11.0031075,59.6321918],[11.003708,59.6321473],[11.0052785,59.6320444],[11.005287,59.6320439],[11.0054122,59.6320356],[11.0059723,59.6319983],[11.0059771,59.6320687],[11.0059796,59.6321046],[11.0059808,59.6321201],[11.0059237,59.6321209],[11.0059305,59.6321944],[11.006119,59.6321925],[11.0061194,59.6322026],[11.0061197,59.6322136],[11.0067179,59.6322053],[11.0067659,59.6322286],[11.006853,59.632254],[11.0069111,59.6322653],[11.0069828,59.6322706],[11.0069835,59.632421],[11.0070468,59.6333997],[11.0039033,59.6334466],[11.0022433,59.6334719]]]},"properties":{"id":107,"tags":{"landuse":"industrial","name":"STACK Infrastructure OSL04","operator":"Stack Infrastructure","operator:wikidata":"Q115477173","telecom":"data_center","website":"https://www.stackinfra.com","type":"multipolygon"},"type":"data_center","osm_id":-14367602}} {"id":1028687251,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[11.004111886,59.632578437],[11.004142983,59.633037262],[11.004275166,59.633034999],[11.004274998,59.63303173],[11.00505133,59.633019157],[11.005056443,59.633099372],[11.005224416,59.63309669],[11.005190637,59.632562344],[11.005060885,59.632564439],[11.005060969,59.632567457],[11.004587978,59.632575419],[11.00458538,59.632536527],[11.004459819,59.632538623],[11.004462418,59.632576844],[11.004242476,59.6325807],[11.004242141,59.632576174],[11.004111886,59.632578437]]]},"properties":{"id":12226,"tags":{"building":"data_center","ref:bygningsnr":"300783262"},"type":"data_center","osm_id":1028687251}} {"id":1164840308,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[11.002600126,59.632599392],[11.002631223,59.633058217],[11.00276349,59.633055954],[11.002763238,59.633052685],[11.00353957,59.633040196],[11.003544683,59.633120327],[11.00371274,59.633117645],[11.003678961,59.632583382],[11.003549042,59.632585478],[11.003549293,59.632588495],[11.003076135,59.632596458],[11.00307362,59.632557566],[11.002948143,59.632559661],[11.002950657,59.632597883],[11.002730716,59.632601571],[11.002730465,59.632597129],[11.002600126,59.632599392]]]},"properties":{"id":15459,"tags":{"building":"data_center","ref:bygningsnr":"300783262"},"type":"data_center","osm_id":1164840308}} {"id":1164840309,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[11.005613672,59.632723444],[11.005644769,59.633182269],[11.005776951,59.633179922],[11.005776784,59.633176737],[11.006553199,59.633164164],[11.006558229,59.633244463],[11.006726286,59.633241781],[11.006692423,59.632707351],[11.006562671,59.632709446],[11.006562839,59.632712464],[11.006089764,59.632720426],[11.006087166,59.632681534],[11.005961772,59.632683797],[11.005964287,59.632721851],[11.005744262,59.632725623],[11.005743927,59.632721181],[11.005613672,59.632723444]]]},"properties":{"id":15460,"tags":{"building":"data_center","ref:bygningsnr":"300783262"},"type":"data_center","osm_id":1164840309}} -{"id":935092287,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[10.991467366,59.759024056],[10.992780978,59.759406942],[10.992773937,59.759423957],[10.992948197,59.759474248],[10.993073842,59.759363859],[10.993022293,59.759348939],[10.993291688,59.759112653],[10.993128827,59.759065547],[10.993181885,59.759019027],[10.993083062,59.758990445],[10.992976947,59.759083484],[10.992845519,59.759045346],[10.992813584,59.759073342],[10.9927876,59.759065798],[10.993409789,59.758524243],[10.99263002,59.758297094],[10.991938848,59.758898663],[10.991693594,59.758827165],[10.991467366,59.759024056]]]},"properties":{"id":11377,"tags":{"name":"Green Mountain Ytre Enebakk","telecom":"data_center","website":"https://greenmountain.no/","building":"warehouse","ref:bygningsnr":"300752944"},"type":"data_center","osm_id":935092287}} -{"id":1161764012,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[10.992826324,59.757448761],[10.994530281,59.757601396],[10.994634888,59.757303168],[10.992928332,59.757152545],[10.992826324,59.757448761]]]},"properties":{"id":15426,"tags":{"name":"Green Mountain Ytre Enebakk","telecom":"data_center","website":"https://greenmountain.no/","building":"industrial"},"type":"data_center","osm_id":1161764012}} +{"id":935092287,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[10.9914674,59.7590241],[10.9916936,59.7588272],[10.9919389,59.7588987],[10.9926301,59.7582971],[10.9934098,59.7585243],[10.9927876,59.7590658],[10.9928136,59.7590734],[10.9928456,59.7590454],[10.992977,59.7590835],[10.9930831,59.7589905],[10.9931819,59.7590191],[10.9931289,59.7590656],[10.9932917,59.7591127],[10.9930223,59.759349],[10.9930739,59.7593639],[10.9929482,59.7594743],[10.992774,59.759424],[10.992781,59.759407],[10.9914674,59.7590241]]]},"properties":{"id":11377,"tags":{"building":"warehouse","name":"Green Mountain Ytre Enebakk","ref:bygningsnr":"300752944","source":"Norway Orthophoto 2024;https://greenmountain.no/data-center/osl1-enebakk/","telecom":"data_center","website":"https://greenmountain.no/"},"type":"data_center","osm_id":935092287}} +{"id":1161764012,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[10.9928264,59.7574488],[10.9929284,59.7571526],[10.9946349,59.7573032],[10.9945303,59.7576014],[10.9928264,59.7574488]]]},"properties":{"id":15426,"tags":{"building":"industrial","name":"Green Mountain Ytre Enebakk","source":"Norway Orthophoto 2024;https://greenmountain.no/data-center/osl1-enebakk/","telecom":"data_center","website":"https://greenmountain.no/"},"type":"data_center","osm_id":1161764012}} {"id":30724580,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[10.808790995,59.924984985],[10.808893925,59.925031923],[10.80893793,59.92500594],[10.808982941,59.925025972],[10.809042955,59.92501298],[10.809083943,59.925031923],[10.809012948,59.925077856],[10.80926583,59.925189755],[10.80955115,59.925025972],[10.809676543,59.925081293],[10.81032899,59.924701928],[10.809890365,59.924508138],[10.80982155,59.924515347],[10.809691631,59.924457847],[10.808820667,59.924557592],[10.809099365,59.924699581],[10.808806418,59.924865291],[10.808918149,59.924914828],[10.808875988,59.924937962],[10.808790995,59.924984985]]]},"properties":{"id":261,"tags":{"name":"Stack Infrastructure OSLO1A","telecom":"data_center","building":"office","operator":"Stack Infrastructure","ref:bygningsnr":"80877293","building:levels":"4","operator:wikidata":"Q115477173"},"type":"data_center","osm_id":30724580}} {"id":80871917,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[10.83408892,59.938588981],[10.834305927,59.938720996],[10.834575992,59.938720996],[10.834574987,59.938736],[10.834581943,59.938736922],[10.834579932,59.938771958],[10.834736925,59.938771958],[10.834734997,59.93893792],[10.836717988,59.938944961],[10.836717988,59.938983937],[10.836817984,59.938983937],[10.83681899,59.938944961],[10.836844974,59.938944961],[10.836846985,59.938774976],[10.836841956,59.938774976],[10.836842962,59.938744968],[10.836849919,59.938744968],[10.836851931,59.938653941],[10.836683957,59.938652935],[10.836684125,59.938640278],[10.836686975,59.938414973],[10.83490297,59.938406926],[10.834899953,59.938646984],[10.834812949,59.938645978],[10.83481496,59.938551933],[10.834579932,59.938550927],[10.834580938,59.938564925],[10.834567946,59.938564925],[10.834567946,59.938551933],[10.834089926,59.938549922],[10.83408892,59.938588981]]]},"properties":{"id":1464,"tags":{"name":"Bulk Data Centers Oslo Internet Exchange","telecom":"data_center","website":"https://bulkinfrastructure.com/data-centers/locations/os-ix","building":"industrial","ref:bygningsnr":"80709943"},"type":"data_center","osm_id":80871917}} {"id":12158409495,"type":"Feature","geometry":{"type":"Point","coordinates":[9.689363435,62.59439936]},"properties":{"id":28723,"tags":{"name":"VisBook AS","telecom":"data_center","website":"https://visbook.com/"},"type":"data_center","osm_id":12158409495}} @@ -4349,3 +4349,4 @@ {"id":540895898,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[101.71747909,56.303855963],[101.71782015,56.304420065],[101.721113819,56.303806929],[101.720772759,56.303242994],[101.71747909,56.303855963]]]},"properties":{"id":8271,"tags":{"name":"Битривер Рус","name:en":"Bitriver Rus","name:ru":"Битривер Рус","telecom":"data_center","website":"https://bitriver.farm/","building":"data_center"},"type":"data_center","osm_id":540895898}} {"id":1082803064,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[123.948021193,47.340264299],[123.948354625,47.340268239],[123.948490663,47.340269831],[123.948488568,47.340349292],[123.948809762,47.340353064],[123.948811942,47.340267485],[123.948918643,47.340268658],[123.948922918,47.340137817],[123.948023959,47.340126082],[123.948021193,47.340264299]]]},"properties":{"id":13377,"tags":{"name":"联通云数据中心·齐齐哈尔","name:en":"Unicom Data Center of Qiqihar","name:zh":"联通云数据中心·齐齐哈尔","telecom":"data_center","building":"yes","name:zh-Hans":"联通云数据中心·齐齐哈尔","name:zh-Hant":"聯通雲數據中心·齊齊哈爾"},"type":"data_center","osm_id":1082803064}} {"id":442479059,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[142.76019226,46.910096898],[142.760192427,46.910325724],[142.760447656,46.910328155],[142.760460397,46.910102263],[142.76019226,46.910096898]]]},"properties":{"id":7471,"tags":{"telecom":"data_center","building":"yes"},"type":"data_center","osm_id":442479059}} +{"id":1551029155,"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[7.1069147,62.8627625],[7.1071207,62.8621617],[7.1075917,62.8616616],[7.1088647,62.8620476],[7.1106308,62.862645],[7.1098655,62.8632827],[7.1089604,62.8630042],[7.1086734,62.8632156],[7.1069147,62.8627625]]]},"properties":{"id":29471,"tags":{"layer":"-1","loc_name":"Troll Housing Klempertåsen","name":"Troll Housing","operator":"Troll Housing AS","telecom":"data_center","website":"https://www.trollhousing.no/"},"type":"data_center","osm_id":1551029155}} From 5b5d942d95dddd56b3bacb465c69098913688d1f Mon Sep 17 00:00:00 2001 From: Trygve Hemminghytt <274629477+trygvehhh@users.noreply.github.com> Date: Fri, 16 Oct 2026 22:23:02 +0200 Subject: [PATCH 004/153] fix(data): make the Norway datacenter script portable and re-runnable Read and write files as UTF-8 with LF line endings so the script and --verify work on Windows, where the default codec is cp1252 (thanks to quanticsoul4772 for the report). Geofabrik keeps only its newest dated extract, so --extract now defaults to the current one and accepts a dated name for --verify while it is listed; the dataset README says so. Downloads time out instead of hanging. --- CHANGELOG.md | 1 + scripts/build-datacenters-norway.py | 52 +++++++++++++++-------- src/data/local_data/datacenters/README.md | 8 +++- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20a9da4e6..067ca16b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -184,6 +184,7 @@ `scripts/build-datacenters-norway.py` reproduces or `--verify`s the merge, touching only features inside Geofabrik's Norway boundary, and the dataset README records the extract, checksum and filter. + - Add a keyless Air quality layer to the Weather group, with Environment and Climate Change Canada's AQHI as the first registered provider. Readings carry `{ provider, scale, value, band }` so another network can be added without diff --git a/scripts/build-datacenters-norway.py b/scripts/build-datacenters-norway.py index 01a891a8b..687395f7b 100644 --- a/scripts/build-datacenters-norway.py +++ b/scripts/build-datacenters-norway.py @@ -1,10 +1,13 @@ #!/usr/bin/env python3 """Maintainer-only Norway refresh of the bundled datacenter extract (osmium-tool). -Downloads a pinned Geofabrik Norway extract, verifies its MD5, filters +Downloads a dated Geofabrik Norway extract, verifies its MD5, filters telecom=data_center / building=data_center with osmium, and merges the result into datacenters.geojsonl: features inside the Geofabrik Norway boundary are added, updated or removed; every other line is kept byte-for-byte. + +Geofabrik keeps only its newest dated extract, so --extract defaults to the +current one and a recorded extract can be re-verified only while it is listed. """ import argparse import hashlib @@ -16,17 +19,28 @@ import subprocess import urllib.request ROOT = Path(__file__).resolve().parent.parent -EXTRACT = 'norway-261005' GEOFABRIK = 'https://download.geofabrik.de/europe/' DATASET = ROOT / 'src/data/local_data/datacenters/datacenters.geojsonl' CONTACT_TAGS = {'email', 'phone', 'fax', 'mobile', 'whatsapp', 'contact:email', 'contact:phone', 'contact:fax', 'contact:mobile', 'contact:whatsapp'} SAME_GEOMETRY_METERS = 0.05 +TIMEOUT_SECONDS = 60 + + +def latest_extract(): + """Resolve norway-latest to the dated name Geofabrik redirects it to.""" + request = urllib.request.Request(GEOFABRIK + 'norway-latest.osm.pbf', method='HEAD') + with urllib.request.urlopen(request, timeout=TIMEOUT_SECONDS) as response: + name = response.geturl().rsplit('/', 1)[-1] + if not name.startswith('norway-') or not name.endswith('.osm.pbf') or name == 'norway-latest.osm.pbf': + raise RuntimeError('Unexpected Geofabrik latest target: %s' % name) + return name[:-len('.osm.pbf')] def fetch(url, target): if not target.exists(): - with urllib.request.urlopen(url) as response, open(str(target) + '.part', 'wb') as out: + with urllib.request.urlopen(url, timeout=TIMEOUT_SECONDS) as response, \ + open(str(target) + '.part', 'wb') as out: shutil.copyfileobj(response, out) Path(str(target) + '.part').rename(target) return target @@ -43,7 +57,7 @@ def md5(path): def read_poly(path): """Geofabrik .poly -> list of (ring, is_hole).""" rings, ring, hole = [], None, False - for raw in path.read_text().splitlines()[1:]: + for raw in path.read_text(encoding='utf-8').splitlines()[1:]: line = raw.strip() if ring is None: if line and line != 'END': @@ -80,15 +94,15 @@ def osm_key(feature): return ('n' if feature['geometry']['type'] == 'Point' else 'w') + str(osm_id) -def export(osmium, pbf, cache): - filtered = cache / (EXTRACT + '-datacenters.osm.pbf') - exported = cache / (EXTRACT + '-datacenters.geojsonseq') +def export(osmium, pbf, cache, extract): + filtered = cache / (extract + '-datacenters.osm.pbf') + exported = cache / (extract + '-datacenters.geojsonseq') subprocess.run([osmium, 'tags-filter', '-O', '-o', str(filtered), str(pbf), 'nwr/telecom=data_center', 'nwr/building=data_center'], check=True) subprocess.run([osmium, 'export', '-O', '-f', 'geojsonseq', '--add-unique-id=type_id', '-o', str(exported), str(filtered)], check=True) fresh = {} - for line in exported.read_text().splitlines(): + for line in exported.read_text(encoding='utf-8').splitlines(): line = line.lstrip('\x1e').strip() if not line: continue @@ -169,26 +183,30 @@ def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--cache', type=Path, required=True) parser.add_argument('--osmium', default=shutil.which('osmium') or 'osmium') + parser.add_argument('--extract', default='latest', + help="dated Geofabrik name such as norway-261005, or 'latest'") parser.add_argument('--verify', action='store_true') args = parser.parse_args() args.cache.mkdir(parents=True, exist_ok=True) - pbf = fetch(GEOFABRIK + EXTRACT + '.osm.pbf', args.cache / (EXTRACT + '.osm.pbf')) - expected = fetch(GEOFABRIK + EXTRACT + '.osm.pbf.md5', - args.cache / (EXTRACT + '.osm.pbf.md5')).read_text().split()[0] + extract = latest_extract() if args.extract == 'latest' else args.extract + pbf = fetch(GEOFABRIK + extract + '.osm.pbf', args.cache / (extract + '.osm.pbf')) + expected = fetch(GEOFABRIK + extract + '.osm.pbf.md5', + args.cache / (extract + '.osm.pbf.md5')).read_text(encoding='utf-8').split()[0] actual = md5(pbf) if actual != expected: raise RuntimeError('MD5 mismatch for %s: %s != %s' % (pbf.name, actual, expected)) rings = read_poly(fetch(GEOFABRIK + 'norway.poly', args.cache / 'norway.poly')) - fresh = export(args.osmium, pbf, args.cache) - current = [line for line in DATASET.read_text().splitlines() if line.strip()] + fresh = export(args.osmium, pbf, args.cache, extract) + current = [line for line in DATASET.read_text(encoding='utf-8').splitlines() if line.strip()] merged, report = merge(current, fresh, rings) payload = '\n'.join(merged) + '\n' if args.verify: - if payload != DATASET.read_text(): - raise SystemExit('datacenters.geojsonl is not the %s merge' % EXTRACT) + if payload != DATASET.read_text(encoding='utf-8'): + raise SystemExit('datacenters.geojsonl is not the %s merge' % extract) else: - DATASET.write_text(payload) - print(json.dumps({'extract': EXTRACT, 'md5': actual, 'norway': len(fresh), + with open(DATASET, 'w', encoding='utf-8', newline='\n') as handle: + handle.write(payload) + print(json.dumps({'extract': extract, 'md5': actual, 'norway': len(fresh), 'features': len(merged), **report})) diff --git a/src/data/local_data/datacenters/README.md b/src/data/local_data/datacenters/README.md index ef0720ae4..8b803dcc7 100644 --- a/src/data/local_data/datacenters/README.md +++ b/src/data/local_data/datacenters/README.md @@ -28,5 +28,9 @@ reflects OSM as of the extract below, everything else the original snapshot. - Filter: `osmium tags-filter nwr/telecom=data_center nwr/building=data_center` - Contact tags are dropped as above; unchanged features keep their original line, so geometry is only rewritten when tags or vertices actually changed. -- Rebuild or check: `python3 scripts/build-datacenters-norway.py --cache ` - (add `--verify` to check without writing; requires `osmium-tool`) +- Refresh: `python3 scripts/build-datacenters-norway.py --cache ` uses + Geofabrik's current Norway extract and prints the dated name it used; record + that name, its OSM timestamp and MD5 here. Requires `osmium-tool`. +- Check: add `--extract --verify` to compare without writing. + Geofabrik keeps only its newest dated extract, so a recorded extract can be + re-verified only while it is still listed; the MD5 above identifies it. From a803be1af273051738e633e778ca04fce1ae0387 Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Fri, 16 Oct 2026 23:01:44 -0500 Subject: [PATCH 005/153] fix(cyclones): evict prior shared selection on storm switch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Regression: explicit storm A→B→A keeps one active record. Reviewer finding: quanticsoul4772 (#847). --- changelog.d/847-cyclone-shared-selection.md | 4 ++++ docs/CURRENT-STATE.md | 5 +++++ src/layers/cyclones/index.js | 6 +++++- src/layers/cyclones/index.test.mjs | 20 +++++++++++++++----- 4 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 changelog.d/847-cyclone-shared-selection.md diff --git a/changelog.d/847-cyclone-shared-selection.md b/changelog.d/847-cyclone-shared-selection.md new file mode 100644 index 000000000..a2f58ca71 --- /dev/null +++ b/changelog.d/847-cyclone-shared-selection.md @@ -0,0 +1,4 @@ +- Explicit cyclone selections publish only the currently selected NHC/CPHC + storm into shared context. Switching storms evicts the previous identity + instead of leaving stale coordinates active (kvnloo, #847; reviewed by + quanticsoul4772). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 22ce1eb3b..8e2662bf4 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -218,6 +218,11 @@ not storm size or the full hazard area. Successful empty and unavailable states are distinct. One owned native Cesium data source preserves polygon holes and geographic seams and releases on disable; forecast animation is not implied. Cyclone markers, labels, tracks and cones are hidden beyond the horizon on every map source. +Explicit cyclone selections publish one shared `weather-cyclones` record +with official advisory provenance and source position. Switching storms removes +the prior record; automatic row selection never claims global context, and +refreshes do not re-announce selection. Clearing or losing an explicitly selected +storm removes shared context rather than assigning a fallback. Consult the linked official advisory for safety decisions. Voice and HUD snapshots reuse the existing feedState classifier. Analyst follow-ups retain their original data provenance; current-view results append provenance without replacing legacy fields. HUD context and deterministic telemetry include non-nominal feed state. diff --git a/src/layers/cyclones/index.js b/src/layers/cyclones/index.js index 2738bebe0..ae4e5175a 100644 --- a/src/layers/cyclones/index.js +++ b/src/layers/cyclones/index.js @@ -79,8 +79,12 @@ export function createCyclonesLayer({ return null; } selectedContextEntity ||= { show: true }; + const contextId = `cyclone:${storm.id}`; + context.removeEntityContextsForLayer?.('weather-cyclones', { + retainIds: new Set([contextId]), + }); const record = context.registerEntityContext?.(selectedContextEntity, { - id: `cyclone:${storm.id}`, + id: contextId, layerId: 'weather-cyclones', layerName: 'Cyclone advisories', source: 'NOAA NHC / CPHC', diff --git a/src/layers/cyclones/index.test.mjs b/src/layers/cyclones/index.test.mjs index 7d796bef7..d1b7fefd4 100644 --- a/src/layers/cyclones/index.test.mjs +++ b/src/layers/cyclones/index.test.mjs @@ -419,11 +419,13 @@ test('explicit cyclone selection publishes shared context without auto-claiming selectedEvents += 1; return selectedContext; }, - removeEntityContextsForLayer(layerId) { + removeEntityContextsForLayer(layerId, { retainIds } = {}) { for (const [id, record] of records) { - if (record.layerId === layerId) records.delete(id); + if (record.layerId === layerId && !retainIds?.has(id)) + records.delete(id); } - if (selectedContext?.layerId === layerId) selectedContext = null; + if (selectedContext && !records.has(selectedContext.id)) + selectedContext = null; }, }; const h = harness({ getSnapshot: async () => next }, { context }); @@ -446,10 +448,18 @@ test('explicit cyclone selection publishes shared context without auto-claiming assert.equal(selectedContext?.longitude, -125.8); assert.equal(selectedContext?.properties.advisoryNumber, '10'); + h.layer.setParams({ stormId: 'ep152026' }); + assert.deepEqual([...records.keys()], ['cyclone:ep152026']); + assert.equal(selectedContext?.id, 'cyclone:ep152026'); + h.layer.setParams({ stormId: 'ep162026' }); + assert.deepEqual([...records.keys()], ['cyclone:ep162026']); + assert.equal(selectedContext?.id, 'cyclone:ep162026'); + assert.equal(selectedEvents, 3, 'each explicit storm switch announces once'); + await h.layer.update(); assert.equal( selectedEvents, - 1, + 3, 'refresh updates the selected record without re-announcing the click', ); @@ -463,7 +473,7 @@ test('explicit cyclone selection publishes shared context without auto-claiming assert.equal(records.size, 0); h.layer.setParams({ stormId: 'ep152026' }); - assert.equal(selectedEvents, 2); + assert.equal(selectedEvents, 4); h.layer.setParams({ clear: true }); assert.equal(selectedContext, null); assert.equal(records.size, 0); From 3a7c7b7c6a9c1c2a126bb6c415386f6016a2cdec Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Sat, 17 Oct 2026 03:36:07 -0500 Subject: [PATCH 006/153] fix(cyclones): keep selected names source-owned for i18n --- src/layers/cyclones/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/layers/cyclones/index.js b/src/layers/cyclones/index.js index 2529b98e0..66bf13bbd 100644 --- a/src/layers/cyclones/index.js +++ b/src/layers/cyclones/index.js @@ -111,7 +111,9 @@ export function createCyclonesLayer({ layerId: 'weather-cyclones', layerName: 'Cyclone advisories', source: 'NOAA NHC / CPHC', - label: `Cyclone · ${storm.name}`, + // Layer identity is already carried separately. Keep source names literal + // rather than adding an untranslated user-facing prefix. + label: storm.name, latitude: storm.position.latitude, longitude: storm.position.longitude, properties: { From 0e2ae76f0ab0f75df72010c1c6ae41c3c052b505 Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Sat, 17 Oct 2026 03:36:09 -0500 Subject: [PATCH 007/153] test(cyclones): assert source-owned context label --- src/layers/cyclones/index.test.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layers/cyclones/index.test.mjs b/src/layers/cyclones/index.test.mjs index 06342464b..f7cbcdc12 100644 --- a/src/layers/cyclones/index.test.mjs +++ b/src/layers/cyclones/index.test.mjs @@ -443,7 +443,7 @@ test('explicit cyclone selection publishes shared context without auto-claiming assert.equal(selectedEvents, 1); assert.equal(selectedContext?.layerId, 'weather-cyclones'); assert.equal(selectedContext?.source, 'NOAA NHC / CPHC'); - assert.equal(selectedContext?.label, 'Cyclone · Another system'); + assert.equal(selectedContext?.label, 'Another system'); assert.equal(selectedContext?.latitude, 15.5); assert.equal(selectedContext?.longitude, -125.8); assert.equal(selectedContext?.properties.advisoryNumber, '10'); From 4318f51de4114bfb68137ff48bedd070b976f771 Mon Sep 17 00:00:00 2001 From: Trygve Hemminghytt <274629477+trygvehhh@users.noreply.github.com> Date: Sun, 18 Oct 2026 20:03:23 +0200 Subject: [PATCH 008/153] docs: move the changelog entry to changelog.d --- CHANGELOG.md | 7 ------- changelog.d/953-datacenters-norway-refresh.md | 6 ++++++ 2 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 changelog.d/953-datacenters-norway-refresh.md diff --git a/CHANGELOG.md b/CHANGELOG.md index a285bc555..98d32365f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -284,13 +284,6 @@ ## [Unreleased] -- Refresh Norway's datacenters from a Geofabrik OpenStreetMap extract - (2026-10-05). Troll Housing joins the layer (4,352 features) and four - Norwegian sites pick up current OSM tags; no site moved or was removed. - `scripts/build-datacenters-norway.py` reproduces or `--verify`s the merge, - touching only features inside Geofabrik's Norway boundary, and the dataset - README records the extract, checksum and filter. - - Add a keyless Air quality layer to the Weather group, with Environment and Climate Change Canada's AQHI as the first registered provider. Readings carry `{ provider, scale, value, band }` so another network can be added without diff --git a/changelog.d/953-datacenters-norway-refresh.md b/changelog.d/953-datacenters-norway-refresh.md new file mode 100644 index 000000000..48a019605 --- /dev/null +++ b/changelog.d/953-datacenters-norway-refresh.md @@ -0,0 +1,6 @@ +- Refresh Norway's datacenters from a Geofabrik OpenStreetMap extract + (2026-10-05). Troll Housing joins the layer (4,352 features) and four + Norwegian sites pick up current OSM tags; no site moved or was removed. + `scripts/build-datacenters-norway.py` reproduces or `--verify`s the merge, + touching only features inside Geofabrik's Norway boundary, and the dataset + README records the extract, checksum and filter (trygvehhh, #953). From b358b5dba176e744fa53de73074a0b242b768a4f Mon Sep 17 00:00:00 2001 From: Said Turksever <28983926+asturksever@users.noreply.github.com> Date: Tue, 20 Oct 2026 14:17:39 +0100 Subject: [PATCH 009/153] fix(cyclones): distinguish deliberate clears from feed eviction --- changelog.d/847-cyclone-shared-selection.md | 6 +-- docs/CURRENT-STATE.md | 2 + src/layers/cyclones/index.js | 18 ++++--- src/layers/cyclones/index.test.mjs | 59 +++++++++++++++++++++ 4 files changed, 74 insertions(+), 11 deletions(-) diff --git a/changelog.d/847-cyclone-shared-selection.md b/changelog.d/847-cyclone-shared-selection.md index a2f58ca71..24edf2ebb 100644 --- a/changelog.d/847-cyclone-shared-selection.md +++ b/changelog.d/847-cyclone-shared-selection.md @@ -1,4 +1,4 @@ - Explicit cyclone selections publish only the currently selected NHC/CPHC - storm into shared context. Switching storms evicts the previous identity - instead of leaving stale coordinates active (kvnloo, #847; reviewed by - quanticsoul4772). + storm into shared context. Switching storms removes the previous identity + without a false eviction event. Deliberate clears remain distinct from feed + disappearance (kvnloo, #847; reviewed by quanticsoul4772). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 42ebf7555..9d6680086 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -394,6 +394,8 @@ with official advisory provenance and source position. Switching storms removes the prior record; automatic row selection never claims global context, and refreshes do not re-announce selection. Clearing or losing an explicitly selected storm removes shared context rather than assigning a fallback. +Deliberate clear/disable reports `deliberate`; feed disappearance reports +`evicted`. Switching storms selects the replacement before pruning the old record. Consult the linked official advisory for safety decisions. Voice and HUD snapshots reuse the existing feedState classifier. Analyst follow-ups retain their original data provenance; current-view results append provenance without replacing legacy fields. HUD context and deterministic telemetry include non-nominal feed state. diff --git a/src/layers/cyclones/index.js b/src/layers/cyclones/index.js index 66bf13bbd..1b45265c5 100644 --- a/src/layers/cyclones/index.js +++ b/src/layers/cyclones/index.js @@ -89,7 +89,9 @@ export function createCyclonesLayer({ const notify = () => listener?.(); const selected = () => snapshot?.storms.find((storm) => storm.id === selectedId) || null; - function clearSelectedContext() { + function clearSelectedContext({ evicted = false } = {}) { + if (!evicted) + context?.clearSelectedEntityContextForLayer?.('weather-cyclones'); context?.removeEntityContextsForLayer?.('weather-cyclones'); selectedContextStormId = null; selectedContextEntity = null; @@ -98,14 +100,11 @@ export function createCyclonesLayer({ function publishSelectedContext({ announce = false } = {}) { const storm = selected(); if (!storm || !context) { - if (!storm) clearSelectedContext(); + if (!storm) clearSelectedContext({ evicted: true }); return null; } selectedContextEntity ||= { show: true }; const contextId = `cyclone:${storm.id}`; - context.removeEntityContextsForLayer?.('weather-cyclones', { - retainIds: new Set([contextId]), - }); const record = context.registerEntityContext?.(selectedContextEntity, { id: contextId, layerId: 'weather-cyclones', @@ -131,6 +130,9 @@ export function createCyclonesLayer({ if (!record) return null; selectedContextStormId = storm.id; if (announce) context.selectEntityContext?.(selectedContextEntity); + context.removeEntityContextsForLayer?.('weather-cyclones', { + retainIds: new Set([contextId]), + }); return record; } @@ -302,7 +304,7 @@ export function createCyclonesLayer({ snapshot = next; selectedId = null; ++navigationGeneration; - clearSelectedContext(); + clearSelectedContext({ evicted: true }); error = next.reason || ADVISORIES_UNAVAILABLE; return true; } @@ -327,7 +329,7 @@ export function createCyclonesLayer({ else rendering.setSelection(selectedId); if (selectedContextStormId) { if (selectedId === selectedContextStormId) publishSelectedContext(); - else clearSelectedContext(); + else clearSelectedContext({ evicted: true }); } return true; } catch (cause) { @@ -338,7 +340,7 @@ export function createCyclonesLayer({ snapshot = null; selectedId = null; ++navigationGeneration; - clearSelectedContext(); + clearSelectedContext({ evicted: true }); return true; } finally { signal?.removeEventListener('abort', abort); diff --git a/src/layers/cyclones/index.test.mjs b/src/layers/cyclones/index.test.mjs index f7cbcdc12..f1c7656b1 100644 --- a/src/layers/cyclones/index.test.mjs +++ b/src/layers/cyclones/index.test.mjs @@ -7,6 +7,7 @@ import { isPointerFree, } from '../../data/inputOwnership.js'; import { isOwnedByOtherLayer } from '../../data/pickRegistry.js'; +import * as contextStore from '../../data/contextStore.js'; const time = '2026-09-16T03:00:00.000Z'; const storm = (id = 'ep152026') => ({ @@ -481,6 +482,64 @@ test('explicit cyclone selection publishes shared context without auto-claiming h.layer.destroy(); }); +test('shared cyclone context distinguishes switches, deliberate clears and feed eviction', async (t) => { + const previousWindow = Object.getOwnPropertyDescriptor(globalThis, 'window'); + const host = new EventTarget(); + Object.defineProperty(globalThis, 'window', { + configurable: true, + value: host, + }); + let h; + t.after(() => { + try { + h?.layer.destroy(); + } finally { + if (previousWindow) + Object.defineProperty(globalThis, 'window', previousWindow); + else delete globalThis.window; + } + }); + const events = []; + host.addEventListener('gev:entity-selected', ({ detail }) => + events.push(['selected', detail.id]), + ); + host.addEventListener('gev:entity-selection-cleared', ({ detail }) => + events.push(['cleared', detail.reason]), + ); + let next = snapshot([storm(), storm('ep162026')]); + h = harness({ getSnapshot: async () => next }, { context: contextStore }); + h.layer.enable(); + await h.layer.update(); + h.layer.setParams({ stormId: 'ep152026' }); + h.layer.setParams({ stormId: 'ep162026' }); + assert.deepEqual(events, [ + ['selected', 'cyclone:ep152026'], + ['selected', 'cyclone:ep162026'], + ]); + assert.deepEqual( + [...contextStore.getContextStore().entities.keys()], + ['cyclone:ep162026'], + ); + await h.layer.update(); + assert.equal(events.length, 2, 'refresh must not announce selection'); + + h.layer.setParams({ clear: true }); + assert.deepEqual(events.at(-1), ['cleared', 'deliberate']); + assert.equal(contextStore.getContextStore().entities.size, 0); + + h.layer.setParams({ stormId: 'ep162026' }); + next = snapshot([storm()]); + await h.layer.update(); + assert.deepEqual(events.at(-1), ['cleared', 'evicted']); + assert.equal(contextStore.getContextStore().entities.size, 0); + assert.equal(contextStore.getContextStore().selectedEntityId, null); + + h.layer.setParams({ stormId: 'ep152026' }); + h.layer.disable(); + assert.deepEqual(events.at(-1), ['cleared', 'deliberate']); + assert.equal(contextStore.getContextStore().entities.size, 0); +}); + test('refresh preserves selection intent, including explicit clears and missing storms', async () => { let next = snapshot([storm(), storm('ep162026')]); const h = harness({ getSnapshot: async () => next }); From 25ec9e10a35ea3b850d078b9d3de36735078899d Mon Sep 17 00:00:00 2001 From: bassem chagra Date: Thu, 22 Oct 2026 16:53:24 +0200 Subject: [PATCH 010/153] feat(cctv): vendor the Bosch MIC PTZ datasheet records the Amsterdam register names Adds MIC-7522-Z30B, MIC-7502-Z30B and MIC-7130-PB4 (MIC IP starlight 7000 HD) from the CCTV Camera Database v2.29.0 model-enrichment extract. Colour siblings (B/G/W) share one datasheet, so they and the register's x wildcard (MIC-7522-Z30x) are aliases of one record. The MIC datasheets state FOV without an axis, so these records add specs but no horizontal FOV range. Refreshes the dataset size in the module header and DATA_SOURCES.md. --- DATA_SOURCES.md | 7 +-- src/layers/cctv/modelSpecs.js | 67 ++++++++++++++++++++++++++--- src/layers/cctv/modelSpecs.test.mjs | 28 ++++++++++++ 3 files changed, 94 insertions(+), 8 deletions(-) diff --git a/DATA_SOURCES.md b/DATA_SOURCES.md index 6d2ee498b..a9d676c85 100644 --- a/DATA_SOURCES.md +++ b/DATA_SOURCES.md @@ -208,7 +208,7 @@ The [Bhote Koshi event pack](public/events/bhote-koshi-2026/README.md), under `p | **Yale Bright Star Catalogue** (9,096 stars, sky background) | `sky/` | **Public domain** | ✅ (no restrictions) | "Yale Bright Star Catalogue (Hoffleit & Warren, via CDS)" (courtesy credit) | | **ESO Milky Way panorama** (eso0932a, blurred cube map, sky background) | `sky/` | **CC BY 4.0** | ✅ (attribution; changes stated) | "ESO/S. Brunier" | | **CCTV ground heights** (3,445 cameras) | `cctv_ground_heights/` | Precomputed camera placement heights, aligned to work with Google Photorealistic 3D Tiles (folder README) | — | — | -| **CCTV Camera Database** model-enrichment extract v2.26.0 (17 camera-model records) | `src/layers/cctv/modelSpecs.js` | **CC0-1.0** (public domain dedication) | ✅ (no restrictions) | "Specs: cctv-database.com" (courtesy — not legally required) | +| **CCTV Camera Database** model-enrichment extract v2.26.0 + v2.29.0 (20 camera-model records) | `src/layers/cctv/modelSpecs.js` | **CC0-1.0** (public domain dedication) | ✅ (no restrictions) | "Specs: cctv-database.com" (courtesy — not legally required) | ### ⚠️ TeleGeography is bundled but NonCommercial @@ -236,11 +236,12 @@ fixtures retain their provenance in `src/data/fixtures/README.md`. ### CCTV Camera Database (`src/layers/cctv/modelSpecs.js`) -The CCTV layer's hardware-model specs are a small verbatim extract (v2.26.0) of the +The CCTV layer's hardware-model specs are a small verbatim extract (v2.26.0, plus the Bosch MIC +records from v2.29.0) of the [CCTV Camera Database](https://github.com/ch-bas/cctv-camera-database), an open dataset of camera models transcribed from manufacturer datasheets, dedicated to the public domain under **CC0-1.0**. Only the records for hardware that the integrated public catalogs name (King -County, Sarasota County and Sioux Falls) are bundled, compiled into the module. Nothing is +County, Sarasota County, Sioux Falls and the City of Amsterdam register) are bundled, compiled into the module. Nothing is fetched at runtime. The records describe camera products (optics, resolution, night vision) only, never endpoints, stream paths or access data. CC0 requires no attribution; the CCTV HUD credits it anyway as `SPECS: CCTV-DATABASE.COM` beside any spec line it renders. diff --git a/src/layers/cctv/modelSpecs.js b/src/layers/cctv/modelSpecs.js index 2d93166a7..89fcf58d2 100644 --- a/src/layers/cctv/modelSpecs.js +++ b/src/layers/cctv/modelSpecs.js @@ -14,18 +14,25 @@ * * Spec records are vendored verbatim from the CCTV Camera Database * (https://github.com/ch-bas/cctv-camera-database, CC0-1.0) — an open dataset - * of 28,000+ camera models transcribed from manufacturer datasheets (84% with - * FOV, as of v2.26.0). This module vendors the records that the currently integrated public + * of 29,000+ camera models transcribed from manufacturer datasheets (76% with + * FOV, as of v2.29.0). This module vendors the records that the currently integrated public * catalogs publish hardware for — King County WA (Cohu, Bosch AUTODOME, Axis * Q6135-LE), plus the Bosch AUTODOME and Axis PTZ/multisensor models that - * appear in Sarasota County FL and Sioux Falls SD open data; packs that - * publish other hardware models can grow it, or vendor the full extract. + * appear in Sarasota County FL and Sioux Falls SD open data, and the Bosch MIC + * PTZs in the City of Amsterdam camera register; packs that publish other + * hardware models can grow it, or vendor the full extract. * * Scope guardrail: records describe camera PRODUCTS (optics, resolution, * night vision) — never endpoints, stream paths, or access/config data. */ -/** Verbatim records from the dataset's model-enrichment extract (v2.26.0). */ +/** + * Verbatim records from the dataset's model-enrichment extract (v2.26.0; the + * Bosch MIC records from v2.29.0). Bosch MIC order codes end in a colour + * letter (B black, G grey, W white) on one shared datasheet; those siblings, + * and the `x` wildcard registries write for the colour letter, are listed as + * aliases of the one vendored record. + */ const RECORDS = [ { id: 'axis-q6135-le', @@ -264,6 +271,56 @@ const RECORDS = [ autotracking: true, environment: ['outdoor'], }, + { + id: 'bosch-mic-7130-pb4', + brand: 'Bosch', + model: 'MIC-7130-PB4', + type: 'ptz', + url: 'https://www.cctv-database.com/camera/bosch-mic-7130-pb4/', + aliases: [ + 'MIC IP starlight 7000 HD', + 'MIC-7130-PG4', + 'MIC-7130-PW4', + 'MIC-7130-Px4', + ], + fov_deg: '2.1-59', + resolution: { mp: 1, w: 1280, h: 720, label: '720p' }, + ptz: true, + autotracking: true, + varifocal: true, + environment: ['outdoor'], + }, + { + id: 'bosch-mic-7502-z30b', + brand: 'Bosch', + model: 'MIC-7502-Z30B', + type: 'ptz', + url: 'https://www.cctv-database.com/camera/bosch-mic-7502-z30b/', + aliases: ['MIC-7502-Z30G', 'MIC-7502-Z30W', 'MIC-7502-Z30x'], + fov_deg: '2.3-63.7', + resolution: { mp: 2.13, w: 1920, h: 1080, label: '1080p' }, + ptz: true, + autotracking: true, + varifocal: true, + night_vision: { type: 'color' }, + environment: ['outdoor'], + }, + { + id: 'bosch-mic-7522-z30b', + brand: 'Bosch', + model: 'MIC-7522-Z30B', + type: 'ptz', + url: 'https://www.cctv-database.com/camera/bosch-mic-7522-z30b/', + aliases: ['MIC-7522-Z30G', 'MIC-7522-Z30W', 'MIC-7522-Z30x'], + fov_deg: '2.1-58.3', + // i18n-ignore: datasheet label + resolution: { mp: 2, w: 1920, h: 1080, label: '1080p HD' }, + ptz: true, + varifocal: true, + night_vision: { type: 'color' }, + environment: ['outdoor'], + ndaa_compliant: true, + }, { id: 'cohu-3920-idome', brand: 'Cohu', diff --git a/src/layers/cctv/modelSpecs.test.mjs b/src/layers/cctv/modelSpecs.test.mjs index 9fbdb00dd..852c6ad64 100644 --- a/src/layers/cctv/modelSpecs.test.mjs +++ b/src/layers/cctv/modelSpecs.test.mjs @@ -245,6 +245,34 @@ test('King County snapshot model strings still resolve', () => { ); }); +test('Amsterdam camera register model strings resolve', () => { + // The register writes the Bosch MIC colour letter as `x`. + assert.equal( + lookupModelSpec('Bosch MIC-7522-Z30x')?.id, + 'bosch-mic-7522-z30b', + ); + assert.equal( + lookupModelSpec('Bosch MIC-7502-Z30x')?.id, + 'bosch-mic-7502-z30b', + ); + assert.equal(lookupModelSpec('Bosch MIC-7130-Px4')?.id, 'bosch-mic-7130-pb4'); + assert.equal(lookupModelSpec('MIC-7522-Z30W')?.id, 'bosch-mic-7522-z30b'); + // Its ANPR units are not in the table: unknown, never a guess. + assert.equal(lookupModelSpec('CSG-8800'), null); + // The MIC and AUTODOME starlight 7000 HD (code-less names, so the brand + // is needed) stay apart. + assert.equal( + lookupModelSpec('MIC IP starlight 7000 HD', 'Bosch')?.id, + 'bosch-mic-7130-pb4', + ); + assert.equal( + lookupModelSpec('AUTODOME IP starlight 7000 HD', 'Bosch')?.id, + 'bosch-autodome-ip-starlight-7000-hd', + ); + // The MIC datasheets state FOV without an axis, so no horizontal range. + assert.equal(horizontalFovRangeDeg(lookupModelSpec('MIC-7522-Z30B')), null); +}); + test('catalog never overwrites an explicit FOV or a curated pose', () => { const [explicit, curated, cohu, pelco] = browserCatalog().buildCatalogFromSources([ From 6a7597d344960f7495fb3bdee2b34eed0a917c17 Mon Sep 17 00:00:00 2001 From: bassem chagra Date: Thu, 22 Oct 2026 17:01:50 +0200 Subject: [PATCH 011/153] docs(changelog): fragment for #1319 --- changelog.d/1319-cctv-bosch-mic-specs.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog.d/1319-cctv-bosch-mic-specs.md diff --git a/changelog.d/1319-cctv-bosch-mic-specs.md b/changelog.d/1319-cctv-bosch-mic-specs.md new file mode 100644 index 000000000..bf1bd0b7f --- /dev/null +++ b/changelog.d/1319-cctv-bosch-mic-specs.md @@ -0,0 +1,3 @@ +- Vendor the Bosch MIC PTZ datasheet records that the City of Amsterdam camera + register names (MIC-7522, MIC-7502, MIC-7130), with the register's `x` colour + wildcard as an alias, from the CCTV Camera Database v2.29.0 (ch-bas, #1319). From dec6cb937ec290d514f2c44d8cdb87a1b4f7fba7 Mon Sep 17 00:00:00 2001 From: Said Turksever Date: Thu, 22 Oct 2026 23:27:00 +0100 Subject: [PATCH 012/153] test(cctv): verify Bosch MIC aliases and preserve estimated optics --- DATA_SOURCES.md | 10 ++++--- docs/CURRENT-STATE.md | 4 +++ src/layers/cctv/modelSpecs.js | 20 +++++++------- src/layers/cctv/modelSpecs.test.mjs | 41 +++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 13 deletions(-) diff --git a/DATA_SOURCES.md b/DATA_SOURCES.md index a9d676c85..1602cfa49 100644 --- a/DATA_SOURCES.md +++ b/DATA_SOURCES.md @@ -236,13 +236,15 @@ fixtures retain their provenance in `src/data/fixtures/README.md`. ### CCTV Camera Database (`src/layers/cctv/modelSpecs.js`) -The CCTV layer's hardware-model specs are a small verbatim extract (v2.26.0, plus the Bosch MIC +The CCTV layer's hardware-model specs are a small extract (v2.26.0, plus the Bosch MIC records from v2.29.0) of the [CCTV Camera Database](https://github.com/ch-bas/cctv-camera-database), an open dataset of camera models transcribed from manufacturer datasheets, dedicated to the public domain under -**CC0-1.0**. Only the records for hardware that the integrated public catalogs name (King -County, Sarasota County, Sioux Falls and the City of Amsterdam register) are bundled, compiled into the module. Nothing is -fetched at runtime. The records describe camera products (optics, resolution, night vision) +**CC0-1.0**. Only the records for hardware named by the integrated public catalogs (King +County, Sarasota County and Sioux Falls), plus the City of Amsterdam register proposed +in [#251](https://github.com/bilawalsidhu/gods-eye-view/pull/251), are bundled, compiled into the module. Nothing is +fetched at runtime. The MIC specification fields are unchanged; product titles are shortened +to model codes and colour aliases are added locally. The records describe camera products (optics, resolution, night vision) only, never endpoints, stream paths or access data. CC0 requires no attribution; the CCTV HUD credits it anyway as `SPECS: CCTV-DATABASE.COM` beside any spec line it renders. diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index a9db91490..13174d759 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -4585,6 +4585,10 @@ silently demoting every later lookup for the session. multi-sensor datasheets publish a capability range, not the lens's current zoom, so those cameras keep their estimate and show `SPEC FOV min–max° (CAPABILITY)` beside it. Public camera state carries `fovSource`, `specFovMinDeg`, `specFovMaxDeg` and `spec` (#452). + The table also includes Bosch MIC-7130, MIC-7502 and MIC-7522 records for the Amsterdam + register proposed in #251, including its `x` colour aliases (#1319). Their axis-less + datasheet FOV does not supply a horizontal capability range or replace the estimated + FOV. Adding these records does not enable the proposed source pack. - **FIRMS**: no ground clamping (zero 3D-tiles height sampling), ≤18 screen-decluttered ambient labels, click-to-inspect detail card, 2.5k/3k sprite budgets viewport-clipped by FRP. - **CCTV v2 foundation:** a pitched frustum wireframe (4 corner rays + far-cap rectangle) with a monitor plane at the frustum's diff --git a/src/layers/cctv/modelSpecs.js b/src/layers/cctv/modelSpecs.js index 89fcf58d2..ba6702584 100644 --- a/src/layers/cctv/modelSpecs.js +++ b/src/layers/cctv/modelSpecs.js @@ -12,24 +12,26 @@ * Cameras without an identified model are untouched — unknown never implies * anything. * - * Spec records are vendored verbatim from the CCTV Camera Database + * Specification fields are vendored from the CCTV Camera Database * (https://github.com/ch-bas/cctv-camera-database, CC0-1.0) — an open dataset * of 29,000+ camera models transcribed from manufacturer datasheets (76% with - * FOV, as of v2.29.0). This module vendors the records that the currently integrated public + * FOV, as of v2.29.0). This module vendors records that the integrated public * catalogs publish hardware for — King County WA (Cohu, Bosch AUTODOME, Axis * Q6135-LE), plus the Bosch AUTODOME and Axis PTZ/multisensor models that - * appear in Sarasota County FL and Sioux Falls SD open data, and the Bosch MIC - * PTZs in the City of Amsterdam camera register; packs that publish other - * hardware models can grow it, or vendor the full extract. + * appear in Sarasota County FL and Sioux Falls SD open data, plus the Bosch MIC + * PTZs for the City of Amsterdam camera register proposed in #251; packs that + * publish other hardware models can grow it, or vendor the full extract. * * Scope guardrail: records describe camera PRODUCTS (optics, resolution, * night vision) — never endpoints, stream paths, or access/config data. */ /** - * Verbatim records from the dataset's model-enrichment extract (v2.26.0; the - * Bosch MIC records from v2.29.0). Bosch MIC order codes end in a colour - * letter (B black, G grey, W white) on one shared datasheet; those siblings, + * Records from the dataset's model-enrichment extract (v2.26.0; the Bosch MIC + * records from v2.29.0). MIC specification fields are unchanged; product + * titles are shortened to model codes and colour aliases are added locally. + * Bosch MIC order codes end in a colour letter (B black, G grey, W white) + * on one shared datasheet; those siblings, * and the `x` wildcard registries write for the colour letter, are listed as * aliases of the one vendored record. */ @@ -488,7 +490,7 @@ const NAME_INDEX = RECORDS.flatMap((record) => { * guesses). * @param {string} model - Hardware model as named by a source pack or seed. * @param {string} [manufacturer] - The source's manufacturer, when published. - * @returns {Object|null} The verbatim spec record, or null when unknown. + * @returns {Object|null} The matched spec record, or null when unknown. */ export function lookupModelSpec(model, manufacturer) { const query = words(model).map(stripVariantSuffix); diff --git a/src/layers/cctv/modelSpecs.test.mjs b/src/layers/cctv/modelSpecs.test.mjs index 852c6ad64..d76f37c24 100644 --- a/src/layers/cctv/modelSpecs.test.mjs +++ b/src/layers/cctv/modelSpecs.test.mjs @@ -273,6 +273,47 @@ test('Amsterdam camera register model strings resolve', () => { assert.equal(horizontalFovRangeDeg(lookupModelSpec('MIC-7522-Z30B')), null); }); +test('Bosch MIC colour aliases resolve without accepting unknown variants', () => { + for (const [pattern, id] of [ + ['MIC-7130-P?4', 'bosch-mic-7130-pb4'], + ['MIC-7502-Z30?', 'bosch-mic-7502-z30b'], + ['MIC-7522-Z30?', 'bosch-mic-7522-z30b'], + ]) { + for (const colour of ['B', 'G', 'W', 'x']) { + const model = pattern.replace('?', colour); + assert.equal(lookupModelSpec(model)?.id, id, model); + assert.equal(lookupModelSpec(`bosch ${model.toLowerCase()}`)?.id, id); + assert.equal(lookupModelSpec(model, 'Bosch')?.id, id); + assert.equal(lookupModelSpec(model, 'Axis'), null); + assert.equal(lookupModelSpec(`${model}-UNKNOWN`), null); + } + assert.equal(lookupModelSpec(pattern.replace('?', 'R')), null); + } +}); + +test('Bosch MIC catalog enrichment preserves estimated and explicit optics', () => { + for (const model of [ + 'Bosch MIC-7130-Px4', + 'Bosch MIC-7502-Z30x', + 'Bosch MIC-7522-Z30x', + ]) { + for (const pose of [{}, { fovDeg: 44 }, { poseSource: 'curated' }]) { + const [camera] = browserCatalog().buildCatalogFromSources([ + { id: 'amsterdam-mic', lat: 52.37, lon: 4.9, model, ...pose }, + ]); + assert.ok(camera.spec, model); + assert.equal(camera.fovDeg, pose.fovDeg ?? 74, model); + assert.equal(camera.fovSource, undefined); + assert.equal(camera.specFovMinDeg, undefined); + assert.equal(camera.specFovMaxDeg, undefined); + assert.equal(horizontalFovRangeDeg(camera.spec), null); + assert.equal(fixedHorizontalFovDeg(camera.spec), null); + assert.equal(specFovCapabilityToken(camera), null); + assert.match(specSummary(camera.spec), /^Bosch MIC-.* · PTZ$/); + } + } +}); + test('catalog never overwrites an explicit FOV or a curated pose', () => { const [explicit, curated, cohu, pelco] = browserCatalog().buildCatalogFromSources([ From 38d29f2beb22b5200b794751b32f1f21a0409e25 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Tue, 27 Oct 2026 13:09:32 +0400 Subject: [PATCH 013/153] feat(fires): FRP intensity filter, confidence switch and six-stop color ramp (HAL-676) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Color every FIRMS detection by fire radiative power on the Portolan cold → hot ramp (blue · teal · lime · amber · orange · red at 0 · 5 · 20 · 50 · 100 · 300 MW), replacing the three warm stops that made a 2 MW and a 40 MW fire look alike. Heat cells, glow sprites and card accents all read the same ramp (src/data/firmsIntensity.js). Add a minimum-FRP log slider whose track is painted with the ramp (so it doubles as the legend), an All / Nominal+ / High confidence switch and an "N of M shown" counter to the Active Fires row. The filter runs once in ingestion.applyFilter(), so markers, cards, heat cells, the context store, the top-fires query and the analyst records all see one set. Default is 0 MW / All: many of the strongest fires are rated low. Persist both options in the layer state (token w: minFrp `f`, confidence `c`), including the short share codec, and give the agent's get_active_fires tool matching min_frp_mw / confidence arguments. Layer panel gains generic `slider` and `segmented` row descriptors (src/ui/rowFilterControls.js). New strings in es / ru / zh-CN. Co-Authored-By: Claude Fable 5.1 --- scripts/format-scope.json | 6 +- scripts/package-boundaries.json | 17 +++ src/data/firmsCards.test.mjs | 22 ++- src/data/firmsIntensity.js | 209 +++++++++++++++++++++++++++++ src/data/firmsIntensity.test.mjs | 207 ++++++++++++++++++++++++++++ src/data/firmsLabels.js | 23 ++-- src/data/firmsLabels.test.mjs | 15 ++- src/data/layerState.js | 21 ++- src/data/layerState.test.mjs | 83 +++++++++++- src/i18n/locales/es.json | 14 +- src/i18n/locales/ru.json | 14 +- src/i18n/locales/zh-CN.json | 14 +- src/i18n/same-as-english.json | 5 +- src/layers/firms/ingestion.js | 32 ++++- src/layers/firms/lifecycle.js | 4 + src/layers/firms/model.js | 57 +++++--- src/layers/firms/policy.js | 19 ++- src/layers/firms/queries.js | 142 +++++++++++++++++++- src/layers/firms/rendering.js | 5 +- src/layers/firms/state.js | 28 ++++ src/share/viewCodec.js | 1 + src/tools/queries/hazards.js | 64 ++++++++- src/tools/queries/hazards.test.mjs | 36 +++++ src/ui/layerPanel.js | 54 +++++++- src/ui/rowFilterControls.js | 169 +++++++++++++++++++++++ src/ui/rowFilterControls.test.mjs | 207 ++++++++++++++++++++++++++++ src/ui/styles/radio.css | 102 ++++++++++++++ 27 files changed, 1500 insertions(+), 70 deletions(-) create mode 100644 src/data/firmsIntensity.js create mode 100644 src/data/firmsIntensity.test.mjs create mode 100644 src/ui/rowFilterControls.js create mode 100644 src/ui/rowFilterControls.test.mjs diff --git a/scripts/format-scope.json b/scripts/format-scope.json index ee23b8b6a..c7ae4e3cf 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1117,5 +1117,9 @@ "src/testSupport/shareViewFixtures.mjs", "src/ui/shareLinks.test.mjs", "src/ui/shareButton.test.mjs", - "src/share/shareLinkPath.test.mjs" + "src/share/shareLinkPath.test.mjs", + "src/data/firmsIntensity.js", + "src/data/firmsIntensity.test.mjs", + "src/ui/rowFilterControls.js", + "src/ui/rowFilterControls.test.mjs" ] diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index b42d90fdc..ca2ecb542 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -495,6 +495,8 @@ "src/ui/railCards.js", "src/ui/railCardBlocks.js", "src/ui/slider.js", + "src/ui/rowFilterControls.js", + "src/ui/segmentedControl.js", "src/ui/chipGroup.js", "src/ui/rowList.js", "src/ui/railTimeline.js", @@ -670,6 +672,7 @@ "src/data/detectionPolicy.js", "src/data/installationFeedback.js", "src/data/idSwitches.js", + "src/data/firmsIntensity.js", "src/data/layerState.js", "src/data/layerStateCoordinator.js", "src/data/layerStateTokenReservations.json", @@ -734,6 +737,7 @@ "src/ui/effects.js", "src/ui/frameRateMonitor.js", "src/ui/layerPanel.js", + "src/ui/rowFilterControls.js", "src/ui/weatherPanel.js", "src/ui/railCards.js", "src/ui/railCardBlocks.js", @@ -954,6 +958,7 @@ "src/data/contactMatch.js", "src/data/iconOrientation.js", "src/data/idSwitches.js", + "src/data/firmsIntensity.js", "src/data/layerState.js", "src/data/layerStateTokenReservations.json", "src/data/modelVisualAnchor.js", @@ -1007,6 +1012,7 @@ "src/data/contactMatch.js", "src/data/iconOrientation.js", "src/data/idSwitches.js", + "src/data/firmsIntensity.js", "src/data/layerState.js", "src/data/layerStateTokenReservations.json", "src/data/modelVisualAnchor.js", @@ -1052,6 +1058,7 @@ "src/data/contactMatch.js", "src/data/iconOrientation.js", "src/data/idSwitches.js", + "src/data/firmsIntensity.js", "src/data/layerState.js", "src/data/layerStateCoordinator.js", "src/data/layerStateTokenReservations.json", @@ -1136,6 +1143,7 @@ "exports": ["./layers/firms"], "modules": [ "src/data/firmsAdapt.js", + "src/data/firmsIntensity.js", "src/data/firmsLabels.js", "src/data/iconOrientation.js", "src/layers/firms/anchors.js", @@ -1525,6 +1533,7 @@ "modules": [ "src/data/iconOrientation.js", "src/data/idSwitches.js", + "src/data/firmsIntensity.js", "src/data/layerState.js", "src/data/layerStateTokenReservations.json", "src/data/radioCountry.js", @@ -1848,6 +1857,7 @@ "src/data/fireAnchors.js", "src/data/firmsAdapt.js", "src/data/firmsHeatmap.js", + "src/data/firmsIntensity.js", "src/data/firmsLabels.js", "src/data/flights.js", "src/data/flowMatch.js", @@ -2259,6 +2269,7 @@ "src/ui/effects.js", "src/ui/frameRateMonitor.js", "src/ui/layerPanel.js", + "src/ui/rowFilterControls.js", "src/ui/weatherPanel.js", "src/ui/railCards.js", "src/ui/railCardBlocks.js", @@ -2687,6 +2698,7 @@ "src/data/detectionDraw.js", "src/data/detectionPolicy.js", "src/data/firmsAdapt.js", + "src/data/firmsIntensity.js", "src/data/firmsLabels.js", "src/data/flowMatch.js", "src/data/focusDeemphasis.js", @@ -3283,6 +3295,7 @@ "src/i18n/marker.js", "src/data/installationFeedback.js", "src/data/idSwitches.js", + "src/data/firmsIntensity.js", "src/data/layerState.js", "src/data/layerStateCoordinator.js", "src/data/layerStateTokenReservations.json", @@ -3899,6 +3912,7 @@ "src/styles/surveillance.js", "src/styles/thermal.js", "src/view/index.js", + "src/data/firmsIntensity.js", "src/data/layerState.js", "src/data/layerStateTokenReservations.json", "src/data/idSwitches.js", @@ -3975,6 +3989,8 @@ "src/tools/queries/brief.js", "src/tools/queries/maritime.js", "src/tools/queries/share.js", + "src/data/firmsIntensity.js", + "src/data/firmsAdapt.js", "src/data/idSwitches.js", "src/data/vesselTypes.js", "src/data/layerState.js", @@ -4107,6 +4123,7 @@ "modules": [ "src/view/index.js", "src/data/idSwitches.js", + "src/data/firmsIntensity.js", "src/data/layerState.js", "src/data/layerStateTokenReservations.json" ], diff --git a/src/data/firmsCards.test.mjs b/src/data/firmsCards.test.mjs index a0ee83c01..f82b8da80 100644 --- a/src/data/firmsCards.test.mjs +++ b/src/data/firmsCards.test.mjs @@ -68,11 +68,27 @@ test('buildFireCard: power that rounds to 10 MW drops the decimal', () => { assert.equal(selected.title, 'FIRE · 10 MW'); }); -test('buildFireCard: SNPP satellite code renders as SNPP, weak fire is not red', () => { +test('buildFireCard: SNPP satellite code renders as SNPP, weak fire is blue', () => { const card = buildFireCard({ fire: fire({ satellite: 'N', frp: 0.8, confidence: 0.3 }), position: {} }, NOW); assert.match(card.details[0], /SNPP$/); assert.equal(card.title, '▲ 0.8 MW'); - assert.notEqual(card.accent, accentForSeverity('red')); + assert.equal(card.accent, accentForSeverity('blue')); +}); + +test('buildFireCard: accent steps through the FRP ramp at 5 · 20 · 50 · 100 · 300 MW', () => { + const accentAt = (frp) => + buildFireCard({ fire: fire({ frp }), position: {} }, NOW).accent; + assert.equal(accentAt(4.9), accentForSeverity('blue')); + assert.equal(accentAt(5), accentForSeverity('teal')); + assert.equal(accentAt(20), accentForSeverity('lime')); + assert.equal(accentAt(50), accentForSeverity('amber')); + assert.equal(accentAt(100), accentForSeverity('orange')); + assert.equal(accentAt(300), accentForSeverity('red')); + // Confidence never moves the color: a low-confidence 864 MW fire stays red. + assert.equal( + buildFireCard({ fire: fire({ frp: 864, confidence: 0.3 }), position: {} }, NOW).accent, + accentForSeverity('red'), + ); }); test('buildSelectedFireCard: full detail card with coords, selected flag, no fade', () => { @@ -125,7 +141,7 @@ test('buildCellCard: singular noun and missing-age omission', () => { const card = buildCellCard(candidate, NOW); assert.equal(card.title, '1 FIRE'); assert.equal(card.details[0], 'max 9.9 MW'); - assert.equal(card.accent, accentForSeverity('yellow'), 'missing accent defaults to yellow'); + assert.equal(card.accent, accentForSeverity('blue'), 'missing accent defaults to the coldest stop'); }); test('FIRMS host policy keeps ambient cards bounded and selected cards protected', () => { diff --git a/src/data/firmsIntensity.js b/src/data/firmsIntensity.js new file mode 100644 index 000000000..417566346 --- /dev/null +++ b/src/data/firmsIntensity.js @@ -0,0 +1,209 @@ +/** + * @module firmsIntensity + * @description Fire intensity policy shared by the Active Fires layer and the + * agent fire tool: the six-stop cold → hot FRP color ramp, the log-scale + * slider that doubles as its legend, and the one filter every consumer + * (markers, cards, heat cells, the top-fires query, `get_active_fires`) runs + * before anything is rendered or selected. Pure — no Cesium, no DOM. + * + * Hue order follows the Portolan FIRMS explorer (`FRP_RAMP`, stepped, not + * interpolated). The thresholds are GEV's own, set on a real week's + * percentiles so every color appears: Portolan's 0/10/50/200/500/1000 MW + * leaves one red fire a week (HAL-675). + */ + +/** + * Stepped FRP ramp, coldest first. A detection takes the LAST stop whose + * `minFrp` it reaches. Names key the glow-sprite cache and the card accents. + */ +export const FRP_RAMP = Object.freeze([ + Object.freeze({ name: 'blue', minFrp: 0, hex: '#4a5bd4' }), + Object.freeze({ name: 'teal', minFrp: 5, hex: '#39a0a8' }), + Object.freeze({ name: 'lime', minFrp: 20, hex: '#c9cf4a' }), + Object.freeze({ name: 'amber', minFrp: 50, hex: '#f2b134' }), + Object.freeze({ name: 'orange', minFrp: 100, hex: '#e8722c' }), + Object.freeze({ name: 'red', minFrp: 300, hex: '#d1382a' }), +]); + +/** Slider ticks: the ramp thresholds, so slider, legend and markers agree. */ +export const FRP_SLIDER_TICKS = Object.freeze( + FRP_RAMP.map((stop) => stop.minFrp), +); + +/** Minimum-FRP values the share codec accepts, in whole megawatts. */ +export const MIN_FRP_MW_MIN = 0; +export const MIN_FRP_MW_MAX = 10_000; + +/** Confidence switch positions; VIIRS reports only low / nominal / high. */ +export const FIRMS_CONFIDENCE_MODES = Object.freeze(['all', 'nominal', 'high']); + +/** + * Normalized-confidence floor for a switch position. The thresholds match + * `confidenceBucket` in the layer model (0.3 / 0.6 / 0.9 after firmsAdapt). + */ +const CONFIDENCE_FLOOR = Object.freeze({ all: 0, nominal: 0.45, high: 0.75 }); + +export const DEFAULT_FIRE_FILTER = Object.freeze({ + minFrp: 0, + confidence: 'all', +}); + +/** + * The ramp stop for a fire radiative power. + * @param {number} frp Megawatts; non-finite or negative reads as 0. + * @returns {{name: string, minFrp: number, hex: string}} + */ +export function frpRampStop(frp) { + const value = Number.isFinite(frp) ? Math.max(0, frp) : 0; + let stop = FRP_RAMP[0]; + for (const candidate of FRP_RAMP) { + if (value >= candidate.minFrp) stop = candidate; + else break; + } + return stop; +} + +/** `#rrggbb` → `[r, g, b]` in 0..255. */ +export function hexToRgb(hex) { + const text = String(hex).replace('#', ''); + return [0, 2, 4].map((offset) => + Number.parseInt(text.slice(offset, offset + 2), 16), + ); +} + +/** + * Log-scale slider axis: position 0 means "no minimum" (0 MW), and the rest + * of the track runs 1 MW → SLIDER_MAX_MW logarithmically. The axis floor is 1 + * MW because the median detection is ~6 MW and a sub-megawatt floor hides + * nothing worth a tick. + */ +export const SLIDER_MAX_MW = 1000; +const LOG_MAX = Math.log10(SLIDER_MAX_MW); + +/** + * Track position in 0..1 for a minimum FRP. + * @param {number} minFrp Megawatts. + * @returns {number} + */ +export function sliderPositionForFrp(minFrp) { + if (!Number.isFinite(minFrp) || minFrp < 1) return 0; + return Math.min(1, Math.log10(minFrp) / LOG_MAX); +} + +/** + * Minimum FRP for a track position, rounded to whole megawatts so a slider + * value and its share-link form are the same number. + * @param {number} position 0..1. + * @returns {number} + */ +export function frpForSliderPosition(position) { + const p = Number.isFinite(position) ? Math.max(0, Math.min(1, position)) : 0; + if (p <= 0) return 0; + const frp = Math.pow(10, p * LOG_MAX); + return Math.max(1, Math.round(frp)); +} + +/** + * CSS `linear-gradient` painting the stepped ramp along the log axis, so the + * slider track IS the legend: the color under the thumb is the color of the + * weakest fire still shown. + * @returns {string} + */ +export function rampTrackGradient() { + const parts = []; + FRP_RAMP.forEach((stop, index) => { + const start = sliderPositionForFrp(stop.minFrp) * 100; + const next = FRP_RAMP[index + 1]; + const end = next ? sliderPositionForFrp(next.minFrp) * 100 : 100; + parts.push(`${stop.hex} ${start.toFixed(2)}% ${end.toFixed(2)}%`); + }); + return `linear-gradient(90deg, ${parts.join(', ')})`; +} + +/** + * Minimum FRP → whole megawatts inside the codec bounds, or null. + * @param {*} value + * @returns {?number} + */ +export function normalizeMinFrp(value) { + const number = + typeof value === 'number' + ? value + : typeof value === 'string' && value.trim() !== '' + ? Number(value) + : NaN; + if (!Number.isFinite(number)) return null; + const rounded = Math.round(number); + return rounded >= MIN_FRP_MW_MIN && rounded <= MIN_FRP_MW_MAX + ? rounded + : null; +} + +/** + * Confidence mode → one of FIRMS_CONFIDENCE_MODES, or null. + * @param {*} value + * @returns {?string} + */ +export function normalizeConfidenceMode(value) { + const text = String(value ?? '') + .trim() + .toLowerCase(); + return FIRMS_CONFIDENCE_MODES.includes(text) ? text : null; +} + +/** + * Sanitize a partial filter against the current one; unknown or invalid + * fields keep their current value. + * @param {Object} [params] + * @param {{minFrp: number, confidence: string}} [current] + * @returns {{minFrp: number, confidence: string}} + */ +export function normalizeFireFilter( + params = {}, + current = DEFAULT_FIRE_FILTER, +) { + const minFrp = normalizeMinFrp(params?.minFrp); + const confidence = normalizeConfidenceMode(params?.confidence); + return { + minFrp: minFrp === null ? current.minFrp : minFrp, + confidence: confidence === null ? current.confidence : confidence, + }; +} + +/** + * Whether one fire passes the filter. `confidence` is the normalized 0..1 + * value firmsAdapt produces; `frp` is megawatts. + * @param {{frp: number, confidence: number}} fire + * @param {{minFrp: number, confidence: string}} filter + * @returns {boolean} + */ +export function firePassesFilter(fire, filter = DEFAULT_FIRE_FILTER) { + const frp = Number.isFinite(fire?.frp) ? fire.frp : 0; + if (frp < (filter.minFrp || 0)) return false; + const floor = CONFIDENCE_FLOOR[filter.confidence] ?? 0; + if (floor <= 0) return true; + const confidence = Number.isFinite(fire?.confidence) ? fire.confidence : 0; + return confidence >= floor; +} + +/** + * The fires that pass the filter, in input order. Returns the SAME array when + * the filter is the default, so callers can tell "nothing hidden" cheaply. + * @template T + * @param {Array} fires Internal records (normalized confidence). + * @param {{minFrp: number, confidence: string}} filter + * @returns {Array} + */ +export function filterFires(fires, filter = DEFAULT_FIRE_FILTER) { + if (!Array.isArray(fires)) return []; + if (isDefaultFireFilter(filter)) return fires; + return fires.filter((fire) => firePassesFilter(fire, filter)); +} + +/** True when the filter hides nothing. */ +export function isDefaultFireFilter(filter) { + return ( + !(filter?.minFrp > 0) && + (filter?.confidence === 'all' || filter?.confidence == null) + ); +} diff --git a/src/data/firmsIntensity.test.mjs b/src/data/firmsIntensity.test.mjs new file mode 100644 index 000000000..558068e67 --- /dev/null +++ b/src/data/firmsIntensity.test.mjs @@ -0,0 +1,207 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { + DEFAULT_FIRE_FILTER, + FIRMS_CONFIDENCE_MODES, + FRP_RAMP, + FRP_SLIDER_TICKS, + filterFires, + firePassesFilter, + frpForSliderPosition, + frpRampStop, + hexToRgb, + isDefaultFireFilter, + normalizeConfidenceMode, + normalizeFireFilter, + normalizeMinFrp, + rampTrackGradient, + sliderPositionForFrp, +} from './firmsIntensity.js'; + +test('the ramp has six cold → hot stops at 0 · 5 · 20 · 50 · 100 · 300 MW in Portolan hue order', () => { + assert.deepEqual( + FRP_RAMP.map((stop) => [stop.name, stop.minFrp, stop.hex]), + [ + ['blue', 0, '#4a5bd4'], + ['teal', 5, '#39a0a8'], + ['lime', 20, '#c9cf4a'], + ['amber', 50, '#f2b134'], + ['orange', 100, '#e8722c'], + ['red', 300, '#d1382a'], + ], + ); + assert.deepEqual([...FRP_SLIDER_TICKS], [0, 5, 20, 50, 100, 300]); + assert.ok(Object.isFrozen(FRP_RAMP)); +}); + +test('a detection takes the last stop it reaches; garbage reads as 0 MW', () => { + assert.equal(frpRampStop(0).name, 'blue'); + assert.equal(frpRampStop(4.99).name, 'blue'); + assert.equal(frpRampStop(5).name, 'teal'); + assert.equal(frpRampStop(19.9).name, 'teal'); + assert.equal(frpRampStop(20).name, 'lime'); + assert.equal(frpRampStop(50).name, 'amber'); + assert.equal(frpRampStop(100).name, 'orange'); + assert.equal(frpRampStop(299.9).name, 'orange'); + assert.equal(frpRampStop(300).name, 'red'); + assert.equal(frpRampStop(1246).name, 'red'); + assert.equal(frpRampStop(NaN).name, 'blue'); + assert.equal(frpRampStop(-3).name, 'blue'); + assert.equal(frpRampStop(undefined).name, 'blue'); +}); + +test('hex stops convert to the "r, g, b" accents the cards paint', () => { + assert.deepEqual(hexToRgb('#4a5bd4'), [74, 91, 212]); + assert.deepEqual(hexToRgb('d1382a'), [209, 56, 42]); +}); + +test('the log slider pins 0 MW at the left and runs 1 → 1000 MW; values round-trip', () => { + assert.equal(sliderPositionForFrp(0), 0); + assert.equal(sliderPositionForFrp(0.5), 0); + assert.equal(sliderPositionForFrp(1), 0); + assert.ok(Math.abs(sliderPositionForFrp(10) - 1 / 3) < 1e-9); + assert.ok(Math.abs(sliderPositionForFrp(100) - 2 / 3) < 1e-9); + assert.equal(sliderPositionForFrp(1000), 1); + assert.equal(sliderPositionForFrp(5000), 1, 'clamped past the axis end'); + assert.equal(frpForSliderPosition(0), 0); + assert.equal(frpForSliderPosition(1), 1000); + assert.equal(frpForSliderPosition(-1), 0); + assert.equal(frpForSliderPosition(2), 1000); + for (const frp of FRP_SLIDER_TICKS) { + assert.equal( + frpForSliderPosition(sliderPositionForFrp(frp)), + frp, + `tick ${frp} MW round-trips through the axis`, + ); + } + // Ticks spread along the track instead of bunching at one end. + const positions = FRP_SLIDER_TICKS.map(sliderPositionForFrp); + for (let i = 1; i < positions.length; i += 1) { + assert.ok(positions[i] - positions[i - 1] >= 0.09, `tick gap ${i}`); + } +}); + +test('the track gradient is the stepped ramp on the log axis, so it doubles as the legend', () => { + const gradient = rampTrackGradient(); + assert.match(gradient, /^linear-gradient\(90deg, /); + assert.match(gradient, /#4a5bd4 0\.00% 23\.3\d%/); + assert.match(gradient, /#39a0a8 23\.3\d% 43\.3\d%/); + assert.match(gradient, /#d1382a 82\.5\d% 100\.00%\)$/); + assert.equal(gradient.match(/#/g).length, FRP_RAMP.length); +}); + +test('minimum FRP normalizes to whole megawatts inside the codec bounds', () => { + assert.equal(normalizeMinFrp(0), 0); + assert.equal(normalizeMinFrp(19.6), 20); + assert.equal(normalizeMinFrp('100'), 100); + assert.equal(normalizeMinFrp(10000), 10000); + assert.equal(normalizeMinFrp(10001), null); + assert.equal(normalizeMinFrp(-1), null); + assert.equal(normalizeMinFrp('abc'), null); + assert.equal(normalizeMinFrp(''), null); + assert.equal(normalizeMinFrp(null), null); + assert.equal(normalizeMinFrp(NaN), null); +}); + +test('confidence modes are exactly all / nominal / high', () => { + assert.deepEqual([...FIRMS_CONFIDENCE_MODES], ['all', 'nominal', 'high']); + assert.equal(normalizeConfidenceMode(' High '), 'high'); + assert.equal(normalizeConfidenceMode('nominal'), 'nominal'); + assert.equal(normalizeConfidenceMode('low'), null); + assert.equal(normalizeConfidenceMode(0.9), null); + assert.equal(normalizeConfidenceMode(undefined), null); +}); + +test('a partial filter patches the current one and invalid fields keep their value', () => { + assert.deepEqual(normalizeFireFilter(), DEFAULT_FIRE_FILTER); + assert.deepEqual(normalizeFireFilter({ minFrp: 20 }), { + minFrp: 20, + confidence: 'all', + }); + assert.deepEqual( + normalizeFireFilter( + { confidence: 'high' }, + { minFrp: 50, confidence: 'all' }, + ), + { minFrp: 50, confidence: 'high' }, + ); + assert.deepEqual( + normalizeFireFilter( + { minFrp: 'nope', confidence: 'medium' }, + { minFrp: 50, confidence: 'nominal' }, + ), + { minFrp: 50, confidence: 'nominal' }, + ); + assert.equal(isDefaultFireFilter(DEFAULT_FIRE_FILTER), true); + assert.equal(isDefaultFireFilter({ minFrp: 0, confidence: 'all' }), true); + assert.equal(isDefaultFireFilter({ minFrp: 1, confidence: 'all' }), false); + assert.equal(isDefaultFireFilter({ minFrp: 0, confidence: 'high' }), false); +}); + +test('the filter keeps a fire at or above the floor and at or above the confidence mode', () => { + const low = { frp: 864, confidence: 0.3 }; + const nominal = { frp: 20, confidence: 0.6 }; + const high = { frp: 2, confidence: 0.9 }; + assert.equal(firePassesFilter(low), true, 'default shows everything'); + assert.equal( + firePassesFilter(nominal, { minFrp: 20, confidence: 'all' }), + true, + ); + assert.equal( + firePassesFilter(nominal, { minFrp: 21, confidence: 'all' }), + false, + ); + assert.equal( + firePassesFilter(low, { minFrp: 0, confidence: 'nominal' }), + false, + ); + assert.equal( + firePassesFilter(nominal, { minFrp: 0, confidence: 'nominal' }), + true, + ); + assert.equal( + firePassesFilter(high, { minFrp: 0, confidence: 'nominal' }), + true, + ); + assert.equal( + firePassesFilter(nominal, { minFrp: 0, confidence: 'high' }), + false, + ); + assert.equal(firePassesFilter(high, { minFrp: 0, confidence: 'high' }), true); + assert.equal( + firePassesFilter(high, { minFrp: 5, confidence: 'high' }), + false, + ); + // Missing numbers read as 0, never as a pass-through. + assert.equal(firePassesFilter({}, { minFrp: 1, confidence: 'all' }), false); + assert.equal( + firePassesFilter({ frp: 10 }, { minFrp: 0, confidence: 'nominal' }), + false, + ); +}); + +test('filterFires returns the same array for the default filter and preserves order otherwise', () => { + const fires = [ + { frp: 864, confidence: 0.3 }, + { frp: 20, confidence: 0.6 }, + { frp: 2, confidence: 0.9 }, + { frp: 120, confidence: 0.9 }, + ]; + assert.equal(filterFires(fires), fires); + assert.equal(filterFires(fires, { minFrp: 0, confidence: 'all' }), fires); + assert.deepEqual( + filterFires(fires, { minFrp: 20, confidence: 'all' }).map((f) => f.frp), + [864, 20, 120], + ); + assert.deepEqual( + filterFires(fires, { minFrp: 0, confidence: 'high' }).map((f) => f.frp), + [2, 120], + ); + assert.deepEqual( + filterFires(fires, { minFrp: 100, confidence: 'nominal' }).map( + (f) => f.frp, + ), + [120], + ); + assert.deepEqual(filterFires(null, { minFrp: 1, confidence: 'all' }), []); +}); diff --git a/src/data/firmsLabels.js b/src/data/firmsLabels.js index b9e9d1765..3af6a15a5 100644 --- a/src/data/firmsLabels.js +++ b/src/data/firmsLabels.js @@ -4,6 +4,8 @@ * dedicated card canvas moved into the shared world-overlay host. */ +import { FRP_RAMP, hexToRgb } from './firmsIntensity.js'; + /** Shipped ambient FIRMS card ceiling. Selected fires bypass this cohort. */ export const FIRMS_AMBIENT_COHORT_LIMIT = 18; export const FIRMS_OVERLAY_SOURCE_ID = 'firms'; @@ -23,20 +25,23 @@ export function fireDetectionKey(fire) { return `firms:${lat}:${lon}:${acq}:${source}`; } -/** Severity accent palette — matches the FIRMS glow-sprite color stops. */ -const ACCENT_RGB = Object.freeze({ - red: '224, 82, 82', - orange: '240, 178, 62', - yellow: '244, 227, 108', -}); +/** + * Severity accent palette — the FIRMS glow-sprite color stops (the six-stop + * FRP ramp in firmsIntensity.js) as "r, g, b" strings for card accents. + */ +const ACCENT_RGB = Object.freeze( + Object.fromEntries( + FRP_RAMP.map((stop) => [stop.name, hexToRgb(stop.hex).join(', ')]), + ), +); /** - * Severity stop name → "r, g, b" accent string (defaults to yellow). - * @param {string} stopName - 'red' | 'orange' | 'yellow'. + * Severity stop name → "r, g, b" accent string (defaults to the coldest stop). + * @param {string} stopName - A FRP_RAMP stop name ('blue' … 'red'). * @returns {string} */ export function accentForSeverity(stopName) { - return ACCENT_RGB[stopName] || ACCENT_RGB.yellow; + return ACCENT_RGB[stopName] || ACCENT_RGB[FRP_RAMP[0].name]; } /** diff --git a/src/data/firmsLabels.test.mjs b/src/data/firmsLabels.test.mjs index 8573d7330..62234bb2d 100644 --- a/src/data/firmsLabels.test.mjs +++ b/src/data/firmsLabels.test.mjs @@ -9,11 +9,16 @@ import { formatFrpMw, } from './firmsLabels.js'; -test('FIRMS formatting helpers retain the shipped severity palette', () => { - assert.equal(accentForSeverity('red'), '224, 82, 82'); - assert.equal(accentForSeverity('orange'), '240, 178, 62'); - assert.equal(accentForSeverity('yellow'), '244, 227, 108'); - assert.equal(accentForSeverity('chartreuse'), accentForSeverity('yellow')); +test('FIRMS card accents are the six FRP ramp stops, coldest as the fallback', () => { + // Portolan hue order; blue #4a5bd4 … red #d1382a (HAL-675). + assert.equal(accentForSeverity('blue'), '74, 91, 212'); + assert.equal(accentForSeverity('teal'), '57, 160, 168'); + assert.equal(accentForSeverity('lime'), '201, 207, 74'); + assert.equal(accentForSeverity('amber'), '242, 177, 52'); + assert.equal(accentForSeverity('orange'), '232, 114, 44'); + assert.equal(accentForSeverity('red'), '209, 56, 42'); + assert.equal(accentForSeverity('yellow'), accentForSeverity('blue')); + assert.equal(accentForSeverity('chartreuse'), accentForSeverity('blue')); }); test('FIRMS power that rounds to 10 MW drops the decimal', () => { diff --git a/src/data/layerState.js b/src/data/layerState.js index 089c8c08b..c68a67e67 100644 --- a/src/data/layerState.js +++ b/src/data/layerState.js @@ -298,6 +298,20 @@ function satelliteFilterOption() { } const OPTION_GROUPS = Object.freeze({ + // Active Fires intensity filter (HAL-676). `minFrp` is whole megawatts on + // the codec side; the panel's log slider rounds to it. Both default to + // "show everything": many of the strongest fires are rated low confidence. + // The bounds and modes mirror MIN_FRP_MW_MAX / FIRMS_CONFIDENCE_MODES in + // firmsIntensity.js (pinned by layerState.test); spelled out here because + // this file runs in isolation in the token-ledger tests. + 'local-firms': Object.freeze([ + boundedIntegerOption('minFrp', 'f', 0, { min: 0, max: 10000 }), + enumOption('confidence', 'c', 'all', ['all', 'nominal', 'high'], { + all: 'a', + nominal: 'n', + high: 'h', + }), + ]), traffic: Object.freeze([ enumOption('roadMode', 'r', null, ['tomtom', 'osm', 'hybrid'], { tomtom: 't', @@ -621,7 +635,12 @@ export const LAYER_STATE_REGISTRY = Object.freeze([ token: 'd', disposition: 'enabled-only', }), - Object.freeze({ id: 'local-firms', token: 'w', disposition: 'enabled-only' }), + Object.freeze({ + id: 'local-firms', + token: 'w', + disposition: 'enabled+options', + optionOwner: 'local-firms', + }), Object.freeze({ id: 'military', token: 'm', diff --git a/src/data/layerState.test.mjs b/src/data/layerState.test.mjs index d05fb9a95..d343fe20f 100644 --- a/src/data/layerState.test.mjs +++ b/src/data/layerState.test.mjs @@ -29,6 +29,7 @@ import radioLayer from './radio.js'; import { stampInitialShareGesture } from '../navigationPolicy.js'; import { MAX_SINCE_DAYS } from '../layers/streetLevel/policy.js'; import { SINCE_STOPS } from '../ui/streetLevelPresentation.js'; +import { FIRMS_CONFIDENCE_MODES, MIN_FRP_MW_MAX } from './firmsIntensity.js'; function deferred() { let resolve; @@ -2984,9 +2985,89 @@ test('Clear All cancels a saved restore still waiting to start', async () => { gate.resolve(); const results = await restore; for (const id of ['earthquakes', 'flights']) { - assert.equal(results.find((result) => result.layerId === id).succeeded, false); + assert.equal( + results.find((result) => result.layerId === id).succeeded, + false, + ); } assert.deepEqual([...manager.getEnabledLayerIds()], []); assert.equal(enabledLayerParam(sink), ''); coordinator.destroy(); }); + +/** Active Fires options decoded from a v2 link with these `lo` assignments. */ +function firmsOptions(lo) { + const params = new URLSearchParams([ + ['v', '2'], + ['l', 'w'], + ]); + if (lo) params.set('lo', lo); + return decodeLayerStateParams(params).options['local-firms']; +} + +test('Active Fires: the intensity filter rides share token w and round-trips', () => { + const state = createDefaultLayerState(); + assert.deepEqual(state.options['local-firms'], { + minFrp: 0, + confidence: 'all', + }); + state.enabledLayerIds = ['local-firms']; + state.options['local-firms'] = { minFrp: 20, confidence: 'high' }; + const encoded = encode(state); + assert.equal(new URLSearchParams(encoded).get('l'), 'w'); + // Other owners write their own explicit defaults into `lo` too (flights 3D, + // wind overlay); the fire assignments ride beside them. + const assignments = new URLSearchParams(encoded).get('lo').split('_'); + assert.ok(assignments.includes('w.f.20'), assignments.join(' ')); + assert.ok(assignments.includes('w.c.h'), assignments.join(' ')); + const decoded = decodeLayerStateParams(new URLSearchParams(encoded)); + assert.deepEqual(decoded.options['local-firms'], { + minFrp: 20, + confidence: 'high', + }); + assert.deepEqual( + parseStoredLayerState(serializeStoredLayerState(state)).options[ + 'local-firms' + ], + state.options['local-firms'], + ); + // Defaults are omitted from the link: a plain `l=w` is "show everything". + const plain = createDefaultLayerState(); + plain.enabledLayerIds = ['local-firms']; + assert.equal( + new URLSearchParams(encode(plain)) + .get('lo') + .split('_') + .filter((assignment) => assignment.startsWith('w.')).length, + 0, + ); + assert.deepEqual(firmsOptions(''), { minFrp: 0, confidence: 'all' }); +}); + +test('Active Fires: the codec accepts whole megawatts in bounds and the three confidence codes', () => { + // The codec spells its bounds out (it runs in isolation in the ledger + // tests); they must stay the layer's. + assert.equal(MIN_FRP_MW_MAX, 10000); + assert.deepEqual([...FIRMS_CONFIDENCE_MODES], ['all', 'nominal', 'high']); + assert.equal(firmsOptions('w.f.300').minFrp, 300); + assert.equal(firmsOptions('w.f.10000').minFrp, 10000); + assert.equal(firmsOptions('w.f.10001').minFrp, 0, 'out of bounds → default'); + assert.equal(firmsOptions('w.f.-5').minFrp, 0); + assert.equal( + firmsOptions('w.f.2.5').minFrp, + 0, + 'a third segment is rejected', + ); + assert.equal(firmsOptions('w.c.a').confidence, 'all'); + assert.equal(firmsOptions('w.c.n').confidence, 'nominal'); + assert.equal(firmsOptions('w.c.h').confidence, 'high'); + assert.equal( + firmsOptions('w.c.x').confidence, + 'all', + 'unknown code → default', + ); + assert.deepEqual(firmsOptions('w.c.n_w.f.5'), { + minFrp: 5, + confidence: 'nominal', + }); +}); diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 0285917b0..ffee7fb87 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -3001,5 +3001,17 @@ "Your choice applies now, but could not be saved.": "Tu elección se aplica ahora, pero no se pudo guardar.", "Voice replies appear here.": "Las respuestas de voz aparecen aquí.", "Preview is off.": "La vista previa está desactivada.", - "Automatic stop is unavailable for this voice connection.": "La parada automática no está disponible para esta conexión de voz." + "Automatic stop is unavailable for this voice connection.": "La parada automática no está disponible para esta conexión de voz.", + "fire confidence filter|All": "Todas", + "fire confidence filter|Nominal+": "Nominal+", + "fire confidence filter|High": "Alta", + "Every detection — many of the strongest fires are rated low confidence": "Todas las detecciones — muchos de los incendios más intensos tienen confianza baja", + "Nominal and high confidence detections": "Detecciones de confianza nominal y alta", + "High confidence detections only": "Solo detecciones de confianza alta", + "Min FRP": "FRP mín.", + "Minimum fire radiative power, megawatts": "Potencia radiativa mínima del fuego, en megavatios", + "{value} MW": "{value} MW", + "fire intensity filter|All": "Todo", + "Detection confidence": "Confianza de la detección", + "{shown} of {total} shown": "{shown} de {total} mostrados" } diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index b1c1be229..1cd88757d 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -3070,5 +3070,17 @@ "Your choice applies now, but could not be saved.": "Ваш выбор применён, но сохранить его не удалось.", "Voice replies appear here.": "Здесь появляются голосовые ответы.", "Preview is off.": "Предпросмотр отключён.", - "Automatic stop is unavailable for this voice connection.": "Автоматическая остановка недоступна для этого голосового подключения." + "Automatic stop is unavailable for this voice connection.": "Автоматическая остановка недоступна для этого голосового подключения.", + "fire confidence filter|All": "Все", + "fire confidence filter|Nominal+": "Средняя+", + "fire confidence filter|High": "Высокая", + "Every detection — many of the strongest fires are rated low confidence": "Все детекции — у многих сильнейших пожаров достоверность низкая", + "Nominal and high confidence detections": "Детекции средней и высокой достоверности", + "High confidence detections only": "Только детекции высокой достоверности", + "Min FRP": "Мин. FRP", + "Minimum fire radiative power, megawatts": "Минимальная мощность излучения пожара, мегаватты", + "{value} MW": "{value} МВт", + "fire intensity filter|All": "Все", + "Detection confidence": "Достоверность детекции", + "{shown} of {total} shown": "показано {shown} из {total}" } diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 9bf76700c..3044c45f8 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -2863,5 +2863,17 @@ "{count} placemarks": { "other": "{count} 个地标" }, - "S2 Underground publishes these KMZ products to GitHub. New uploads are detected within seconds and replace the previous edition automatically. Click a marker for its report.": "S2 Underground 在 GitHub 发布这些 KMZ 产品。新上传的内容会在数秒内被检测到,并自动替换旧版本。点击标记查看报告。" + "S2 Underground publishes these KMZ products to GitHub. New uploads are detected within seconds and replace the previous edition automatically. Click a marker for its report.": "S2 Underground 在 GitHub 发布这些 KMZ 产品。新上传的内容会在数秒内被检测到,并自动替换旧版本。点击标记查看报告。", + "fire confidence filter|All": "全部", + "fire confidence filter|Nominal+": "标称+", + "fire confidence filter|High": "高", + "Every detection — many of the strongest fires are rated low confidence": "所有检测——许多最强的火点置信度为低", + "Nominal and high confidence detections": "标称和高置信度的检测", + "High confidence detections only": "仅高置信度的检测", + "Min FRP": "最小 FRP", + "Minimum fire radiative power, megawatts": "最小火辐射功率(兆瓦)", + "{value} MW": "{value} MW", + "fire intensity filter|All": "全部", + "Detection confidence": "检测置信度", + "{shown} of {total} shown": "显示 {shown} / {total}" } diff --git a/src/i18n/same-as-english.json b/src/i18n/same-as-english.json index 05f5d3dee..5f1b14f8a 100644 --- a/src/i18n/same-as-english.json +++ b/src/i18n/same-as-english.json @@ -98,6 +98,7 @@ "WX", "audio {state}", "dB", + "fire confidence filter|Nominal+", "fire confidence|nominal", "ft", "hPa", @@ -120,6 +121,7 @@ "{value} KM", "{value} KM/H", "{value} KM/S", + "{value} MW", "ΔE", "ΔN", "▲ {frp} MW" @@ -168,9 +170,9 @@ "MM", "NVG", "REC", - "SRC {value}", "S2 GhostMaps", "S2 · {name}", + "SRC {value}", "Sentinel-2", "Techno", "Trance", @@ -195,6 +197,7 @@ "{type} SPD: {speed} HDG: {heading}", "{value} KM", "{value} KM/S", + "{value} MW", "ΔE", "ΔN", "▲ {frp} MW" diff --git a/src/layers/firms/ingestion.js b/src/layers/firms/ingestion.js index 494ab5f1e..215c35da3 100644 --- a/src/layers/firms/ingestion.js +++ b/src/layers/firms/ingestion.js @@ -1,5 +1,6 @@ import { adaptFirmsRecords } from '../../data/firmsAdapt.js'; import { fireDetectionKey } from '../../data/firmsLabels.js'; +import { filterFires } from '../../data/firmsIntensity.js'; import { msg } from '../../i18n/index.js'; export function createIngestion({ @@ -40,12 +41,13 @@ export function createIngestion({ layerState._stale = Boolean(payload?.stale); const previousSelection = layerState._selectedFire; layerState._selectedFire = null; - layerState._fires = adaptFirmsRecords(payload?.fires); - layerState._cellCacheByGrid.clear(); // aggregation is per-dataset — new fires, new cells - layerState._firesByFrp = [...layerState._fires].sort( + layerState._allFires = adaptFirmsRecords(payload?.fires); + // Sorted once per payload; applyFilter only filters, so a slider drag + // over 200k detections never re-sorts. + layerState._allFiresByFrp = [...layerState._allFires].sort( (a, b) => b.frp - a.frp, ); - layerState._count = layerState._fires.length; + applyFilter(); // Data age, not response age: a stale proxy payload truthfully reads old. layerState._lastUpdate = Number.isFinite(payload?.fetchedAt) ? payload.fetchedAt @@ -65,6 +67,7 @@ export function createIngestion({ } components.rendering.renderCurrentLod(true); if (reselected) components.selection.selectFire(reselected, false); + layerState._rowControlsListener?.(); } catch (error) { if ( request.signal.aborted || @@ -83,6 +86,25 @@ export function createIngestion({ } } + /** + * Run the intensity filter over the loaded payload. This is the ONE place + * the shown set is derived: `_fires` / `_firesByFrp` feed markers, cards, + * heat cells, the context store, the top-fires query and the analyst + * records, so none of them can disagree about which fires exist. Cells are + * aggregated per shown set, so the cache goes with it. + */ + + function applyFilter() { + layerState._fires = filterFires(layerState._allFires, layerState._filter); + layerState._cellCacheByGrid.clear(); + layerState._firesByFrp = filterFires( + layerState._allFiresByFrp, + layerState._filter, + ); + layerState._count = layerState._fires.length; + layerState._totalCount = layerState._allFires.length; + } + /** * Find the record in the freshly-loaded set matching a previous selection. * Identity is the detection itself (lat/lon/acquisition time) — indices @@ -109,5 +131,5 @@ export function createIngestion({ }, }; - return { loadHeatmap, findMatchingFire, methods }; + return { loadHeatmap, applyFilter, findMatchingFire, methods }; } diff --git a/src/layers/firms/lifecycle.js b/src/layers/firms/lifecycle.js index 7e0b42a00..1138504dd 100644 --- a/src/layers/firms/lifecycle.js +++ b/src/layers/firms/lifecycle.js @@ -91,10 +91,14 @@ export function createLifecycle({ components.rendering.removeDetectionCollections(viewer); components.selection.clearContextRegistrations(); clearSelectedEntityContextForLayer(id); + layerState._allFires = []; + layerState._allFiresByFrp = []; layerState._fires = []; layerState._firesByFrp = []; layerState._cellCacheByGrid.clear(); layerState._count = 0; + layerState._totalCount = 0; + layerState._rowControlsListener = null; layerState._cellCount = 0; layerState._lastUpdate = null; layerState._keyRequired = false; diff --git a/src/layers/firms/model.js b/src/layers/firms/model.js index 14b875bf8..a90066cc6 100644 --- a/src/layers/firms/model.js +++ b/src/layers/firms/model.js @@ -6,6 +6,7 @@ import { accentForSeverity, formatFrpMw, } from '../../data/firmsLabels.js'; +import { FRP_RAMP, frpRampStop } from '../../data/firmsIntensity.js'; import { VIEW_PADDING, DETECTION_COLOR_STOPS, @@ -119,27 +120,42 @@ export function createModel({ ); } - function heatColor(value, alpha) { - if (value > 0.72) return Cesium.Color.RED.withAlpha(alpha); - if (value > 0.42) return Cesium.Color.ORANGE.withAlpha(alpha); - return Cesium.Color.YELLOW.withAlpha(alpha); + /** + * The ramp stop for a fire radiative power (stepped, coldest first). + * Intensity alone drives the color: confidence feeds the card text and the + * switch, brightness is unreliable (saturates at 367 K) — see HAL-675. + * @param {number} frp - Megawatts. + * @returns {{name: string, minFrp: number, color: Cesium.Color}} + */ + + function frpColorStop(frp) { + const name = frpRampStop(frp).name; + return ( + DETECTION_COLOR_STOPS.find((stop) => stop.name === name) || + DETECTION_COLOR_STOPS[0] + ); } /** - * Pick a sprite color stop from FRP + confidence, reusing the same - * yellow → orange → red thresholds as the aggregated heat cells. + * Fill color for an aggregated heat cell: the ramp color of its strongest + * detection, so cells, markers and the slider legend read on one scale. + * @param {number} maxFrp - Strongest FRP in the cell, megawatts. + * @param {number} alpha - Fill alpha (heat-normalized by the caller). + * @returns {Cesium.Color} + */ + + function heatColor(maxFrp, alpha) { + return frpColorStop(maxFrp).color.withAlpha(alpha); + } + + /** + * Pick a sprite color stop for one detection from its FRP on the shared ramp. * @param {Object} fire - Detection record. * @returns {{name: string, color: Cesium.Color}} */ function detectionColorStop(fire) { - const heat = Math.min( - 1, - Math.sqrt(Math.max(0, fire.frp) / 150) * 0.85 + fire.confidence * 0.15, - ); - if (heat > 0.72) return DETECTION_COLOR_STOPS[0]; - if (heat > 0.42) return DETECTION_COLOR_STOPS[1]; - return DETECTION_COLOR_STOPS[2]; + return frpColorStop(fire?.frp); } /** FRP → core marker pixel size, clamped to 8..28px. */ @@ -418,7 +434,7 @@ export function createModel({ position: candidate.position, cullPosition: candidate.cullPosition || candidate.position, gapPx: 10, - accent: candidate.accent || accentForSeverity('yellow'), + accent: candidate.accent || accentForSeverity(FRP_RAMP[0].name), title: `${cell.count} ${noun}`, details: [parts.join(' · ')], selected: false, @@ -460,16 +476,14 @@ export function createModel({ } /** - * Heat-normalized cell score → severity accent, mirroring heatColor's - * red/orange/yellow thresholds. - * @param {number} normalized - 0..1 normalized heat score. + * Cell card accent: the ramp stop of the cell's strongest detection, + * mirroring heatColor. + * @param {number} maxFrp - Strongest FRP in the cell, megawatts. * @returns {string} "r, g, b" accent string. */ - function cellAccent(normalized) { - if (normalized > 0.72) return accentForSeverity('red'); - if (normalized > 0.42) return accentForSeverity('orange'); - return accentForSeverity('yellow'); + function cellAccent(maxFrp) { + return accentForSeverity(frpColorStop(maxFrp).name); } /** Coordinate line like "30.512°N 75.831°E". */ @@ -576,6 +590,7 @@ export function createModel({ cellIntersectsBounds, heatScore, heatColor, + frpColorStop, detectionColorStop, frpPixelSize, sizeBucket, diff --git a/src/layers/firms/policy.js b/src/layers/firms/policy.js index 673aab871..18ea88238 100644 --- a/src/layers/firms/policy.js +++ b/src/layers/firms/policy.js @@ -1,4 +1,5 @@ import { FIRMS_AMBIENT_COHORT_LIMIT } from '../../data/firmsLabels.js'; +import { FRP_RAMP } from '../../data/firmsIntensity.js'; import * as Cesium from 'cesium'; /** Client poll interval; the proxy's 30 min TTL is what guards upstream quota. */ @@ -88,10 +89,16 @@ export const CULL_LIFT_THRESHOLD_M = 10; export const CULL_LIFT_M = 12; -/** Color stops shared by cell heat fills and detection glow sprites. */ +/** + * Color stops shared by cell heat fills and detection glow sprites: the + * six-stop cold → hot FRP ramp (firmsIntensity.js), coldest first, as Cesium + * colors. Stop names key the glow-sprite cache and the card accents. + */ -export const DETECTION_COLOR_STOPS = [ - { name: 'red', color: Cesium.Color.RED }, - { name: 'orange', color: Cesium.Color.ORANGE }, - { name: 'yellow', color: Cesium.Color.YELLOW }, -]; +export const DETECTION_COLOR_STOPS = FRP_RAMP.map((stop) => + Object.freeze({ + name: stop.name, + minFrp: stop.minFrp, + color: Cesium.Color.fromCssColorString(stop.hex), + }), +); diff --git a/src/layers/firms/queries.js b/src/layers/firms/queries.js index 5f663cc97..220012133 100644 --- a/src/layers/firms/queries.js +++ b/src/layers/firms/queries.js @@ -1,7 +1,19 @@ import { fireDetectionKey } from '../../data/firmsLabels.js'; -import { t } from '../../i18n/index.js'; +import { + FIRMS_CONFIDENCE_MODES, + FRP_SLIDER_TICKS, + firePassesFilter, + frpForSliderPosition, + normalizeFireFilter, + rampTrackGradient, + sliderPositionForFrp, +} from '../../data/firmsIntensity.js'; +import { formatNumber, t } from '../../i18n/index.js'; import { REFRESH_INTERVAL_MS } from './policy.js'; +/** Slider resolution: whole-percent positions along the log axis. */ +const SLIDER_STEPS = 1000; + export function createQueries({ layerState, services, @@ -11,6 +23,25 @@ export function createQueries({ }) { const { id, name, icon, source } = config; + /** Whole-megawatt label for a slider value or tick ("0", "20", "1 000"). */ + function frpLabel(frp) { + return formatNumber(frp, { maximumFractionDigits: 0 }); + } + + const confidenceLabels = () => ({ + all: t('All', { context: 'fire confidence filter' }), + nominal: t('Nominal+', { context: 'fire confidence filter' }), + high: t('High', { context: 'fire confidence filter' }), + }); + + const confidenceTitles = () => ({ + all: t( + 'Every detection — many of the strongest fires are rated low confidence', + ), + nominal: t('Nominal and high confidence detections'), + high: t('High confidence detections only'), + }); + const methods = { /** Return the selected detection as a plain record for application consumers. */ getSelectedInfo() { @@ -51,6 +82,109 @@ export function createQueries({ // not this interval — is what protects the upstream FIRMS quota). updateInterval: REFRESH_INTERVAL_MS, + /** + * The intensity filter as layer options (share token `w`, owner + * `local-firms` in layerState.js). + * @returns {{minFrp: number, confidence: string}} + */ + getParams() { + return { ...layerState._filter }; + }, + + /** + * Apply a (partial) intensity filter. Invalid fields keep their current + * value. The filter runs in one place (ingestion.applyFilter) and the LOD + * rebuild re-derives markers, cells, cards and context registrations from + * the shown set; a selected fire that no longer passes is deselected. + * @param {{minFrp?: number, confidence?: string}} params + * @returns {boolean} True — the request is always accepted. + */ + setParams(params = {}) { + const next = normalizeFireFilter(params, layerState._filter); + if ( + next.minFrp === layerState._filter.minFrp && + next.confidence === layerState._filter.confidence + ) + return true; + layerState._filter = next; + if (!layerState._allFires.length) return true; + components.ingestion.applyFilter(); + if ( + layerState._selectedFire && + !firePassesFilter(layerState._selectedFire, next) + ) { + components.selection.clearFireSelection(); + } + if (layerState._enabled) components.rendering.renderCurrentLod(true); + layerState._rowControlsListener?.(); + return true; + }, + + /** + * Row controls under the Active Fires row: the log-scale minimum-FRP + * slider whose track is painted with the intensity ramp (so it doubles as + * the legend), the All / Nominal+ / High confidence switch, and the + * "N of M shown" counter. + */ + getRowControls() { + const { minFrp, confidence } = layerState._filter; + const labels = confidenceLabels(); + const titles = confidenceTitles(); + const shown = layerState._count; + const total = layerState._totalCount; + return { + slider: { + id: 'min-frp', + label: t('Min FRP'), + ariaLabel: t('Minimum fire radiative power, megawatts'), + valueText: + minFrp > 0 + ? t('{value} MW', { value: frpLabel(minFrp) }) + : t('All', { context: 'fire intensity filter' }), + min: 0, + max: SLIDER_STEPS, + step: 1, + value: Math.round(sliderPositionForFrp(minFrp) * SLIDER_STEPS), + track: rampTrackGradient(), + ticks: FRP_SLIDER_TICKS.map((frp) => ({ + at: sliderPositionForFrp(frp), + label: frpLabel(frp), + })), + params: (value) => ({ + minFrp: frpForSliderPosition(Number(value) / SLIDER_STEPS), + }), + }, + segmented: { + id: 'confidence', + ariaLabel: t('Detection confidence'), + options: FIRMS_CONFIDENCE_MODES.map((mode) => ({ + id: `confidence-${mode}`, + label: labels[mode], + title: titles[mode], + active: mode === confidence, + params: { confidence: mode }, + })), + }, + info: total + ? t('{shown} of {total} shown', { + shown: formatNumber(shown), + total: formatNumber(total), + }) + : '', + }; + }, + + /** + * Install the panel's "row controls changed" callback: a load or a filter + * change moves the counter, and nothing else repaints the row before the + * next scheduled refresh. + * @param {(() => void)|null} listener + */ + setRowControlsListener(listener) { + layerState._rowControlsListener = + typeof listener === 'function' ? listener : null; + }, + /** * Layer stats for the data panel. Degraded feed states surface through * `error` (established qa-failstate pattern: a dead feed must never look @@ -84,7 +218,9 @@ export function createQueries({ }); } return { + // Shown (filtered) detections; `total` is the loaded payload. count: layerState._count, + total: layerState._totalCount, cells: layerState._cellCount, lastUpdate: layerState._lastUpdate, loading: layerState._loading, @@ -176,8 +312,12 @@ export function createQueries({ _bindInteractionForTest(viewer, fires = []) { layerState._viewer = viewer; layerState._enabled = true; + layerState._allFires = fires; + layerState._allFiresByFrp = [...fires]; layerState._fires = fires; layerState._firesByFrp = [...fires]; + layerState._count = fires.length; + layerState._totalCount = fires.length; layerState._pickIndexById.clear(); layerState._labelLodDistance = 1e7; layerState._labelCandidates = fires.map((fire) => { diff --git a/src/layers/firms/rendering.js b/src/layers/firms/rendering.js index 8ae445f91..757fd4cf7 100644 --- a/src/layers/firms/rendering.js +++ b/src/layers/firms/rendering.js @@ -144,7 +144,7 @@ export function createRendering({ const score = components.model.heatScore(cell); const normalized = Math.min(1, Math.sqrt(score / maxScore)); const alpha = 0.16 + normalized * 0.5; - const color = components.model.heatColor(normalized, alpha); + const color = components.model.heatColor(cell.maxFrp, alpha); const centerLon = cell.lonCell + lod.gridDegrees / 2; const centerLat = cell.latCell + lod.gridDegrees / 2; const position = Cesium.Cartesian3.fromDegrees(centerLon, centerLat, 0); @@ -170,13 +170,12 @@ export function createRendering({ }); // Cells arrive heat-sorted, so candidate order doubles as label priority. - // Accent is resolved here because `normalized` only exists in this walk. layerState._labelCandidates.push({ position, cullPosition: components.model.cellCullPosition(centerLon, centerLat), fire: null, cell, - accent: components.model.cellAccent(normalized), + accent: components.model.cellAccent(cell.maxFrp), }); } diff --git a/src/layers/firms/state.js b/src/layers/firms/state.js index 48ae11db2..d84ee2026 100644 --- a/src/layers/firms/state.js +++ b/src/layers/firms/state.js @@ -1,4 +1,5 @@ import * as Cesium from 'cesium'; +import { DEFAULT_FIRE_FILTER } from '../../data/firmsIntensity.js'; export function createFirmsState({ services, config }) { const layerState = {}; @@ -39,12 +40,39 @@ export function createFirmsState({ services, config }) { layerState._error = null; + /** Every adapted detection in the current payload, before the filter. */ + + layerState._allFires = []; + + /** `_allFires` sorted by FRP descending, once per payload. */ + + layerState._allFiresByFrp = []; + + /** + * The detections that pass the intensity filter — the ONLY set rendering, + * selection, cells, the top-fires query and the analyst records ever walk. + */ + layerState._fires = []; layerState._firesByFrp = []; + /** Shown (filtered) detection count. */ + layerState._count = 0; + /** Loaded detection count before the filter ("N of M shown"). */ + + layerState._totalCount = 0; + + /** Minimum FRP (MW) and confidence mode; see firmsIntensity.js. */ + + layerState._filter = { ...DEFAULT_FIRE_FILTER }; + + /** Panel callback: repaint the row controls (counter) after a load. */ + + layerState._rowControlsListener = null; + layerState._cellCount = 0; layerState._lastUpdate = null; diff --git a/src/share/viewCodec.js b/src/share/viewCodec.js index 84ba8fbc1..18f64e0aa 100644 --- a/src/share/viewCodec.js +++ b/src/share/viewCodec.js @@ -255,6 +255,7 @@ export const SHARE_VIEW_FLAGS = freezeAll([ * written explicitly. */ export const SHARE_VIEW_LAYER_OPTION_ABSENT = Object.freeze({ + 'local-firms': Object.freeze({ minFrp: 0, confidence: 'all' }), traffic: Object.freeze({ roadMode: null }), 'weather-lightning': Object.freeze({ opacity: 'strong' }), 'weather-radar': Object.freeze({ opacity: 'strong' }), diff --git a/src/tools/queries/hazards.js b/src/tools/queries/hazards.js index 2b11c639c..e671db426 100644 --- a/src/tools/queries/hazards.js +++ b/src/tools/queries/hazards.js @@ -4,6 +4,14 @@ import { suggestView } from '../views.js'; import { defineTool, ToolError } from '../catalog.js'; import { AREA_SCHEMA, areaContains, resolveArea } from '../area.js'; import { LIMIT_SCHEMA, capRows, countNoun, isoTime } from '../results.js'; +import { + FIRMS_CONFIDENCE_MODES, + MIN_FRP_MW_MAX, + MIN_FRP_MW_MIN, + firePassesFilter, + normalizeFireFilter, +} from '../../data/firmsIntensity.js'; +import { normalizeConfidence } from '../../data/firmsAdapt.js'; function acquiredMsUtc(acqDate, acqTime) { if (typeof acqDate !== 'string' || !/^\d{4}-\d{2}-\d{2}$/.test(acqDate)) @@ -87,10 +95,30 @@ export const getActiveFires = defineTool({ title: 'Active fires', description: 'Satellite fire detections from NASA FIRMS in the last 24 hours within an ' + - 'area, most intense (fire radiative power) first.', + 'area, most intense (fire radiative power) first. Optionally limited to a ' + + 'minimum fire radiative power in megawatts and a confidence level — the ' + + "same filter as the Active Fires layer's intensity controls.", inputSchema: { type: 'object', - properties: { area: AREA_SCHEMA, limit: LIMIT_SCHEMA }, + properties: { + area: AREA_SCHEMA, + min_frp_mw: { + type: 'number', + minimum: MIN_FRP_MW_MIN, + maximum: MIN_FRP_MW_MAX, + description: + 'Hide detections weaker than this fire radiative power (MW). ' + + 'A typical detection is ~6 MW; 20 MW keeps the top tenth, 100 MW the top percent.', + }, + confidence: { + type: 'string', + enum: [...FIRMS_CONFIDENCE_MODES], + description: + '"all" (default), "nominal" (nominal and high), or "high". Many of the ' + + 'strongest fires are rated low confidence, so prefer "all" unless asked.', + }, + limit: LIMIT_SCHEMA, + }, required: ['area'], additionalProperties: false, }, @@ -103,9 +131,31 @@ export const getActiveFires = defineTool({ 'unavailable', 'Fire detections need a NASA FIRMS key configured for this server', ); + const filter = normalizeFireFilter({ + minFrp: args.min_frp_mw, + confidence: args.confidence, + }); const fires = snapshot.fires - .filter((fire) => areaContains(area, fire)) + .filter( + (fire) => + areaContains(area, fire) && + firePassesFilter( + { + frp: Number(fire.frp), + confidence: normalizeConfidence(fire.confidence), + }, + filter, + ), + ) .sort((a, b) => (b.frp ?? 0) - (a.frp ?? 0)); + const filterNotes = [ + ...(filter.minFrp > 0 ? [`≥ ${filter.minFrp} MW`] : []), + ...(filter.confidence !== 'all' + ? [ + `${filter.confidence === 'high' ? 'high' : 'nominal or high'} confidence`, + ] + : []), + ]; const result = capRows(fires, args.limit); // The proxy serves its last good snapshot when a refresh fails, and marks // satellites whose download failed. @@ -119,10 +169,16 @@ export const getActiveFires = defineTool({ ]; return { summary: - `${countNoun(fires.length, 'fire detection')} in ${area.label} in the last 24 hours` + + `${countNoun(fires.length, 'fire detection')}` + + (filterNotes.length ? ` (${filterNotes.join(', ')})` : '') + + ` in ${area.label} in the last 24 hours` + (notes.length ? ` (${notes.join('; ')}).` : '.'), data: { view: suggestView(services, { area, layers: ['local-firms'] }), + filter: { + min_frp_mw: filter.minFrp, + confidence: filter.confidence, + }, stale, missing_sources: missing, fetched_at: isoTime(snapshot.fetchedAt), diff --git a/src/tools/queries/hazards.test.mjs b/src/tools/queries/hazards.test.mjs index fa17158dd..c1d3eb43a 100644 --- a/src/tools/queries/hazards.test.mjs +++ b/src/tools/queries/hazards.test.mjs @@ -44,3 +44,39 @@ test('fire acquisition timestamps preserve valid leap days and UTC times', async assert.equal(result.data.rows[0].acquired, expected); } }); + +const WEEK = [ + { lat: 24.1, lon: 121.1, frp: 864, confidence: 'l', acqDate: '2026-10-01', acqTime: '0100' }, + { lat: 24.2, lon: 121.2, frp: 120, confidence: 'h', acqDate: '2026-10-01', acqTime: '0100' }, + { lat: 24.3, lon: 121.3, frp: 20, confidence: 'n', acqDate: '2026-10-01', acqTime: '0100' }, + { lat: 24.4, lon: 121.4, frp: 2, confidence: 'h', acqDate: '2026-10-01', acqTime: '0100' }, + { lat: 30, lon: 100, frp: 500, confidence: 'h', acqDate: '2026-10-01', acqTime: '0100' }, +]; +const TAIWAN = { area: { bbox: [120, 23, 122, 25] } }; + +test('get_active_fires shows every detection by default and reports the filter it used', async () => { + const result = await catalogWith(WEEK).call('get_active_fires', TAIWAN); + assert.deepEqual(result.data.rows.map((row) => row.frp_mw), [864, 120, 20, 2]); + assert.deepEqual(result.data.filter, { min_frp_mw: 0, confidence: 'all' }); + assert.match(result.summary, /^4 fire detections in /); +}); + +test('get_active_fires applies the same minimum-FRP and confidence filter as the layer', async () => { + const catalog = catalogWith(WEEK); + const strong = await catalog.call('get_active_fires', { ...TAIWAN, min_frp_mw: 20 }); + assert.deepEqual(strong.data.rows.map((row) => row.frp_mw), [864, 120, 20]); + assert.match(strong.summary, /^3 fire detections \(≥ 20 MW\) in /); + + const nominal = await catalog.call('get_active_fires', { ...TAIWAN, confidence: 'nominal' }); + assert.deepEqual(nominal.data.rows.map((row) => row.frp_mw), [120, 20, 2], 'the 864 MW low-confidence fire drops'); + assert.match(nominal.summary, /\(nominal or high confidence\)/); + + const both = await catalog.call('get_active_fires', { + ...TAIWAN, + min_frp_mw: 19.6, + confidence: 'high', + }); + assert.deepEqual(both.data.rows.map((row) => row.frp_mw), [120]); + assert.deepEqual(both.data.filter, { min_frp_mw: 20, confidence: 'high' }); + assert.match(both.summary, /\(≥ 20 MW, high confidence\)/); +}); diff --git a/src/ui/layerPanel.js b/src/ui/layerPanel.js index 18b71dabf..dc6566848 100644 --- a/src/ui/layerPanel.js +++ b/src/ui/layerPanel.js @@ -1,4 +1,5 @@ import { syncChipGroup } from './chipGroup.js'; +import { syncSegmentedGroup, syncSliderBlock } from './rowFilterControls.js'; import { syncRowList } from './rowList.js'; import { layerFeedState } from '../data/feedState.js'; export { layerFeedState } from '../data/feedState.js'; @@ -388,18 +389,42 @@ export class LayerPanel { const controls = document.createElement('div'); controls.className = 'data-toggle-controls'; this._bind(controls, 'click', (event) => { - const button = event.target?.closest?.('.data-toggle-chip'); + const button = + event.target?.closest?.('.data-toggle-chip') || + event.target?.closest?.('.data-toggle-segment'); if (!button || button.disabled) return; // Re-read the live descriptor rather than trusting the rendered // chip, so a stale row can never apply an inverted toggle. - const chip = this._rowControlsFor(layer.id)?.chips?.find( - (entry) => entry.id === button.dataset.chipId, - ); + const live = this._rowControlsFor(layer.id); + const chip = + live?.chips?.find( + (entry) => entry.id === button.dataset.chipId, + ) || + live?.segmented?.options?.find( + (entry) => entry.id === button.dataset.chipId, + ); if (!chip || chip.disabled || !this.isEnabled(layer.id)) return; if (typeof chip.onClick === 'function') chip.onClick(); else if (chip.params) this.setLayerParams(layer.id, chip.params, { origin: 'user' }); }); + // A row slider (e.g. the Active Fires minimum-FRP filter) maps its + // position to params through the live descriptor on every tick. + this._bind(controls, 'input', (event) => { + const input = event.target; + if (!input?.matches?.('.data-toggle-slider-input')) return; + const slider = this._rowControlsFor(layer.id)?.slider; + if ( + !slider || + slider.id !== input.dataset.sliderId || + typeof slider.params !== 'function' || + !this.isEnabled(layer.id) + ) + return; + this.setLayerParams(layer.id, slider.params(input.value), { + origin: 'user', + }); + }); row.appendChild(controls); // An ordered list below the chips, for a layer whose row carries a // sequence (turn-by-turn directions). Its own delegated listener, its @@ -521,13 +546,30 @@ export class LayerPanel { const chips = controls?.chips || []; const legend = controls?.legend || []; const infoText = controls?.info; + const slider = controls?.slider || null; + const segmented = controls?.segmented || null; this._syncRowList(listContainer, controls?.list || null); - container.hidden = chips.length === 0 && legend.length === 0 && !infoText; + container.hidden = + chips.length === 0 && + legend.length === 0 && + !infoText && + !slider && + !segmented; const info = container._rowControlsInfo || null; const firstLegend = container.querySelector('.data-toggle-legend-item'); - syncChipGroup(container, chips, { before: firstLegend || info }); + // Order: chips, switch, slider, legend, info. + syncSegmentedGroup(container, segmented, { before: firstLegend || info }); + const switchNode = container.querySelector('.data-toggle-segmented'); + syncSliderBlock(container, slider, { + before: switchNode?.nextSibling || firstLegend || info, + }); + const firstControl = + switchNode || container.querySelector('.data-toggle-slider'); + syncChipGroup(container, chips, { + before: firstControl || firstLegend || info, + }); const legendSignature = JSON.stringify( legend.map(({ label, color, count, blurb }) => [ diff --git a/src/ui/rowFilterControls.js b/src/ui/rowFilterControls.js new file mode 100644 index 000000000..b0299d24b --- /dev/null +++ b/src/ui/rowFilterControls.js @@ -0,0 +1,169 @@ +import { createSlider } from './slider.js'; +import { syncSegmentedControl } from './segmentedControl.js'; + +const set = (node, key, value) => { + if (node[key] !== value) node[key] = value; +}; +const attribute = (node, key, value) => { + if (node.getAttribute(key) !== value) node.setAttribute(key, value); +}; +// Custom properties need setProperty; test fixtures carry a plain style bag. +const styleVar = (node, name, value) => { + if (typeof node.style?.setProperty === 'function') { + if (value) node.style.setProperty(name, value); + else node.style.removeProperty(name); + } else if (node.style) node.style[name] = value || ''; +}; + +/** + * Reconcile a layer row's quantitative slider block in place (keyed by the + * descriptor id), so a refresh triggered by the slider's own input never + * replaces the node under the pointer. The caller owns dispatch: it listens + * for `input` on the row container and reads `.data-toggle-slider-input`. + * + * Descriptor: `{ id, label, ariaLabel, valueText, min, max, step, value, + * track, ticks: [{ at, label }] }` — `track` is a CSS background painting the + * runnable track (a color ramp doubles as the legend), `at` is 0..1. + * @param {HTMLElement} container The row's `.data-toggle-controls` node. + * @param {?object} slider Descriptor, or null to remove the block. + * @param {{before?: ?Node}} [options] Insertion anchor for a new block. + * @returns {?HTMLElement} The block, when rendered. + */ +export function syncSliderBlock(container, slider, { before = null } = {}) { + if (!container) return null; + const document = container.ownerDocument ?? globalThis.document; + const existing = [...container.children].find( + (node) => node.dataset?.sliderId, + ); + if (!slider) { + existing?.remove(); + return null; + } + let block = existing; + if (!block || block.dataset.sliderId !== slider.id) { + existing?.remove(); + block = document.createElement('div'); + block.className = 'data-toggle-slider'; + block.dataset.sliderId = slider.id; + const head = document.createElement('div'); + head.className = 'data-toggle-slider-head'; + const label = document.createElement('span'); + label.className = 'data-toggle-slider-label'; + const value = document.createElement('span'); + value.className = 'data-toggle-slider-value gev-slider-value'; + head.append(label, value); + const input = createSlider({ + documentRef: document, + className: 'data-toggle-slider-input', + min: slider.min, + max: slider.max, + step: slider.step, + value: slider.value, + }); + input.dataset.sliderId = slider.id; + const ticks = document.createElement('div'); + ticks.className = 'data-toggle-slider-ticks'; + block.append(head, input, ticks); + block._parts = { label, value, input, ticks }; + container.insertBefore(block, before); + } + const { label, value, input, ticks } = block._parts; + set(label, 'textContent', slider.label ?? ''); + set(value, 'textContent', slider.valueText ?? ''); + set(input, 'min', String(slider.min)); + set(input, 'max', String(slider.max)); + set(input, 'step', String(slider.step ?? 1)); + // Never move the thumb under an active drag: the layer's rounded value can + // sit a hair off the pointer, and a refresh runs on every input tick. + if (document.activeElement !== input) + set(input, 'value', String(slider.value)); + if (slider.ariaLabel) attribute(input, 'aria-label', slider.ariaLabel); + if (slider.valueText) attribute(input, 'aria-valuetext', slider.valueText); + const track = slider.track || ''; + if ((block.dataset.track || '') !== track) { + styleVar(input, '--slider-track', track); + block.dataset.track = track; + } + const signature = JSON.stringify(slider.ticks || []); + if (block.dataset.ticks !== signature) { + for (const node of [...ticks.children]) node.remove(); + for (const tick of slider.ticks || []) { + const node = document.createElement('span'); + node.className = 'data-toggle-slider-tick'; + styleVar(node, '--at', `${(tick.at * 100).toFixed(2)}%`); + node.textContent = tick.label; + ticks.appendChild(node); + } + block.dataset.ticks = signature; + } + return block; +} + +/** + * Reconcile a one-of-many switch (`.gev-segmented` radiogroup) in place. + * Buttons carry `data-chip-id` like chips so the row's delegated click handler + * can resolve them; the caller matches `.data-toggle-segment`. + * + * Descriptor: `{ id, ariaLabel, options: [{ id, label, title, active, + * disabled, params }] }`. + * @param {HTMLElement} container The row's `.data-toggle-controls` node. + * @param {?object} segmented Descriptor, or null to remove the group. + * @param {{before?: ?Node}} [options] Insertion anchor for a new group. + * @returns {?HTMLElement} The group, when rendered. + */ +export function syncSegmentedGroup( + container, + segmented, + { before = null } = {}, +) { + if (!container) return null; + const document = container.ownerDocument ?? globalThis.document; + const existing = [...container.children].find( + (node) => node.dataset?.segmentedId, + ); + if (!segmented) { + existing?.remove(); + return null; + } + let group = existing; + if (!group || group.dataset.segmentedId !== segmented.id) { + existing?.remove(); + group = document.createElement('div'); + group.className = 'gev-segmented data-toggle-segmented'; + group.dataset.segmentedId = segmented.id; + group.setAttribute('role', 'radiogroup'); + container.insertBefore(group, before); + } + if (segmented.ariaLabel) attribute(group, 'aria-label', segmented.ariaLabel); + const stale = new Map(); + for (const node of [...group.children]) + if (node.dataset?.chipId) stale.set(node.dataset.chipId, node); + const ordered = []; + for (const option of segmented.options || []) { + let button = stale.get(option.id); + stale.delete(option.id); + if (!button) { + button = document.createElement('button'); + button.type = 'button'; + button.className = 'gev-segment data-toggle-segment'; + button.dataset.chipId = option.id; + button.setAttribute('role', 'radio'); + } + set(button, 'textContent', option.label); + set(button, 'title', option.title || ''); + set(button, 'disabled', Boolean(option.disabled)); + ordered.push(button); + } + for (const node of stale.values()) node.remove(); + ordered.forEach((node, index) => { + if (group.children[index] !== node) + group.insertBefore(node, group.children[index] || null); + }); + const active = (segmented.options || []).find((option) => option.active); + syncSegmentedControl(ordered, active?.id, { + valueOf: (button) => button.dataset.chipId, + activeClass: 'active', + rovingFocus: true, + }); + return group; +} diff --git a/src/ui/rowFilterControls.test.mjs b/src/ui/rowFilterControls.test.mjs new file mode 100644 index 000000000..9cc8fb1d4 --- /dev/null +++ b/src/ui/rowFilterControls.test.mjs @@ -0,0 +1,207 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { syncSegmentedGroup, syncSliderBlock } from './rowFilterControls.js'; +import { railFixture } from './railTestFixture.mjs'; + +const sliderDescriptor = (overrides = {}) => ({ + id: 'min-frp', + label: 'MIN FRP', + ariaLabel: 'Minimum fire radiative power', + valueText: 'All', + min: 0, + max: 1000, + step: 1, + value: 0, + track: 'linear-gradient(90deg, #4a5bd4 0% 23%, #d1382a 82% 100%)', + ticks: [ + { at: 0, label: '0' }, + { at: 0.233, label: '5' }, + { at: 0.826, label: '300' }, + ], + params: (value) => ({ minFrp: Number(value) }), + ...overrides, +}); + +const segmentedDescriptor = (active = 'all') => ({ + id: 'confidence', + ariaLabel: 'Detection confidence', + options: ['all', 'nominal', 'high'].map((mode) => ({ + id: `confidence-${mode}`, + label: mode.toUpperCase(), + title: `${mode} title`, + active: mode === active, + params: { confidence: mode }, + })), +}); + +test('the slider block renders label, value, painted track and ticks, and is reconciled in place', () => { + const f = railFixture(); + const container = f.document.createElement('div'); + const block = syncSliderBlock(container, sliderDescriptor()); + assert.equal(block.className, 'data-toggle-slider'); + assert.equal(block.dataset.sliderId, 'min-frp'); + const input = block.querySelector('.data-toggle-slider-input'); + assert.equal(input.type, 'range'); + assert.equal(input.max, '1000'); + assert.equal(input.value, '0'); + assert.equal( + input.getAttribute('aria-label'), + 'Minimum fire radiative power', + ); + assert.equal(input.getAttribute('aria-valuetext'), 'All'); + assert.match(input.style['--slider-track'], /^linear-gradient/); + assert.equal( + block.querySelector('.data-toggle-slider-label').textContent, + 'MIN FRP', + ); + assert.equal( + block.querySelector('.data-toggle-slider-value').textContent, + 'All', + ); + const ticks = block.querySelector('.data-toggle-slider-ticks'); + assert.deepEqual( + ticks.children.map((node) => [node.textContent, node.style['--at']]), + [ + ['0', '0.00%'], + ['5', '23.30%'], + ['300', '82.60%'], + ], + ); + + const again = syncSliderBlock( + container, + sliderDescriptor({ value: 434, valueText: '20 MW' }), + ); + assert.equal(again, block, 'same node — a refresh never drops the thumb'); + assert.equal(input.value, '434'); + assert.equal( + block.querySelector('.data-toggle-slider-value').textContent, + '20 MW', + ); + assert.equal(container.children.length, 1); + + // A thumb under the pointer is never moved by a refresh. + input.focus(); + syncSliderBlock(container, sliderDescriptor({ value: 0 })); + assert.equal(input.value, '434'); + + syncSliderBlock(container, null); + assert.equal(container.children.length, 0); +}); + +test('the segmented group is a radiogroup whose active option reads checked, reconciled by id', () => { + const f = railFixture(); + const container = f.document.createElement('div'); + const group = syncSegmentedGroup(container, segmentedDescriptor('all')); + assert.equal(group.getAttribute('role'), 'radiogroup'); + assert.equal(group.getAttribute('aria-label'), 'Detection confidence'); + assert.ok(group.className.split(' ').includes('gev-segmented')); + const buttons = group.children; + assert.deepEqual( + buttons.map((b) => [ + b.dataset.chipId, + b.textContent, + b.getAttribute('aria-checked'), + b.getAttribute('tabindex'), + ]), + [ + ['confidence-all', 'ALL', 'true', '0'], + ['confidence-nominal', 'NOMINAL', 'false', '-1'], + ['confidence-high', 'HIGH', 'false', '-1'], + ], + ); + assert.equal(buttons[0].getAttribute('role'), 'radio'); + assert.equal(buttons[1].title, 'nominal title'); + + syncSegmentedGroup(container, segmentedDescriptor('high')); + assert.equal(group.children[0], buttons[0], 'buttons are reused'); + assert.equal(buttons[0].getAttribute('aria-checked'), 'false'); + assert.equal(buttons[2].getAttribute('aria-checked'), 'true'); + assert.ok(buttons[2].classList.contains('active')); + assert.equal(container.children.length, 1); + + syncSegmentedGroup(container, null); + assert.equal(container.children.length, 0); +}); + +test('a layer row dispatches slider input and switch clicks as user params', async () => { + const { LayerPanel } = await import('./layerPanel.js'); + const f = railFixture(); + const previousDocument = globalThis.document; + globalThis.document = f.document; + const calls = []; + let controls = { + slider: sliderDescriptor(), + segmented: segmentedDescriptor('all'), + info: '12 of 40 shown', + }; + const panel = new LayerPanel({ + getLayers: () => [ + { + id: 'local-firms', + name: 'Active Fires', + icon: '▲', + source: 'NASA FIRMS', + enabled: true, + showInTogglePanel: true, + stats: {}, + }, + ], + isEnabled: () => true, + setEnabled: () => {}, + setLayerParams: (...args) => calls.push(args), + hasRowControls: () => true, + subscribeRowControls: () => {}, + getRowControls: () => controls, + }); + try { + panel.mount(f.container); + const row = f.find((n) => n.dataset.layerId === 'local-firms'); + const container = row.querySelector('.data-toggle-controls'); + assert.equal(container.hidden, false); + assert.equal( + row.querySelector('.data-toggle-controls-info').textContent, + '12 of 40 shown', + ); + // Order: switch, slider, info. + assert.deepEqual( + container.children.map((node) => node.className.split(' ')[0]), + ['gev-segmented', 'data-toggle-slider', 'data-toggle-controls-info'], + ); + + const input = row.querySelector('.data-toggle-slider-input'); + input.value = '434'; + const inputEvent = new Event('input'); + Object.defineProperty(inputEvent, 'target', { value: input }); + container.dispatchEvent(inputEvent); + assert.deepEqual(calls.at(-1), [ + 'local-firms', + { minFrp: 434 }, + { origin: 'user' }, + ]); + + const high = row + .querySelector('.data-toggle-segmented') + .children.find((b) => b.dataset.chipId === 'confidence-high'); + high.click(); + assert.deepEqual(calls.at(-1), [ + 'local-firms', + { confidence: 'high' }, + { origin: 'user' }, + ]); + + // A stale descriptor never applies: the live one decides. + controls = { ...controls, segmented: segmentedDescriptor('high') }; + // The fixture DOM has no attribute selectors, so sync the row directly. + panel._syncRowControls(container, { id: 'local-firms', enabled: true }); + assert.equal(high.getAttribute('aria-checked'), 'true'); + assert.equal( + row.querySelector('.data-toggle-slider-input'), + input, + 'the slider survives a refresh', + ); + } finally { + panel.destroy(); + globalThis.document = previousDocument; + } +}); diff --git a/src/ui/styles/radio.css b/src/ui/styles/radio.css index 483321992..5047ae6f4 100644 --- a/src/ui/styles/radio.css +++ b/src/ui/styles/radio.css @@ -1035,6 +1035,108 @@ html:not([lang='en']) .data-row-list-text { padding-top: 3px; overflow-wrap: anywhere; } + +/* Optional per-layer one-of-many switch (Active Fires confidence). The shared + .gev-segmented surface, sized to the chip row. */ +.data-toggle-controls .data-toggle-segmented { + flex-basis: 100%; + max-width: 220px; +} + +.data-toggle-controls .data-toggle-segment { + min-height: 20px; + padding: 3px 6px; + font-size: 8px; + letter-spacing: 0.8px; +} + +/* Optional per-layer quantitative slider (Active Fires minimum FRP). The + track is painted by the layer (`--slider-track`, a stepped color ramp), so + the slider doubles as the marker legend; ticks sit under their thresholds. */ +.data-toggle-slider { + flex-basis: 100%; + display: grid; + gap: 2px; + padding-top: 2px; +} + +.data-toggle-slider-head { + display: flex; + justify-content: space-between; + align-items: baseline; + gap: 8px; + font-family: var(--font-mono); + font-size: 8px; + letter-spacing: 1.2px; + color: var(--text-dim); + text-transform: uppercase; +} + +.data-toggle-slider-value { + min-width: 0; + font-size: 9px; + letter-spacing: 0.5px; + text-transform: none; +} + +.data-toggle-slider-input { + height: 14px; +} + +.data-toggle-slider-input::-webkit-slider-runnable-track { + height: 5px; + border-radius: 3px; + background: var(--slider-track, rgba(255, 255, 255, 0.08)); + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.35); +} + +.data-toggle-slider-input::-moz-range-track, +.data-toggle-slider-input::-moz-range-progress { + height: 5px; + border-radius: 3px; + background: var(--slider-track, rgba(255, 255, 255, 0.08)); +} + +.data-toggle-slider-input::-webkit-slider-thumb { + width: 11px; + height: 11px; + margin-top: -3px; + background: var(--text-primary); + box-shadow: + 0 0 0 1px rgba(0, 0, 0, 0.6), + 0 0 6px rgba(255, 255, 255, 0.35); +} + +.data-toggle-slider-input::-moz-range-thumb { + width: 11px; + height: 11px; + background: var(--text-primary); + box-shadow: + 0 0 0 1px rgba(0, 0, 0, 0.6), + 0 0 6px rgba(255, 255, 255, 0.35); +} + +.data-toggle-slider-ticks { + position: relative; + height: 10px; + margin: 0 5px; + font-family: var(--font-mono); + font-size: 7px; + letter-spacing: 0.4px; + color: var(--text-dim); +} + +.data-toggle-slider-tick { + position: absolute; + top: 0; + left: var(--at); + transform: translateX(-50%); + white-space: nowrap; +} + +.data-toggle-slider-tick:first-child { + transform: none; +} /* ── Local RTL-SDR card (FM + Local ADS-B receiver) ── */ .sdr-radio-card { display: grid; From 22a87500c6b3296da1003a4101ca0ed80ba1f992 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Tue, 27 Oct 2026 18:30:58 +0400 Subject: [PATCH 014/153] docs(fires): current-state note and changelog fragment for the intensity filter (#1426) Describe the six-stop FRP ramp, the slider / confidence switch / counter, the single filter point, the share-token options and the tool arguments in docs/CURRENT-STATE.md, and add changelog.d/1426-fire-intensity-filter.md as CONTRIBUTING asks for runtime changes. Co-Authored-By: Claude Fable 5.1 --- changelog.d/1426-fire-intensity-filter.md | 8 ++++++++ docs/CURRENT-STATE.md | 24 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 changelog.d/1426-fire-intensity-filter.md diff --git a/changelog.d/1426-fire-intensity-filter.md b/changelog.d/1426-fire-intensity-filter.md new file mode 100644 index 000000000..fad9051e9 --- /dev/null +++ b/changelog.d/1426-fire-intensity-filter.md @@ -0,0 +1,8 @@ +- Color every Active Fires detection by fire radiative power on a six-stop + cold → hot ramp (blue · teal · lime · amber · orange · red at 0 · 5 · 20 · + 50 · 100 · 300 MW), and add a log-scale minimum-FRP slider whose track is the + ramp, an All / Nominal+ / High confidence switch and an "N of M shown" + counter to the layer row. The filter applies once before rendering, so + markers, cards, heat cells, context and the top-fires query agree; share + links keep it (`w` token: `f`, `c`), and `get_active_fires` takes matching + `min_frp_mw` and `confidence` arguments. Default 0 MW / All (gekh, #1426). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 0cb46940c..61699bda9 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -2054,6 +2054,30 @@ Generated style sliders use the same name as their visible parameter label. The first-run suppression checkbox keeps its native wrapping label, so its accessible name remains "Don't show this again". Control behavior is unchanged. +## Active Fires intensity filter and color ramp + +Every FIRMS detection is colored by fire radiative power on a six-stop cold → +hot ramp: blue from 0 MW, teal from 5, lime from 20, amber from 50, orange from +100 and red from 300 MW (`FRP_RAMP` in `src/data/firmsIntensity.js`). Heat +cells, glow sprites and card accents read the same ramp; confidence and +brightness do not affect the color. + +The Active Fires row carries a minimum-FRP slider on a log scale whose track is +painted with the ramp and ticked at the same six values, an All / Nominal+ / +High confidence switch, and an "N of M shown" counter. The default is 0 MW and +All, because many of the strongest detections are rated low confidence. The +filter runs once in `ingestion.applyFilter()` before rendering, so markers, +cards, heat cells, the shared context store, the top-fires query and the +analyst records all see one filtered set; a selected fire that no longer passes +is deselected. The layer state keeps both options under the `w` (`local-firms`) +share token as `f` (whole megawatts, 0–10,000) and `c` (`a`, `n`, `h`), +including the short share codec; a link without them restores the defaults. + +The `get_active_fires` tool accepts its own `min_frp_mw` and `confidence` +(`all`, `nominal`, `high`) arguments, independent of the panel's setting, and +names the applied criteria in its notes. Stale-snapshot and missing-source +reporting are unchanged. + ## FIRMS source status The FIRMS CSV parser rejects impossible acquisition calendar dates before the proxy filters records to the trailing 24 hours, while retaining valid UTC acquisition times. From 1dad6b658a77b80465204cd10c5247cb4c2c084c Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Tue, 27 Oct 2026 18:50:03 +0400 Subject: [PATCH 015/153] feat(fires): caption the confidence switch and name the slider "Fire intensity (FRP)" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The switch had no visible word saying what ALL / NOMINAL+ / HIGH refer to, and "Min FRP" assumed the reader knows the acronym. The segmented row descriptor gains an optional visible `label` (a caption above the group); the fires row uses "Confidence" and "Fire intensity (FRP)", and the slider value reads "≥ N MW" so the threshold is still clear. Locales updated. Co-Authored-By: Claude Fable 5.1 --- docs/CURRENT-STATE.md | 7 ++++--- src/i18n/locales/es.json | 5 +++-- src/i18n/locales/ru.json | 5 +++-- src/i18n/locales/zh-CN.json | 5 +++-- src/i18n/same-as-english.json | 4 ++-- src/layers/firms/queries.js | 5 +++-- src/ui/rowFilterControls.js | 24 ++++++++++++++++++++++-- src/ui/rowFilterControls.test.mjs | 23 ++++++++++++++++++++--- src/ui/styles/radio.css | 10 ++++++++++ 9 files changed, 70 insertions(+), 18 deletions(-) diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 61699bda9..2132a910f 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -2062,9 +2062,10 @@ hot ramp: blue from 0 MW, teal from 5, lime from 20, amber from 50, orange from cells, glow sprites and card accents read the same ramp; confidence and brightness do not affect the color. -The Active Fires row carries a minimum-FRP slider on a log scale whose track is -painted with the ramp and ticked at the same six values, an All / Nominal+ / -High confidence switch, and an "N of M shown" counter. The default is 0 MW and +The Active Fires row carries a "Fire intensity (FRP)" slider on a log scale +whose track is painted with the ramp and ticked at the same six values (its +value reads "All" or "≥ N MW"), a "Confidence" switch with All / Nominal+ / +High, and an "N of M shown" counter. The default is 0 MW and All, because many of the strongest detections are rated low confidence. The filter runs once in `ingestion.applyFilter()` before rendering, so markers, cards, heat cells, the shared context store, the top-fires query and the diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index ffee7fb87..babea8bfb 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -3008,9 +3008,10 @@ "Every detection — many of the strongest fires are rated low confidence": "Todas las detecciones — muchos de los incendios más intensos tienen confianza baja", "Nominal and high confidence detections": "Detecciones de confianza nominal y alta", "High confidence detections only": "Solo detecciones de confianza alta", - "Min FRP": "FRP mín.", + "Fire intensity (FRP)": "Intensidad (FRP)", + "≥ {value} MW": "≥ {value} MW", + "Confidence": "Confianza", "Minimum fire radiative power, megawatts": "Potencia radiativa mínima del fuego, en megavatios", - "{value} MW": "{value} MW", "fire intensity filter|All": "Todo", "Detection confidence": "Confianza de la detección", "{shown} of {total} shown": "{shown} de {total} mostrados" diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 1cd88757d..6289ad38c 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -3077,9 +3077,10 @@ "Every detection — many of the strongest fires are rated low confidence": "Все детекции — у многих сильнейших пожаров достоверность низкая", "Nominal and high confidence detections": "Детекции средней и высокой достоверности", "High confidence detections only": "Только детекции высокой достоверности", - "Min FRP": "Мин. FRP", + "Fire intensity (FRP)": "Интенсивность (FRP)", + "≥ {value} MW": "≥ {value} МВт", + "Confidence": "Достоверность", "Minimum fire radiative power, megawatts": "Минимальная мощность излучения пожара, мегаватты", - "{value} MW": "{value} МВт", "fire intensity filter|All": "Все", "Detection confidence": "Достоверность детекции", "{shown} of {total} shown": "показано {shown} из {total}" diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 3044c45f8..110f7a77c 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -2870,9 +2870,10 @@ "Every detection — many of the strongest fires are rated low confidence": "所有检测——许多最强的火点置信度为低", "Nominal and high confidence detections": "标称和高置信度的检测", "High confidence detections only": "仅高置信度的检测", - "Min FRP": "最小 FRP", + "Fire intensity (FRP)": "火势强度 (FRP)", + "≥ {value} MW": "≥ {value} MW", + "Confidence": "置信度", "Minimum fire radiative power, megawatts": "最小火辐射功率(兆瓦)", - "{value} MW": "{value} MW", "fire intensity filter|All": "全部", "Detection confidence": "检测置信度", "{shown} of {total} shown": "显示 {shown} / {total}" diff --git a/src/i18n/same-as-english.json b/src/i18n/same-as-english.json index 5f1b14f8a..5d0313965 100644 --- a/src/i18n/same-as-english.json +++ b/src/i18n/same-as-english.json @@ -121,7 +121,7 @@ "{value} KM", "{value} KM/H", "{value} KM/S", - "{value} MW", + "≥ {value} MW", "ΔE", "ΔN", "▲ {frp} MW" @@ -197,7 +197,7 @@ "{type} SPD: {speed} HDG: {heading}", "{value} KM", "{value} KM/S", - "{value} MW", + "≥ {value} MW", "ΔE", "ΔN", "▲ {frp} MW" diff --git a/src/layers/firms/queries.js b/src/layers/firms/queries.js index 220012133..44ce8573d 100644 --- a/src/layers/firms/queries.js +++ b/src/layers/firms/queries.js @@ -135,11 +135,11 @@ export function createQueries({ return { slider: { id: 'min-frp', - label: t('Min FRP'), + label: t('Fire intensity (FRP)'), ariaLabel: t('Minimum fire radiative power, megawatts'), valueText: minFrp > 0 - ? t('{value} MW', { value: frpLabel(minFrp) }) + ? t('≥ {value} MW', { value: frpLabel(minFrp) }) : t('All', { context: 'fire intensity filter' }), min: 0, max: SLIDER_STEPS, @@ -156,6 +156,7 @@ export function createQueries({ }, segmented: { id: 'confidence', + label: t('Confidence'), ariaLabel: t('Detection confidence'), options: FIRMS_CONFIDENCE_MODES.map((mode) => ({ id: `confidence-${mode}`, diff --git a/src/ui/rowFilterControls.js b/src/ui/rowFilterControls.js index b0299d24b..87a3e0bc6 100644 --- a/src/ui/rowFilterControls.js +++ b/src/ui/rowFilterControls.js @@ -104,8 +104,9 @@ export function syncSliderBlock(container, slider, { before = null } = {}) { * Buttons carry `data-chip-id` like chips so the row's delegated click handler * can resolve them; the caller matches `.data-toggle-segment`. * - * Descriptor: `{ id, ariaLabel, options: [{ id, label, title, active, - * disabled, params }] }`. + * Descriptor: `{ id, label, ariaLabel, options: [{ id, label, title, active, + * disabled, params }] }` — `label` is an optional visible caption above the + * buttons (the group itself is a flex item, so the caption is a sibling). * @param {HTMLElement} container The row's `.data-toggle-controls` node. * @param {?object} segmented Descriptor, or null to remove the group. * @param {{before?: ?Node}} [options] Insertion anchor for a new group. @@ -121,19 +122,38 @@ export function syncSegmentedGroup( const existing = [...container.children].find( (node) => node.dataset?.segmentedId, ); + const existingCaption = [...container.children].find( + (node) => node.dataset?.segmentedCaptionFor, + ); if (!segmented) { existing?.remove(); + existingCaption?.remove(); return null; } let group = existing; if (!group || group.dataset.segmentedId !== segmented.id) { existing?.remove(); + existingCaption?.remove(); group = document.createElement('div'); group.className = 'gev-segmented data-toggle-segmented'; group.dataset.segmentedId = segmented.id; group.setAttribute('role', 'radiogroup'); container.insertBefore(group, before); } + let caption = [...container.children].find( + (node) => node.dataset?.segmentedCaptionFor === segmented.id, + ); + if (segmented.label) { + if (!caption) { + caption = document.createElement('span'); + caption.className = 'data-toggle-segmented-label'; + caption.dataset.segmentedCaptionFor = segmented.id; + container.insertBefore(caption, group); + } + set(caption, 'textContent', segmented.label); + } else { + caption?.remove(); + } if (segmented.ariaLabel) attribute(group, 'aria-label', segmented.ariaLabel); const stale = new Map(); for (const node of [...group.children]) diff --git a/src/ui/rowFilterControls.test.mjs b/src/ui/rowFilterControls.test.mjs index 9cc8fb1d4..ac5d2c1d0 100644 --- a/src/ui/rowFilterControls.test.mjs +++ b/src/ui/rowFilterControls.test.mjs @@ -24,6 +24,7 @@ const sliderDescriptor = (overrides = {}) => ({ const segmentedDescriptor = (active = 'all') => ({ id: 'confidence', + label: 'Confidence', ariaLabel: 'Detection confidence', options: ['all', 'nominal', 'high'].map((mode) => ({ id: `confidence-${mode}`, @@ -96,6 +97,9 @@ test('the segmented group is a radiogroup whose active option reads checked, rec assert.equal(group.getAttribute('role'), 'radiogroup'); assert.equal(group.getAttribute('aria-label'), 'Detection confidence'); assert.ok(group.className.split(' ').includes('gev-segmented')); + const caption = container.children[container.children.indexOf(group) - 1]; + assert.equal(caption.className, 'data-toggle-segmented-label'); + assert.equal(caption.textContent, 'Confidence'); const buttons = group.children; assert.deepEqual( buttons.map((b) => [ @@ -118,10 +122,18 @@ test('the segmented group is a radiogroup whose active option reads checked, rec assert.equal(buttons[0].getAttribute('aria-checked'), 'false'); assert.equal(buttons[2].getAttribute('aria-checked'), 'true'); assert.ok(buttons[2].classList.contains('active')); + assert.equal(container.children.length, 2, 'caption and group'); + + syncSegmentedGroup(container, { ...segmentedDescriptor('high'), label: '' }); + assert.equal( + container.querySelector('.data-toggle-segmented-label'), + null, + 'an empty label removes the caption', + ); assert.equal(container.children.length, 1); syncSegmentedGroup(container, null); - assert.equal(container.children.length, 0); + assert.equal(container.children.length, 0, 'null removes group and caption'); }); test('a layer row dispatches slider input and switch clicks as user params', async () => { @@ -163,10 +175,15 @@ test('a layer row dispatches slider input and switch clicks as user params', asy row.querySelector('.data-toggle-controls-info').textContent, '12 of 40 shown', ); - // Order: switch, slider, info. + // Order: switch caption, switch, slider, info. assert.deepEqual( container.children.map((node) => node.className.split(' ')[0]), - ['gev-segmented', 'data-toggle-slider', 'data-toggle-controls-info'], + [ + 'data-toggle-segmented-label', + 'gev-segmented', + 'data-toggle-slider', + 'data-toggle-controls-info', + ], ); const input = row.querySelector('.data-toggle-slider-input'); diff --git a/src/ui/styles/radio.css b/src/ui/styles/radio.css index 5047ae6f4..e005c5288 100644 --- a/src/ui/styles/radio.css +++ b/src/ui/styles/radio.css @@ -1043,6 +1043,16 @@ html:not([lang='en']) .data-row-list-text { max-width: 220px; } +.data-toggle-segmented-label { + flex-basis: 100%; + padding-top: 2px; + font-family: var(--font-mono); + font-size: 8px; + letter-spacing: 1.2px; + color: var(--text-dim); + text-transform: uppercase; +} + .data-toggle-controls .data-toggle-segment { min-height: 20px; padding: 3px 6px; From 887b261195fe4a425e9cd8dfdd5027172b7c5342 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Tue, 27 Oct 2026 19:19:40 +0400 Subject: [PATCH 016/153] fix(fires): paint aggregated heat cells warm by density, not by strongest FRP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coloring each far-zoom cell with the ramp stop of its strongest detection turned a burning region into a blue / teal / lime mosaic: neighbouring cells flipped hue on one outlier and the cold stops did not read as fire. Cells say where it burns, so they go back to the heat-normalized score (density, night share, max FRP) on the warm end of the ramp — lime, amber, red — with the cell card accent matching. Single detections keep the full six-stop FRP ramp. Co-Authored-By: Claude Fable 5.1 --- changelog.d/1426-fire-intensity-filter.md | 3 +- docs/CURRENT-STATE.md | 9 ++++-- src/layers/firms/model.js | 37 +++++++++++++++++------ src/layers/firms/rendering.js | 5 +-- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/changelog.d/1426-fire-intensity-filter.md b/changelog.d/1426-fire-intensity-filter.md index fad9051e9..09e3c3a7d 100644 --- a/changelog.d/1426-fire-intensity-filter.md +++ b/changelog.d/1426-fire-intensity-filter.md @@ -2,7 +2,8 @@ cold → hot ramp (blue · teal · lime · amber · orange · red at 0 · 5 · 20 · 50 · 100 · 300 MW), and add a log-scale minimum-FRP slider whose track is the ramp, an All / Nominal+ / High confidence switch and an "N of M shown" - counter to the layer row. The filter applies once before rendering, so + counter to the layer row. Far-zoom heat cells keep a warm density fill + (lime · amber · red). The filter applies once before rendering, so markers, cards, heat cells, context and the top-fires query agree; share links keep it (`w` token: `f`, `c`), and `get_active_fires` takes matching `min_frp_mw` and `confidence` arguments. Default 0 MW / All (gekh, #1426). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 2132a910f..7e29d8675 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -2058,9 +2058,12 @@ accessible name remains "Don't show this again". Control behavior is unchanged. Every FIRMS detection is colored by fire radiative power on a six-stop cold → hot ramp: blue from 0 MW, teal from 5, lime from 20, amber from 50, orange from -100 and red from 300 MW (`FRP_RAMP` in `src/data/firmsIntensity.js`). Heat -cells, glow sprites and card accents read the same ramp; confidence and -brightness do not affect the color. +100 and red from 300 MW (`FRP_RAMP` in `src/data/firmsIntensity.js`). Glow +sprites and fire-card accents read that ramp; confidence and brightness do +not affect the color. Aggregated heat cells (far zoom) instead take the warm +end of the ramp — lime, amber or red — from their heat-normalized score +(density, night share and strongest FRP), so a region reads as one field +rather than a per-cell mosaic; the cell card's accent matches its fill. The Active Fires row carries a "Fire intensity (FRP)" slider on a log scale whose track is painted with the ramp and ticked at the same six values (its diff --git a/src/layers/firms/model.js b/src/layers/firms/model.js index a90066cc6..83f573c98 100644 --- a/src/layers/firms/model.js +++ b/src/layers/firms/model.js @@ -137,15 +137,33 @@ export function createModel({ } /** - * Fill color for an aggregated heat cell: the ramp color of its strongest - * detection, so cells, markers and the slider legend read on one scale. - * @param {number} maxFrp - Strongest FRP in the cell, megawatts. + * Severity stop for an aggregated heat cell from its heat-normalized score + * (density, night share and strongest FRP together). Cells say *where* it + * burns, so they stay on the warm end of the ramp — lime, amber, red — and + * read as one field instead of a per-cell mosaic; the cold stops belong to + * single detections, which say *how hard* each one burns. + * @param {number} normalized - 0..1 heat score (sqrt-normalized to the view). + * @returns {{name: string, minFrp: number, color: Cesium.Color}} + */ + + function cellColorStop(normalized) { + const name = + normalized > 0.72 ? 'red' : normalized > 0.42 ? 'amber' : 'lime'; + return ( + DETECTION_COLOR_STOPS.find((stop) => stop.name === name) || + DETECTION_COLOR_STOPS[0] + ); + } + + /** + * Fill color for an aggregated heat cell. + * @param {number} normalized - 0..1 heat score (see {@link cellColorStop}). * @param {number} alpha - Fill alpha (heat-normalized by the caller). * @returns {Cesium.Color} */ - function heatColor(maxFrp, alpha) { - return frpColorStop(maxFrp).color.withAlpha(alpha); + function heatColor(normalized, alpha) { + return cellColorStop(normalized).color.withAlpha(alpha); } /** @@ -476,14 +494,14 @@ export function createModel({ } /** - * Cell card accent: the ramp stop of the cell's strongest detection, + * Cell card accent: the warm severity stop of the cell's heat score, * mirroring heatColor. - * @param {number} maxFrp - Strongest FRP in the cell, megawatts. + * @param {number} normalized - 0..1 heat score. * @returns {string} "r, g, b" accent string. */ - function cellAccent(maxFrp) { - return accentForSeverity(frpColorStop(maxFrp).name); + function cellAccent(normalized) { + return accentForSeverity(cellColorStop(normalized).name); } /** Coordinate line like "30.512°N 75.831°E". */ @@ -590,6 +608,7 @@ export function createModel({ cellIntersectsBounds, heatScore, heatColor, + cellColorStop, frpColorStop, detectionColorStop, frpPixelSize, diff --git a/src/layers/firms/rendering.js b/src/layers/firms/rendering.js index 757fd4cf7..8ae445f91 100644 --- a/src/layers/firms/rendering.js +++ b/src/layers/firms/rendering.js @@ -144,7 +144,7 @@ export function createRendering({ const score = components.model.heatScore(cell); const normalized = Math.min(1, Math.sqrt(score / maxScore)); const alpha = 0.16 + normalized * 0.5; - const color = components.model.heatColor(cell.maxFrp, alpha); + const color = components.model.heatColor(normalized, alpha); const centerLon = cell.lonCell + lod.gridDegrees / 2; const centerLat = cell.latCell + lod.gridDegrees / 2; const position = Cesium.Cartesian3.fromDegrees(centerLon, centerLat, 0); @@ -170,12 +170,13 @@ export function createRendering({ }); // Cells arrive heat-sorted, so candidate order doubles as label priority. + // Accent is resolved here because `normalized` only exists in this walk. layerState._labelCandidates.push({ position, cullPosition: components.model.cellCullPosition(centerLon, centerLat), fire: null, cell, - accent: components.model.cellAccent(cell.maxFrp), + accent: components.model.cellAccent(normalized), }); } From 6d6ad20ad3d171ade71911b9542d94d72855194d Mon Sep 17 00:00:00 2001 From: quanticsoul4772 <71096528+quanticsoul4772@users.noreply.github.com> Date: Thu, 29 Oct 2026 00:41:30 -0700 Subject: [PATCH 017/153] fix(infrastructure): ground-sample only stem bases the camera sees scene.sampleHeight reads only surface rendered for the current view. For a data centre or dam base outside the frustum or over the horizon it read through the Earth (about -6,344 km over Ashburn on Esri), failed the 9,000 m check and retried every 2 s indefinitely, one offscreen render per record. Over Ashburn that held rest frames at 58-589 ms. Unseen bases are now skipped without being stamped, so each is sampled on the first walk that sees it, and they no longer arm the retry render. Co-Authored-By: Claude Opus 5.5 --- docs/CURRENT-STATE.md | 4 ++- src/data/localGeojson.test.mjs | 53 +++++++++++++++++++++++++++++++++- src/data/localGeojsonCore.js | 44 +++++++++++++++++++++++++--- 3 files changed, 95 insertions(+), 6 deletions(-) diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 09ae87f1a..e5202e55c 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -1959,7 +1959,9 @@ during continuous motion. Disable/re-enable resets selection cleanly. Close-up stem sizing uses camera-to-feature distance without a 5 km minimum. Unchanged overlay entries do not request another frame; moved positions, changed membership and re-enabling still publish. Ground sampling waits for -visible globe tiles to settle and uses valid loaded terrain as a floor while +visible globe tiles to settle, samples only markers whose base is in the +camera's view and above the horizon (an unseen base reads through the Earth +and would retry every 2 s), and uses valid loaded terrain as a floor while retaining rooftop and below-sea-level elevations. A hidden globe does not constrain photoreal geometry, and retry work remains bounded. Already sampled nearby markers follow higher settled terrain on existing bounded walks, without diff --git a/src/data/localGeojson.test.mjs b/src/data/localGeojson.test.mjs index 13cde65a5..89de41529 100644 --- a/src/data/localGeojson.test.mjs +++ b/src/data/localGeojson.test.mjs @@ -90,6 +90,8 @@ async function createRealLocalLayerHarness({ globalThis.window = { dispatchEvent() {} }; let sampleHeightImpl = sampleHeight; const sampleCalls = { count: 0 }; + // The camera frustum, reduced to the one answer ground sampling asks of it. + let baseVisibility = Cesium.Intersect.INSIDE; const overlayHost = { setVisible: (...args) => hostCalls.push(['visible', ...args]), setEntries: (...args) => hostCalls.push(['entries', ...args]), @@ -107,7 +109,14 @@ async function createRealLocalLayerHarness({ }, camera: { positionWC: Cesium.Cartesian3.fromDegrees(-97.695, 30.205, 100_000), - frustum: { fov: Math.PI / 3 }, + directionWC: new Cesium.Cartesian3(), + upWC: new Cesium.Cartesian3(), + frustum: { + fov: Math.PI / 3, + computeCullingVolume: () => ({ + computeVisibility: () => baseVisibility, + }), + }, moveEnd, flyTo() {}, }, @@ -151,6 +160,10 @@ async function createRealLocalLayerHarness({ sampleCalls, /** Swap scene.sampleHeight mid-test (e.g. tiles finally arrive). */ setSampleHeight(next) { sampleHeightImpl = next; }, + /** Put the feature's base inside (true) or outside the camera frustum. */ + setBaseInView(inView) { + baseVisibility = inView ? Cesium.Intersect.INSIDE : Cesium.Intersect.OUTSIDE; + }, cleanup() { if (originalWindow === undefined) delete globalThis.window; else globalThis.window = originalWindow; @@ -736,6 +749,44 @@ test('ground sampling waits for visible globe tiles before caching a height', as assert.ok(Math.abs(baseHeightM(env) - 117) < 0.01); }); +test('an unseen base is not sampled and arms no retry until it is in view', async (t) => { + // Out of view the scene has no surface under the base, so the depth sample + // would pass through the Earth (about -6,344 km) and fail on every retry. + const env = await createRealLocalLayerHarness({ + sampleHeightSupported: true, sampleHeight: () => 117, + }); + _resetRenderGovernorForTest(); + const governorScene = { renders: 0, requestRender() { this.renders += 1; } }; + installRenderGovernor({ scene: governorScene }); + governorScene.renders = 0; // discard the governor's own install settling frame + t.mock.timers.enable({ apis: ['setTimeout'] }); + const clock = installFakeClock(t); + t.after(() => { + env.layer.destroy(env.viewer); + env.cleanup(); + _resetRenderGovernorForTest(); + }); + env.viewer.scene.globe = { show: true, tilesLoaded: true, getHeight: () => 117 }; + setCameraAltitude(env, 20_000); + env.setBaseInView(false); + runArmedRetryChain(env, t, clock, 5); + assert.equal(env.sampleCalls.count, 0, 'an off-screen base must not be sampled'); + assert.equal(governorScene.renders, 0, 'an off-screen base must not keep a parked camera rendering'); + assert.ok(Math.abs(baseHeightM(env)) < 0.01); + + // In the frustum but over the horizon: 50 m up, about 67 km away. + env.setBaseInView(true); + env.viewer.camera.positionWC = Cesium.Cartesian3.fromDegrees(-97.0, 30.205, 50); + runArmedRetryChain(env, t, clock, 5); + assert.equal(env.sampleCalls.count, 0, 'a base over the horizon must not be sampled'); + assert.equal(governorScene.renders, 0); + + setCameraAltitude(env, 20_000); + env.preRender.raise(); + assert.equal(env.sampleCalls.count, 1, 'the base is sampled on the first walk that sees it'); + assert.ok(Math.abs(baseHeightM(env) - 117) < 0.01); +}); + test('settled terrain refinement lifts an already sampled stem without another GPU sample', async (t) => { const env = await createRealLocalLayerHarness({ sampleHeightSupported: true, sampleHeight: () => 117, diff --git a/src/data/localGeojsonCore.js b/src/data/localGeojsonCore.js index 1d04fa46c..9d97df61c 100644 --- a/src/data/localGeojsonCore.js +++ b/src/data/localGeojsonCore.js @@ -1000,9 +1000,9 @@ export function createLocalGeoJsonLayer( // governor the retry's preRender never arrives on a parked camera // and the stem stays at ellipsoid height (buried/floating) until // the user happens to move. Schedule the frame the retry needs. - // Gated on a sampleable scene and in-range records only, so a far - // camera (or a keyless scene) stays fully idle; the distance is - // only computed for still-unsampled stems. + // Gated on a sampleable scene and in-range, in-view records only, + // so a far camera (or a keyless scene) stays fully idle; the + // distance is only computed for still-unsampled stems. if ( canSampleGround && !record.groundSampled && @@ -1010,7 +1010,8 @@ export function createLocalGeoJsonLayer( Cesium.Cartesian3.distance( viewer.camera.positionWC, record.base, - ) < GROUND_SAMPLE_MAX_DISTANCE_M + ) < GROUND_SAMPLE_MAX_DISTANCE_M && + groundSampleInView(viewer, record) ) { groundRetryPending = true; } @@ -1130,9 +1131,44 @@ function refreshLocalTerrainFloor(viewer, record) { return true; } +const groundSampleSphere = new Cesium.BoundingSphere( + new Cesium.Cartesian3(), + 1, +); + +const groundSampleOccluder = new Cesium.EllipsoidalOccluder( + Cesium.Ellipsoid.WGS84, +); + +/** + * Whether the camera sees the record's base: inside the view frustum and + * above the horizon. scene.sampleHeight reads only surface rendered for the + * current view, so a sample of an unseen base passes through the Earth (about + * -6,344 km near Ashburn on Esri) and fails on every 2 s retry, each one a + * full offscreen render: 110 unseen data centres there held the page near 2 s + * a frame indefinitely. An unseen base keeps its stem at the unsampled height + * and is sampled on the first walk that sees it. + */ +function groundSampleInView(viewer, record) { + const camera = viewer.camera; + const culling = camera.frustum.computeCullingVolume( + camera.positionWC, + camera.directionWC, + camera.upWC, + ); + Cesium.Cartesian3.clone(record.base, groundSampleSphere.center); + if ( + culling.computeVisibility(groundSampleSphere) === Cesium.Intersect.OUTSIDE + ) + return false; + groundSampleOccluder.cameraPosition = camera.positionWC; + return groundSampleOccluder.isPointVisible(record.base); +} + function sampleLocalGroundHeight(viewer, record, now) { if (record.groundSampled || !viewer.scene.sampleHeightSupported) return false; if (now - record.lastGroundSampleMs < GROUND_SAMPLE_RETRY_MS) return false; + if (!groundSampleInView(viewer, record)) return false; record.lastGroundSampleMs = now; const globe = viewer.scene.globe; if (globe?.show && globe.tilesLoaded === false) return false; From 189b30b5459a1a476fed3833325d2f460ce07862 Mon Sep 17 00:00:00 2001 From: quanticsoul4772 <71096528+quanticsoul4772@users.noreply.github.com> Date: Thu, 29 Oct 2026 00:43:40 -0700 Subject: [PATCH 018/153] docs(changelog): add the infrastructure ground-sampling entry Co-Authored-By: Claude Opus 5.5 --- changelog.d/1464-infrastructure-ground-sample-in-view.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog.d/1464-infrastructure-ground-sample-in-view.md diff --git a/changelog.d/1464-infrastructure-ground-sample-in-view.md b/changelog.d/1464-infrastructure-ground-sample-in-view.md new file mode 100644 index 000000000..8ab5d1d88 --- /dev/null +++ b/changelog.d/1464-infrastructure-ground-sample-in-view.md @@ -0,0 +1,4 @@ +- Ground-sample Data Centers and Dams markers only when the camera sees their + base. An off-screen base read through the Earth and retried every 2 s, which + held the page near 2 s a frame over Ashburn, Virginia on the Esri map + (quanticsoul4772, #1464). From ecc0ced47c4f765627910bf089e303251cd5e9b4 Mon Sep 17 00:00:00 2001 From: quanticsoul4772 <71096528+quanticsoul4772@users.noreply.github.com> Date: Thu, 29 Oct 2026 01:25:57 -0700 Subject: [PATCH 019/153] fix(infrastructure): test the ground, not the ellipsoid, for in-view sampling An unsampled base sits at ellipsoid height 0. Over high terrain seen at an angle that point projects below the screen while the ground above it is in view, so the gate skipped ground the camera could see and never sampled it. The gate now tests loaded globe terrain when there is some, and otherwise the whole span of heights a sample can accept (0 to 9,000 m). Co-Authored-By: Claude Opus 5.5 --- ...64-infrastructure-ground-sample-in-view.md | 6 +- docs/CURRENT-STATE.md | 8 ++- src/data/localGeojson.test.mjs | 58 +++++++++++++++++++ src/data/localGeojsonCore.js | 49 +++++++++++++--- 4 files changed, 106 insertions(+), 15 deletions(-) diff --git a/changelog.d/1464-infrastructure-ground-sample-in-view.md b/changelog.d/1464-infrastructure-ground-sample-in-view.md index 8ab5d1d88..b563c86b4 100644 --- a/changelog.d/1464-infrastructure-ground-sample-in-view.md +++ b/changelog.d/1464-infrastructure-ground-sample-in-view.md @@ -1,4 +1,4 @@ -- Ground-sample Data Centers and Dams markers only when the camera sees their - base. An off-screen base read through the Earth and retried every 2 s, which - held the page near 2 s a frame over Ashburn, Virginia on the Esri map +- Ground-sample Data Centers and Dams markers only when the camera sees the + ground under them. Unseen ground read through the Earth and retried every + 2 s; over Ashburn, Virginia on the Esri map, slow frames reached 2 s (quanticsoul4772, #1464). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index e5202e55c..065d67112 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -1959,9 +1959,11 @@ during continuous motion. Disable/re-enable resets selection cleanly. Close-up stem sizing uses camera-to-feature distance without a 5 km minimum. Unchanged overlay entries do not request another frame; moved positions, changed membership and re-enabling still publish. Ground sampling waits for -visible globe tiles to settle, samples only markers whose base is in the -camera's view and above the horizon (an unseen base reads through the Earth -and would retry every 2 s), and uses valid loaded terrain as a floor while +visible globe tiles to settle, samples only markers whose ground is in the +camera's view and above the horizon (unseen ground reads through the Earth +and would retry every 2 s; until it is seen, a stem keeps its unsampled +height, which can show for a stem whose base is just off screen), and uses +valid loaded terrain as a floor while retaining rooftop and below-sea-level elevations. A hidden globe does not constrain photoreal geometry, and retry work remains bounded. Already sampled nearby markers follow higher settled terrain on existing bounded walks, without diff --git a/src/data/localGeojson.test.mjs b/src/data/localGeojson.test.mjs index 89de41529..1c47cb8c1 100644 --- a/src/data/localGeojson.test.mjs +++ b/src/data/localGeojson.test.mjs @@ -787,6 +787,64 @@ test('an unseen base is not sampled and arms no retry until it is in view', asyn assert.ok(Math.abs(baseHeightM(env) - 117) < 0.01); }); +for (const [label, globe] of [ + ['loaded terrain', { show: true, tilesLoaded: true, getHeight: () => 2_500 }], + ['a hidden globe', { show: false, tilesLoaded: true, getHeight: () => undefined }], +]) { + test(`high ground in view is sampled with ${label} although its unsampled base projects off screen`, async (t) => { + // A base on 2,500 m terrain, seen from 3 km away at a shallow angle: its + // ellipsoid-height point is far below the bottom of the screen. + const env = await createRealLocalLayerHarness({ + sampleHeightSupported: true, sampleHeight: () => 2_500, + }); + const clock = installFakeClock(t); + t.after(() => { env.layer.destroy(env.viewer); env.cleanup(); }); + env.viewer.scene.globe = globe; + const entity = env.dataSources[0].entities.values[0]; + const base = Cesium.Cartographic.fromCartesian(entity.__localBaseCartesian); + const ground = Cesium.Cartesian3.fromRadians(base.longitude, base.latitude, 2_500); + const position = Cesium.Cartesian3.fromRadians( + base.longitude, + base.latitude - 3_000 / 6_371_000, + 2_500 + 1_000, + ); + const direction = Cesium.Cartesian3.normalize( + Cesium.Cartesian3.subtract(ground, position, new Cesium.Cartesian3()), + new Cesium.Cartesian3(), + ); + const right = Cesium.Cartesian3.normalize( + Cesium.Cartesian3.cross( + direction, + Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(position), + new Cesium.Cartesian3(), + ), + new Cesium.Cartesian3(), + ); + const up = Cesium.Cartesian3.cross(right, direction, new Cesium.Cartesian3()); + const frustum = new Cesium.PerspectiveFrustum({ + fov: Math.PI / 3, + aspectRatio: 800 / 600, + near: 1, + far: 1e8, + }); + Object.assign(env.viewer.camera, { + positionWC: position, + directionWC: direction, + upWC: up, + frustum, + }); + const offScreen = frustum + .computeCullingVolume(position, direction, up) + .computeVisibility(new Cesium.BoundingSphere(entity.__localBaseCartesian, 1)); + assert.equal(offScreen, Cesium.Intersect.OUTSIDE, 'precondition: the ellipsoid-height base is off screen'); + + clock.advance(2_100); + env.preRender.raise(); + assert.equal(env.sampleCalls.count, 1, 'the ground in view is sampled'); + assert.ok(Math.abs(baseHeightM(env) - 2_500) < 0.01); + }); +} + test('settled terrain refinement lifts an already sampled stem without another GPU sample', async (t) => { const env = await createRealLocalLayerHarness({ sampleHeightSupported: true, sampleHeight: () => 117, diff --git a/src/data/localGeojsonCore.js b/src/data/localGeojsonCore.js index 9d97df61c..ec8fc824e 100644 --- a/src/data/localGeojsonCore.js +++ b/src/data/localGeojsonCore.js @@ -1140,29 +1140,60 @@ const groundSampleOccluder = new Cesium.EllipsoidalOccluder( Cesium.Ellipsoid.WGS84, ); +const groundSampleCarto = new Cesium.Cartographic(); +const groundSampleTop = new Cesium.Cartesian3(); + /** - * Whether the camera sees the record's base: inside the view frustum and - * above the horizon. scene.sampleHeight reads only surface rendered for the - * current view, so a sample of an unseen base passes through the Earth (about - * -6,344 km near Ashburn on Esri) and fails on every 2 s retry, each one a - * full offscreen render: 110 unseen data centres there held the page near 2 s - * a frame indefinitely. An unseen base keeps its stem at the unsampled height - * and is sampled on the first walk that sees it. + * Whether the camera can see the ground under the record: inside the view + * frustum and above the horizon. scene.sampleHeight reads only surface + * rendered for the current view, so a sample of unseen ground passes through + * the Earth (about -6,344 km near Ashburn on Esri) and fails on every 2 s + * retry, each one a full offscreen render; 110 unseen data centres there held + * rest frames at 58-589 ms. Unsampled bases sit on the ellipsoid, so the test + * uses loaded globe terrain when there is some, and otherwise every height a + * sample can accept (0 to GROUND_SAMPLE_MAX_ABS_HEIGHT_M): high ground in + * view is never mistaken for an unseen base. Unseen ground is sampled on the + * first walk that sees it. */ function groundSampleInView(viewer, record) { const camera = viewer.camera; + const globe = viewer.scene.globe; + const terrain = globe?.show ? globe.getHeight?.(record.carto) : undefined; + const known = + Number.isFinite(terrain) && + Math.abs(terrain) <= GROUND_SAMPLE_MAX_ABS_HEIGHT_M; + const span = GROUND_SAMPLE_MAX_ABS_HEIGHT_M / 2; + groundSampleCarto.longitude = record.carto.longitude; + groundSampleCarto.latitude = record.carto.latitude; + groundSampleCarto.height = known ? terrain : span; + Cesium.Cartographic.toCartesian( + groundSampleCarto, + Cesium.Ellipsoid.WGS84, + groundSampleSphere.center, + ); + groundSampleSphere.radius = known ? 1 : span; const culling = camera.frustum.computeCullingVolume( camera.positionWC, camera.directionWC, camera.upWC, ); - Cesium.Cartesian3.clone(record.base, groundSampleSphere.center); if ( culling.computeVisibility(groundSampleSphere) === Cesium.Intersect.OUTSIDE ) return false; + // The highest ground the sample could find is the last to drop below the + // horizon. + if (!known) groundSampleCarto.height = GROUND_SAMPLE_MAX_ABS_HEIGHT_M; groundSampleOccluder.cameraPosition = camera.positionWC; - return groundSampleOccluder.isPointVisible(record.base); + return groundSampleOccluder.isPointVisible( + known + ? groundSampleSphere.center + : Cesium.Cartographic.toCartesian( + groundSampleCarto, + Cesium.Ellipsoid.WGS84, + groundSampleTop, + ), + ); } function sampleLocalGroundHeight(viewer, record, now) { From f392eecbd969a0f8941b6ee2748bc58362a51865 Mon Sep 17 00:00:00 2001 From: quanticsoul4772 <71096528+quanticsoul4772@users.noreply.github.com> Date: Thu, 29 Oct 2026 01:47:05 -0700 Subject: [PATCH 020/153] fix(infrastructure): test ground below 0 m and unknown terrain correctly The ellipsoidal horizon test hid ground below the ellipsoid (low-geoid coasts, the Dead Sea) from a camera near it, so it is now tested at 0 m. With the globe hidden the ground is tested as the vertical from 0 to 9,000 m against the frustum planes, in place of a 4.5 km sphere that let in much unseen ground. Co-Authored-By: Claude Opus 5.5 --- docs/CURRENT-STATE.md | 11 +-- src/data/localGeojson.test.mjs | 128 +++++++++++++++++++++------------ src/data/localGeojsonCore.js | 77 +++++++++++--------- 3 files changed, 130 insertions(+), 86 deletions(-) diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 065d67112..4815e0fd1 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -1959,11 +1959,12 @@ during continuous motion. Disable/re-enable resets selection cleanly. Close-up stem sizing uses camera-to-feature distance without a 5 km minimum. Unchanged overlay entries do not request another frame; moved positions, changed membership and re-enabling still publish. Ground sampling waits for -visible globe tiles to settle, samples only markers whose ground is in the -camera's view and above the horizon (unseen ground reads through the Earth -and would retry every 2 s; until it is seen, a stem keeps its unsampled -height, which can show for a stem whose base is just off screen), and uses -valid loaded terrain as a floor while +visible globe tiles to settle, and skips markers whose ground the camera +cannot see (unseen ground reads through the Earth and would retry every 2 s). +Ground is tested at loaded globe terrain, or across 0-9,000 m when the globe +is hidden, so photoreal views skip only ground well out of view. Until it is +seen, a stem keeps its unsampled height, which can show for a stem whose base +is just off screen. Sampling uses valid loaded terrain as a floor while retaining rooftop and below-sea-level elevations. A hidden globe does not constrain photoreal geometry, and retry work remains bounded. Already sampled nearby markers follow higher settled terrain on existing bounded walks, without diff --git a/src/data/localGeojson.test.mjs b/src/data/localGeojson.test.mjs index 1c47cb8c1..3e104592f 100644 --- a/src/data/localGeojson.test.mjs +++ b/src/data/localGeojson.test.mjs @@ -113,8 +113,13 @@ async function createRealLocalLayerHarness({ upWC: new Cesium.Cartesian3(), frustum: { fov: Math.PI / 3, + // No planes: everything is in view. One plane no point satisfies: + // nothing is. computeCullingVolume: () => ({ - computeVisibility: () => baseVisibility, + planes: + baseVisibility === Cesium.Intersect.OUTSIDE + ? [new Cesium.Cartesian4(0, 0, 0, -1)] + : [], }), }, moveEnd, @@ -787,64 +792,95 @@ test('an unseen base is not sampled and arms no retry until it is in view', asyn assert.ok(Math.abs(baseHeightM(env) - 117) < 0.01); }); -for (const [label, globe] of [ - ['loaded terrain', { show: true, tilesLoaded: true, getHeight: () => 2_500 }], - ['a hidden globe', { show: false, tilesLoaded: true, getHeight: () => undefined }], +/** + * Give the harness a real Cesium camera `southM` metres south of the base at + * `cameraM` metres above the ellipsoid, looking at the base's ground at + * `groundM` (or directly away from it). + */ +function aimRealCamera(env, { groundM, cameraM, southM, away = false }) { + const entity = env.dataSources[0].entities.values[0]; + const base = Cesium.Cartographic.fromCartesian(entity.__localBaseCartesian); + const ground = Cesium.Cartesian3.fromRadians(base.longitude, base.latitude, groundM); + const position = Cesium.Cartesian3.fromRadians( + base.longitude, + base.latitude - southM / 6_371_000, + cameraM, + ); + const direction = Cesium.Cartesian3.normalize( + away + ? Cesium.Cartesian3.subtract(position, ground, new Cesium.Cartesian3()) + : Cesium.Cartesian3.subtract(ground, position, new Cesium.Cartesian3()), + new Cesium.Cartesian3(), + ); + const right = Cesium.Cartesian3.normalize( + Cesium.Cartesian3.cross( + direction, + Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(position), + new Cesium.Cartesian3(), + ), + new Cesium.Cartesian3(), + ); + const up = Cesium.Cartesian3.cross(right, direction, new Cesium.Cartesian3()); + const frustum = new Cesium.PerspectiveFrustum({ + fov: Math.PI / 3, + aspectRatio: 800 / 600, + near: 1, + far: 1e8, + }); + Object.assign(env.viewer.camera, { + positionWC: position, + directionWC: direction, + upWC: up, + frustum, + }); + return frustum + .computeCullingVolume(position, direction, up) + .computeVisibility(new Cesium.BoundingSphere(entity.__localBaseCartesian, 1)); +} + +const loadedTerrain = (height) => ({ show: true, tilesLoaded: true, getHeight: () => height }); +const hiddenGlobe = { show: false, tilesLoaded: true, getHeight: () => undefined }; + +for (const { label, globe, groundM, cameraM, southM, baseOffScreen } of [ + // 2,500 m terrain from 3 km away at a shallow angle: the ellipsoid-height + // base is far below the bottom of the screen. + { label: 'high ground with loaded terrain', globe: loadedTerrain(2_500), groundM: 2_500, cameraM: 3_500, southM: 3_000, baseOffScreen: true }, + { label: 'high ground under a hidden globe', globe: hiddenGlobe, groundM: 2_500, cameraM: 3_500, southM: 3_000, baseOffScreen: true }, + // A low-geoid coast (about -63 m near Mumbai) from a camera 50 m above the + // ellipsoid: the ellipsoidal horizon would hide the ground itself. + { label: 'ground below the ellipsoid', globe: loadedTerrain(-63), groundM: -63, cameraM: 50, southM: 2_000, baseOffScreen: false }, ]) { - test(`high ground in view is sampled with ${label} although its unsampled base projects off screen`, async (t) => { - // A base on 2,500 m terrain, seen from 3 km away at a shallow angle: its - // ellipsoid-height point is far below the bottom of the screen. + test(`${label} in view is sampled`, async (t) => { const env = await createRealLocalLayerHarness({ - sampleHeightSupported: true, sampleHeight: () => 2_500, + sampleHeightSupported: true, sampleHeight: () => groundM, }); const clock = installFakeClock(t); t.after(() => { env.layer.destroy(env.viewer); env.cleanup(); }); env.viewer.scene.globe = globe; - const entity = env.dataSources[0].entities.values[0]; - const base = Cesium.Cartographic.fromCartesian(entity.__localBaseCartesian); - const ground = Cesium.Cartesian3.fromRadians(base.longitude, base.latitude, 2_500); - const position = Cesium.Cartesian3.fromRadians( - base.longitude, - base.latitude - 3_000 / 6_371_000, - 2_500 + 1_000, - ); - const direction = Cesium.Cartesian3.normalize( - Cesium.Cartesian3.subtract(ground, position, new Cesium.Cartesian3()), - new Cesium.Cartesian3(), - ); - const right = Cesium.Cartesian3.normalize( - Cesium.Cartesian3.cross( - direction, - Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(position), - new Cesium.Cartesian3(), - ), - new Cesium.Cartesian3(), - ); - const up = Cesium.Cartesian3.cross(right, direction, new Cesium.Cartesian3()); - const frustum = new Cesium.PerspectiveFrustum({ - fov: Math.PI / 3, - aspectRatio: 800 / 600, - near: 1, - far: 1e8, - }); - Object.assign(env.viewer.camera, { - positionWC: position, - directionWC: direction, - upWC: up, - frustum, - }); - const offScreen = frustum - .computeCullingVolume(position, direction, up) - .computeVisibility(new Cesium.BoundingSphere(entity.__localBaseCartesian, 1)); - assert.equal(offScreen, Cesium.Intersect.OUTSIDE, 'precondition: the ellipsoid-height base is off screen'); + const baseVisibility = aimRealCamera(env, { groundM, cameraM, southM }); + if (baseOffScreen) + assert.equal(baseVisibility, Cesium.Intersect.OUTSIDE, 'precondition: the ellipsoid-height base is off screen'); clock.advance(2_100); env.preRender.raise(); assert.equal(env.sampleCalls.count, 1, 'the ground in view is sampled'); - assert.ok(Math.abs(baseHeightM(env) - 2_500) < 0.01); + assert.ok(Math.abs(baseHeightM(env) - groundM) < 0.01); }); } +test('under a hidden globe, ground behind the camera is not sampled', async (t) => { + const env = await createRealLocalLayerHarness({ + sampleHeightSupported: true, sampleHeight: () => 2_500, + }); + const clock = installFakeClock(t); + t.after(() => { env.layer.destroy(env.viewer); env.cleanup(); }); + env.viewer.scene.globe = hiddenGlobe; + aimRealCamera(env, { groundM: 2_500, cameraM: 3_500, southM: 3_000, away: true }); + clock.advance(2_100); + env.preRender.raise(); + assert.equal(env.sampleCalls.count, 0); +}); + test('settled terrain refinement lifts an already sampled stem without another GPU sample', async (t) => { const env = await createRealLocalLayerHarness({ sampleHeightSupported: true, sampleHeight: () => 117, diff --git a/src/data/localGeojsonCore.js b/src/data/localGeojsonCore.js index ec8fc824e..596b78ed9 100644 --- a/src/data/localGeojsonCore.js +++ b/src/data/localGeojsonCore.js @@ -1131,17 +1131,25 @@ function refreshLocalTerrainFloor(viewer, record) { return true; } -const groundSampleSphere = new Cesium.BoundingSphere( - new Cesium.Cartesian3(), - 1, -); - const groundSampleOccluder = new Cesium.EllipsoidalOccluder( Cesium.Ellipsoid.WGS84, ); const groundSampleCarto = new Cesium.Cartographic(); -const groundSampleTop = new Cesium.Cartesian3(); +const groundSampleLow = new Cesium.Cartesian3(); +const groundSampleHigh = new Cesium.Cartesian3(); + +/** The record's vertical at `height` metres above the ellipsoid. */ +function groundSamplePoint(record, height, result) { + groundSampleCarto.longitude = record.carto.longitude; + groundSampleCarto.latitude = record.carto.latitude; + groundSampleCarto.height = height; + return Cesium.Cartographic.toCartesian( + groundSampleCarto, + Cesium.Ellipsoid.WGS84, + result, + ); +} /** * Whether the camera can see the ground under the record: inside the view @@ -1150,10 +1158,10 @@ const groundSampleTop = new Cesium.Cartesian3(); * the Earth (about -6,344 km near Ashburn on Esri) and fails on every 2 s * retry, each one a full offscreen render; 110 unseen data centres there held * rest frames at 58-589 ms. Unsampled bases sit on the ellipsoid, so the test - * uses loaded globe terrain when there is some, and otherwise every height a - * sample can accept (0 to GROUND_SAMPLE_MAX_ABS_HEIGHT_M): high ground in - * view is never mistaken for an unseen base. Unseen ground is sampled on the - * first walk that sees it. + * uses loaded globe terrain when there is some. Otherwise (a hidden globe) it + * tests the vertical from 0 to GROUND_SAMPLE_MAX_ABS_HEIGHT_M, every height a + * sample can accept, so high ground in view is never mistaken for an unseen + * base. Unseen ground is sampled on the first walk that sees it. */ function groundSampleInView(viewer, record) { const camera = viewer.camera; @@ -1162,37 +1170,36 @@ function groundSampleInView(viewer, record) { const known = Number.isFinite(terrain) && Math.abs(terrain) <= GROUND_SAMPLE_MAX_ABS_HEIGHT_M; - const span = GROUND_SAMPLE_MAX_ABS_HEIGHT_M / 2; - groundSampleCarto.longitude = record.carto.longitude; - groundSampleCarto.latitude = record.carto.latitude; - groundSampleCarto.height = known ? terrain : span; - Cesium.Cartographic.toCartesian( - groundSampleCarto, - Cesium.Ellipsoid.WGS84, - groundSampleSphere.center, - ); - groundSampleSphere.radius = known ? 1 : span; - const culling = camera.frustum.computeCullingVolume( + const low = groundSamplePoint(record, known ? terrain : 0, groundSampleLow); + const high = known + ? low + : groundSamplePoint( + record, + GROUND_SAMPLE_MAX_ABS_HEIGHT_M, + groundSampleHigh, + ); + // The vertical is unseen only when both ends are outside the same plane. + const { planes } = camera.frustum.computeCullingVolume( camera.positionWC, camera.directionWC, camera.upWC, ); - if ( - culling.computeVisibility(groundSampleSphere) === Cesium.Intersect.OUTSIDE - ) - return false; - // The highest ground the sample could find is the last to drop below the - // horizon. - if (!known) groundSampleCarto.height = GROUND_SAMPLE_MAX_ABS_HEIGHT_M; + for (const plane of planes) { + if ( + Cesium.Cartesian3.dot(plane, low) + plane.w < 0 && + Cesium.Cartesian3.dot(plane, high) + plane.w < 0 + ) + return false; + } + // The ellipsoidal occluder hides every point below the ellipsoid from a + // camera near it, so ground below 0 m (low-geoid coasts, the Dead Sea) is + // tested at 0 m; unknown ground at the top of the vertical. + const horizonHeight = known + ? Math.max(terrain, 0) + : GROUND_SAMPLE_MAX_ABS_HEIGHT_M; groundSampleOccluder.cameraPosition = camera.positionWC; return groundSampleOccluder.isPointVisible( - known - ? groundSampleSphere.center - : Cesium.Cartographic.toCartesian( - groundSampleCarto, - Cesium.Ellipsoid.WGS84, - groundSampleTop, - ), + groundSamplePoint(record, horizonHeight, groundSampleHigh), ); } From b778a43f1d7538a10d29f89b0611c29e3dabfe6e Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Thu, 29 Oct 2026 17:05:14 +0400 Subject: [PATCH 021/153] feat(fires): Snap Map-style heat raster and its globe imagery drape Detections are binned on a 2048x1024 equirectangular grid weighted 1 + log10(1 + FRP), Gaussian-blurred (longitude wraps), normalized on a log scale against the 99.5th percentile and mapped blue -> red with an alpha ramp that is fully transparent below the floor. heatImagery drapes the bytes as one full-globe SingleTileImageryProvider on the active imagery host. Co-Authored-By: Claude Opus 5.5 --- src/data/firmsHeatRaster.js | 176 ++++++++++++++++++++++++++ src/data/firmsHeatRaster.test.mjs | 73 +++++++++++ src/layers/firms/heatImagery.js | 71 +++++++++++ src/layers/firms/heatImagery.test.mjs | 87 +++++++++++++ 4 files changed, 407 insertions(+) create mode 100644 src/data/firmsHeatRaster.js create mode 100644 src/data/firmsHeatRaster.test.mjs create mode 100644 src/layers/firms/heatImagery.js create mode 100644 src/layers/firms/heatImagery.test.mjs diff --git a/src/data/firmsHeatRaster.js b/src/data/firmsHeatRaster.js new file mode 100644 index 000000000..52a020671 --- /dev/null +++ b/src/data/firmsHeatRaster.js @@ -0,0 +1,176 @@ +/** + * Snap Map–style heat raster for the Active Fires far-zoom bands: detections + * are binned on an equirectangular grid (row 0 = north, column 0 = 180°W), + * blurred, normalized on a log scale and mapped through HEAT_PALETTE. Pure: + * no Cesium, no DOM, so the whole pipeline is unit-tested in node. + */ + +/** Below this normalized heat nothing is painted: empty land stays empty. */ +export const HEAT_FLOOR = 0.03; + +export const HEAT_PALETTE = Object.freeze([ + { at: 0.0, rgb: [43, 108, 255], alpha: 0 }, + { at: 0.08, rgb: [43, 108, 255], alpha: 0.35 }, + { at: 0.25, rgb: [25, 195, 255], alpha: 0.55 }, + { at: 0.45, rgb: [47, 224, 122], alpha: 0.65 }, + { at: 0.65, rgb: [245, 230, 66], alpha: 0.75 }, + { at: 0.82, rgb: [255, 138, 31], alpha: 0.82 }, + { at: 1.0, rgb: [255, 42, 26], alpha: 0.88 }, +]); + +export function heatColorAt(t) { + if (!(t > HEAT_FLOOR)) return [0, 0, 0, 0]; + const v = Math.min(1, t); + let i = 1; + while (i < HEAT_PALETTE.length - 1 && HEAT_PALETTE[i].at < v) i += 1; + const a = HEAT_PALETTE[i - 1]; + const b = HEAT_PALETTE[i]; + const k = (v - a.at) / (b.at - a.at || 1); + const mix = (p, q) => Math.round(p + (q - p) * k); + return [ + mix(a.rgb[0], b.rgb[0]), + mix(a.rgb[1], b.rgb[1]), + mix(a.rgb[2], b.rgb[2]), + Math.round((a.alpha + (b.alpha - a.alpha) * k) * 255), + ]; +} + +const defaultWeight = (fire) => + 1 + Math.log10(1 + Math.max(0, Number(fire.frp) || 0)); + +export function binFires(fires, { width, height, weight = defaultWeight }) { + const grid = new Float32Array(width * height); + for (const fire of fires) { + if (!Number.isFinite(fire.lat) || !Number.isFinite(fire.lon)) continue; + const x = Math.min( + width - 1, + Math.max(0, Math.floor(((fire.lon + 180) / 360) * width)), + ); + const y = Math.min( + height - 1, + Math.max(0, Math.floor(((90 - fire.lat) / 180) * height)), + ); + grid[y * width + x] += weight(fire); + } + return grid; +} + +function kernel(sigma) { + const radius = Math.max(1, Math.ceil(sigma * 3)); + const k = new Float32Array(radius * 2 + 1); + let sum = 0; + for (let i = -radius; i <= radius; i++) { + k[i + radius] = Math.exp(-(i * i) / (2 * sigma * sigma)); + sum += k[i + radius]; + } + for (let i = 0; i < k.length; i++) k[i] /= sum; + return { k, radius }; +} + +export function blurGaussian(grid, width, height, sigma) { + const { k, radius } = kernel(sigma); + const tmp = new Float32Array(grid.length); + const out = new Float32Array(grid.length); + for (let y = 0; y < height; y++) { + const row = y * width; + for (let x = 0; x < width; x++) { + const v = grid[row + x]; + if (v === 0) continue; + for (let i = -radius; i <= radius; i++) { + const xx = (((x + i) % width) + width) % width; // longitude wraps + tmp[row + xx] += v * k[i + radius]; + } + } + } + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const v = tmp[y * width + x]; + if (v === 0) continue; + for (let i = -radius; i <= radius; i++) { + const yy = Math.min(height - 1, Math.max(0, y + i)); // poles clamp + out[yy * width + x] += v * k[i + radius]; + } + } + } + return out; +} + +/** Bins of the log-density histogram used to find the reference quantile. */ +const QUANTILE_BINS = 4096; + +/** + * The p-quantile of the non-zero values, from a histogram of log1p(value): + * one linear pass instead of sorting ~350k burning pixels (a sort cost + * 200 ms+ and dominated the build). Bin width on the log axis is + * max/4096, far finer than the 256-step palette it feeds. + */ +function percentileOfNonZero(values, p) { + let count = 0; + let max = 0; + for (let i = 0; i < values.length; i++) { + const v = values[i]; + if (v > 0) { + count += 1; + if (v > max) max = v; + } + } + if (!count) return 0; + const logMax = Math.log1p(max); + const bins = new Uint32Array(QUANTILE_BINS); + const toBin = (QUANTILE_BINS - 1) / logMax; + for (let i = 0; i < values.length; i++) { + const v = values[i]; + if (v > 0) bins[Math.floor(Math.log1p(v) * toBin)] += 1; + } + const target = Math.floor(p * (count - 1)); + let seen = 0; + for (let b = 0; b < QUANTILE_BINS; b++) { + seen += bins[b]; + if (seen > target) return Math.expm1((b + 1) / toBin); + } + return max; +} + +/** HEAT_PALETTE sampled at 256 steps, so the per-pixel walk is one lookup. */ +const LUT_STEPS = 256; +let paletteLut = null; +function heatLut() { + if (!paletteLut) { + paletteLut = new Uint8ClampedArray(LUT_STEPS * 4); + for (let i = 0; i < LUT_STEPS; i++) { + paletteLut.set(heatColorAt(i / (LUT_STEPS - 1)), i * 4); + } + } + return paletteLut; +} + +export function buildHeatRaster( + fires, + { width, height, sigmaPx, percentile = 0.995 }, +) { + const density = blurGaussian( + binFires(fires, { width, height }), + width, + height, + sigmaPx, + ); + const reference = percentileOfNonZero(density, percentile); + const rgba = new Uint8ClampedArray(width * height * 4); + if (reference > 0) { + const lut = heatLut(); + const scale = (LUT_STEPS - 1) / Math.log1p(reference); + for (let i = 0; i < density.length; i++) { + const d = density[i]; + if (d <= 0) continue; + const step = Math.min(LUT_STEPS - 1, Math.round(Math.log1p(d) * scale)); + const l = step * 4; + if (lut[l + 3] === 0) continue; + const o = i * 4; + rgba[o] = lut[l]; + rgba[o + 1] = lut[l + 1]; + rgba[o + 2] = lut[l + 2]; + rgba[o + 3] = lut[l + 3]; + } + } + return { width, height, rgba, reference }; +} diff --git a/src/data/firmsHeatRaster.test.mjs b/src/data/firmsHeatRaster.test.mjs new file mode 100644 index 000000000..704c83427 --- /dev/null +++ b/src/data/firmsHeatRaster.test.mjs @@ -0,0 +1,73 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { + HEAT_PALETTE, + heatColorAt, + binFires, + blurGaussian, + buildHeatRaster, +} from './firmsHeatRaster.js'; + +const fire = (lat, lon, frp = 10) => ({ lat, lon, frp }); + +test('palette runs cold to hot and starts fully transparent', () => { + assert.equal(HEAT_PALETTE[0].at, 0); + assert.equal(HEAT_PALETTE.at(-1).at, 1); + assert.deepEqual(heatColorAt(0), [0, 0, 0, 0]); + assert.equal(heatColorAt(0.01)[3], 0, 'below the floor nothing is painted'); + const low = heatColorAt(0.15); + const high = heatColorAt(1); + assert.ok(low[2] > low[0], 'low heat is blue'); + assert.ok(high[0] > high[2], 'the core is red'); + assert.ok(high[3] > low[3], 'hotter is more opaque'); +}); + +test('binFires drops each detection into its equirectangular pixel', () => { + const grid = binFires([fire(89.9, -179.9, 0), fire(-89.9, 179.9, 0)], { + width: 4, + height: 2, + }); + assert.equal(grid[0], 1, 'north-west corner'); + assert.equal(grid[7], 1, 'south-east corner'); + assert.equal( + grid.reduce((a, b) => a + b, 0), + 2, + ); +}); + +test('binFires weights strong fires slightly more', () => { + const grid = binFires([fire(0.1, 0.1, 999)], { width: 4, height: 2 }); + assert.ok(grid[2] > 3 && grid[2] < 5, String(grid[2])); +}); + +test('blurGaussian keeps mass and wraps across the antimeridian', () => { + const w = 16; + const h = 8; + const grid = new Float32Array(w * h); + grid[3 * w + 0] = 1; + const out = blurGaussian(grid, w, h, 1.5); + const sum = out.reduce((a, b) => a + b, 0); + assert.ok(Math.abs(sum - 1) < 1e-3, `mass ${sum}`); + assert.ok(out[3 * w + (w - 1)] > 0, 'spills to the east edge'); +}); + +test('buildHeatRaster is transparent where there are no fires', () => { + const r = buildHeatRaster([fire(40, -120), fire(40.1, -120.1)], { + width: 360, + height: 180, + sigmaPx: 2, + }); + assert.equal(r.rgba.length, 360 * 180 * 4); + const alphaAt = (lat, lon) => { + const x = Math.floor(((lon + 180) / 360) * 360); + const y = Math.floor(((90 - lat) / 180) * 180); + return r.rgba[(y * 360 + x) * 4 + 3]; + }; + assert.ok(alphaAt(40, -120) > 0, 'blob over the fires'); + assert.equal(alphaAt(-30, 60), 0, 'empty far away'); +}); + +test('buildHeatRaster with no fires is fully transparent', () => { + const r = buildHeatRaster([], { width: 8, height: 4, sigmaPx: 1 }); + assert.ok(r.rgba.every((v) => v === 0)); +}); diff --git a/src/layers/firms/heatImagery.js b/src/layers/firms/heatImagery.js new file mode 100644 index 000000000..f2f99fbe6 --- /dev/null +++ b/src/layers/firms/heatImagery.js @@ -0,0 +1,71 @@ +/** + * Drapes the Active Fires heat raster over the globe as one full-extent + * imagery tile on the active imagery host (globe or 3D-tiles), like the wind + * layer's scalar field. Owns the canvas and the imagery layer; nothing else + * in the fires layer touches imagery. + */ + +const defaultCanvas = (width, height) => { + const canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + return canvas; +}; + +export function createHeatImagery({ + cesium, + getHost, + createCanvas = defaultCanvas, +}) { + let raster = null; + let layer = null; + let collection = null; + let show = true; + + function detach() { + if (layer && collection) collection.remove(layer, true); + layer = null; + collection = null; + } + + function attach() { + detach(); + if (!raster) return; + const host = getHost?.() ?? { collection: null, kind: 'none' }; + if (!host.collection) return; + const canvas = createCanvas(raster.width, raster.height); + const ctx = canvas.getContext('2d'); + const image = ctx.createImageData(raster.width, raster.height); + image.data.set(raster.rgba); + ctx.putImageData(image, 0, 0); + const provider = new cesium.SingleTileImageryProvider({ + url: canvas.toDataURL('image/png'), + tileWidth: raster.width, + tileHeight: raster.height, + rectangle: cesium.Rectangle.MAX_VALUE, + }); + collection = host.collection; + layer = collection.addImageryProvider(provider); + layer.show = show; + collection.raiseToTop?.(layer); + } + + return { + setRaster(next) { + raster = next; + attach(); + }, + setShow(value) { + show = Boolean(value); + if (layer) layer.show = show; + }, + rehome() { + const host = getHost?.(); + if ((host?.collection ?? null) !== collection) attach(); + }, + destroy() { + detach(); + raster = null; + }, + }; +} diff --git a/src/layers/firms/heatImagery.test.mjs b/src/layers/firms/heatImagery.test.mjs new file mode 100644 index 000000000..0fca7b97f --- /dev/null +++ b/src/layers/firms/heatImagery.test.mjs @@ -0,0 +1,87 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { createHeatImagery } from './heatImagery.js'; + +function harness() { + const layers = []; + const removed = []; + const collection = { + addImageryProvider(provider) { + const layer = { provider, show: true, alpha: 1 }; + layers.push(layer); + return layer; + }, + remove(layer, destroy) { + layers.splice(layers.indexOf(layer), 1); + removed.push({ layer, destroy }); + }, + raiseToTop() {}, + }; + let host = { collection, kind: 'globe' }; + const cesium = { + Rectangle: { MAX_VALUE: { max: true } }, + SingleTileImageryProvider: class { + constructor(options) { + this.options = options; + } + }, + }; + const createCanvas = (w, h) => ({ + width: w, + height: h, + getContext: () => ({ + createImageData: (cw, ch) => ({ + data: new Uint8ClampedArray(cw * ch * 4), + }), + putImageData() {}, + }), + toDataURL: () => 'data:image/png;base64,AAAA', + }); + const imagery = createHeatImagery({ + cesium, + getHost: () => host, + createCanvas, + }); + return { imagery, layers, removed, collection, setHost: (h) => (host = h) }; +} + +const raster = { width: 4, height: 2, rgba: new Uint8ClampedArray(32) }; + +test('setRaster drapes one full-globe tile and replaces it on the next build', () => { + const h = harness(); + h.imagery.setRaster(raster); + assert.equal(h.layers.length, 1); + assert.deepEqual(h.layers[0].provider.options.rectangle, { max: true }); + assert.equal(h.layers[0].provider.options.tileWidth, 4); + h.imagery.setRaster(raster); + assert.equal(h.layers.length, 1, 'never two heat layers'); + assert.equal(h.removed[0].destroy, true); +}); + +test('setShow toggles without rebuilding', () => { + const h = harness(); + h.imagery.setRaster(raster); + const layer = h.layers[0]; + h.imagery.setShow(false); + assert.equal(layer.show, false); + h.imagery.setShow(true); + assert.equal(h.layers[0], layer); + assert.equal(layer.show, true); +}); + +test('no imagery host keeps nothing draped; rehome brings it back', () => { + const h = harness(); + h.setHost({ collection: null, kind: 'none' }); + h.imagery.setRaster(raster); + assert.equal(h.layers.length, 0); + h.setHost({ collection: h.collection, kind: 'globe' }); + h.imagery.rehome(); + assert.equal(h.layers.length, 1); +}); + +test('destroy removes the layer', () => { + const h = harness(); + h.imagery.setRaster(raster); + h.imagery.destroy(); + assert.equal(h.layers.length, 0); +}); From de87aaf86acfbf3fd358833c6478e93d9718d3f8 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Thu, 29 Oct 2026 17:11:32 +0400 Subject: [PATCH 022/153] feat(fires): far zoom shows a Snap Map-style heatmap instead of heat squares The global and regional LOD bands drape the heat raster on the active imagery host and draw no rectangle entities; the 2/1 degree aggregation now only feeds the "N FIRES" cards, whose accent is the strongest fire's FRP color. Markers below ~750 km hide the heatmap, as do disable and destroy. A stale raster is rebuilt immediately on first paint and with a 150 ms trailing debounce afterwards, so a slider drag does not re-encode on every step. The shell hands the layer its imagery host, so the heatmap follows globe and 3D-tiles map stacks. Co-Authored-By: Claude Opus 5.5 --- src/data/firmsInteraction.test.mjs | 75 ++++++++++++++++++ src/layers/firms/heatImagery.js | 4 + src/layers/firms/ingestion.js | 7 +- src/layers/firms/lifecycle.js | 24 ++++++ src/layers/firms/model.js | 48 ++---------- src/layers/firms/policy.js | 32 ++++++-- src/layers/firms/queries.js | 15 +++- src/layers/firms/rendering.js | 119 +++++++++++++++++++---------- src/layers/firms/state.js | 19 +++++ src/ui/layerBindings.js | 6 ++ 10 files changed, 257 insertions(+), 92 deletions(-) diff --git a/src/data/firmsInteraction.test.mjs b/src/data/firmsInteraction.test.mjs index d735df3f8..39f0382c8 100644 --- a/src/data/firmsInteraction.test.mjs +++ b/src/data/firmsInteraction.test.mjs @@ -392,3 +392,78 @@ test('disable cancels a pending source and a late response cannot repopulate the assert.equal(h.layer.getStats().loading, false); } finally { h.layer.destroy(h.viewer); h.cleanup(); } }); + +test('far zoom drapes one heatmap and draws no rectangles; markers and disable hide it', () => { + // A canvas stub for the heat drape and the detection glow sprites. + const priorDocument = globalThis.document; + const restoreDocument = () => { + if (priorDocument === undefined) delete globalThis.document; + else globalThis.document = priorDocument; + }; + globalThis.document = { + createElement: () => ({ + getContext: () => ({ + createImageData: (w, hh) => ({ + data: new Uint8ClampedArray(w * hh * 4), + }), + putImageData() {}, + createRadialGradient: () => ({ addColorStop() {} }), + fillRect() {}, + }), + toDataURL: () => 'data:image/png;base64,AAAA', + }), + }; + const h = harness({ + fires: [makeFire(), makeFire({ index: 8, lat: 30.6, lon: -98.3, frp: 12 })], + withDataSource: true, + cameraPosition: Cesium.Cartesian3.fromDegrees(-98, 30, 12_000_000), + }); + const added = []; + const removed = []; + h.viewer.scene.primitives = { + add() {}, + remove() {}, + raiseToTop() {}, + contains: () => true, + }; + h.viewer.scene.frameState = { mode: Cesium.SceneMode.SCENE3D }; + try { + const collection = { + addImageryProvider: (provider) => { + const layer = { provider, show: true }; + added.push(layer); + return layer; + }, + remove: (layer, destroy) => removed.push({ layer, destroy }), + raiseToTop() {}, + }; + h.layer.attachShellServices({ + imageryHost: () => ({ kind: 'globe', collection }), + }); + h.layer._renderLodForTest('global'); + assert.equal(added.length, 1, 'one heat imagery layer'); + assert.equal(added[0].show, true); + assert.equal(h.layer._entityCountForTest(), 0, 'no rectangle entities'); + assert.ok(h.published.length > 0, 'the far band still paints cards'); + + h.layer._renderLodForTest('regional'); + assert.equal(added.length, 1, 'switching far bands reuses the raster'); + + h.layer._renderLodForTest('close'); + assert.equal(added[0].show, false, 'the markers band hides the heatmap'); + + h.layer._renderLodForTest('global'); + assert.equal(added[0].show, true); + h.layer.disable(); + assert.equal(added[0].show, false, 'disable hides the heatmap'); + + h.layer.destroy(h.viewer); + assert.deepEqual( + removed.map((entry) => [entry.layer, entry.destroy]), + [[added[0], true]], + ); + } finally { + h.cleanup(); + restoreDocument(); + } +}); diff --git a/src/layers/firms/heatImagery.js b/src/layers/firms/heatImagery.js index f2f99fbe6..31fbf1f69 100644 --- a/src/layers/firms/heatImagery.js +++ b/src/layers/firms/heatImagery.js @@ -55,6 +55,10 @@ export function createHeatImagery({ raster = next; attach(); }, + /** True once a raster was handed over (painted or waiting for a host). */ + hasRaster() { + return raster !== null; + }, setShow(value) { show = Boolean(value); if (layer) layer.show = show; diff --git a/src/layers/firms/ingestion.js b/src/layers/firms/ingestion.js index 215c35da3..cb9dbd72f 100644 --- a/src/layers/firms/ingestion.js +++ b/src/layers/firms/ingestion.js @@ -89,14 +89,15 @@ export function createIngestion({ /** * Run the intensity filter over the loaded payload. This is the ONE place * the shown set is derived: `_fires` / `_firesByFrp` feed markers, cards, - * heat cells, the context store, the top-fires query and the analyst - * records, so none of them can disagree about which fires exist. Cells are - * aggregated per shown set, so the cache goes with it. + * the heatmap, the context store, the top-fires query and the analyst + * records, so none of them can disagree about which fires exist. Cells and + * the heat raster are built per shown set, so their caches go with it. */ function applyFilter() { layerState._fires = filterFires(layerState._allFires, layerState._filter); layerState._cellCacheByGrid.clear(); + layerState._heatRaster = null; layerState._firesByFrp = filterFires( layerState._allFiresByFrp, layerState._filter, diff --git a/src/layers/firms/lifecycle.js b/src/layers/firms/lifecycle.js index 1138504dd..72434ad46 100644 --- a/src/layers/firms/lifecycle.js +++ b/src/layers/firms/lifecycle.js @@ -1,5 +1,6 @@ import * as Cesium from 'cesium'; import { FIRMS_OVERLAY_SOURCE_ID } from '../../data/firmsLabels.js'; +import { LOD_LEVELS } from './policy.js'; export function createLifecycle({ layerState, @@ -14,6 +15,20 @@ export function createLifecycle({ const { id, overlayHost } = config; const methods = { + /** + * Shell services: `imageryHost()` resolves where draped imagery goes on + * the active map stack (globe or 3D tiles, src/maps/imageryHost.js). The + * heatmap moves with it; without a host it drapes on viewer.imageryLayers. + * @param {{imageryHost?: () => {collection: ?Object, kind: string}}|null} services + */ + attachShellServices(services) { + layerState._imageryHost = + typeof services?.imageryHost === 'function' + ? services.imageryHost + : null; + layerState._heatImagery?.rehome(); + }, + init(viewer) { if (layerState._destroyed) return; layerState._viewer = viewer; @@ -40,6 +55,8 @@ export function createLifecycle({ layerState._billboards.show = true; } overlayHost.setVisible(FIRMS_OVERLAY_SOURCE_ID, true); + if (LOD_LEVELS[layerState._currentLodIndex]?.mode === 'heat') + layerState._heatImagery?.setShow(true); components.viewport.installLodWatcher(); components.viewport.installMoveEndWatcher(); components.selection.installClickHandler(); @@ -64,6 +81,7 @@ export function createLifecycle({ components.selection.clearFireSelection(); if (layerState._dataSource) layerState._dataSource.show = false; if (layerState._billboards) layerState._billboards.show = false; + layerState._heatImagery?.setShow(false); overlayHost.clearSource(FIRMS_OVERLAY_SOURCE_ID); overlayHost.setVisible(FIRMS_OVERLAY_SOURCE_ID, false); clearSelectedEntityContextForLayer(id); @@ -96,6 +114,12 @@ export function createLifecycle({ layerState._fires = []; layerState._firesByFrp = []; layerState._cellCacheByGrid.clear(); + clearTimeout(layerState._heatRebuildTimer); + layerState._heatRebuildTimer = null; + layerState._heatImagery?.destroy(); + layerState._heatImagery = null; + layerState._heatRaster = null; + layerState._imageryHost = null; layerState._count = 0; layerState._totalCount = 0; layerState._rowControlsListener = null; diff --git a/src/layers/firms/model.js b/src/layers/firms/model.js index 83f573c98..c3d3be71a 100644 --- a/src/layers/firms/model.js +++ b/src/layers/firms/model.js @@ -136,36 +136,6 @@ export function createModel({ ); } - /** - * Severity stop for an aggregated heat cell from its heat-normalized score - * (density, night share and strongest FRP together). Cells say *where* it - * burns, so they stay on the warm end of the ramp — lime, amber, red — and - * read as one field instead of a per-cell mosaic; the cold stops belong to - * single detections, which say *how hard* each one burns. - * @param {number} normalized - 0..1 heat score (sqrt-normalized to the view). - * @returns {{name: string, minFrp: number, color: Cesium.Color}} - */ - - function cellColorStop(normalized) { - const name = - normalized > 0.72 ? 'red' : normalized > 0.42 ? 'amber' : 'lime'; - return ( - DETECTION_COLOR_STOPS.find((stop) => stop.name === name) || - DETECTION_COLOR_STOPS[0] - ); - } - - /** - * Fill color for an aggregated heat cell. - * @param {number} normalized - 0..1 heat score (see {@link cellColorStop}). - * @param {number} alpha - Fill alpha (heat-normalized by the caller). - * @returns {Cesium.Color} - */ - - function heatColor(normalized, alpha) { - return cellColorStop(normalized).color.withAlpha(alpha); - } - /** * Pick a sprite color stop for one detection from its FRP on the shared ramp. * @param {Object} fire - Detection record. @@ -432,8 +402,8 @@ export function createModel({ /** * Card model for an aggregated heat cell, e.g. title "14 FIRES", detail - * "max 210 MW · new 3h". Accent comes from the candidate (heat-normalized - * score is only known at renderCells time). Exported for unit tests. + * "max 210 MW · new 3h". Accent comes from the candidate (renderHeat sets + * it with {@link cellCardAccent}). Exported for unit tests. * @param {{cell: Object, position: Cesium.Cartesian3, accent: string}} candidate * @param {number} nowMs - Current epoch milliseconds. * @returns {Object} firmsLabels entry. @@ -494,14 +464,14 @@ export function createModel({ } /** - * Cell card accent: the warm severity stop of the cell's heat score, - * mirroring heatColor. - * @param {number} normalized - 0..1 heat score. + * Cell card accent: the cell's strongest fire on the FRP ramp, the same + * color its markers take once the camera is close enough to show them. + * @param {{maxFrp?: number}} cell - Aggregated cell. * @returns {string} "r, g, b" accent string. */ - function cellAccent(normalized) { - return accentForSeverity(cellColorStop(normalized).name); + function cellCardAccent(cell) { + return accentForSeverity(frpColorStop(cell?.maxFrp ?? 0).name); } /** Coordinate line like "30.512°N 75.831°E". */ @@ -607,8 +577,6 @@ export function createModel({ boundsContainPoint, cellIntersectsBounds, heatScore, - heatColor, - cellColorStop, frpColorStop, detectionColorStop, frpPixelSize, @@ -623,7 +591,7 @@ export function createModel({ buildFireCard, buildCellCard, applyFirmsOverlayPolicy, - cellAccent, + cellCardAccent, formatLatLon, formatFrp, formatAge, diff --git a/src/layers/firms/policy.js b/src/layers/firms/policy.js index 18ea88238..eb235bc81 100644 --- a/src/layers/firms/policy.js +++ b/src/layers/firms/policy.js @@ -7,9 +7,10 @@ import * as Cesium from 'cesium'; export const REFRESH_INTERVAL_MS = 600_000; /** - * LOD bands keyed by camera height. `cells` bands render aggregated - * ground-clamped heat rectangles; `detections` bands (< ~750km plus the - * local band) render individual fire detections as glow-sprite billboards. + * LOD bands keyed by camera height. `heat` bands (above ~3,000 km) drape a + * Snap Map–style heatmap over the globe (firmsHeatRaster.js); their + * `gridDegrees` aggregation only feeds the "N FIRES" cards. `detections` + * bands render individual fire detections as glow-sprite billboards. * Labels in every band go through the shared screen-space greedy declutter * (hard cap MAX_AMBIENT_LABELS) — there are no per-band label knobs. */ @@ -18,7 +19,7 @@ export const LOD_LEVELS = [ { id: 'global', minHeight: 9000000, - mode: 'cells', + mode: 'heat', gridDegrees: 2.0, maxCells: 1800, labelDistance: 12000000, @@ -26,7 +27,7 @@ export const LOD_LEVELS = [ { id: 'regional', minHeight: 3000000, - mode: 'cells', + mode: 'heat', gridDegrees: 1.0, maxCells: 3600, labelDistance: 8500000, @@ -47,6 +48,25 @@ export const LOD_LEVELS = [ }, ]; +/** + * Global heat raster for the `heat` bands: ≈0.18° per pixel, Gaussian σ in + * pixels. Built once per data refresh or filter change, never per camera move. + */ + +export const HEAT_RASTER = Object.freeze({ + width: 2048, + height: 1024, + sigmaPx: 3, +}); + +/** + * Trailing delay before a stale heatmap is rebuilt while one is already on + * screen: a slider drag fires many filter changes, and a build plus PNG + * encode costs a few hundred milliseconds. The first paint is immediate. + */ + +export const HEAT_REBUILD_MS = 150; + export const LOD_CHECK_MS = 650; /** +/-10% hysteresis on LOD band edges so slow zooms don't thrash rebuilds. */ @@ -90,7 +110,7 @@ export const CULL_LIFT_THRESHOLD_M = 10; export const CULL_LIFT_M = 12; /** - * Color stops shared by cell heat fills and detection glow sprites: the + * Color stops for detection glow sprites and card accents: the * six-stop cold → hot FRP ramp (firmsIntensity.js), coldest first, as Cesium * colors. Stop names key the glow-sprite cache and the card accents. */ diff --git a/src/layers/firms/queries.js b/src/layers/firms/queries.js index 44ce8573d..797734597 100644 --- a/src/layers/firms/queries.js +++ b/src/layers/firms/queries.js @@ -9,7 +9,7 @@ import { sliderPositionForFrp, } from '../../data/firmsIntensity.js'; import { formatNumber, t } from '../../i18n/index.js'; -import { REFRESH_INTERVAL_MS } from './policy.js'; +import { LOD_LEVELS, REFRESH_INTERVAL_MS } from './policy.js'; /** Slider resolution: whole-percent positions along the log axis. */ const SLIDER_STEPS = 1000; @@ -309,6 +309,19 @@ export function createQueries({ return result; }, + /** Test seam: render one named LOD band against a near-global view. */ + _renderLodForTest(lodId) { + const lod = LOD_LEVELS.find((level) => level.id === lodId); + if (lod.mode === 'detections') + components.rendering.renderDetections(lod, null); + else components.rendering.renderHeat(lod, null); + }, + + /** Test seam: entities drawn by the layer's data source. */ + _entityCountForTest() { + return layerState._dataSource?.entities?.values?.length ?? 0; + }, + /** Test seam that binds the production click path and indexes. */ _bindInteractionForTest(viewer, fires = []) { layerState._viewer = viewer; diff --git a/src/layers/firms/rendering.js b/src/layers/firms/rendering.js index 8ae445f91..84a6eed36 100644 --- a/src/layers/firms/rendering.js +++ b/src/layers/firms/rendering.js @@ -1,7 +1,14 @@ import * as Cesium from 'cesium'; import { FIRMS_OVERLAY_SOURCE_ID } from '../../data/firmsLabels.js'; import { horizonOccluder } from '../../data/iconOrientation.js'; -import { LOD_LEVELS, CONTEXT_TOP_N } from './policy.js'; +import { buildHeatRaster } from '../../data/firmsHeatRaster.js'; +import { + LOD_LEVELS, + CONTEXT_TOP_N, + HEAT_RASTER, + HEAT_REBUILD_MS, +} from './policy.js'; +import { createHeatImagery } from './heatImagery.js'; export function createRendering({ layerState, @@ -29,8 +36,11 @@ export function createRendering({ !layerState._dataSource || !layerState._fires.length || !layerState._viewer - ) + ) { + // A filter that leaves nothing shown must not leave the old heat behind. + if (!layerState._fires.length) layerState._heatImagery?.setShow(false); return false; + } const lodIndex = components.viewport.selectLodIndex( components.viewport.cameraHeight(), ); @@ -54,7 +64,7 @@ export function createRendering({ if (lod.mode === 'detections') { renderDetections(lod, bounds); } else { - renderCells(aggregateFires(lod, bounds), lod, bounds); + renderHeat(lod, bounds); } return true; } @@ -118,65 +128,89 @@ export function createRendering({ return clipped; } + /** The heat imagery adapter, created on first use. */ + + function heatImagery() { + if (!layerState._heatImagery) { + layerState._heatImagery = createHeatImagery({ + cesium: Cesium, + getHost: () => + layerState._imageryHost?.() ?? { + collection: layerState._viewer?.imageryLayers ?? null, + kind: 'globe', + }, + }); + } + return layerState._heatImagery; + } + + /** Build the heat raster from the shown set and drape it. */ + + function rebuildHeatRaster() { + clearTimeout(layerState._heatRebuildTimer); + layerState._heatRebuildTimer = null; + if (layerState._destroyed) return; + layerState._heatRaster = buildHeatRaster(layerState._fires, HEAT_RASTER); + heatImagery().setRaster(layerState._heatRaster); + } + /** - * Render aggregated heat cells (global/regional bands) as ground-clamped - * rectangles. Cell labels do NOT live on the entities anymore — they go - * through the same unclamped, screen-space-decluttered label pipeline as - * detections (see {@link rebuildAmbientLabels}). - * @param {Array} cells - Aggregated cells, heat-sorted descending. + * Make sure the draped heatmap matches the shown set. The first paint is + * immediate; later rebuilds (filter drags, refreshes) trail by + * HEAT_REBUILD_MS and keep the previous heatmap on screen meanwhile. + */ + + function ensureHeatRaster() { + if (layerState._heatRaster) return; + if (!heatImagery().hasRaster()) { + rebuildHeatRaster(); + return; + } + clearTimeout(layerState._heatRebuildTimer); + layerState._heatRebuildTimer = setTimeout( + rebuildHeatRaster, + HEAT_REBUILD_MS, + ); + } + + /** + * Far bands (global/regional): a Snap Map–style heatmap draped over the + * globe, transparent where nothing burns, plus the decluttered "N FIRES" + * cards from the coarse aggregation. No entities and no sprites are drawn; + * cards go through the same screen-space label pipeline as detections + * (see {@link rebuildAmbientLabels}). * @param {Object} lod - Active LOD descriptor. * @param {?Object} bounds - Padded view bounds in degrees, or null. */ - function renderCells(cells, lod, bounds) { + function renderHeat(lod, bounds) { ensureDetectionCollections(); layerState._dataSource.entities.removeAll(); if (layerState._billboards) layerState._billboards.removeAll(); layerState._pickIndexById.clear(); layerState._cullPositions.length = 0; - layerState._cellCount = cells.length; - const maxScore = Math.max(1, ...cells.map(components.model.heatScore)); + const imagery = heatImagery(); + // The map stack may have changed since the last far render. + imagery.rehome(); + ensureHeatRaster(); + imagery.setShow(layerState._enabled); + + const cells = aggregateFires(lod, bounds); + layerState._cellCount = cells.length; layerState._labelCandidates = []; layerState._labelLodDistance = lod.labelDistance; + // Cells arrive heat-sorted, so candidate order doubles as label priority. for (const cell of cells) { - const score = components.model.heatScore(cell); - const normalized = Math.min(1, Math.sqrt(score / maxScore)); - const alpha = 0.16 + normalized * 0.5; - const color = components.model.heatColor(normalized, alpha); const centerLon = cell.lonCell + lod.gridDegrees / 2; const centerLat = cell.latCell + lod.gridDegrees / 2; - const position = Cesium.Cartesian3.fromDegrees(centerLon, centerLat, 0); - - layerState._dataSource.entities.add({ - rectangle: { - coordinates: Cesium.Rectangle.fromDegrees( - cell.lonCell, - cell.latCell, - cell.lonCell + lod.gridDegrees, - cell.latCell + lod.gridDegrees, - ), - material: new Cesium.ColorMaterialProperty(color), - heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, - }, - position, - properties: { - count: cell.count, - intensity: score, - maxFrp: cell.maxFrp, - night: cell.night, - }, - }); - - // Cells arrive heat-sorted, so candidate order doubles as label priority. - // Accent is resolved here because `normalized` only exists in this walk. layerState._labelCandidates.push({ - position, + position: Cesium.Cartesian3.fromDegrees(centerLon, centerLat, 0), cullPosition: components.model.cellCullPosition(centerLon, centerLat), fire: null, cell, - accent: components.model.cellAccent(normalized), + accent: components.model.cellCardAccent(cell), }); } @@ -202,6 +236,7 @@ export function createRendering({ */ function renderDetections(lod, bounds) { + layerState._heatImagery?.setShow(false); ensureDetectionCollections(); layerState._dataSource.entities.removeAll(); if (!layerState._billboards) return; @@ -345,7 +380,7 @@ export function createRendering({ return { renderCurrentLod, aggregateFires, - renderCells, + renderHeat, renderDetections, ensureDetectionCollections, removeDetectionCollections, diff --git a/src/layers/firms/state.js b/src/layers/firms/state.js index d84ee2026..9a0b031b2 100644 --- a/src/layers/firms/state.js +++ b/src/layers/firms/state.js @@ -131,6 +131,25 @@ export function createFirmsState({ services, config }) { layerState._cellCacheByGrid = new Map(); + /** + * Heat raster for the far bands (firmsHeatRaster.js); null = stale, rebuilt + * on the next far render. Cleared with the cell cache on every new shown set. + */ + + layerState._heatRaster = null; + + /** Pending debounced heat rebuild (see HEAT_REBUILD_MS). */ + + layerState._heatRebuildTimer = null; + + /** Imagery adapter (heatImagery.js), created on the first far render. */ + + layerState._heatImagery = null; + + /** Shell-provided imagery host resolver; falls back to viewer.imageryLayers. */ + + layerState._imageryHost = null; + /** Camera idle snapshot so the throttled LOD check is ~free when parked. */ layerState._camSnapValid = false; diff --git a/src/ui/layerBindings.js b/src/ui/layerBindings.js index fb8f29119..60128f8e0 100644 --- a/src/ui/layerBindings.js +++ b/src/ui/layerBindings.js @@ -141,6 +141,12 @@ export class LayerBindings { }); this._weatherShellModules.push(layer); } + // Active Fires drapes its far-zoom heatmap on the same imagery host. + const fires = this._dataManager?.layers?.get('local-firms')?.module; + if (typeof fires?.attachShellServices === 'function') { + fires.attachShellServices({ imageryHost: this.services.imageryHost }); + this._weatherShellModules.push(fires); + } } _persistAwarenessSelection(event, cleared = false) { From 52e428955f4c56249bec1573a542169026561ed2 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Thu, 29 Oct 2026 17:17:06 +0400 Subject: [PATCH 023/153] docs(fires): describe the far-zoom heatmap Co-Authored-By: Claude Opus 5.5 --- changelog.d/1426-fire-intensity-filter.md | 6 +++--- docs/CURRENT-STATE.md | 19 ++++++++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/changelog.d/1426-fire-intensity-filter.md b/changelog.d/1426-fire-intensity-filter.md index 09e3c3a7d..188f964ad 100644 --- a/changelog.d/1426-fire-intensity-filter.md +++ b/changelog.d/1426-fire-intensity-filter.md @@ -2,8 +2,8 @@ cold → hot ramp (blue · teal · lime · amber · orange · red at 0 · 5 · 20 · 50 · 100 · 300 MW), and add a log-scale minimum-FRP slider whose track is the ramp, an All / Nominal+ / High confidence switch and an "N of M shown" - counter to the layer row. Far-zoom heat cells keep a warm density fill - (lime · amber · red). The filter applies once before rendering, so - markers, cards, heat cells, context and the top-fires query agree; share + counter to the layer row. Far zoom shows a Snap Map–style heatmap instead + of squares, empty where nothing burns. The filter applies once before + rendering, so markers, cards, the heatmap, context and the top-fires query agree; share links keep it (`w` token: `f`, `c`), and `get_active_fires` takes matching `min_frp_mw` and `confidence` arguments. Default 0 MW / All (gekh, #1426). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 7e29d8675..336b32132 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -2060,10 +2060,19 @@ Every FIRMS detection is colored by fire radiative power on a six-stop cold → hot ramp: blue from 0 MW, teal from 5, lime from 20, amber from 50, orange from 100 and red from 300 MW (`FRP_RAMP` in `src/data/firmsIntensity.js`). Glow sprites and fire-card accents read that ramp; confidence and brightness do -not affect the color. Aggregated heat cells (far zoom) instead take the warm -end of the ramp — lime, amber or red — from their heat-normalized score -(density, night share and strongest FRP), so a region reads as one field -rather than a per-cell mosaic; the cell card's accent matches its fill. +not affect the color. + +At far zoom (camera above ~3,000 km) the layer drapes a Snap Map–style +heatmap instead of individual markers: the shown detections are binned on a +global 2048 × 1024 grid, each weighted `1 + log10(1 + FRP)`, Gaussian-blurred, +normalized on a log scale against the 99.5th percentile and mapped from blue +through cyan, green, yellow and orange to red. Nothing is painted where +nothing burns (`src/data/firmsHeatRaster.js`). It is one full-globe imagery +tile on the active imagery host (`src/layers/firms/heatImagery.js`), rebuilt +on each data refresh or filter change (the first paint at once, later ones +150 ms after the last change) and hidden once markers take over below +~750 km. "N FIRES" cards from a 2° / 1° aggregation still label the hottest +areas; their accent is the strongest fire's FRP color. The Active Fires row carries a "Fire intensity (FRP)" slider on a log scale whose track is painted with the ramp and ticked at the same six values (its @@ -2071,7 +2080,7 @@ value reads "All" or "≥ N MW"), a "Confidence" switch with All / Nominal+ / High, and an "N of M shown" counter. The default is 0 MW and All, because many of the strongest detections are rated low confidence. The filter runs once in `ingestion.applyFilter()` before rendering, so markers, -cards, heat cells, the shared context store, the top-fires query and the +cards, the heatmap, the shared context store, the top-fires query and the analyst records all see one filtered set; a selected fire that no longer passes is deselected. The layer state keeps both options under the `w` (`local-firms`) share token as `f` (whole megawatts, 0–10,000) and `c` (`a`, `n`, `h`), From 2c422d2f3820707cf86de8c0f0618d57aade8a84 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Thu, 29 Oct 2026 17:26:23 +0400 Subject: [PATCH 024/153] build(boundaries): register the fires heat raster and imagery modules Co-Authored-By: Claude Opus 5.5 --- scripts/package-boundaries.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index 17772b58e..894e70a68 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -1174,6 +1174,7 @@ "modules": [ "src/data/firmsAdapt.js", "src/data/firmsIntensity.js", + "src/data/firmsHeatRaster.js", "src/data/firmsLabels.js", "src/data/iconOrientation.js", "src/layers/firms/anchors.js", @@ -1185,6 +1186,7 @@ "src/layers/firms/policy.js", "src/layers/firms/queries.js", "src/layers/firms/rendering.js", + "src/layers/firms/heatImagery.js", "src/layers/firms/selection.js", "src/layers/firms/source.js", "src/layers/firms/state.js", @@ -1916,6 +1918,7 @@ "src/data/firmsAdapt.js", "src/data/firmsHeatmap.js", "src/data/firmsIntensity.js", + "src/data/firmsHeatRaster.js", "src/data/firmsLabels.js", "src/data/flights.js", "src/data/flowMatch.js", @@ -2076,6 +2079,7 @@ "src/layers/firms/policy.js", "src/layers/firms/queries.js", "src/layers/firms/rendering.js", + "src/layers/firms/heatImagery.js", "src/layers/firms/selection.js", "src/layers/firms/source.js", "src/layers/firms/state.js", @@ -2760,6 +2764,7 @@ "src/data/detectionPolicy.js", "src/data/firmsAdapt.js", "src/data/firmsIntensity.js", + "src/data/firmsHeatRaster.js", "src/data/firmsLabels.js", "src/data/flowMatch.js", "src/data/focusDeemphasis.js", @@ -2890,6 +2895,7 @@ "src/layers/firms/policy.js", "src/layers/firms/queries.js", "src/layers/firms/rendering.js", + "src/layers/firms/heatImagery.js", "src/layers/firms/selection.js", "src/layers/firms/source.js", "src/layers/firms/state.js", From d32a4f62d33ef6dfe78d8e2b6f9373625c14e8e0 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Thu, 29 Oct 2026 17:36:09 +0400 Subject: [PATCH 025/153] i18n(zh-Hant): fire filter strings follow zh-CN wording (s2tw) Co-Authored-By: Claude Opus 5.5 --- src/i18n/locales/zh-Hant.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/i18n/locales/zh-Hant.json b/src/i18n/locales/zh-Hant.json index c71924233..9dadb3a50 100644 --- a/src/i18n/locales/zh-Hant.json +++ b/src/i18n/locales/zh-Hant.json @@ -2868,16 +2868,16 @@ "routing busy — too many routes at once": "路線服務繁忙:同時請求的路線過多", "route proxy error": "路線代理出錯", "fire confidence filter|All": "全部", - "fire confidence filter|Nominal+": "中+", + "fire confidence filter|Nominal+": "標稱+", "fire confidence filter|High": "高", - "Every detection — many of the strongest fires are rated low confidence": "所有探測——許多最強的火點可信度為低", - "Nominal and high confidence detections": "中、高可信度的探測", - "High confidence detections only": "僅高可信度的探測", + "Every detection — many of the strongest fires are rated low confidence": "所有檢測——許多最強的火點置信度為低", + "Nominal and high confidence detections": "標稱和高置信度的檢測", + "High confidence detections only": "僅高置信度的檢測", "Fire intensity (FRP)": "火勢強度 (FRP)", "≥ {value} MW": "≥ {value} MW", - "Confidence": "可信度", - "Minimum fire radiative power, megawatts": "最小火輻射功率(百萬瓦)", + "Confidence": "置信度", + "Minimum fire radiative power, megawatts": "最小火輻射功率(兆瓦)", "fire intensity filter|All": "全部", - "Detection confidence": "探測可信度", + "Detection confidence": "檢測置信度", "{shown} of {total} shown": "顯示 {shown} / {total}" } From bef47ee7c7cca963c3eeb145da5aad0bb08263bf Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Thu, 29 Oct 2026 18:25:33 +0400 Subject: [PATCH 026/153] fix(fires): weight the far-zoom heatmap by fire radiative power Heat was a detection count, so raising the minimum-FRP slider removed most detections and the hot spots faded to blue even where strong fires still burned. Each detection now adds its FRP in megawatts (0.5 MW floor), so weak fires carry little heat and filtering them out keeps strong-fire areas hot. On the live payload, hot spots that stay yellow or hotter at >=100 MW rise from 7% to 17% and their median heat from 0.10 to 0.38. --- docs/CURRENT-STATE.md | 4 +++- src/data/firmsHeatRaster.js | 11 ++++++++++- src/data/firmsHeatRaster.test.mjs | 33 +++++++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index b34636004..1bd9c82cd 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -2096,7 +2096,9 @@ not affect the color. At far zoom (camera above ~3,000 km) the layer drapes a Snap Map–style heatmap instead of individual markers: the shown detections are binned on a -global 2048 × 1024 grid, each weighted `1 + log10(1 + FRP)`, Gaussian-blurred, +global 2048 × 1024 grid, each weighted by its FRP in megawatts (so heat is +radiated power, and raising the FRP slider does not dim areas where strong fires +burn), Gaussian-blurred, normalized on a log scale against the 99.5th percentile and mapped from blue through cyan, green, yellow and orange to red. Nothing is painted where nothing burns (`src/data/firmsHeatRaster.js`). It is one full-globe imagery diff --git a/src/data/firmsHeatRaster.js b/src/data/firmsHeatRaster.js index 52a020671..516c7676f 100644 --- a/src/data/firmsHeatRaster.js +++ b/src/data/firmsHeatRaster.js @@ -35,8 +35,17 @@ export function heatColorAt(t) { ]; } +/** Weight of a detection with no or zero FRP, in megawatts. */ +export const HEAT_MIN_WEIGHT_MW = 0.5; + +/** + * Heat is radiated power, not a head count: each detection adds its FRP in + * megawatts. Weak fires carry little power, so raising the minimum-FRP slider + * removes most detections without dimming the areas where strong fires burn + * (a count-based heat collapsed there and the hot spots faded). + */ const defaultWeight = (fire) => - 1 + Math.log10(1 + Math.max(0, Number(fire.frp) || 0)); + Math.max(HEAT_MIN_WEIGHT_MW, Number(fire.frp) || 0); export function binFires(fires, { width, height, weight = defaultWeight }) { const grid = new Float32Array(width * height); diff --git a/src/data/firmsHeatRaster.test.mjs b/src/data/firmsHeatRaster.test.mjs index 704c83427..2b51785e6 100644 --- a/src/data/firmsHeatRaster.test.mjs +++ b/src/data/firmsHeatRaster.test.mjs @@ -1,6 +1,7 @@ import test from 'node:test'; import assert from 'node:assert/strict'; import { + HEAT_MIN_WEIGHT_MW, HEAT_PALETTE, heatColorAt, binFires, @@ -23,7 +24,7 @@ test('palette runs cold to hot and starts fully transparent', () => { }); test('binFires drops each detection into its equirectangular pixel', () => { - const grid = binFires([fire(89.9, -179.9, 0), fire(-89.9, 179.9, 0)], { + const grid = binFires([fire(89.9, -179.9, 1), fire(-89.9, 179.9, 1)], { width: 4, height: 2, }); @@ -35,9 +36,33 @@ test('binFires drops each detection into its equirectangular pixel', () => { ); }); -test('binFires weights strong fires slightly more', () => { - const grid = binFires([fire(0.1, 0.1, 999)], { width: 4, height: 2 }); - assert.ok(grid[2] > 3 && grid[2] < 5, String(grid[2])); +test('binFires weights each detection by its radiative power', () => { + const grid = binFires( + [fire(0.1, 0.1, 250), fire(0.2, 0.2, 0), fire(0.3, 0.3, Number.NaN)], + { width: 4, height: 2 }, + ); + assert.equal(grid[2], 250 + 2 * HEAT_MIN_WEIGHT_MW); +}); + +test('filtering out weak fires keeps a strong fire hot', () => { + const strong = fire(0.1, 0.1, 300); + const weak = Array.from({ length: 40 }, () => fire(0.1, 0.1, 2)); + const reference = Array.from({ length: 10 }, () => fire(20.1, 20.1, 100)); + const options = { width: 360, height: 180, sigmaPx: 2 }; + const pixel = ((90 - 0.1) | 0) * 360 + ((0.1 + 180) | 0); + const red = (r) => r.rgba[pixel * 4]; + const alpha = (r) => r.rgba[pixel * 4 + 3]; + const unfiltered = buildHeatRaster([strong, ...weak, ...reference], options); + const filtered = buildHeatRaster([strong, ...reference], options); + assert.ok(alpha(filtered) > 0); + assert.ok( + alpha(filtered) >= alpha(unfiltered) * 0.9, + `alpha ${alpha(unfiltered)} -> ${alpha(filtered)}`, + ); + assert.ok( + red(filtered) >= red(unfiltered) * 0.9, + `red ${red(unfiltered)} -> ${red(filtered)}`, + ); }); test('blurGaussian keeps mass and wraps across the antimeridian', () => { From a4c7b20ca825a731531b61fc2935f1a47621248a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Itallo=20Brand=C3=A3o?= <45429643+IMBrandao@users.noreply.github.com> Date: Thu, 29 Oct 2026 16:11:10 -0300 Subject: [PATCH 027/153] feat(transit): add Rio de Janeiro buses and BRT (SMTR GTFS-RT, CC BY 4.0) Register Rio's two keyless GTFS-Realtime VehiclePositions feeds from the city transport secretariat (SMTR): municipal buses (SPPO) and the Mobi-Rio BRT, the Transit layer's first Latin American region. Both feeds publish Position.speed in km/h instead of m/s. A new optional registry field, speedUnit: 'kmh', makes buildTransitSnapshot convert it once, so every speedMps consumer stays correct and other feeds are untouched. Document the source in DATA_SOURCES.md and update the region lists in README.md and docs/CURRENT-STATE.md. Refs #1480 Co-Authored-By: Claude Opus 5.5 --- DATA_SOURCES.md | 3 +- README.md | 2 +- docs/CURRENT-STATE.md | 8 ++++-- src/data/transitFeeds.js | 50 ++++++++++++++++++++++++++++++++++ src/data/transitFeeds.test.mjs | 43 +++++++++++++++++++++++++++++ src/data/transitProxy.js | 21 +++++++++++++- src/data/transitProxy.test.mjs | 26 ++++++++++++++++++ 7 files changed, 147 insertions(+), 6 deletions(-) diff --git a/DATA_SOURCES.md b/DATA_SOURCES.md index e31d0d3f0..2b989c509 100644 --- a/DATA_SOURCES.md +++ b/DATA_SOURCES.md @@ -95,6 +95,7 @@ How to read this: | **Barrie Transit** (myridebarrie.ca) | Transit layer live vehicles, Barrie ON | Barrie Transit realtime data, published by the City of Barrie under a licence accepted by use of the data. The licence is revocable and requires no attribution. | Courtesy credit to the City of Barrie (the licence requires none, and its trademark clause is broad) | | **YRT/Viva** (rtu.york.ca) | Transit layer live vehicles, York Region ON | York Region Transit realtime data, first-party York Region infrastructure under the YRT Open Data Licence v2.0, which permits commercial use and makes attribution optional. Viva route ids are named by colour from York Region’s published GTFS. | "Contains public transit Information made available under YRT’s Open Data Licence" — the licence’s own wording, given though not required | | **Burlington Transit** (opendata.burlington.ca) | Transit layer live vehicles, Burlington ON | Burlington Transit realtime data under the City of Burlington Open Data Terms of Use, which permit any lawful purpose. The terms are revocable and must travel with the data, so the credit links them. Route ids are internal keys and are joined to the City’s published GTFS. | Credit to the City of Burlington plus a link to its Open Data Terms of Use, which the licence requires | +| **SMTR Rio de Janeiro** (dados.mobilidade.rio) | Transit layer live vehicles, Rio de Janeiro: municipal buses (SPPO) and the Mobi-Rio BRT, as two feeds | CC BY 4.0, stated on both data.rio catalog pages. Keyless GTFS-Realtime published by the Secretaria Municipal de Transportes, labelled beta, with a gateway limit of 5 requests a second and 60 a minute. Speeds arrive in km/h rather than m/s and are converted by the proxy. Route ids are internal keys and are shown raw. | Attribution to SMTR / Prefeitura da Cidade do Rio de Janeiro under CC BY 4.0 | | **Radio Browser** | Geolocated internet-radio station directory and station-level tags | Public-domain directory data under PDDL 1.0; individual broadcaster stream terms apply | "Radio Browser" plus a link to the selected broadcaster | | **Re:Earth Terrain** (Mapterhorn) | Terrain (keyless globe stacks — OSM etc. — + `/api/terrain/heights` ellipsoidal-height lookups) | Terrain mesh: CC BY 4.0; geoid: EGM2008 (NGA, public domain) | "Terrain (keyless globe stacks): Re:Earth Terrain / Mapterhorn (CC BY 4.0) / EGM2008 (NGA)" | | **OSRM on the FOSSGIS routing servers** (`routing.openstreetmap.de`) | Street-following routes for the Directions layer and voice route annotations, via `/api/route` | [FOSSGIS routing usage policy](https://routing.openstreetmap.de/about.html): "Display the required attribution and display a link to 'fix the map'", "Use a valid user agent and, if applicable, a correct referrer", "One request per second max", "No scraping, no heavy usage". The full policy is the German [FOSSGIS Nutzungsbedingungen](https://www.fossgis.de/arbeitsgruppen/osm-server/nutzungsbedingungen/); FOSSGIS also states that the server may be embedded in your own pages but "eine gewerbliche Nutzung ist nur mit Einschränkungen erlaubt" (commercial use only with restrictions). Route data derives from OpenStreetMap (ODbL 1.0) | "Routing: OSRM on the FOSSGIS servers" + a "fix the map" link — shown in the Data attribution popover | @@ -177,7 +178,7 @@ The optional Local ADS-B layer and the broadcast-FM receiver use radio you recei - **NYC DOT Traffic Management Center cameras.** Off by default. NYC DOT's [developer data feeds page](https://www.nyc.gov/html/dot/html/about/datafeeds.shtml) asks developers who want the camera feed to contact `tmcdot@dot.nyc.gov` and sign a data-sharing agreement. This project does not hold one that covers downstream installations, so the pack loads only when an operator who holds their own agreement sets `CCTV_NYC_ENABLED=1`; with the flag unset, empty or any other value, the server makes no request to NYC DOT. The endpoint needs no key. The camera list is the public `webcams.nyctmc.org/api/cameras` catalog (~980 cameras across the five boroughs); frames are stills at `webcams.nyctmc.org/api/cameras//image`, synthesized from a validated UUID rather than taken from the payload, and only that host is registered. Cameras the feed reports as offline are dropped. The catalog publishes no camera facing, so headings use the shared id-hash fallback at low confidence and are corrected with the in-app calibration gizmo. Once enabled, the 250 cameras nearest the borough cores load; `CCTV_NYC_MAX_SOURCES` (8–400) changes the cap. Frames are fetched at request time and never stored or redistributed. NYC DOT asks every application that uses its data to carry its disclaimer; it is registered verbatim in the Data attribution popover. - **City of Toronto RESCU cameras.** Keyless. The camera list is the City's public `tmcearthcameras.json` on `opendata.toronto.ca` (dataset "Traffic Cameras", Transportation Services), served as JSONP and unwrapped with an anchored pattern. This is the municipal network the Ontario 511 pack does not carry: downtown arterials plus the Gardiner, DVP, Allen and Lake Shore. The list publishes no frame URL, so frame URLs are BUILT from the documented `CameraImages/loc####.jpg` convention and a strictly-digits camera number, pinning the frame proxy to the portal origin by construction; the list fetch refuses redirects and bounds the body it buffers. Frames are fetched at request time and never stored or redistributed. The dataset publishes no camera facing: the `D1`-`D4` fields are the directions of the *comparison* images (static reference stills captured in 2016 under a different path), not a bearing for the live pan-tilt-zoom frame, so headings use the shared id-hash fallback at low confidence and are corrected with the in-app calibration gizmo. A camera that is temporarily out of service still answers 200 with a byte-identical "Image Unavailable" placeholder rather than an error (about 6% of the network at any moment), so such a camera reads as healthy; the frame it shows is the agency's, not a synthesized one. The licence requires the attribution statement above. Disable with `CCTV_TORONTO_ENABLED=0`. - **Camera frame content.** Public camera frames can contain people, vehicles and license plates, and the camera layer does nothing with them beyond putting them on the map. A successful upstream response is relayed as the provider served it: nothing in the camera pipeline blurs, redacts, enhances or restores it, and nothing there runs face, plate or object detection or otherwise recognises or classifies what is in the picture. (The ALPR layer described below maps where plate-reader cameras are, from locations contributors tagged in OpenStreetMap; it reads nothing from any camera frame.) When an upstream has no frame for a camera, what you see instead is a Google Street View still or the app's own placeholder card; the panel's source badge names which of them you are looking at, and a refresh that fails after a frame has arrived leaves the last good picture on screen rather than replacing it. The browser resamples each frame for display: onto a fixed 1920x1080 surface for the camera's projection plane in the scene, and onto a 192x108 canvas for the small ambient card. That scaling is the only change made to the picture, and the only pixels the camera layer reads back are a 64x36 downscale hashed to tell whether the picture has changed. Live streams are piped through; the still path reads the image into memory to pass it on — TxDOT wraps its JPEG in a JSON envelope, which is decoded there — and no frame is written to disk (the disk cache, `.gev-cache/`, holds feed JSON for other layers and never camera imagery). Outside that pipeline, the voice assistant is the one feature that sends imagery anywhere: when it answers a question about what is in view it may attach a downscaled screenshot of the rendered scene — including any camera plane on screen — to the request it sends to the voice model. Frames are fetched only from server-registered camera URLs — a client cannot hand the proxy a URL (see [SECURITY.md](SECURITY.md)). What the app does stays inside the line README draws: no named-person search, no face recognition, no tracking individuals. -- **Transit (GTFS-Realtime).** The proxy requests only registered operator feeds, validates redirects, bounds responses, and uses conditional requests, short snapshot caching and failure backoff. All sixteen registered regions are live-enabled; each can be disabled independently. Vehicles use delayed playback between reports, with report age and waiting states shown separately. Session-local selected trails are available for every feed. MBTA additionally retains up to 15 minutes of recently observed positions in the running proxy, so available history can survive a browser reload; server restart clears it. History reads never fetch upstream, and other feeds have no proxy retention. Nothing is archived to disk or collected in the background. Operator text credits are included as a courtesy and do not imply endorsement. Heights are aligned to work with Google 3D tiles; subway markers are shown at street level because these feeds do not supply depth. The TTC feed is BusTime, the surface system: it carries buses and streetcars and no subway at all. About four in ten of its vehicles report no route at all (unassigned or deadheading), and those are shown with the feed default rather than a route-established mode. It sends no ETag or Last-Modified, so its conditional requests fall through to the ordinary snapshot cache. Three Golden Horseshoe neighbours run alongside it — MiWay, Hamilton HSR and Durham Region Transit — each bus-only and each polled only near its own region. Durham Region Transit publishes no bearing on any vehicle, so those sprites take their heading from observed movement like any other feed that omits it. Guelph, Kingston and Barrie extend the same pattern eastward and north. Hamilton, Guelph, Burlington and YRT publish route ids that are not the number on the vehicle, so those entries carry a route-name table taken from each operator’s own published GTFS; any id missing from a table renders unchanged rather than blank. A label is never invented: YRT runs a route `9101` that appears nowhere in its published routes, so it stays as the feed sends it. Burlington’s is the one that cannot be shortcut: `351` is route 1 while `3510` is route 10, so the table is a real join rather than a trimmed prefix. GO Transit / Metrolinx is deliberately absent: its REALTIME feed requires an API key issued by manual review, which the keyless admission rule excludes (its static schedule download is keyless, but carries no vehicle positions). Barrie and YRT/Viva each invite acceptance of their licence through a form, and each licence also states that using the data is itself acceptance; this deployment relies on that clause, which is recorded in both entries. Grand River Transit in Waterloo is absent for a different reason: it answers, but its feed header was months stale and it publishes no per-vehicle timestamps, so it would render vehicles that look live and are not. Ottawa’s OC Transpo falls to the same keyless admission rule as GO Transit — its realtime feed requires an API key. London Transit and Thunder Bay Transit publish vehicle positions over plain HTTP with no HTTPS endpoint available. Every other Ontario system — Brampton, Oakville, Niagara, Milton, Windsor, Greater Sudbury, UP Express and a dozen smaller operators — publishes static GTFS schedules only, with no realtime vehicle positions to register. Between the nine included and these exclusions, every Ontario realtime vehicle-position feed catalogued in the Mobility Database is accounted for. +- **Transit (GTFS-Realtime).** The proxy requests only registered operator feeds, validates redirects, bounds responses, and uses conditional requests, short snapshot caching and failure backoff. All eighteen registered feeds, covering seventeen regions, are live-enabled; each can be disabled independently. Vehicles use delayed playback between reports, with report age and waiting states shown separately. Session-local selected trails are available for every feed. MBTA additionally retains up to 15 minutes of recently observed positions in the running proxy, so available history can survive a browser reload; server restart clears it. History reads never fetch upstream, and other feeds have no proxy retention. Nothing is archived to disk or collected in the background. Operator text credits are included as a courtesy and do not imply endorsement. Heights are aligned to work with Google 3D tiles; subway markers are shown at street level because these feeds do not supply depth. The TTC feed is BusTime, the surface system: it carries buses and streetcars and no subway at all. About four in ten of its vehicles report no route at all (unassigned or deadheading), and those are shown with the feed default rather than a route-established mode. It sends no ETag or Last-Modified, so its conditional requests fall through to the ordinary snapshot cache. Three Golden Horseshoe neighbours run alongside it — MiWay, Hamilton HSR and Durham Region Transit — each bus-only and each polled only near its own region. Durham Region Transit publishes no bearing on any vehicle, so those sprites take their heading from observed movement like any other feed that omits it. Guelph, Kingston and Barrie extend the same pattern eastward and north. Hamilton, Guelph, Burlington and YRT publish route ids that are not the number on the vehicle, so those entries carry a route-name table taken from each operator’s own published GTFS; any id missing from a table renders unchanged rather than blank. A label is never invented: YRT runs a route `9101` that appears nowhere in its published routes, so it stays as the feed sends it. Burlington’s is the one that cannot be shortcut: `351` is route 1 while `3510` is route 10, so the table is a real join rather than a trimmed prefix. GO Transit / Metrolinx is deliberately absent: its REALTIME feed requires an API key issued by manual review, which the keyless admission rule excludes (its static schedule download is keyless, but carries no vehicle positions). Barrie and YRT/Viva each invite acceptance of their licence through a form, and each licence also states that using the data is itself acceptance; this deployment relies on that clause, which is recorded in both entries. Grand River Transit in Waterloo is absent for a different reason: it answers, but its feed header was months stale and it publishes no per-vehicle timestamps, so it would render vehicles that look live and are not. Ottawa’s OC Transpo falls to the same keyless admission rule as GO Transit — its realtime feed requires an API key. London Transit and Thunder Bay Transit publish vehicle positions over plain HTTP with no HTTPS endpoint available. Every other Ontario system — Brampton, Oakville, Niagara, Milton, Windsor, Greater Sudbury, UP Express and a dozen smaller operators — publishes static GTFS schedules only, with no realtime vehicle positions to register. Between the nine included and these exclusions, every Ontario realtime vehicle-position feed catalogued in the Mobility Database is accounted for. - **Radio Browser.** `/api/radio/stations` discovers official API mirrors, makes bounded and coalesced healthy/geolocated HTTPS-station queries, caches the normalized public-domain directory for 45 minutes, and may serve the last good catalog for up to seven days during an outage. Refreshes must meet minimum accepted-query and station coverage before replacing a warm catalog; schema-valid responses whose rows all fail the product's health policy do not count as successful queries. A usable partial cold catalog is explicitly `DEGRADED`, and non-array or empty successful payloads are rejected atomically. Individual structurally malformed rows are skipped rather than failing the whole query; the response carries their bounded `rejectedStationCount` (at most 10,000), which the client adds to its own rejected rows and reports as degraded coverage without discarding the accepted generation. Every directory and click-count request rejects redirects, validates all resolved addresses as globally routable (including reserved/documentation IPv4 and special/non-global IPv6 exclusions), and pins the TLS connection to a validated address. Only MP3/AAC non-HLS directory rows with public HTTPS stream targets are returned; favicons are intentionally omitted. Pressing play connects one browser audio element directly to the selected broadcaster and calls the directory's click counter through known-ID-only `POST /api/radio/click/:uuid`. GEV never proxies, caches, records, bundles, or redistributes audio. Radio Browser supplies station-level tags, not dependable current-song or upcoming-program metadata, so Radio filtering never claims either. Direct playback exposes the listener's IP address to the broadcaster, whose own stream terms apply. - **TomTom Traffic.** Optional and BYOK: without `TOMTOM_API_KEY` the traffic layer runs its built-in simulation and no TomTom data (or attribution) appears. With a key, flow vector tiles are fetched through the server-side `/api/tomtom` proxy (120 s cache + a daily tile-budget governor — `TOMTOM_DAILY_TILE_BUDGET`, default 6,000 — sized so a 31-day month stays inside TomTom's 200K monthly free allowance; still a configurable application safety ceiling, not a guarantee; TomTom's [current pricing](https://docs.tomtom.com/pricing/) lists 200K free tile requests per month) and the "Traffic flow data © TomTom" credit is registered in the Data attribution popover the moment live mode activates. TomTom data is served live and cached only transiently (≤120 s TTL under `.gev-cache/`, gitignored) — it is not bundled or redistributed. One 23 KB point-in-time tile snapshot is committed as a decode-test fixture (`src/data/fixtures/`, © TomTom, never served to the app). - **Routing (OSRM / FOSSGIS).** `/api/route` proxies the public OSRM instances FOSSGIS e.V. runs for the OpenStreetMap community (car, bike, foot profiles). They are keyless and intended for fair, interactive use — the proxy rate-limits clients (60/min, 200/min total), caps route span and response size, caches each route for 10 minutes, and identifies itself in the User-Agent. Heavy or automated use must run its own OSRM. Routes are computed from OpenStreetMap data (ODbL); the Directions layer and voice routes never redistribute them. A route the router cannot find is reported as such; the Directions layer draws nothing in that case, and voice routes fall back to a clearly labeled straight line. diff --git a/README.md b/README.md index 745bec3d8..965c0e283 100644 --- a/README.md +++ b/README.md @@ -403,7 +403,7 @@ Twenty layers and map sources. **Eighteen have a keyless path.** Some offer addi | 📷 **Mapped ALPR Cameras** | License-plate-reader camera locations tagged by OpenStreetMap contributors, loaded one city-sized view at a time, with **SHOW NEAREST**. Locations and tags only: no plate data, no video | OpenStreetMap (incl. DeFlock mapping) | 🟢 | | 📷 **Street Level** | Street-level photos behind one panel, one chip per provider: coverage on the streets, image cones, an embedded viewer with full-screen **EXPAND**. Mapillary, Google Street View, KartaView and Panoramax | Mapillary · Google · KartaView · Panoramax | 🟢 KartaView, Panoramax · 🟡 Mapillary token · 🔴 Google Maps key | | 📻 **Radio** | Geolocated world radio with an **analog tuner** — drag the needle across up to 750 stations and the globe flies to each broadcaster | Radio Browser / broadcasters | 🟢 | -| 🚌 **Transit** | Live buses, trams, metros, trains and ferries with delayed playback between reports, selected-vehicle trails, and mode-coloured DETECT labels — Boston, Austin, Minneapolis, Helsinki, the Netherlands, Norway, South East Queensland, and nine in Ontario: Toronto (surface vehicles; the subway publishes no positions), Mississauga, Hamilton, Durham Region, York Region, Guelph, Burlington, Barrie and Kingston | Operator GTFS-Realtime feeds | 🟢 | +| 🚌 **Transit** | Live buses, trams, metros, trains and ferries with delayed playback between reports, selected-vehicle trails, and mode-coloured DETECT labels — Boston, Austin, Minneapolis, Helsinki, the Netherlands, Norway, South East Queensland, Rio de Janeiro (buses and BRT), and nine in Ontario: Toronto (surface vehicles; the subway publishes no positions), Mississauga, Hamilton, Durham Region, York Region, Guelph, Burlington, Barrie and Kingston | Operator GTFS-Realtime feeds | 🟢 | | 🚲 **Bikeshare** | Live station availability | GBFS | 🟢 | | 🧭 **Directions** | Click A and B on the globe for a street-following drive, walk or cycle route draped on the terrain with turn-by-turn steps — then FLY the camera along it. No key, no geocoder, no mic | OSRM on FOSSGIS servers (OpenStreetMap) | 🟢 | | 🔥 **Active Fires** | Live NASA FIRMS detections, trailing 24h | NASA FIRMS | 🟡 | diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 966bb3878..2adac270e 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -4295,11 +4295,13 @@ Transit is off by default, and share links use token `j`. The movement panel ord places Transit directly after Street Traffic and before Bike Share. Cameras and utilities retain their own groups. The layer polls registered feeds near the camera every 15 seconds, below a 3,000 km altitude -gate. Sixteen keyless regions are available: Boston, Austin, Minneapolis–St Paul, -Helsinki, the Netherlands, Norway, South East Queensland, and nine in +gate. Seventeen keyless regions are available: Boston, Austin, Minneapolis–St Paul, +Helsinki, the Netherlands, Norway, South East Queensland, Rio de Janeiro +(municipal buses and the Mobi-Rio BRT, two feeds), and nine in Ontario — Toronto (TTC surface vehicles; the subway publishes no positions), MiWay, Hamilton HSR, Durham Region, YRT/Viva, Guelph, -Burlington, Barrie and Kingston. Mode silhouettes +Burlington, Barrie and Kingston. Rio's feeds publish speed in km/h, which +the proxy converts to m/s before any card reads it. Mode silhouettes identify buses, trams, subways, trains, ferries and unclassified vehicles. Retained transit history uses the same outlier quarantine as live observations and diff --git a/src/data/transitFeeds.js b/src/data/transitFeeds.js index b8476a6ee..e871a2e89 100644 --- a/src/data/transitFeeds.js +++ b/src/data/transitFeeds.js @@ -385,7 +385,12 @@ function burlingtonRouteLabel(routeId) { * url: string, headers?: Record, * license: string, licenseUrl: string, attribution: string, * defaultMode: string, routeMode?: (routeId: string|null) => string, + * speedUnit?: 'kmh', * }>>} + * + * `speedUnit: 'kmh'` marks a feed that publishes `Position.speed` in km/h + * instead of the m/s the spec requires; the proxy converts it before anything + * downstream reads `speedMps`. */ export const TRANSIT_FEED_REGISTRY = Object.freeze([ Object.freeze({ @@ -729,6 +734,51 @@ export const TRANSIT_FEED_REGISTRY = Object.freeze([ defaultMode: 'bus', routeLabel: burlingtonRouteLabel, }), + Object.freeze({ + id: 'smtr-rio-onibus', + name: 'Rio buses (SPPO)', + operator: 'Secretaria Municipal de Transportes (SMTR), Rio de Janeiro', + region: 'Rio de Janeiro, RJ', + // Every vehicle in a 2026-10-29 snapshot, from Santa Cruz in the west to + // the Zona Sul, sat within 31 km of this point. + center: Object.freeze({ lat: -22.92, lon: -43.42 }), + loadRadiusKm: 45, + url: 'https://dados.mobilidade.rio/gtfs/realtime/onibus/vehicle-positions', + license: 'CC BY 4.0', + licenseUrl: + 'https://www.data.rio/documents/997bc16cc4344a5cb0e48ab06cbdfd1f', + attribution: 'SMTR / Prefeitura da Cidade do Rio de Janeiro (CC BY 4.0)', + defaultEnabled: true, + terms: Object.freeze({ + quote: + 'This work is licensed under a Creative Commons Attribution 4.0 International License', + note: 'The data.rio catalog page labels the feed [beta] and states a gateway limit of 5 requests a second and 60 a minute behind a 10-second cache, which the 15-second proxy TTL stays inside. It is the named replacement for the JSON GPS endpoints SMTR deprecated on 2026-10-07 and says it will switch off by 2026-11-30. SMTR relays the concessionaires’ ITS data and repairs trips with its own matching; the page places accuracy with the suppliers. Speeds arrive in km/h, not m/s (a 2026-10-29 snapshot peaked at 89), hence `speedUnit`. Route ids are internal keys: `O0313AAA0A` carried service 313 in the same day’s JSON feed. They are shown raw until a published table is joined.', + }), + defaultMode: 'bus', + speedUnit: 'kmh', + }), + Object.freeze({ + id: 'smtr-rio-brt', + name: 'Mobi-Rio BRT', + operator: + 'Secretaria Municipal de Transportes (SMTR), Rio de Janeiro, for the Mobi-Rio BRT fleet', + region: 'Rio de Janeiro, RJ', + center: Object.freeze({ lat: -22.92, lon: -43.42 }), + loadRadiusKm: 45, + url: 'https://dados.mobilidade.rio/gtfs/realtime/brt/vehicle-positions', + license: 'CC BY 4.0', + licenseUrl: + 'https://www.data.rio/documents/8bb196cc02174d25b77437bb2f6443d4', + attribution: 'SMTR / Prefeitura da Cidade do Rio de Janeiro (CC BY 4.0)', + defaultEnabled: true, + terms: Object.freeze({ + quote: + 'This work is licensed under a Creative Commons Attribution 4.0 International License', + note: 'Same catalog terms, [beta] label and gateway limits as the bus feed. The fleet is operated by Mobi-Rio and tracked by SONDA, whose data SMTR relays. Speeds are km/h here too (peak 62 in the same snapshot). Route ids are opaque (`20000461130`) and are shown raw.', + }), + defaultMode: 'bus', + speedUnit: 'kmh', + }), ]); /** diff --git a/src/data/transitFeeds.test.mjs b/src/data/transitFeeds.test.mjs index fd990af45..51903b7db 100644 --- a/src/data/transitFeeds.test.mjs +++ b/src/data/transitFeeds.test.mjs @@ -482,3 +482,46 @@ test('Burlington is live and carries its terms link, which its licence requires' assert.match(bur.licenseUrl, /Open%20Data%20Terms%20of%20Use\.pdf$/); assert.match(bur.url, /^https:\/\//, 'port 80 has no listener at all'); }); + +test('Rio buses and BRT cover the city from Centro to Santa Cruz, and not São Paulo', () => { + const ids = (lat, lon) => + transitFeedsInRange(lat, lon).map((feed) => feed.id); + for (const [place, lat, lon] of [ + ['Centro', -22.9068, -43.1729], + ['Barra da Tijuca', -23.0004, -43.3659], + ['Santa Cruz', -22.9194, -43.6847], + ]) { + assert.ok( + ids(lat, lon).includes('smtr-rio-onibus'), + `buses reach ${place}`, + ); + assert.ok(ids(lat, lon).includes('smtr-rio-brt'), `BRT reaches ${place}`); + } + assert.deepEqual( + ids(-23.5505, -46.6333).filter((id) => id.startsWith('smtr-rio')), + [], + 'São Paulo, 360 km away, never polls Rio', + ); +}); + +test('Rio feeds are CC BY 4.0, live, and declare the km/h speeds they publish', () => { + for (const id of ['smtr-rio-onibus', 'smtr-rio-brt']) { + const feed = getTransitFeed(id); + assert.equal(feed.defaultEnabled, true, `${id} is live`); + assert.equal(feed.license, 'CC BY 4.0'); + assert.match(feed.licenseUrl, /^https:\/\/www\.data\.rio\/documents\//); + assert.match(feed.attribution, /Prefeitura da Cidade do Rio de Janeiro/); + assert.equal(feed.speedUnit, 'kmh', `${id} publishes km/h`); + assert.equal(transitModeFor(feed, null), 'bus'); + } + const sources = readFileSync( + new URL('../../DATA_SOURCES.md', import.meta.url), + 'utf8', + ); + assert.ok( + sources + .split('\n') + .some((line) => line.startsWith('| **SMTR Rio de Janeiro')), + 'Rio has a DATA_SOURCES row', + ); +}); diff --git a/src/data/transitProxy.js b/src/data/transitProxy.js index 458240e9d..2923c9c32 100644 --- a/src/data/transitProxy.js +++ b/src/data/transitProxy.js @@ -224,6 +224,25 @@ export function repairVehicleTimestamps(vehicles, headerTimestamp, fetchedAtS) { }); } +/** + * Bring a feed's speeds to the m/s the spec requires. A feed registered with + * `speedUnit: 'kmh'` publishes km/h in `Position.speed`, and read as m/s a + * 44 km/h bus would be reported at 158 km/h. Converting here, once, keeps every + * consumer of `speedMps` honest without each one knowing about the feed. + * + * @param {object} feed Registry entry. + * @param {object[]} vehicles Normalized vehicle records. + * @returns {object[]} + */ +export function normalizeFeedSpeeds(feed, vehicles) { + if (feed?.speedUnit !== 'kmh') return vehicles; + return vehicles.map((vehicle) => + Number.isFinite(vehicle.speedMps) + ? { ...vehicle, speedMps: vehicle.speedMps / 3.6 } + : vehicle, + ); +} + /** * Decode upstream bytes into the JSON snapshot the browser consumes. * @@ -257,7 +276,7 @@ export function buildTransitSnapshot(feed, bytes, now = Date.now()) { truncated: decoded.truncated, count: decoded.vehicles.length, vehicles: repairVehicleTimestamps( - decoded.vehicles, + normalizeFeedSpeeds(feed, decoded.vehicles), decoded.timestamp, Math.floor(now / 1000), ), diff --git a/src/data/transitProxy.test.mjs b/src/data/transitProxy.test.mjs index dea10ab25..445e658f2 100644 --- a/src/data/transitProxy.test.mjs +++ b/src/data/transitProxy.test.mjs @@ -137,6 +137,7 @@ function encodeFeed({ const position = new PbfWriter(); position.writeFloatField(1, entity.lat); position.writeFloatField(2, entity.lon); + if (entity.speed != null) position.writeFloatField(5, entity.speed); vehicle.writeBytesField(2, position.finish()); if (entity.timestamp) vehicle.writeVarintField(5, entity.timestamp); const descriptor = new PbfWriter(); @@ -284,6 +285,31 @@ test('the snapshot builder fills timestamps from the header it decoded', () => { assert.equal(snapshot.feedTimestamp, 1_700_000_000); }); +test('a feed that publishes km/h has its speeds converted to m/s, and only that feed', () => { + // Rio's SMTR feeds put km/h in Position.speed; read as m/s, a 36 km/h bus + // would be reported at 130 km/h. + const bytes = encodeFeed({ + entities: [ + { id: 'moving', lat: -22.9, lon: -43.2, speed: 36 }, + { id: 'still', lat: -22.9, lon: -43.2, speed: 0 }, + { id: 'silent', lat: -22.9, lon: -43.2 }, + ], + }); + const rio = buildTransitSnapshot(getTransitFeed('smtr-rio-onibus'), bytes, 1); + const speeds = Object.fromEntries( + rio.vehicles.map((vehicle) => [vehicle.id, vehicle.speedMps]), + ); + assert.ok(Math.abs(speeds.moving - 10) < 1e-6, '36 km/h is 10 m/s'); + assert.equal(speeds.still, 0); + assert.equal(speeds.silent, null, 'an absent speed stays absent'); + const mbta = buildTransitSnapshot(getTransitFeed('mbta'), bytes, 1); + assert.equal( + mbta.vehicles.find((vehicle) => vehicle.id === 'moving').speedMps, + 36, + 'a spec-conforming feed is left alone', + ); +}); + test('conditional-request validators and gzip ride along with feed identification', () => { const entur = getTransitFeed('entur-norway'); const plain = transitUpstreamHeaders(entur); From 53d30c9e80d765b14eb2a2c35a957168cad2bf4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Itallo=20Brand=C3=A3o?= <45429643+IMBrandao@users.noreply.github.com> Date: Thu, 29 Oct 2026 16:30:47 -0300 Subject: [PATCH 028/153] docs(changelog): add fragment for #1481 Co-Authored-By: Claude Opus 5.5 --- changelog.d/1481-rio-transit.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog.d/1481-rio-transit.md diff --git a/changelog.d/1481-rio-transit.md b/changelog.d/1481-rio-transit.md new file mode 100644 index 000000000..62b4ede04 --- /dev/null +++ b/changelog.d/1481-rio-transit.md @@ -0,0 +1,4 @@ +- Add Rio de Janeiro to the Transit layer: municipal buses and the Mobi-Rio BRT + from SMTR's keyless GTFS-Realtime feeds (CC BY 4.0), the layer's first Latin + American region. A feed that publishes speed in km/h declares + `speedUnit: 'kmh'` and the proxy converts it to m/s (IMBrandao, #1481). From 096383b43266fb6b13d3cc471be4b80f74f7876a Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Fri, 30 Oct 2026 21:00:13 +0400 Subject: [PATCH 029/153] Translate the fire filter strings into de, fr and ja --- src/i18n/locales/de.json | 15 ++++++++++++++- src/i18n/locales/fr.json | 15 ++++++++++++++- src/i18n/locales/ja.json | 15 ++++++++++++++- src/i18n/same-as-english.json | 3 +++ 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 8e383aded..f18b5ca67 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -2926,5 +2926,18 @@ "Malformed cyclone snapshot": "Fehlerhafter Wirbelsturm-Snapshot", "STALE · Roads: {source} · Flow: cached TomTom tiles": "VERALTET · Straßen: {source} · Verkehrsfluss: TomTom-Kacheln aus dem Cache", "routing busy — too many routes at once": "Routing-Dienst ausgelastet – zu viele Routen gleichzeitig", - "route proxy error": "Fehler des Routen-Proxys" + "route proxy error": "Fehler des Routen-Proxys", + "fire confidence filter|All": "Alle", + "fire confidence filter|Nominal+": "Mittel+", + "fire confidence filter|High": "Hoch", + "Every detection — many of the strongest fires are rated low confidence": "Alle Erkennungen — viele der stärksten Brände haben eine niedrige Konfidenz", + "Nominal and high confidence detections": "Erkennungen mit mittlerer und hoher Konfidenz", + "High confidence detections only": "Nur Erkennungen mit hoher Konfidenz", + "Fire intensity (FRP)": "Intensität (FRP)", + "≥ {value} MW": "≥ {value} MW", + "Confidence": "Konfidenz", + "Minimum fire radiative power, megawatts": "Minimale Strahlungsleistung des Brandes in Megawatt", + "fire intensity filter|All": "Alle", + "Detection confidence": "Konfidenz der Erkennung", + "{shown} of {total} shown": "{shown} von {total} angezeigt" } diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index 931e7c3ff..59641d143 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -2996,5 +2996,18 @@ "ESC to dismiss": "ESC pour fermer", "Tip: the GEV MIC button in the dock lets you talk to the map.": "Astuce : le bouton GEV MIC du dock permet de parler à la carte.", "Malformed cyclone snapshot": "Instantané cyclonique mal formé", - "Cyclone request timed out": "Délai dépassé pour la requête cyclonique" + "Cyclone request timed out": "Délai dépassé pour la requête cyclonique", + "fire confidence filter|All": "Toutes", + "fire confidence filter|Nominal+": "Nominale+", + "fire confidence filter|High": "Élevée", + "Every detection — many of the strongest fires are rated low confidence": "Toutes les détections — beaucoup des feux les plus intenses ont une confiance faible", + "Nominal and high confidence detections": "Détections de confiance nominale et élevée", + "High confidence detections only": "Détections de confiance élevée uniquement", + "Fire intensity (FRP)": "Intensité (FRP)", + "≥ {value} MW": "≥ {value} MW", + "Confidence": "Confiance", + "Minimum fire radiative power, megawatts": "Puissance radiative minimale du feu, en mégawatts", + "fire intensity filter|All": "Toutes", + "Detection confidence": "Confiance de la détection", + "{shown} of {total} shown": "{shown} sur {total} affichées" } diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index 5a48dc886..85757c1dd 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -2856,5 +2856,18 @@ "routing busy — too many routes at once": "ルート検索サービスが混雑しています。同時に要求されたルートが多すぎます", "route proxy error": "ルート検索プロキシでエラーが発生しました", "Malformed cyclone snapshot": "サイクロンのスナップショットの形式が不正です", - "Cyclone request timed out": "サイクロンのリクエストがタイムアウトしました" + "Cyclone request timed out": "サイクロンのリクエストがタイムアウトしました", + "fire confidence filter|All": "すべて", + "fire confidence filter|Nominal+": "中以上", + "fire confidence filter|High": "高", + "Every detection — many of the strongest fires are rated low confidence": "すべての検知 — 最も強い火災の多くは信頼度が低と判定されています", + "Nominal and high confidence detections": "信頼度が中・高の検知", + "High confidence detections only": "信頼度が高の検知のみ", + "Fire intensity (FRP)": "強度(FRP)", + "≥ {value} MW": "≥ {value} MW", + "Confidence": "信頼度", + "Minimum fire radiative power, megawatts": "火災放射強度の最小値(メガワット)", + "fire intensity filter|All": "すべて", + "Detection confidence": "検知の信頼度", + "{shown} of {total} shown": "{total}件中{shown}件を表示" } diff --git a/src/i18n/same-as-english.json b/src/i18n/same-as-english.json index dd0df9990..390b56e58 100644 --- a/src/i18n/same-as-english.json +++ b/src/i18n/same-as-english.json @@ -163,6 +163,7 @@ "{value} KM/S", "ΔN", "Ⅱ PAUSE", + "≥ {value} MW", "▲ {frp} MW" ], "es": [ @@ -469,6 +470,7 @@ "ΔE", "ΔN", "Ⅱ PAUSE", + "≥ {value} MW", "▲ {frp} MW" ], "it": [ @@ -688,6 +690,7 @@ "{type} SPD: {speed} HDG: {heading}", "ΔE", "ΔN", + "≥ {value} MW", "▲ {frp} MW" ], "pt": [ From 18d55f58b9a756cb758996eb2593e6b2967a956d Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Mon, 2 Nov 2026 13:48:28 +0400 Subject: [PATCH 030/153] Color fires from ember to white-hot instead of blue to red About 90% of detections are under 20 MW, so the old blue and teal stops painted most of the map in cold colors that do not read as fire. The ramp now runs ember, red, flame, orange, gold and white-hot at the same thresholds, each stop lighter than the one below, so the brightest marks are the strongest fires. The heatmap uses the same colors. --- changelog.d/1426-fire-intensity-filter.md | 12 ++--- docs/CURRENT-STATE.md | 17 ++++--- src/data/firmsCards.test.mjs | 26 +++++----- src/data/firmsHeatRaster.js | 18 ++++--- src/data/firmsHeatRaster.test.mjs | 10 ++-- src/data/firmsIntensity.js | 27 +++++----- src/data/firmsIntensity.test.mjs | 62 ++++++++++++++--------- src/data/firmsLabels.js | 4 +- src/data/firmsLabels.test.mjs | 20 ++++---- src/layers/firms/model.js | 2 +- src/layers/firms/policy.js | 2 +- src/ui/layerPanel/layerRows.test.mjs | 2 +- 12 files changed, 115 insertions(+), 87 deletions(-) diff --git a/changelog.d/1426-fire-intensity-filter.md b/changelog.d/1426-fire-intensity-filter.md index 188f964ad..c1d06643e 100644 --- a/changelog.d/1426-fire-intensity-filter.md +++ b/changelog.d/1426-fire-intensity-filter.md @@ -1,9 +1,9 @@ - Color every Active Fires detection by fire radiative power on a six-stop - cold → hot ramp (blue · teal · lime · amber · orange · red at 0 · 5 · 20 · - 50 · 100 · 300 MW), and add a log-scale minimum-FRP slider whose track is the - ramp, an All / Nominal+ / High confidence switch and an "N of M shown" - counter to the layer row. Far zoom shows a Snap Map–style heatmap instead - of squares, empty where nothing burns. The filter applies once before - rendering, so markers, cards, the heatmap, context and the top-fires query agree; share + ember → white-hot ramp (ember · red · flame · orange · gold · white-hot at + 0 · 5 · 20 · 50 · 100 · 300 MW, brighter as power rises), and add a + log-scale minimum-FRP slider whose track is the ramp, an All / Nominal+ / + High confidence switch and an "N of M shown" counter to the layer row. Far + zoom shows a Snap Map–style heatmap in the same colors instead of squares, + empty where nothing burns. The filter applies once before rendering, so markers, cards, the heatmap, context and the top-fires query agree; share links keep it (`w` token: `f`, `c`), and `get_active_fires` takes matching `min_frp_mw` and `confidence` arguments. Default 0 MW / All (gekh, #1426). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index a7d941001..5644960bc 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -2175,19 +2175,22 @@ accessible name remains "Don't show this again". Control behavior is unchanged. ## Active Fires intensity filter and color ramp -Every FIRMS detection is colored by fire radiative power on a six-stop cold → -hot ramp: blue from 0 MW, teal from 5, lime from 20, amber from 50, orange from -100 and red from 300 MW (`FRP_RAMP` in `src/data/firmsIntensity.js`). Glow -sprites and fire-card accents read that ramp; confidence and brightness do -not affect the color. +Every FIRMS detection is colored by fire radiative power on a six-stop ember → +white-hot ramp: dark ember from 0 MW, red from 5, flame from 20, orange from +50, gold from 100 and pale white-hot from 300 MW (`FRP_RAMP` in +`src/data/firmsIntensity.js`). Each stop is lighter than the one below and +none is a cold hue, so the brightest marks are the strongest fires; ~90% of +detections are under 20 MW and stay dim red. Glow sprites and fire-card +accents read that ramp; confidence and brightness do not affect the color. At far zoom (camera above ~3,000 km) the layer drapes a Snap Map–style heatmap instead of individual markers: the shown detections are binned on a global 2048 × 1024 grid, each weighted by its FRP in megawatts (so heat is radiated power, and raising the FRP slider does not dim areas where strong fires burn), Gaussian-blurred, -normalized on a log scale against the 99.5th percentile and mapped from blue -through cyan, green, yellow and orange to red. Nothing is painted where +normalized on a log scale against the 99.5th percentile and mapped through the +same colors, from a faint ember edge through red, orange and gold to a pale +white-hot core. Nothing is painted where nothing burns (`src/data/firmsHeatRaster.js`). It is one full-globe imagery tile on the active imagery host (`src/layers/firms/heatImagery.js`), rebuilt on each data refresh or filter change (the first paint at once, later ones diff --git a/src/data/firmsCards.test.mjs b/src/data/firmsCards.test.mjs index d0ca7bd70..9d6157324 100644 --- a/src/data/firmsCards.test.mjs +++ b/src/data/firmsCards.test.mjs @@ -45,7 +45,7 @@ test('buildFireCard: title carries FRP, detail carries conf/age/satellite', () = assert.equal(card.details.length, 1); assert.equal(card.details[0], 'high · 2h · N20'); assert.equal(card.selected, false); - assert.equal(card.accent, accentForSeverity('red'), 'FRP 1520 is red-hot'); + assert.equal(card.accent, accentForSeverity('white-hot'), 'FRP 1520 is white-hot'); assert.deepEqual(card.position, { x: 1, y: 2, z: 3 }, 'uses the candidate position untouched'); }); @@ -69,26 +69,26 @@ test('buildFireCard: power that rounds to 10 MW drops the decimal', () => { assert.equal(selected.title, 'FIRE · 10 MW'); }); -test('buildFireCard: SNPP satellite code renders as SNPP, weak fire is blue', () => { +test('buildFireCard: SNPP satellite code renders as SNPP, weak fire is an ember', () => { const card = buildFireCard({ fire: fire({ satellite: 'N', frp: 0.8, confidence: 0.3 }), position: {} }, NOW); assert.match(card.details[0], /SNPP$/); assert.equal(card.title, '▲ 0.8 MW'); - assert.equal(card.accent, accentForSeverity('blue')); + assert.equal(card.accent, accentForSeverity('ember')); }); test('buildFireCard: accent steps through the FRP ramp at 5 · 20 · 50 · 100 · 300 MW', () => { const accentAt = (frp) => buildFireCard({ fire: fire({ frp }), position: {} }, NOW).accent; - assert.equal(accentAt(4.9), accentForSeverity('blue')); - assert.equal(accentAt(5), accentForSeverity('teal')); - assert.equal(accentAt(20), accentForSeverity('lime')); - assert.equal(accentAt(50), accentForSeverity('amber')); - assert.equal(accentAt(100), accentForSeverity('orange')); - assert.equal(accentAt(300), accentForSeverity('red')); + assert.equal(accentAt(4.9), accentForSeverity('ember')); + assert.equal(accentAt(5), accentForSeverity('red')); + assert.equal(accentAt(20), accentForSeverity('flame')); + assert.equal(accentAt(50), accentForSeverity('orange')); + assert.equal(accentAt(100), accentForSeverity('gold')); + assert.equal(accentAt(300), accentForSeverity('white-hot')); // Confidence never moves the color: a low-confidence 864 MW fire stays red. assert.equal( buildFireCard({ fire: fire({ frp: 864, confidence: 0.3 }), position: {} }, NOW).accent, - accentForSeverity('red'), + accentForSeverity('white-hot'), ); }); @@ -109,12 +109,12 @@ test('buildCellCard: plural noun, max FRP and newest age, accent passthrough', ( const candidate = { cell: { count: 14, maxFrp: 210.4, newestAcqMs: NOW - 3 * H, night: 2 }, position: { x: 0, y: 0, z: 0 }, - accent: accentForSeverity('orange'), + accent: accentForSeverity('gold'), }; const card = buildCellCard(candidate, NOW); assert.equal(card.title, '14 FIRES'); assert.equal(card.details[0], 'max 210 MW · new 3h'); - assert.equal(card.accent, accentForSeverity('orange')); + assert.equal(card.accent, accentForSeverity('gold')); }); test('buildCellCard: the count picks the plural form of the language', () => { @@ -166,7 +166,7 @@ test('buildCellCard: singular noun and missing-age omission', () => { const card = buildCellCard(candidate, NOW); assert.equal(card.title, '1 FIRE'); assert.equal(card.details[0], 'max 9.9 MW'); - assert.equal(card.accent, accentForSeverity('blue'), 'missing accent defaults to the coldest stop'); + assert.equal(card.accent, accentForSeverity('ember'), 'missing accent defaults to the weakest stop'); }); test('FIRMS host policy keeps ambient cards bounded and selected cards protected', () => { diff --git a/src/data/firmsHeatRaster.js b/src/data/firmsHeatRaster.js index 516c7676f..985699d7e 100644 --- a/src/data/firmsHeatRaster.js +++ b/src/data/firmsHeatRaster.js @@ -8,14 +8,18 @@ /** Below this normalized heat nothing is painted: empty land stays empty. */ export const HEAT_FLOOR = 0.03; +/** + * The FRP marker ramp as a continuous glow: faint ember at the edges, a + * pale white-hot core where the most power burns. + */ export const HEAT_PALETTE = Object.freeze([ - { at: 0.0, rgb: [43, 108, 255], alpha: 0 }, - { at: 0.08, rgb: [43, 108, 255], alpha: 0.35 }, - { at: 0.25, rgb: [25, 195, 255], alpha: 0.55 }, - { at: 0.45, rgb: [47, 224, 122], alpha: 0.65 }, - { at: 0.65, rgb: [245, 230, 66], alpha: 0.75 }, - { at: 0.82, rgb: [255, 138, 31], alpha: 0.82 }, - { at: 1.0, rgb: [255, 42, 26], alpha: 0.88 }, + { at: 0.0, rgb: [158, 42, 27], alpha: 0 }, + { at: 0.08, rgb: [158, 42, 27], alpha: 0.35 }, + { at: 0.25, rgb: [210, 64, 31], alpha: 0.55 }, + { at: 0.45, rgb: [240, 106, 40], alpha: 0.65 }, + { at: 0.65, rgb: [251, 154, 46], alpha: 0.75 }, + { at: 0.82, rgb: [253, 200, 74], alpha: 0.82 }, + { at: 1.0, rgb: [255, 243, 176], alpha: 0.9 }, ]); export function heatColorAt(t) { diff --git a/src/data/firmsHeatRaster.test.mjs b/src/data/firmsHeatRaster.test.mjs index 2b51785e6..a5cf7eccf 100644 --- a/src/data/firmsHeatRaster.test.mjs +++ b/src/data/firmsHeatRaster.test.mjs @@ -11,16 +11,20 @@ import { const fire = (lat, lon, frp = 10) => ({ lat, lon, frp }); -test('palette runs cold to hot and starts fully transparent', () => { +test('palette runs ember to white-hot and starts fully transparent', () => { assert.equal(HEAT_PALETTE[0].at, 0); assert.equal(HEAT_PALETTE.at(-1).at, 1); assert.deepEqual(heatColorAt(0), [0, 0, 0, 0]); assert.equal(heatColorAt(0.01)[3], 0, 'below the floor nothing is painted'); const low = heatColorAt(0.15); const high = heatColorAt(1); - assert.ok(low[2] > low[0], 'low heat is blue'); - assert.ok(high[0] > high[2], 'the core is red'); + assert.ok(low[0] > low[1] && low[1] > low[2], 'low heat is an ember red'); + assert.ok(high[1] > low[1] && high[2] > low[2], 'the core is paler'); assert.ok(high[3] > low[3], 'hotter is more opaque'); + for (let i = 1; i <= 100; i++) { + const [r, , b] = heatColorAt(i / 100); + assert.ok(r >= b, `no cold hue at ${i}%`); + } }); test('binFires drops each detection into its equirectangular pixel', () => { diff --git a/src/data/firmsIntensity.js b/src/data/firmsIntensity.js index 417566346..0b14dd3bd 100644 --- a/src/data/firmsIntensity.js +++ b/src/data/firmsIntensity.js @@ -1,28 +1,31 @@ /** * @module firmsIntensity * @description Fire intensity policy shared by the Active Fires layer and the - * agent fire tool: the six-stop cold → hot FRP color ramp, the log-scale + * agent fire tool: the six-stop ember → white-hot FRP color ramp, the log-scale * slider that doubles as its legend, and the one filter every consumer * (markers, cards, heat cells, the top-fires query, `get_active_fires`) runs * before anything is rendered or selected. Pure — no Cesium, no DOM. * - * Hue order follows the Portolan FIRMS explorer (`FRP_RAMP`, stepped, not - * interpolated). The thresholds are GEV's own, set on a real week's - * percentiles so every color appears: Portolan's 0/10/50/200/500/1000 MW - * leaves one red fire a week (HAL-675). + * The ramp (`FRP_RAMP`, stepped, not interpolated) runs like a fire cooling + * down: a dim ember for weak fires through red, orange and gold to a pale + * white-hot core, lightness rising with power, so the brightest marks are the + * strongest fires. No cold hues: ~90% of detections are under 20 MW and a + * blue start painted most of the map blue. The thresholds are GEV's own, set + * on a real week's percentiles so every color appears: Portolan's + * 0/10/50/200/500/1000 MW leaves one hottest fire a week (HAL-675). */ /** - * Stepped FRP ramp, coldest first. A detection takes the LAST stop whose + * Stepped FRP ramp, weakest first. A detection takes the LAST stop whose * `minFrp` it reaches. Names key the glow-sprite cache and the card accents. */ export const FRP_RAMP = Object.freeze([ - Object.freeze({ name: 'blue', minFrp: 0, hex: '#4a5bd4' }), - Object.freeze({ name: 'teal', minFrp: 5, hex: '#39a0a8' }), - Object.freeze({ name: 'lime', minFrp: 20, hex: '#c9cf4a' }), - Object.freeze({ name: 'amber', minFrp: 50, hex: '#f2b134' }), - Object.freeze({ name: 'orange', minFrp: 100, hex: '#e8722c' }), - Object.freeze({ name: 'red', minFrp: 300, hex: '#d1382a' }), + Object.freeze({ name: 'ember', minFrp: 0, hex: '#9e2a1b' }), + Object.freeze({ name: 'red', minFrp: 5, hex: '#d2401f' }), + Object.freeze({ name: 'flame', minFrp: 20, hex: '#f06a28' }), + Object.freeze({ name: 'orange', minFrp: 50, hex: '#fb9a2e' }), + Object.freeze({ name: 'gold', minFrp: 100, hex: '#fdc84a' }), + Object.freeze({ name: 'white-hot', minFrp: 300, hex: '#fff3b0' }), ]); /** Slider ticks: the ramp thresholds, so slider, legend and markers agree. */ diff --git a/src/data/firmsIntensity.test.mjs b/src/data/firmsIntensity.test.mjs index 558068e67..c1d22948b 100644 --- a/src/data/firmsIntensity.test.mjs +++ b/src/data/firmsIntensity.test.mjs @@ -18,40 +18,54 @@ import { sliderPositionForFrp, } from './firmsIntensity.js'; -test('the ramp has six cold → hot stops at 0 · 5 · 20 · 50 · 100 · 300 MW in Portolan hue order', () => { +test('the ramp has six ember → white-hot stops at 0 · 5 · 20 · 50 · 100 · 300 MW', () => { assert.deepEqual( FRP_RAMP.map((stop) => [stop.name, stop.minFrp, stop.hex]), [ - ['blue', 0, '#4a5bd4'], - ['teal', 5, '#39a0a8'], - ['lime', 20, '#c9cf4a'], - ['amber', 50, '#f2b134'], - ['orange', 100, '#e8722c'], - ['red', 300, '#d1382a'], + ['ember', 0, '#9e2a1b'], + ['red', 5, '#d2401f'], + ['flame', 20, '#f06a28'], + ['orange', 50, '#fb9a2e'], + ['gold', 100, '#fdc84a'], + ['white-hot', 300, '#fff3b0'], ], ); assert.deepEqual([...FRP_SLIDER_TICKS], [0, 5, 20, 50, 100, 300]); assert.ok(Object.isFrozen(FRP_RAMP)); }); +test('every stop is warm and each is lighter than the one below', () => { + const luma = ([r, g, b]) => 0.2126 * r + 0.7152 * g + 0.0722 * b; + let previous = -1; + for (const stop of FRP_RAMP) { + const rgb = hexToRgb(stop.hex); + assert.ok(rgb[0] >= rgb[2], `${stop.name} has no cold hue`); + assert.ok( + luma(rgb) > previous, + `${stop.name} is lighter than the stop below`, + ); + previous = luma(rgb); + } +}); + test('a detection takes the last stop it reaches; garbage reads as 0 MW', () => { - assert.equal(frpRampStop(0).name, 'blue'); - assert.equal(frpRampStop(4.99).name, 'blue'); - assert.equal(frpRampStop(5).name, 'teal'); - assert.equal(frpRampStop(19.9).name, 'teal'); - assert.equal(frpRampStop(20).name, 'lime'); - assert.equal(frpRampStop(50).name, 'amber'); - assert.equal(frpRampStop(100).name, 'orange'); - assert.equal(frpRampStop(299.9).name, 'orange'); - assert.equal(frpRampStop(300).name, 'red'); - assert.equal(frpRampStop(1246).name, 'red'); - assert.equal(frpRampStop(NaN).name, 'blue'); - assert.equal(frpRampStop(-3).name, 'blue'); - assert.equal(frpRampStop(undefined).name, 'blue'); + assert.equal(frpRampStop(0).name, 'ember'); + assert.equal(frpRampStop(4.99).name, 'ember'); + assert.equal(frpRampStop(5).name, 'red'); + assert.equal(frpRampStop(19.9).name, 'red'); + assert.equal(frpRampStop(20).name, 'flame'); + assert.equal(frpRampStop(50).name, 'orange'); + assert.equal(frpRampStop(100).name, 'gold'); + assert.equal(frpRampStop(299.9).name, 'gold'); + assert.equal(frpRampStop(300).name, 'white-hot'); + assert.equal(frpRampStop(1246).name, 'white-hot'); + assert.equal(frpRampStop(NaN).name, 'ember'); + assert.equal(frpRampStop(-3).name, 'ember'); + assert.equal(frpRampStop(undefined).name, 'ember'); }); test('hex stops convert to the "r, g, b" accents the cards paint', () => { - assert.deepEqual(hexToRgb('#4a5bd4'), [74, 91, 212]); + assert.deepEqual(hexToRgb('#9e2a1b'), [158, 42, 27]); assert.deepEqual(hexToRgb('d1382a'), [209, 56, 42]); }); @@ -84,9 +98,9 @@ test('the log slider pins 0 MW at the left and runs 1 → 1000 MW; values round- test('the track gradient is the stepped ramp on the log axis, so it doubles as the legend', () => { const gradient = rampTrackGradient(); assert.match(gradient, /^linear-gradient\(90deg, /); - assert.match(gradient, /#4a5bd4 0\.00% 23\.3\d%/); - assert.match(gradient, /#39a0a8 23\.3\d% 43\.3\d%/); - assert.match(gradient, /#d1382a 82\.5\d% 100\.00%\)$/); + assert.match(gradient, /#9e2a1b 0\.00% 23\.3\d%/); + assert.match(gradient, /#d2401f 23\.3\d% 43\.3\d%/); + assert.match(gradient, /#fff3b0 82\.5\d% 100\.00%\)$/); assert.equal(gradient.match(/#/g).length, FRP_RAMP.length); }); diff --git a/src/data/firmsLabels.js b/src/data/firmsLabels.js index 3af6a15a5..bf97982c2 100644 --- a/src/data/firmsLabels.js +++ b/src/data/firmsLabels.js @@ -36,8 +36,8 @@ const ACCENT_RGB = Object.freeze( ); /** - * Severity stop name → "r, g, b" accent string (defaults to the coldest stop). - * @param {string} stopName - A FRP_RAMP stop name ('blue' … 'red'). + * Severity stop name → "r, g, b" accent string (defaults to the weakest stop). + * @param {string} stopName - A FRP_RAMP stop name ('ember' … 'white-hot'). * @returns {string} */ export function accentForSeverity(stopName) { diff --git a/src/data/firmsLabels.test.mjs b/src/data/firmsLabels.test.mjs index 62234bb2d..a141d0d17 100644 --- a/src/data/firmsLabels.test.mjs +++ b/src/data/firmsLabels.test.mjs @@ -9,16 +9,16 @@ import { formatFrpMw, } from './firmsLabels.js'; -test('FIRMS card accents are the six FRP ramp stops, coldest as the fallback', () => { - // Portolan hue order; blue #4a5bd4 … red #d1382a (HAL-675). - assert.equal(accentForSeverity('blue'), '74, 91, 212'); - assert.equal(accentForSeverity('teal'), '57, 160, 168'); - assert.equal(accentForSeverity('lime'), '201, 207, 74'); - assert.equal(accentForSeverity('amber'), '242, 177, 52'); - assert.equal(accentForSeverity('orange'), '232, 114, 44'); - assert.equal(accentForSeverity('red'), '209, 56, 42'); - assert.equal(accentForSeverity('yellow'), accentForSeverity('blue')); - assert.equal(accentForSeverity('chartreuse'), accentForSeverity('blue')); +test('FIRMS card accents are the six FRP ramp stops, weakest as the fallback', () => { + // Ember #9e2a1b … white-hot #fff3b0, lightness rising with power. + assert.equal(accentForSeverity('ember'), '158, 42, 27'); + assert.equal(accentForSeverity('red'), '210, 64, 31'); + assert.equal(accentForSeverity('flame'), '240, 106, 40'); + assert.equal(accentForSeverity('orange'), '251, 154, 46'); + assert.equal(accentForSeverity('gold'), '253, 200, 74'); + assert.equal(accentForSeverity('white-hot'), '255, 243, 176'); + assert.equal(accentForSeverity('blue'), accentForSeverity('ember')); + assert.equal(accentForSeverity('chartreuse'), accentForSeverity('ember')); }); test('FIRMS power that rounds to 10 MW drops the decimal', () => { diff --git a/src/layers/firms/model.js b/src/layers/firms/model.js index 330d237e1..aefb94b21 100644 --- a/src/layers/firms/model.js +++ b/src/layers/firms/model.js @@ -121,7 +121,7 @@ export function createModel({ } /** - * The ramp stop for a fire radiative power (stepped, coldest first). + * The ramp stop for a fire radiative power (stepped, weakest first). * Intensity alone drives the color: confidence feeds the card text and the * switch, brightness is unreliable (saturates at 367 K) — see HAL-675. * @param {number} frp - Megawatts. diff --git a/src/layers/firms/policy.js b/src/layers/firms/policy.js index eb235bc81..faa55bbc3 100644 --- a/src/layers/firms/policy.js +++ b/src/layers/firms/policy.js @@ -111,7 +111,7 @@ export const CULL_LIFT_M = 12; /** * Color stops for detection glow sprites and card accents: the - * six-stop cold → hot FRP ramp (firmsIntensity.js), coldest first, as Cesium + * six-stop ember → white-hot FRP ramp (firmsIntensity.js), weakest first, as Cesium * colors. Stop names key the glow-sprite cache and the card accents. */ diff --git a/src/ui/layerPanel/layerRows.test.mjs b/src/ui/layerPanel/layerRows.test.mjs index 5e1d543d0..966c41cb6 100644 --- a/src/ui/layerPanel/layerRows.test.mjs +++ b/src/ui/layerPanel/layerRows.test.mjs @@ -75,7 +75,7 @@ const fireRow = (value, active = 'all') => ({ max: 1000, step: 1, value, - track: 'linear-gradient(90deg, #4a5bd4, #d1382a)', + track: 'linear-gradient(90deg, #9e2a1b, #fff3b0)', ticks: [ { at: 0, label: '0' }, { at: 0.5, label: '30' }, From 314292a006e6fda186f55c8434c9fdf97ff2cb54 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Mon, 2 Nov 2026 14:10:57 +0400 Subject: [PATCH 031/153] Brighten the heatmap edge so weak fire regions stay visible The heat scale is set by the hottest regions, so most of the world sits at the low end. The ember edge was a dark red at 35% opacity and nearly vanished into forest and savanna imagery: over the Americas the spots were there but hard to see. The edge is now a bright red starting at 58% opacity, which reads at least as well as the old blue did. --- docs/CURRENT-STATE.md | 5 +++-- src/data/firmsHeatRaster.js | 21 ++++++++++++--------- src/data/firmsHeatRaster.test.mjs | 3 ++- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 5644960bc..dabc074ae 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -2189,8 +2189,9 @@ global 2048 × 1024 grid, each weighted by its FRP in megawatts (so heat is radiated power, and raising the FRP slider does not dim areas where strong fires burn), Gaussian-blurred, normalized on a log scale against the 99.5th percentile and mapped through the -same colors, from a faint ember edge through red, orange and gold to a pale -white-hot core. Nothing is painted where +same hues, from a bright red edge through orange and gold to a pale +white-hot core. The edge starts more than half opaque, so regions far below +the hottest ones still read over forest and savanna imagery. Nothing is painted where nothing burns (`src/data/firmsHeatRaster.js`). It is one full-globe imagery tile on the active imagery host (`src/layers/firms/heatImagery.js`), rebuilt on each data refresh or filter change (the first paint at once, later ones diff --git a/src/data/firmsHeatRaster.js b/src/data/firmsHeatRaster.js index 985699d7e..f6aadff3b 100644 --- a/src/data/firmsHeatRaster.js +++ b/src/data/firmsHeatRaster.js @@ -9,17 +9,20 @@ export const HEAT_FLOOR = 0.03; /** - * The FRP marker ramp as a continuous glow: faint ember at the edges, a - * pale white-hot core where the most power burns. + * The FRP marker ramp as a continuous glow, from a red edge through orange + * and gold to a pale white-hot core. The edge is a bright red, not the + * markers' dark ember, and starts more than half opaque: most of the world + * sits low on a scale set by the hottest regions, and a dark translucent red + * vanishes into forest and savanna imagery. */ export const HEAT_PALETTE = Object.freeze([ - { at: 0.0, rgb: [158, 42, 27], alpha: 0 }, - { at: 0.08, rgb: [158, 42, 27], alpha: 0.35 }, - { at: 0.25, rgb: [210, 64, 31], alpha: 0.55 }, - { at: 0.45, rgb: [240, 106, 40], alpha: 0.65 }, - { at: 0.65, rgb: [251, 154, 46], alpha: 0.75 }, - { at: 0.82, rgb: [253, 200, 74], alpha: 0.82 }, - { at: 1.0, rgb: [255, 243, 176], alpha: 0.9 }, + { at: 0.0, rgb: [232, 58, 30], alpha: 0 }, + { at: 0.08, rgb: [232, 58, 30], alpha: 0.58 }, + { at: 0.25, rgb: [242, 86, 34], alpha: 0.7 }, + { at: 0.45, rgb: [248, 122, 40], alpha: 0.76 }, + { at: 0.65, rgb: [252, 166, 52], alpha: 0.82 }, + { at: 0.82, rgb: [254, 208, 92], alpha: 0.87 }, + { at: 1.0, rgb: [255, 245, 190], alpha: 0.92 }, ]); export function heatColorAt(t) { diff --git a/src/data/firmsHeatRaster.test.mjs b/src/data/firmsHeatRaster.test.mjs index a5cf7eccf..25c8b61fb 100644 --- a/src/data/firmsHeatRaster.test.mjs +++ b/src/data/firmsHeatRaster.test.mjs @@ -18,7 +18,8 @@ test('palette runs ember to white-hot and starts fully transparent', () => { assert.equal(heatColorAt(0.01)[3], 0, 'below the floor nothing is painted'); const low = heatColorAt(0.15); const high = heatColorAt(1); - assert.ok(low[0] > low[1] && low[1] > low[2], 'low heat is an ember red'); + assert.ok(low[0] > low[1] && low[1] > low[2], 'low heat is red'); + assert.ok(low[3] >= 0.5 * 255, 'low heat stays visible on any imagery'); assert.ok(high[1] > low[1] && high[2] > low[2], 'the core is paler'); assert.ok(high[3] > low[3], 'hotter is more opaque'); for (let i = 1; i <= 100; i++) { From ed2aaa2c50d89cb65a6cc5c88bbbd79052dd9e5d Mon Sep 17 00:00:00 2001 From: InoukT Date: Mon, 2 Nov 2026 09:58:40 -0500 Subject: [PATCH 032/153] fix(cctv): add Taiwan Highway Bureau fallback --- CONTRIBUTING.md | 2 +- DATA_SOURCES.md | 2 +- docs/CCTV_INTEGRATION.md | 133 +++++++++++++++++++++++++ docs/CURRENT-STATE.md | 20 +--- server/providers/cctv/media.js | 169 +++++++++++++++++++++++++++++-- server/providers/cctv/taiwan.js | 171 ++++++++++++++++++++++++++++++-- src/data/cctvProxy.test.mjs | 156 +++++++++++++++++++++++++++++ src/data/cctvTaiwan.test.mjs | 90 ++++++++++++++++- 8 files changed, 704 insertions(+), 39 deletions(-) create mode 100644 docs/CCTV_INTEGRATION.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d8e569d3a..197ae7b6d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -107,7 +107,7 @@ prints anything; never fix that by renaming or deleting PR A's published token. The highest-leverage places to jump in: -- **🌆 Add a CCTV source pack.** Austin is the reference camera source. Adding another city means a clean public camera catalog with coordinates, attribution, and server-registered frame URLs (the proxy only fetches registered URLs — never client-supplied ones, see [SECURITY.md](SECURITY.md)). City packs are the best first lane. +- **🌆 Add a CCTV source pack.** Austin is the reference camera source. Follow the [CCTV integration workflow](docs/CCTV_INTEGRATION.md) for source review, provider registration, proxy security, tests, and attribution. The proxy only fetches server-registered URLs — never client-supplied ones; see [SECURITY.md](SECURITY.md). - **🛰️ Add or improve a data layer.** Layer factories live in `src/layers//`, with source, record, controller and renderer owners implementing the layer interface (`init/enable/disable/update/destroy/getStats`, optional `getDetectableObjects`/`getStats`). Use an existing layer as a template, and see [Adding a new layer](#adding-a-new-layer) for what the PR needs. - **🎙️ Extend voice control.** Voice arguments are defined in `src/voice/actionSchemas.js`, with server-side descriptions in `server/providers/openai/tools.js` and client-side execution in `src/voice/gevActions.js`. Keep the tool surface tight and the responses honest (confirm only what actually happened). - **🎨 Add a visual style.** Styles are GLSL post-process shaders in `src/styles/`. diff --git a/DATA_SOURCES.md b/DATA_SOURCES.md index a4035f175..0d4c1ad9c 100644 --- a/DATA_SOURCES.md +++ b/DATA_SOURCES.md @@ -115,7 +115,7 @@ The optional Local ADS-B layer and the broadcast-FM receiver use radio you recei **Quebec is thinly represented**, and that is upstream rather than a filter here: the province runs its own Info-Smog program, so only a handful of Quebec stations appear in ECCC's national feed. The reporting station count also varies hour to hour as stations report or fall silent. - **Via Lietuva / Eismoinfo (Lithuania).** Public road-camera catalogs and periodically updated still images from [Eismoinfo](https://eismoinfo.lt/), credited to Via Lietuva / eismoinfo.lt in the app. **Off by default.** The camera endpoints are the eismoinfo.lt website backend and are not among the services listed in Via Lietuva's [open-data statement](https://eismoinfo.lt/eismoinfo-backend/content?id=44), whose conditions are attribution and reuse on the same terms. Until the statement is confirmed to cover the camera photos, the pack loads only when an operator sets `CCTV_LITHUANIA_ENABLED=1`; with the flag unset, empty or any other value, the server makes no request to Eismoinfo. `eismoinfo-backend/camera-info-table` is joined by ID to `layer-static-features/VKR`. Without `lks=true`, the latter returns WGS84 `[latitude, longitude]`; the table's `x/y` instead use LKS-94 metres. Only the official HTTPS `/eismoinfo-backend/image-provider/camera/last?id=…` image endpoint is registered. Catalogs use the shared 15-minute cache; frames are fetched on demand and never bundled or archived. These are periodic snapshots, not continuous video. Camera headings are low-confidence estimates. No API key is required. `CCTV_LITHUANIA_MAX_SOURCES` defaults to 400. -- **Freeway Bureau, MOTC (Taiwan).** National freeway cameras from the Freeway Bureau's keyless [CCTV static table](https://tisvcloud.freeway.gov.tw/history/motc20/CCTV.xml) in the MOTC 2.0 standard, refreshed daily and fetched at runtime (never bundled). Freeway Bureau traffic data is published under the [Open Government Data License, Taiwan (Version 1.0)](https://data.gov.tw/license), which permits reuse, including commercial reuse, with attribution; the app credits the Freeway Bureau, MOTC, names the dataset and links the licence, as its attribution exhibit asks. The table publishes each camera's MJPEG stream on one of four official camera servers (`cctvn`, `cctvn5`, `cctvc`, `cctvs` under `freeway.gov.tw`). The frame proxy relays single images, so each published stream URL is mapped to the same server's single-JPEG path for the same camera number (`/abs2mjpg/bmjpg` → `/abs2mjpg/jpg`, `/live-view/mjpg/video.cgi` → `/live-view/jpg/image.cgi`); only those exact HTTPS pairs are registered, and the still path is not itself listed in the table. These are on-demand snapshots, not continuous video. Camera headings are low-confidence estimates. No API key is required. The table host does not answer from some networks outside Taiwan (the camera servers do); there the pack is empty, logs one warning and retries hourly. On by default; `CCTV_TAIWAN_ENABLED=0` skips the pack, and `CCTV_TAIWAN_MAX_SOURCES` defaults to 600 (bounded to 1–2000). +- **Freeway Bureau and Highway Bureau, MOTC (Taiwan).** National freeway cameras use the Freeway Bureau’s keyless [MOTC 2.0 CCTV table](https://tisvcloud.freeway.gov.tw/history/motc20/CCTV.xml), refreshed daily and fetched at runtime (never bundled). Freeway Bureau data follows the [Open Government Data License, Taiwan v1.0](https://data.gov.tw/license); the app credits the Bureau, names the dataset and links the licence. If that catalog is unreachable and no last-good source list exists, the app falls back to the Highway Bureau’s free [provincial-road CCTV XML feed](https://thbapp.thb.gov.tw/opendata/), with attribution as requested by the Bureau. Its MJPEG streams are accepted only from cctv-ss01 through cctv-ss08.thb.gov.tw over HTTPS; the frame proxy extracts one bounded JPEG per request. This fallback covers provincial roads, not national freeways. Neither feed requires an API key. CCTV_TAIWAN_ENABLED=0 disables both; CCTV_TAIWAN_MAX_SOURCES defaults to 600 (bounded to 1–2000). - **Google Maps Platform.** You supply your own API key and are bound by [Google's ToS](https://cloud.google.com/maps-platform/terms). Google Maps Content (tiles, geocodes, places) **may not be cached, stored, rehosted, or committed** — this app only ever uses it live, which is the compliant pattern. The "Google" attribution is displayed on the globe and must stay visible. Restrict your key (see [SECURITY.md](SECURITY.md)). - **OpenSky Network.** Its license is **non-commercial**, and operational use of the REST API in a live product can require a prior written agreement with OpenSky — even for non-profit/government use. If you deploy this commercially, contact OpenSky for your own terms. The flights layer is a toggle and runs anonymously by default. diff --git a/docs/CCTV_INTEGRATION.md b/docs/CCTV_INTEGRATION.md new file mode 100644 index 000000000..9cd81f837 --- /dev/null +++ b/docs/CCTV_INTEGRATION.md @@ -0,0 +1,133 @@ +# CCTV integration workflow + +Use this workflow when adding a camera provider or repairing an existing feed. +The CCTV layer gets its catalog and media through the local server; keep +provider-specific network access and URL policy on the server side. + +## 1. Check the source before coding + +- Identify the catalog endpoint and the actual frame or live-media endpoint. + They may be different hosts or use different formats. +- Read the provider's license, terms, attribution, rate limits, and access + requirements. Publicly reachable data is not automatically licensed for + reuse. Record whether the app may display it and whether any use is + restricted. +- Prefer a public, keyless feed. If credentials are required, keep them in a + server-only environment variable; never put a secret in browser code or a + Vite-exposed variable. If access terms require an agreement or remain + unconfirmed, make the pack opt-in and ensure it makes no request by default. +- Confirm the feed can be fetched from the app's Node server environment. A URL + opening in a browser does not prove the server can reach it, and browser CORS + behavior does not diagnose a server-side fetch. +- Treat camera directories and aggregators such as [TW Live](https://tw.live/) + as discovery aids. Trace each listing to the original agency or camera owner; + their data and media terms govern reuse. For example, SkylineWebcams says + only camera hosts may embed its live feed and its terms restrict copying or + retransmitting footage, so do not proxy its stream without written + authorization ([FAQ](https://www.skylinewebcams.com/support/faq.html), + [terms](https://www.skylinewebcams.com/en/terms-of-use.html)). +- Decide whether the provider supplies still snapshots or continuous video. + Prefer stills unless live video is necessary and supported by the existing + proxy path. + +## 2. Add and register the provider pack + +Use the smallest existing provider as a template. Current owners are: + +- `server/providers/cctv/sources.js` for standard open-data loaders. +- `server/providers/cctv/.js` for a provider with its own parser, + fallback, or more involved URL policy. +- `server/providers/cctv/catalog.js` to import the loader and add it to + `LIVE_PACKS`. Each pack is independently gated and the shared catalog cap + allocates space across packs. +- `server/providers/cctv/constants.js` for provider endpoints, caps, and + timeouts. + +Return normalized camera records with stable unique IDs, readable names, +`city`/`cityId`, provider attribution, valid `lat`/`lon`, and the correct +`feedType`. Include camera heading only when the source actually provides a +bearing; descriptive direction text is not a numeric heading. Mark uncertain +heading data with the existing low-confidence conventions. Set `sourceKind` so +health and source diagnostics identify the provider. Apply a bounded per-pack +camera limit and geographic filtering where appropriate; avoid one provider +silently consuming the whole shared catalog cap. + +Camera coordinates need their own verification. Prefer the original provider's +camera coordinates, then corroborate them against its location description, +route/mile marker, or official map. An aggregator's map dot, a town/county name, +or a geocoded attraction name is not a precise camera position. Do not pin a +camera to a city center or nearby landmark; if its actual location cannot be +verified, leave it out until it can. For manually curated coordinates, record +the evidence in the provider data or an adjacent comment. For example, TW Live +camera pages identify the originating agency; use that agency's catalog for +the camera point when available. + +If the source becomes opt-in, use the catalog's opt-in gate (`envOptIn`) and +document the flag and reason in `DATA_SOURCES.md`. Otherwise use the normal +enabled-by-default flag pattern and document how to disable the pack. + +## 3. Keep frame and media requests server-registered + +The browser should request the local `/api/cctv/frame/:id` or +`/api/cctv/media/:id` endpoint. Do not pass an arbitrary upstream URL from the +browser, and do not fetch an unvalidated URL supplied by a catalog record. +Every provider must have a server-side rule that pins frame and media URLs to +the expected scheme, host, and path; use HTTPS where the provider supports it. +Use `pinnedCameraUrl()` for URLs that belong under a fixed provider directory, +or a stricter provider-specific validator when hosts or paths vary. Register +any new permitted image/media origin in the existing +`server/providers/cctv` media policy. + +Catalog and media loaders must also: + +- refuse unsafe schemes, credentials, unexpected ports, redirects outside the + registered origin/path, and malformed identifiers; +- set request deadlines and cap catalog and buffered frame bodies; +- parse only the expected format and validate coordinates before returning a + camera; +- handle offline cameras and partial provider failures without failing the + entire merged catalog; and +- avoid persistent frame storage unless the provider's terms explicitly allow + it and the design has been reviewed. + +For live media, use the existing media proxy and supported feed type (`mjpeg`, +`mp4`, `webm`, or `hls`) rather than adding a direct browser stream. Validate +the upstream content type and bound or cancel streams according to the +existing proxy behavior. Read [SECURITY.md](../SECURITY.md) before changing +URL validation, redirects, or proxy behavior. + +## 4. Add focused regression coverage + +Add provider tests under `src/data/` following the existing CCTV test naming +and fixtures. Cover at least: + +- representative valid catalog rows and their normalized output; +- missing or invalid IDs, coordinates, and frame URLs; +- duplicate records and the pack's cap/filter behavior; +- unsafe host/path, credentials, and redirect cases; +- timeout, oversized, malformed, and unavailable upstream responses; and +- the frame or live-media content type the provider actually serves. + +Use `src/data/cctvProxy.test.mjs` for shared proxy/media behavior and +`src/data/cctvCatalogCap.test.mjs` for shared catalog allocation. Run the +focused provider and proxy tests, then the standard checks from +[CONTRIBUTING.md](../CONTRIBUTING.md) that apply to the change. For runtime +verification, inspect `/api/cctv/sources`, `/api/cctv/health`, and the camera's +`/api/cctv/frame/:id` or `/api/cctv/stream/:id` response locally. Confirm a +successful frame is from the upstream camera by checking its content type and +`X-CCTV-Source`; a fallback image is not proof that the upstream feed works. + +## 5. Update source documentation and submit + +- Add the provider, endpoint, terms/license, required attribution, key status, + caching behavior, and any restrictions to `DATA_SOURCES.md`. +- Update the CCTV source section in `docs/CURRENT-STATE.md` when runtime + behavior, flags, caps, or fallback behavior changes. +- Register in-app attribution through the existing source/provider credit + fields; update `src/data/dataCredits.js` when the source needs a layer-level + credit. +- Add the required `changelog.d/-.md` entry for a runtime + change, and include the source, license, attribution, key/runtime-fetch + details, and verification evidence in the PR description. +- For a new layer, also follow the camera/source requirements in the + [new-layer PR checklist](../CONTRIBUTING.md#adding-a-new-layer). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 84d42cb7b..9dbb20ce9 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -1341,24 +1341,8 @@ video; camera poses use the existing low-confidence heading prior. ## Taiwan CCTV source pack -The CCTV catalog includes Taiwan national freeway cameras from the Freeway -Bureau, MOTC. One keyless request reads the daily MOTC 2.0 `CCTV.xml` table -(~1,800 cameras); the request refuses redirects, has a 15-second deadline and a -6 MiB response cap, and uses the shared 15-minute cache and fair catalog -allocation. A failed download serves the last good table (up to a day old), -or an empty pack, and is not retried for an hour: the catalog host does not -answer from some networks outside Taiwan, and without the backoff every refresh -there would wait out the connect timeout. The table -publishes MJPEG stream URLs; each is mapped to the same camera server's -single-JPEG path for the same camera number, and only those exact HTTPS pairs -on the four `freeway.gov.tw` camera servers are registered with the frame -proxy. Camera keys come from the server and camera number, because published -CCTV IDs contain Chinese place names and a few repeat across cameras. Poses use -the low-confidence heading prior. `CCTV_TAIWAN_ENABLED=0` disables the pack; -`CCTV_TAIWAN_MAX_SOURCES` sets its cap (default 600, bounded to 1–2000), and -`CCTV_TAIWAN_URL` overrides the table URL. -Gate: `src/data/cctvTaiwan.test.mjs`. - +The CCTV catalog includes Taiwan national freeway cameras from the Freeway Bureau, MOTC. The app first reads the daily MOTC 2.0 CCTV.xml table with a keyless HTTPS request, a 15-second deadline, a 6 MiB response cap, and the shared 15-minute cache. If that catalog is unreachable and no last-good source list exists, the loader uses the Highway Bureau’s public provincial-road CCTV XML feed at https://cctv-maintain.thb.gov.tw/opendataCCTVs.xml. The fallback is capped by the same Taiwan source limit and hourly retry backoff; its MJPEG feeds are restricted to the eight cctv-ss01 through cctv-ss08.thb.gov.tw HTTPS servers. The frame proxy returns one bounded JPEG from each stream, not an unbounded video response. The Highway Bureau open-data page states XML downloads are free and asks users to attribute the source; the app credits Highway Bureau, MOTC. These are provincial-road cameras, not a replacement for the national freeway cameras. CCTV_TAIWAN_ENABLED=0 disables both feeds; CCTV_TAIWAN_MAX_SOURCES sets the shared cap (default 600, bounded to 1–2000), and CCTV_TAIWAN_URL overrides the Freeway Bureau table URL. +Gate: src/data/cctvTaiwan.test.mjs and src/data/cctvProxy.test.mjs. ## DriveBC CCTV source pack The CCTV catalog adds DriveBC highway cameras for British Columbia alongside the diff --git a/server/providers/cctv/media.js b/server/providers/cctv/media.js index 7f89f2ae1..dcb8e4d83 100644 --- a/server/providers/cctv/media.js +++ b/server/providers/cctv/media.js @@ -621,6 +621,151 @@ export function cctvUpstreamUserAgent(url) { } } +/** Read one bounded JPEG part from an open MJPEG response, then stop the stream. */ +async function readFirstMjpegFrame(upstream, maxBytes) { + const mediaType = cctvLiveMediaType( + 'mjpeg', + upstream.headers.get('content-type'), + ); + const boundary = parseMediaType(mediaType)?.params.get('boundary') || ''; + if ( + !boundary || + !upstream.body || + !Number.isSafeInteger(maxBytes) || + maxBytes < 4 + ) { + try { + await upstream.body?.cancel(); + } catch { + /* no-op */ + } + return null; + } + + const nextBoundary = Buffer.from('\r\n--' + boundary, 'latin1'); + const opening = Buffer.from('--' + boundary + '\r\n', 'latin1'); + const headerTerminator = Buffer.from('\r\n\r\n', 'ascii'); + const jpegStart = Buffer.from([0xff, 0xd8]); + const jpegEnd = Buffer.from([0xff, 0xd9]); + const maxHeaderBytes = 8 * 1024; + const maxBufferedBytes = + opening.length + headerTerminator.length + maxHeaderBytes + maxBytes; + let reader; + let buffer = Buffer.alloc(0); + let parsedHeaders = false; + let bodyStart = -1; + let declaredLength = null; + + try { + reader = upstream.body.getReader(); + for (;;) { + const { done, value } = await reader.read(); + if (done) return null; + + const chunk = Buffer.from(value); + const room = Math.max(0, maxBufferedBytes - buffer.length); + const included = chunk.subarray(0, room); + const overflow = included.length < chunk.length; + buffer = Buffer.concat( + [buffer, included], + buffer.length + included.length, + ); + + if (buffer.length < opening.length) { + if (overflow) return null; + continue; + } + if (!buffer.subarray(0, opening.length).equals(opening)) return null; + + if (!parsedHeaders) { + const headerEnd = buffer.indexOf(headerTerminator, opening.length); + if (headerEnd < 0) { + if (buffer.length - opening.length > maxHeaderBytes || overflow) + return null; + continue; + } + if (headerEnd - opening.length > maxHeaderBytes) return null; + + const headerText = buffer + .subarray(opening.length, headerEnd) + .toString('latin1'); + const headers = new Map(); + for (const line of headerText.split('\r\n')) { + const colon = line.indexOf(':'); + if (colon <= 0) return null; + const name = line.slice(0, colon).trim().toLowerCase(); + if (!name || headers.has(name)) return null; + headers.set(name, line.slice(colon + 1).trim()); + } + if (cctvRasterImageType(headers.get('content-type')) !== 'image/jpeg') + return null; + + const length = headers.get('content-length'); + if (length !== undefined) { + if (!/^\d+$/.test(length)) return null; + declaredLength = Number(length); + if ( + !Number.isSafeInteger(declaredLength) || + declaredLength < jpegStart.length + jpegEnd.length || + declaredLength > maxBytes + ) + return null; + } + bodyStart = headerEnd + headerTerminator.length; + parsedHeaders = true; + } + + const available = buffer.length - bodyStart; + if (declaredLength !== null) { + const nextPart = buffer.indexOf(nextBoundary, bodyStart); + if (nextPart >= bodyStart && nextPart - bodyStart < declaredLength) + return null; + if (available >= declaredLength) { + const frame = buffer.subarray(bodyStart, bodyStart + declaredLength); + if ( + frame.subarray(0, jpegStart.length).equals(jpegStart) && + frame.subarray(-jpegEnd.length).equals(jpegEnd) + ) + return Buffer.from(frame); + return null; + } + } else if (available >= jpegStart.length) { + const frameStart = buffer.subarray( + bodyStart, + bodyStart + jpegStart.length, + ); + if (!frameStart.equals(jpegStart)) return null; + const nextPart = buffer.indexOf(nextBoundary, bodyStart); + const end = buffer.indexOf(jpegEnd, bodyStart + jpegStart.length); + if ( + nextPart >= bodyStart && + (end < 0 || end + jpegEnd.length > nextPart) + ) + return null; + if (end >= 0) { + const frameLength = end + jpegEnd.length - bodyStart; + if (frameLength > maxBytes) return null; + return Buffer.from(buffer.subarray(bodyStart, end + jpegEnd.length)); + } + if (available > maxBytes) return null; + } + if (overflow) return null; + } + } finally { + if (reader) { + try { + await reader.cancel(); + } catch { + /* already closed or aborted */ + } + try { + reader.releaseLock(); + } catch { + /* already released */ + } + } + } +} /** * Fetch one upstream CCTV image within the frame-refresh budget. * @@ -660,10 +805,7 @@ export async function fetchCctvImageFromUpstream( fetchImpl, ); if (!upstream) return null; - const contentType = cctvRasterImageType( - upstream.headers.get('content-type'), - ); - if (!upstream.ok || !contentType) { + if (!upstream.ok) { try { await upstream.body?.cancel(); } catch { @@ -671,9 +813,24 @@ export async function fetchCctvImageFromUpstream( } return null; } - const body = await readCappedResponseBytes(upstream, maxBytes); + const upstreamType = upstream.headers.get('content-type'); + const contentType = cctvRasterImageType(upstreamType); + if (contentType) { + const body = await readCappedResponseBytes(upstream, maxBytes); + if (!body) return null; + return { ok: true, body, contentType }; + } + if (!cctvLiveMediaType('mjpeg', upstreamType)) { + try { + await upstream.body?.cancel(); + } catch { + /* no-op */ + } + return null; + } + const body = await readFirstMjpegFrame(upstream, maxBytes); if (!body) return null; - return { ok: true, body, contentType }; + return { ok: true, body, contentType: 'image/jpeg' }; } catch { return null; } finally { diff --git a/server/providers/cctv/taiwan.js b/server/providers/cctv/taiwan.js index a14aabf9a..e24f015b1 100644 --- a/server/providers/cctv/taiwan.js +++ b/server/providers/cctv/taiwan.js @@ -10,6 +10,8 @@ import { readResponseTextCapped } from '../common/http.js'; * standard, published keyless and refreshed daily (~1,800 cameras). */ export const TAIWAN_FREEWAY_CCTV_URL = 'https://tisvcloud.freeway.gov.tw/history/motc20/CCTV.xml'; +export const TAIWAN_HIGHWAY_CCTV_URL = + 'https://cctv-maintain.thb.gov.tw/opendataCCTVs.xml'; /** The whole network is ~1.2 MB. */ export const TAIWAN_MAX_CATALOG_BYTES = 6 * 1024 * 1024; const DEFAULT_TAIWAN_MAX_SOURCES = 600; @@ -35,6 +37,16 @@ const STREAM_TO_FRAME = new Map([ ]); const DIRECTIONS = { N: 'N', S: 'S', E: 'E', W: 'W' }; +const TAIWAN_HIGHWAY_CAMERA_HOSTS = new Set([ + 'cctv-ss01.thb.gov.tw', + 'cctv-ss02.thb.gov.tw', + 'cctv-ss03.thb.gov.tw', + 'cctv-ss04.thb.gov.tw', + 'cctv-ss05.thb.gov.tw', + 'cctv-ss06.thb.gov.tw', + 'cctv-ss07.thb.gov.tw', + 'cctv-ss08.thb.gov.tw', +]); /** Prioritization anchors, north to south, so a cap keeps the whole island * rather than only greater Taipei. */ @@ -211,6 +223,74 @@ export function taiwanCameraToSource(row) { }; } +/** + * One Highway Bureau row -> a source whose first MJPEG frame is served as a + * snapshot by the existing camera-frame proxy. + * + * @param {object} row - Output of parseTaiwanCctvXml. + * @returns {?object} + */ +export function taiwanHighwayCameraToSource(row) { + if (!row || typeof row !== 'object') return null; + const { lat, lon } = row; + if (!isLikelyTaiwanCoordinate(lat, lon)) return null; + + let url; + try { + url = new URL(String(row.streamUrl ?? '')); + } catch { + return null; + } + if ( + url.protocol !== 'https:' || + url.username || + url.password || + url.port || + url.search || + url.hash || + !TAIWAN_HIGHWAY_CAMERA_HOSTS.has(url.hostname) || + !/^\/[A-Za-z0-9._+~-]{1,100}$/.test(url.pathname) || + url.pathname.includes('..') + ) + return null; + + const rawId = String(row.cctvId ?? '').trim(); + if (!/^[A-Za-z0-9-]{1,80}$/.test(rawId)) return null; + const cameraId = 'tw-thb-' + rawId.toLowerCase(); + const road = String(row.roadName ?? '').trim(); + const direction = DIRECTIONS[String(row.direction ?? '').trim()] || ''; + const mile = String(row.mile ?? '').trim(); + const section = [row.sectionStart, row.sectionEnd] + .map((part) => String(part ?? '').trim()) + .filter(Boolean) + .join('→'); + const name = + (road || mile || section + ? [road, direction, mile, section].filter(Boolean).join(' ') + : '') || rawId; + + return { + id: cameraId, + name: name.slice(0, 160), + city: 'Taiwan / 臺灣', + cityId: 'taiwan', + provider: 'Highway Bureau, MOTC', + lat, + lon, + headingDeg: fallbackHeadingFromId(cameraId), + headingConfidence: 'low', + pitchDeg: -18, + fovDeg: 44, + rangeM: 145, + mountHeightM: 8, + feedType: 'mjpeg', + url: url.href, + snapshotUrl: url.href, + sourceKind: 'taiwan-highway-motc', + license: 'Highway Bureau, MOTC open data', + code: cameraDisplayCode((road + ' ' + mile).trim().toUpperCase() || rawId), + }; +} let lastGood = null; let lastGoodAt = 0; let retryAfter = 0; @@ -237,6 +317,49 @@ function taiwanSourceCap() { : DEFAULT_TAIWAN_MAX_SOURCES; } +/** Fetch the public provincial-road CCTV table as a no-key fallback. */ +async function loadTaiwanHighwaySources() { + const signal = AbortSignal.timeout(CCTV_SOURCE_FETCH_TIMEOUT_MS); + const response = await fetch(TAIWAN_HIGHWAY_CCTV_URL, { + headers: { Accept: 'application/xml,text/xml' }, + redirect: 'manual', + signal, + }); + if (!response.ok) { + await response.body?.cancel().catch(() => {}); + throw new Error( + response.status >= 300 && response.status < 400 + ? 'Highway Bureau catalog redirected; redirects are not followed' + : 'Highway Bureau catalog HTTP ' + response.status, + ); + } + const xml = await readResponseTextCapped( + response, + TAIWAN_MAX_CATALOG_BYTES, + signal, + ); + const cameras = new Map(); + for (const row of parseTaiwanCctvXml(xml)) { + const camera = taiwanHighwayCameraToSource(row); + if (camera && !cameras.has(camera.id)) cameras.set(camera.id, camera); + } + if (!cameras.size) + throw new Error('no usable Highway Bureau cameras in the table'); + const sources = prioritizeSources( + [...cameras.values()], + taiwanSourceCap(), + ANCHORS, + ); + console.log( + '[CCTV] Loaded Taiwan Highway Bureau fallback: ' + + cameras.size + + ' (using ' + + sources.length + + ')', + ); + return sources; +} + /** * Fetch Taiwan Freeway Bureau cameras from the keyless MOTC 2.0 XML table. * One bounded request per shared catalog refresh. A failed download serves the @@ -262,7 +385,7 @@ export async function loadTaiwanSources() { throw new Error( response.status >= 300 && response.status < 400 ? 'catalog redirected; redirects are not followed' - : `HTTP ${response.status}`, + : 'HTTP ' + response.status, ); } const xml = await readResponseTextCapped( @@ -282,7 +405,11 @@ export async function loadTaiwanSources() { ANCHORS, ); console.log( - `[CCTV] Loaded Taiwan camera sources: ${cameras.size} (using ${sources.length})`, + '[CCTV] Loaded Taiwan camera sources: ' + + cameras.size + + ' (using ' + + sources.length + + ')', ); lastGood = sources; lastGoodAt = Date.now(); @@ -291,13 +418,37 @@ export async function loadTaiwanSources() { } catch (error) { retryAfter = Date.now() + TAIWAN_RETRY_AFTER_FAILURE_MS; const fallback = fallbackSources(); - console.warn( - `[CCTV] Taiwan camera download failed (${error?.message || error}); ` + - (fallback.length - ? `serving the last good ${fallback.length} cameras` - : 'no Taiwan cameras') + - ', next attempt in 1 h', - ); - return fallback; + if (fallback.length) { + console.warn( + '[CCTV] Taiwan Freeway camera download failed (' + + (error?.message || error) + + '); serving the last good ' + + fallback.length + + ' cameras, next attempt in 1 h', + ); + return fallback; + } + try { + const sources = await loadTaiwanHighwaySources(); + lastGood = sources; + lastGoodAt = Date.now(); + console.warn( + '[CCTV] Taiwan Freeway camera download failed (' + + (error?.message || error) + + '); using ' + + sources.length + + ' Highway Bureau cameras as fallback, next attempt in 1 h', + ); + return sources; + } catch (fallbackError) { + console.warn( + '[CCTV] Taiwan Freeway camera download failed (' + + (error?.message || error) + + '); Highway Bureau fallback failed (' + + (fallbackError?.message || fallbackError) + + '); no Taiwan cameras, next attempt in 1 h', + ); + return []; + } } } diff --git a/src/data/cctvProxy.test.mjs b/src/data/cctvProxy.test.mjs index f197c9a97..979a18ded 100644 --- a/src/data/cctvProxy.test.mjs +++ b/src/data/cctvProxy.test.mjs @@ -313,3 +313,159 @@ test('CCTV upstream frame fetch accepts only raster image types and sends their assert.equal(state.cancelled, true, `${contentType}: body cancelled`); } }); + +function multipartResponse(contentType, chunks, { onCancel = () => {} } = {}) { + let nextChunk = 0; + const body = new ReadableStream( + { + pull(controller) { + if (nextChunk >= chunks.length) { + controller.close(); + return; + } + controller.enqueue(chunks[nextChunk++]); + }, + cancel() { + onCancel(); + }, + }, + { highWaterMark: 0 }, + ); + return new Response(body, { + status: 200, + headers: { 'Content-Type': contentType }, + }); +} + +function jpegPart(boundary, body, contentType = 'image/jpeg', length = body.length) { + return Buffer.concat([ + Buffer.from( + '--' + + boundary + + '\r\nContent-Type: ' + + contentType + + '\r\nContent-Length: ' + + length + + '\r\n\r\n', + ), + body, + Buffer.from('\r\n'), + ]); +} + +test('CCTV upstream frame fetch extracts only the first JPEG from MJPEG', async () => { + const boundary = 'DIGIEVER'; + const first = Buffer.from([0xff, 0xd8, 0x11, 0x22, 0xff, 0xd9]); + const second = Buffer.from([0xff, 0xd8, 0x33, 0x44, 0xff, 0xd9]); + for (const type of [ + 'multipart/x-mixed-replace; boundary=DIGIEVER', + 'multipart/x-mixed-replace; boundary="DIGIEVER"', + ]) { + let cancelled = false; + const result = await fetchCctvImageFromUpstream( + 'https://cctv-ss02.thb.gov.tw/T62-9K+020', + { + maxBytes: 1024, + fetchImpl: async () => + multipartResponse( + type, + [ + jpegPart(boundary, first), + jpegPart(boundary, second), + Buffer.from('--' + boundary + '--\r\n'), + ], + { onCancel: () => { cancelled = true; } }, + ), + }, + ); + assert.equal(result?.contentType, 'image/jpeg', type); + assert.deepEqual(result?.body, first, type); + assert.equal(cancelled, true, type); + } +}); + +test('CCTV upstream frame fetch rejects malformed and non-JPEG MJPEG parts', async () => { + const jpeg = Buffer.from([0xff, 0xd8, 0x01, 0x02, 0xff, 0xd9]); + for (const [type, chunks] of [ + ['multipart/x-mixed-replace', []], + [ + 'multipart/x-mixed-replace; boundary=DIGIEVER', + [jpegPart('DIGIEVER', jpeg, 'image/png')], + ], + ]) { + let cancelled = false; + const result = await fetchCctvImageFromUpstream( + 'https://cctv-ss02.thb.gov.tw/T62-9K+020', + { + fetchImpl: async () => + multipartResponse(type, chunks, { onCancel: () => { cancelled = true; } }), + }, + ); + assert.equal(result, null, type); + assert.equal(cancelled, true, type); + } +}); + +test('CCTV upstream frame fetch rejects truncated or oversized MJPEG parts', async () => { + const boundary = 'DIGIEVER'; + const full = Buffer.from([0xff, 0xd8, 0x01, 0x02, 0xff, 0xd9]); + const truncated = Buffer.from([0xff, 0xd8, 0x01, 0x02]); + for (const [chunks, maxBytes] of [ + [jpegPart(boundary, truncated, 'image/jpeg', full.length), 1024], + [jpegPart(boundary, full), 5], + ]) { + let cancelled = false; + const result = await fetchCctvImageFromUpstream( + 'https://cctv-ss02.thb.gov.tw/T62-9K+020', + { + maxBytes, + fetchImpl: async () => + multipartResponse( + 'multipart/x-mixed-replace; boundary=' + boundary, + [chunks], + { onCancel: () => { cancelled = true; } }, + ), + }, + ); + assert.equal(result, null); + assert.equal(cancelled, true); + } +}); + +test('CCTV upstream frame fetch does not cross into a later part when the first JPEG is truncated', async () => { + const boundary = 'DIGIEVER'; + const truncated = Buffer.from([0xff, 0xd8, 0x01, 0x02]); + const valid = Buffer.from([0xff, 0xd8, 0x03, 0x04, 0xff, 0xd9]); + const wire = Buffer.concat([ + Buffer.from( + '--' + boundary + '\r\nContent-Type: image/jpeg\r\n\r\n', + ), + truncated, + Buffer.from( + '\r\n--' + + boundary + + '\r\nContent-Type: image/jpeg\r\nContent-Length: ' + + valid.length + + '\r\n\r\n', + ), + valid, + Buffer.from('\r\n--' + boundary + '--\r\n'), + ]); + let cancelled = false; + + const result = await fetchCctvImageFromUpstream( + 'https://cctv-ss02.thb.gov.tw/T62-9K+020', + { + maxBytes: 1024, + fetchImpl: async () => + multipartResponse( + 'multipart/x-mixed-replace; boundary=' + boundary, + [wire], + { onCancel: () => { cancelled = true; } }, + ), + }, + ); + + assert.equal(result, null); + assert.equal(cancelled, true); +}); \ No newline at end of file diff --git a/src/data/cctvTaiwan.test.mjs b/src/data/cctvTaiwan.test.mjs index 4794f11a8..d1d52e190 100644 --- a/src/data/cctvTaiwan.test.mjs +++ b/src/data/cctvTaiwan.test.mjs @@ -182,6 +182,86 @@ test('loader deduplicates cameras that share a camera number', async (t) => { ]); }); +test('falls back to Highway Bureau MJPEG cameras when the Freeway catalog fails', async (t) => { + const highwayUrl = 'https://cctv-maintain.thb.gov.tw/opendataCCTVs.xml'; + const requests = []; + t.mock.method(console, 'log', () => {}); + t.mock.method(console, 'warn', () => {}); + t.mock.method(globalThis, 'fetch', async (url, options) => { + const href = String(url); + requests.push(href); + assert.equal(options.redirect, 'manual'); + if (href === TAIWAN_FREEWAY_CCTV_URL) + return new Response('', { status: 503 }); + if (href === highwayUrl) { + return new Response( + cctvXml( + block({ + id: 'CCTV-14-0620-009-002', + stream: 'https://cctv-ss02.thb.gov.tw:443/T62-9K+020', + lat: '24.9967', + lon: '121.4521', + }), + ), + { headers: { 'content-type': 'application/xml' } }, + ); + } + throw new Error('Unexpected Taiwan feed URL: ' + href); + }); + + const sources = await loadTaiwanSources(); + + assert.deepEqual(requests, [TAIWAN_FREEWAY_CCTV_URL, highwayUrl]); + assert.equal(sources.length, 1); + assert.equal(sources[0].id, 'tw-thb-cctv-14-0620-009-002'); + assert.equal(sources[0].cityId, 'taiwan'); + assert.equal(sources[0].provider, 'Highway Bureau, MOTC'); + assert.equal(sources[0].feedType, 'mjpeg'); + assert.equal(sources[0].sourceKind, 'taiwan-highway-motc'); + assert.equal(new URL(sources[0].url).hostname, 'cctv-ss02.thb.gov.tw'); + assert.equal(new URL(sources[0].url).pathname, '/T62-9K+020'); +}); + +test('the Highway Bureau fallback registers only approved HTTPS camera servers', async (t) => { + const highwayUrl = 'https://cctv-maintain.thb.gov.tw/opendataCCTVs.xml'; + t.mock.method(console, 'log', () => {}); + t.mock.method(console, 'warn', () => {}); + t.mock.method(globalThis, 'fetch', async (url) => { + if (String(url) === TAIWAN_FREEWAY_CCTV_URL) + return new Response('', { status: 503 }); + if (String(url) === highwayUrl) { + return new Response( + cctvXml( + block({ + id: 'CCTV-14-0620-009-001', + stream: 'https://cctv-ss09.thb.gov.tw/T62-9K+019', + }), + block({ + id: 'CCTV-14-0620-009-003', + stream: 'http://cctv-ss02.thb.gov.tw/T62-9K+021', + }), + block({ + id: 'CCTV-14-0620-009-004', + stream: 'https://cctv-ss02.thb.gov.tw:8443/T62-9K+022', + }), + block({ + id: 'CCTV-14-0620-009-002', + stream: 'https://cctv-ss02.thb.gov.tw:443/T62-9K+020', + }), + ), + { headers: { 'content-type': 'application/xml' } }, + ); + } + throw new Error('Unexpected Taiwan feed URL: ' + String(url)); + }); + + const sources = await loadTaiwanSources(); + + assert.deepEqual( + sources.map((source) => source.id), + ['tw-thb-cctv-14-0620-009-002'], + ); +}); test('a redirected or failed catalog contributes an empty pack', async (t) => { t.mock.method(console, 'warn', () => {}); for (const status of [302, 503]) { @@ -214,13 +294,17 @@ test('the Taiwan pack is in the catalog by default', async (t) => { ); }); -test('CCTV_TAIWAN_ENABLED=0 makes no Freeway Bureau request', async (t) => { +test('CCTV_TAIWAN_ENABLED=0 makes no Taiwan catalog request', async (t) => { const { requested, sources } = await runCatalogWithTaiwanFlag(t, '0'); assert.ok(requested.length > 0, 'the other packs still refreshed'); assert.equal( requested.some((href) => href.includes('freeway.gov.tw')), false, ); + assert.equal( + requested.some((href) => href.includes('cctv-maintain.thb.gov.tw')), + false, + ); assert.ok(!sources.some((c) => c.cityId === 'taiwan')); }); @@ -250,12 +334,12 @@ test('a failed download is not retried until the backoff ends', async (t) => { t.mock.method(Date, 'now', () => 1_000_000); assert.deepEqual(await loadTaiwanSources(), []); assert.deepEqual(await loadTaiwanSources(), []); - assert.equal(calls, 1, 'the second refresh made no request'); + assert.equal(calls, 2, 'the second refresh made no request'); Date.now.mock.mockImplementation( () => 1_000_000 + TAIWAN_RETRY_AFTER_FAILURE_MS + 1, ); await loadTaiwanSources(); - assert.equal(calls, 2, 'the backoff ends after an hour'); + assert.equal(calls, 4, 'the backoff ends after an hour'); }); test('a failed download serves the last good table', async (t) => { From 16965c4fbcf242afb6393a9bd31fb268961b2867 Mon Sep 17 00:00:00 2001 From: InoukT Date: Mon, 2 Nov 2026 10:00:13 -0500 Subject: [PATCH 033/153] docs(changelog): add Taiwan CCTV fallback entry --- changelog.d/1506-taiwan-highway-cctv-fallback.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog.d/1506-taiwan-highway-cctv-fallback.md diff --git a/changelog.d/1506-taiwan-highway-cctv-fallback.md b/changelog.d/1506-taiwan-highway-cctv-fallback.md new file mode 100644 index 000000000..41c3d044b --- /dev/null +++ b/changelog.d/1506-taiwan-highway-cctv-fallback.md @@ -0,0 +1,3 @@ +- Add a keyless Highway Bureau fallback for Taiwan CCTV when the Freeway Bureau + catalog is unavailable, keeping official camera coordinates and serving + bounded snapshots from MJPEG feeds (InoukT, #1506). From ad171f2854704b2cee1e50b457a96c0adde71e84 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Mon, 2 Nov 2026 22:43:51 +0400 Subject: [PATCH 034/153] Draw each far-zoom fire as a marker-sized heat spot The heat raster was 2048 px wide with a 3 px blur, so every fire spread over ~200 km and the far-zoom map read as clouds next to the markers. Double the grid to ~10 km per pixel and blur by one pixel: a lone fire is now a spot about as wide as its marker at the 3,000 km hand-off. --- changelog.d/1426-fire-intensity-filter.md | 2 +- docs/CURRENT-STATE.md | 5 +++-- src/layers/firms/heatImagery.test.mjs | 25 +++++++++++++++++++++++ src/layers/firms/policy.js | 13 +++++++----- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/changelog.d/1426-fire-intensity-filter.md b/changelog.d/1426-fire-intensity-filter.md index c1d06643e..4c02ccf20 100644 --- a/changelog.d/1426-fire-intensity-filter.md +++ b/changelog.d/1426-fire-intensity-filter.md @@ -4,6 +4,6 @@ log-scale minimum-FRP slider whose track is the ramp, an All / Nominal+ / High confidence switch and an "N of M shown" counter to the layer row. Far zoom shows a Snap Map–style heatmap in the same colors instead of squares, - empty where nothing burns. The filter applies once before rendering, so markers, cards, the heatmap, context and the top-fires query agree; share + one marker-sized spot per fire, empty where nothing burns. The filter applies once before rendering, so markers, cards, the heatmap, context and the top-fires query agree; share links keep it (`w` token: `f`, `c`), and `get_active_fires` takes matching `min_frp_mw` and `confidence` arguments. Default 0 MW / All (gekh, #1426). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index dabc074ae..5be2a98dc 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -2185,9 +2185,10 @@ accents read that ramp; confidence and brightness do not affect the color. At far zoom (camera above ~3,000 km) the layer drapes a Snap Map–style heatmap instead of individual markers: the shown detections are binned on a -global 2048 × 1024 grid, each weighted by its FRP in megawatts (so heat is +global 4096 × 2048 grid (≈10 km per pixel), each weighted by its FRP in megawatts (so heat is radiated power, and raising the FRP slider does not dim areas where strong fires -burn), Gaussian-blurred, +burn), Gaussian-blurred by one pixel so each fire stays a spot about the size +of its marker, normalized on a log scale against the 99.5th percentile and mapped through the same hues, from a bright red edge through orange and gold to a pale white-hot core. The edge starts more than half opaque, so regions far below diff --git a/src/layers/firms/heatImagery.test.mjs b/src/layers/firms/heatImagery.test.mjs index 0fca7b97f..4b6403298 100644 --- a/src/layers/firms/heatImagery.test.mjs +++ b/src/layers/firms/heatImagery.test.mjs @@ -1,6 +1,8 @@ import test from 'node:test'; import assert from 'node:assert/strict'; import { createHeatImagery } from './heatImagery.js'; +import { buildHeatRaster } from '../../data/firmsHeatRaster.js'; +import { HEAT_RASTER } from './policy.js'; function harness() { const layers = []; @@ -85,3 +87,26 @@ test('destroy removes the layer', () => { h.imagery.destroy(); assert.equal(h.layers.length, 0); }); + +test('the shipped raster paints a lone weak fire as a marker-sized spot', () => { + // A hot cluster elsewhere sets the scale, as Africa does on real data. + const fires = [{ lat: 0, lon: 0, frp: 5 }]; + for (let i = 0; i < 40; i++) { + fires.push({ lat: -10 + (i % 5) * 0.1, lon: 25 + i * 0.05, frp: 300 }); + } + const r = buildHeatRaster(fires, HEAT_RASTER); + const y = Math.floor((90 / 180) * r.height); + const painted = []; + for (let x = 0; x < r.width; x++) { + const lon = ((x + 0.5) / r.width) * 360 - 180; + if (Math.abs(lon) < 5 && r.rgba[(y * r.width + x) * 4 + 3] > 0) { + painted.push(x); + } + } + const kmPerPx = 40075 / r.width; + assert.ok(painted.length > 0, 'the weak fire still shows'); + assert.ok( + painted.length * kmPerPx <= 80, + `spot ${Math.round(painted.length * kmPerPx)} km wide`, + ); +}); diff --git a/src/layers/firms/policy.js b/src/layers/firms/policy.js index faa55bbc3..9de42cfa4 100644 --- a/src/layers/firms/policy.js +++ b/src/layers/firms/policy.js @@ -49,14 +49,17 @@ export const LOD_LEVELS = [ ]; /** - * Global heat raster for the `heat` bands: ≈0.18° per pixel, Gaussian σ in - * pixels. Built once per data refresh or filter change, never per camera move. + * Global heat raster for the `heat` bands: ≈0.09° (≈10 km) per pixel and a + * one-pixel Gaussian σ, so a lone fire is a spot about as wide as its marker + * at the 3,000 km hand-off and neighbours merge only when they really touch + * (2048 px with σ 3 smeared each fire over ~200 km). Built once per data + * refresh or filter change, never per camera move. */ export const HEAT_RASTER = Object.freeze({ - width: 2048, - height: 1024, - sigmaPx: 3, + width: 4096, + height: 2048, + sigmaPx: 1, }); /** From 5ab8ddb4ca3cd848017bc3435ff3784c4bf53c31 Mon Sep 17 00:00:00 2001 From: German Khokhlov Date: Mon, 2 Nov 2026 23:12:38 +0400 Subject: [PATCH 035/153] Double the far-zoom heat spots so they read as spots At 10 km per pixel each fire was a marker-sized spot that faded into the imagery from the globe view. A 2048 px grid with the same one-pixel blur makes every spot exactly twice as wide (~60 km for a lone weak fire), still separate, and the build is three times faster. --- changelog.d/1426-fire-intensity-filter.md | 2 +- docs/CURRENT-STATE.md | 6 +++--- src/layers/firms/heatImagery.test.mjs | 4 ++-- src/layers/firms/policy.js | 15 ++++++++------- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/changelog.d/1426-fire-intensity-filter.md b/changelog.d/1426-fire-intensity-filter.md index 4c02ccf20..6f2d11a33 100644 --- a/changelog.d/1426-fire-intensity-filter.md +++ b/changelog.d/1426-fire-intensity-filter.md @@ -4,6 +4,6 @@ log-scale minimum-FRP slider whose track is the ramp, an All / Nominal+ / High confidence switch and an "N of M shown" counter to the layer row. Far zoom shows a Snap Map–style heatmap in the same colors instead of squares, - one marker-sized spot per fire, empty where nothing burns. The filter applies once before rendering, so markers, cards, the heatmap, context and the top-fires query agree; share + one distinct spot per fire, empty where nothing burns. The filter applies once before rendering, so markers, cards, the heatmap, context and the top-fires query agree; share links keep it (`w` token: `f`, `c`), and `get_active_fires` takes matching `min_frp_mw` and `confidence` arguments. Default 0 MW / All (gekh, #1426). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 5be2a98dc..4d1b69849 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -2185,10 +2185,10 @@ accents read that ramp; confidence and brightness do not affect the color. At far zoom (camera above ~3,000 km) the layer drapes a Snap Map–style heatmap instead of individual markers: the shown detections are binned on a -global 4096 × 2048 grid (≈10 km per pixel), each weighted by its FRP in megawatts (so heat is +global 2048 × 1024 grid (≈20 km per pixel), each weighted by its FRP in megawatts (so heat is radiated power, and raising the FRP slider does not dim areas where strong fires -burn), Gaussian-blurred by one pixel so each fire stays a spot about the size -of its marker, +burn), Gaussian-blurred by one pixel so each fire stays a distinct spot about +twice the size of its marker, normalized on a log scale against the 99.5th percentile and mapped through the same hues, from a bright red edge through orange and gold to a pale white-hot core. The edge starts more than half opaque, so regions far below diff --git a/src/layers/firms/heatImagery.test.mjs b/src/layers/firms/heatImagery.test.mjs index 4b6403298..5543a0691 100644 --- a/src/layers/firms/heatImagery.test.mjs +++ b/src/layers/firms/heatImagery.test.mjs @@ -88,7 +88,7 @@ test('destroy removes the layer', () => { assert.equal(h.layers.length, 0); }); -test('the shipped raster paints a lone weak fire as a marker-sized spot', () => { +test('the shipped raster paints a lone weak fire as a distinct spot', () => { // A hot cluster elsewhere sets the scale, as Africa does on real data. const fires = [{ lat: 0, lon: 0, frp: 5 }]; for (let i = 0; i < 40; i++) { @@ -106,7 +106,7 @@ test('the shipped raster paints a lone weak fire as a marker-sized spot', () => const kmPerPx = 40075 / r.width; assert.ok(painted.length > 0, 'the weak fire still shows'); assert.ok( - painted.length * kmPerPx <= 80, + painted.length * kmPerPx <= 100, `spot ${Math.round(painted.length * kmPerPx)} km wide`, ); }); diff --git a/src/layers/firms/policy.js b/src/layers/firms/policy.js index 9de42cfa4..2af5d9f5c 100644 --- a/src/layers/firms/policy.js +++ b/src/layers/firms/policy.js @@ -49,16 +49,17 @@ export const LOD_LEVELS = [ ]; /** - * Global heat raster for the `heat` bands: ≈0.09° (≈10 km) per pixel and a - * one-pixel Gaussian σ, so a lone fire is a spot about as wide as its marker - * at the 3,000 km hand-off and neighbours merge only when they really touch - * (2048 px with σ 3 smeared each fire over ~200 km). Built once per data - * refresh or filter change, never per camera move. + * Global heat raster for the `heat` bands: ≈0.18° (≈20 km) per pixel and a + * one-pixel Gaussian σ, so a lone fire is a distinct spot about twice as wide + * as its marker at the 3,000 km hand-off and still reads from the + * whole-globe view; neighbours merge only when they nearly touch (σ 3 here + * smeared each fire over ~200 km). Built once per data refresh or filter + * change, never per camera move. */ export const HEAT_RASTER = Object.freeze({ - width: 4096, - height: 2048, + width: 2048, + height: 1024, sigmaPx: 1, }); From fa4ce4b2a5f4dda628745d5e39452e1fb8247037 Mon Sep 17 00:00:00 2001 From: InoukT Date: Mon, 2 Nov 2026 22:57:22 -0500 Subject: [PATCH 036/153] feat(cctv): add Quebec, Ottawa, and World feeds --- DATA_SOURCES.md | 5 + README.md | 2 +- .../1506-taiwan-highway-cctv-fallback.md | 9 +- config/cctv_sources.world-image-cameras.json | 38338 ++++++++++++++++ docs/CCTV_INTEGRATION.md | 33 +- docs/CURRENT-STATE.md | 68 +- index.html | 2 +- public/quebec-cameras.json | 1 + public/quebec511-camera-preview.html | 151 + scripts/package-boundaries.json | 11 +- server/providers/cctv.js | 149 +- server/providers/cctv/cap.js | 45 +- server/providers/cctv/catalog.js | 30 +- server/providers/cctv/constants.js | 31 +- server/providers/cctv/media.js | 8 + server/providers/cctv/normalize.js | 4 + server/providers/cctv/ottawa.js | 119 + server/providers/cctv/quebec.js | 127 + server/providers/cctv/worldCameras.js | 138 + src/data/cctvCalgary.test.mjs | 4 +- src/data/cctvDriveBcSource.test.mjs | 2 + src/data/cctvHk.test.mjs | 4 +- src/data/cctvNyc.test.mjs | 4 +- src/data/cctvOttawa.test.mjs | 200 + src/data/cctvToronto.test.mjs | 4 +- src/i18n/locales/ar.json | 5 + src/i18n/locales/de.json | 5 + src/i18n/locales/es.json | 5 + src/i18n/locales/fr.json | 5 + src/i18n/locales/it.json | 5 + src/i18n/locales/ja.json | 5 + src/i18n/locales/pt.json | 5 + src/i18n/locales/ru.json | 5 + src/i18n/locales/uk.json | 5 + src/i18n/locales/zh-CN.json | 5 + src/i18n/locales/zh-Hant.json | 5 + src/i18n/same-as-english.json | 44 +- src/layers/cctv/cards.js | 8 +- src/layers/cctv/catalog.js | 5 + src/layers/cctv/frames.js | 13 +- src/layers/cctv/hover.js | 5 +- src/layers/cctv/model.js | 22 +- src/layers/cctv/presentation.js | 23 +- src/layers/cctv/projection.js | 3 + src/layers/cctv/rendering.js | 9 +- src/layers/cctv/rendering.test.mjs | 7 +- src/layers/cctv/selection.js | 6 + src/layers/cctv/selection.test.mjs | 54 + src/layers/cctv/state.js | 4 + src/standalone/quebecCameraPreview.css | 114 + src/standalone/quebecCameraPreview.js | 319 + src/standalone/quebecCameraPreview.test.mjs | 136 + src/ui/applicationShell.js | 1 + src/ui/cctvControls.js | 5 + src/ui/cctvPresentation.js | 22 +- src/ui/quebecCctvOverlay.js | 389 + src/ui/quebecCctvOverlay.test.mjs | 71 + src/ui/styles/quebecCctvOverlay.css | 98 + style.css | 1 + 59 files changed, 40815 insertions(+), 88 deletions(-) create mode 100644 config/cctv_sources.world-image-cameras.json create mode 100644 public/quebec-cameras.json create mode 100644 public/quebec511-camera-preview.html create mode 100644 server/providers/cctv/ottawa.js create mode 100644 server/providers/cctv/quebec.js create mode 100644 server/providers/cctv/worldCameras.js create mode 100644 src/data/cctvOttawa.test.mjs create mode 100644 src/layers/cctv/selection.test.mjs create mode 100644 src/standalone/quebecCameraPreview.css create mode 100644 src/standalone/quebecCameraPreview.js create mode 100644 src/standalone/quebecCameraPreview.test.mjs create mode 100644 src/ui/quebecCctvOverlay.js create mode 100644 src/ui/quebecCctvOverlay.test.mjs create mode 100644 src/ui/styles/quebecCctvOverlay.css diff --git a/DATA_SOURCES.md b/DATA_SOURCES.md index 5cac67401..d1ec14392 100644 --- a/DATA_SOURCES.md +++ b/DATA_SOURCES.md @@ -116,6 +116,7 @@ The optional Local ADS-B layer and the broadcast-FM receiver use radio you recei - **Via Lietuva / Eismoinfo (Lithuania).** Public road-camera catalogs and periodically updated still images from [Eismoinfo](https://eismoinfo.lt/), credited to Via Lietuva / eismoinfo.lt in the app. **Off by default.** The camera endpoints are the eismoinfo.lt website backend and are not among the services listed in Via Lietuva's [open-data statement](https://eismoinfo.lt/eismoinfo-backend/content?id=44), whose conditions are attribution and reuse on the same terms. Until the statement is confirmed to cover the camera photos, the pack loads only when an operator sets `CCTV_LITHUANIA_ENABLED=1`; with the flag unset, empty or any other value, the server makes no request to Eismoinfo. `eismoinfo-backend/camera-info-table` is joined by ID to `layer-static-features/VKR`. Without `lks=true`, the latter returns WGS84 `[latitude, longitude]`; the table's `x/y` instead use LKS-94 metres. Only the official HTTPS `/eismoinfo-backend/image-provider/camera/last?id=…` image endpoint is registered. Catalogs use the shared 15-minute cache; frames are fetched on demand and never bundled or archived. These are periodic snapshots, not continuous video. Camera headings are low-confidence estimates. No API key is required. `CCTV_LITHUANIA_MAX_SOURCES` defaults to 400. - **Freeway Bureau and Highway Bureau, MOTC (Taiwan).** National freeway cameras use the Freeway Bureau’s keyless [MOTC 2.0 CCTV table](https://tisvcloud.freeway.gov.tw/history/motc20/CCTV.xml), refreshed daily and fetched at runtime (never bundled). Freeway Bureau data follows the [Open Government Data License, Taiwan v1.0](https://data.gov.tw/license); the app credits the Bureau, names the dataset and links the licence. If that catalog is unreachable and no last-good source list exists, the app falls back to the Highway Bureau’s free [provincial-road CCTV XML feed](https://thbapp.thb.gov.tw/opendata/), with attribution as requested by the Bureau. Its MJPEG streams are accepted only from cctv-ss01 through cctv-ss08.thb.gov.tw over HTTPS; the frame proxy extracts one bounded JPEG per request. This fallback covers provincial roads, not national freeways. Neither feed requires an API key. CCTV_TAIWAN_ENABLED=0 disables both; CCTV_TAIWAN_MAX_SOURCES defaults to 600 (bounded to 1–2000). +- **Québec CCTV (MTQ / Québec 511, Montréal and scenic links).** `public/quebec-cameras.json` contains 680 MTQ positions from the official georeferenced WFS (CC BY 4.0), 426 Montréal camera locations derived from OSM (ODbL 1.0), and 14 scenic records with per-row provenance and accuracy. The 680 MTQ cameras play the operator's five-second MP4 clip directly in the browser from `www.quebec511.info/Carte/Fenetres/camera.ashx?id=&format=mp4`; Québec 511 refreshes those clips every few minutes. A second browser request supplies an approximate map still. The app does not proxy, store, or read video pixels, and no camera images are bundled. Montréal and scenic entries have provider-page links rather than direct frame URLs; their source-page terms apply. The video remains hosted by Québec 511 under its service terms. No API key is required; `CCTV_QUEBEC_ENABLED=0` disables the pack. - **Google Maps Platform.** You supply your own API key and are bound by [Google's ToS](https://cloud.google.com/maps-platform/terms). Google Maps Content (tiles, geocodes, places) **may not be cached, stored, rehosted, or committed** — this app only ever uses it live, which is the compliant pattern. The "Google" attribution is displayed on the globe and must stay visible. Restrict your key (see [SECURITY.md](SECURITY.md)). - **OpenSky Network.** Its license is **non-commercial**, and operational use of the REST API in a live product can require a prior written agreement with OpenSky — even for non-profit/government use. If you deploy this commercially, contact OpenSky for your own terms. The flights layer is a toggle and runs anonymously by default. @@ -162,6 +163,8 @@ The optional Local ADS-B layer and the broadcast-FM receiver use radio you recei - **DelDOT live video cameras.** The keyless `tmc.deldot.gov/json/videocamera.json` catalog supplies active cameras and official `https://video.deldot.gov/live/…/playlist.m3u8` links. The local server transiently buffers bounded MPEG-TS segments in memory and deletes them on session release or idle expiry. No recordings are retained. `CCTV_DELDOT_ENABLED=0` disables the pack. Public availability is not a blanket redistribution license; deployment beyond personal local viewing needs confirmation of applicable DelDOT terms. - **Fintraffic weathercams.** The camera list is one keyless GeoJSON request to `tie.digitraffic.fi/api/weathercam/v1/stations` (809 stations / 2,275 presets), sent with the `Digitraffic-User: gods-eye-view` header the service asks clients to identify themselves with and with gzip; frames are stills on `weathercam.digitraffic.fi`, refreshed on each station's 600 s collection interval, which is also the client's ambient-still refresh cadence for this pack (the active camera keeps the usual 10-second refresh). One preset (a fixed camera view) is one camera; stations not `GATHERING` and presets not `inCollection` are dropped. Attribution is required by the CC BY 4.0 licence and is registered in the Data attribution popover. `CCTV_FINTRAFFIC_ENABLED=0` is the kill switch. - **DriveBC highway cameras.** The camera list comes from the keyless `https://www.drivebc.ca/api/webcams/` endpoint served by the DriveBC.ca site ([bcgov/DriveBC.ca](https://github.com/bcgov/DriveBC.ca)); frames come from `https://www.drivebc.ca/images/.jpg`, built from the numeric camera id. DataBC's [DriveBC HighwayCams](https://catalogue.data.gov.bc.ca/dataset/bc-highwaycams) catalogue entry publishes the same cameras under the Open Government Licence – British Columbia, but its CSV still lists the retired `images.drivebc.ca` frame URLs, which now return a placeholder. The licence's attribution statement is required and is registered in the Data attribution popover. By default the 250 cameras nearest Vancouver and Victoria load; `CCTV_DRIVEBC_MAX_SOURCES` changes the cap and `CCTV_DRIVEBC_ENABLED=0` turns the pack off. Some cameras in the feed are supplied by partners (TransLink, the City of Vancouver, the City of Surrey, Parks Canada / Alberta Motor Association and others); the feed's per-camera credit is carried onto the camera record and shown beside the provider in the CCTV panel. +- **City of Ottawa traffic cameras.** The keyless `traffic.ottawa.ca/map/camera_list` JSON supplies an id, coordinates, an English/French description and a type; frames are city-served JPEG stills built from the id at `traffic.ottawa.ca/map/camera?id=`, and only that directory is pinned. MTO cameras carried on the city feed keep their owner as a per-camera credit. The feed publishes no bearing, so headings use the shared id-hash fallback at low confidence, and no status field, so a camera the city takes offline still registers. Frames are fetched at request time and never stored. The city publishes no explicit reuse licence for this feed; deployment beyond personal local viewing needs confirmation of applicable terms. `CCTV_OTTAWA_MAX_SOURCES` caps the pack (default 250, nearest downtown) and `CCTV_OTTAWA_ENABLED=0` turns it off. +- **World cams image subset.** The normal CCTV catalog adds 166 Icelandic Road and Coastal Administration cameras, 1,176 Oregon TripCheck stills, and 1,054 MLIT river cameras from the curated `config/cctv_sources.world-image-cameras.json` export; disable it with `CCTV_WORLD_CAMERAS_ENABLED=0`. The server validates and pins each image URL to its provider path. [Vegagerðin's data-service licence](https://www.vegagerdin.is/vegagerdin/gagnasafn/vefthjonustur/terms-and-conditions) permits reuse with attribution but excludes third-party rights; [ODOT allows TripCheck image use and requests credit](https://www.tripcheck.com/Pages/Frequently-Asked-Questions); MLIT's [site terms](https://www.river.go.jp/kawabou/kwb_apend/html/caution.html) are CC BY-compatible with attribution and warn against high-volume/periodic collection, so those frames refresh at ten minutes per camera. Images are not bundled or persisted; a bounded 32 MB in-memory cache reuses them until the per-source cadence. The 249 NZTA Journey Planner rows are excluded because its [website terms prohibit scraping](https://www.journeys.nzta.govt.nz/about-this-site/terms-of-use); use an authorized API feed or obtain permission before adding those rows. - **TxDOT ITS cameras.** The catalog comes from the keyless `its.txdot.gov/its/DistrictIts/GetCctvStatusListByDistrict` endpoint, one call per district. Frames come from the per-camera `GetCctvSnapshotByIcdId` endpoint, which answers JSON carrying a base64 JPEG rather than an image body; the proxy decodes it only for responses from the official TxDOT origin and validates the JPEG header before serving. Only cameras reporting `Device Online` are registered. Districts default to Austin and San Antonio (`CCTV_TXDOT_DISTRICTS`; 25 codes exist statewide); `CCTV_TXDOT_MAX_SOURCES` caps the pack and `CCTV_TXDOT_ENABLED=0` turns it off. Frames are fetched live at request time and are never stored or redistributed. - **Tallinn ristmikud.** Intersection camera stills are fetched live from `ristmikud.tallinn.ee` (`/last/camNNN.jpg`). The curated catalog (`config/cctv_sources.tallinn.json`) supplies coordinates and heading priors; only server-registered ristmikud HTTPS URLs are proxied. Frames are fetched at request time and never stored or redistributed. Disable with `CCTV_TALLINN_ENABLED=0`. - **Tarktee / Transpordiamet.** Estonia road-weather camera locations and current JPEG URLs come from keyless DATEX2 endpoints on `tarktee.transpordiamet.ee` (`/api/v1/datex/roadCameraLocations` + `roadCameraImages`). Frame URLs rotate with each capture; the 15-minute CCTV source cache refreshes them. Only `https://tarktee.transpordiamet.ee/images/…` URLs are registered. Disable with `CCTV_TARKTEE_ENABLED=0`. @@ -203,6 +206,8 @@ The [Bhote Koshi event pack](public/events/bhote-koshi-2026/README.md), under `p | **Datacenters** (4,351) | `datacenters/` | **ODbL 1.0** (OpenStreetMap extract) | ✅ (attribution + share-alike on data) | © OpenStreetMap contributors (shared credit) | | **Dams** (704) | `dams/` | **ODbL 1.0** (OpenInfraMap / OSM extract) | ✅ (attribution + share-alike on data) | © OpenStreetMap contributors (shared credit) + Open Infrastructure Map | | **Military area names** (36,466) | `osm_military_names/` | **ODbL 1.0** (OpenStreetMap, via Overture Maps) | ✅ (attribution + share-alike on data) | © OpenStreetMap contributors (shared credit) + Overture Maps Foundation | +| **Québec CCTV source catalog** (1,120 locations) | `public/quebec-cameras.json` | Mixed: MTQ locations CC BY 4.0; Montréal camera nodes ODbL 1.0; scenic records retain per-record provenance. No video files are bundled or cached. | Location data is per-record; video remains hosted by Québec 511 and its platform terms apply; scenic source pages may have separate terms | MTQ / Données Québec CC BY 4.0; © OpenStreetMap contributors (ODbL); scenic operator and position source shown in the selected-camera panel | +| **World camera image subset** (2,396 locations) | `config/cctv_sources.world-image-cameras.json` | Mixed: Vegagerðin open-government licence, ODOT TripCheck public images, and MLIT site content compatible with CC BY 4.0. Frames are not bundled or persisted; the server holds a bounded in-memory cache. | Per-source terms apply; NZTA Journey Planner web-cache rows are excluded | Vegagerðin, Oregon Department of Transportation, and Japan Ministry of Land, Infrastructure, Transport and Tourism (MLIT) | | **TeleGeography Submarine Cable Map** (712 cables + 1,917 landing points) | `telegeography_submarine_cables/` | **CC BY-NC-SA 3.0** | ❌ **NonCommercial — remove for commercial use** | "© TeleGeography — submarinecablemap.com" | | **Natural Earth physical regions** (1,046 land + 292 marine named polygons) | `natural_earth/` | **Public domain** | ✅ (no restrictions) | "Made with Natural Earth" (courtesy credit — not legally required) | | **DataSF Analysis Neighborhoods** (41 SF neighborhood polygons) | `neighborhoods/` | **PDDL 1.0** (public domain) | ✅ (no restrictions) | "City & County of San Francisco — DataSF" (courtesy — not legally required) | diff --git a/README.md b/README.md index 0dfb73e89..db284186e 100644 --- a/README.md +++ b/README.md @@ -435,7 +435,7 @@ Twenty layers and map sources. **Eighteen have a keyless path.** Some offer addi | 🌍 **Earthquakes** | Global seismic activity, last 24h | USGS | 🟢 | | ◍ **Air quality** | Live AQHI on the published 1–10+ health-risk scale, with a Weather-panel card showing the band legend and the highest readings in view. **Canada only** — ECCC is the first registered provider | ECCC MSC GeoMet | 🟢 | | 🚗 **Traffic** | Simulated vehicles on OSM roads. With TomTom, live flow speeds drive the simulation and congestion colors below ~8 km; individual vehicle positions are not live observations | TomTom + OSM | 🟢 simulation · 🟡 live flow speeds | -| 📹 **CCTV Mesh** | ~4,000 public cameras (shared cap) projected _into_ the 3D space — Austin · Texas (TxDOT) · California (Caltrans) · London (TfL) · Ontario (511, free developer key) · Finland (Fintraffic) · British Columbia (DriveBC) · Estonia (Tallinn, Tarktee) · Delaware (DelDOT live video) · New South Wales (Live Traffic NSW) · Calgary · Norway (Statens vegvesen) · Toronto · King County (WA) · Washington (WSDOT) · Catalonia (Servei Català de Trànsit) · Hong Kong (Transport Department) · Taiwan (Freeway Bureau, MOTC) · Italy (A22 Brennero motorway), plus opt-in New York City (NYC DOT TMC, needs your own NYC DOT agreement), opt-in Lithuania (Via Lietuva / Eismoinfo, photo licence unconfirmed) and opt-in Florida (FL511, individual personal use only; other use needs FDOT's written consent). Positions are published; poses are estimated priors **you calibrate by dragging a gizmo on the camera itself** | City APIs | 🟢 | +| 📹 **CCTV Mesh** | ~7,516 camera locations (4,000 shared slots + 1,120 Québec + 2,396 World image feeds) projected _into_ the 3D space — Austin · Texas (TxDOT) · California (Caltrans) · London (TfL) · Ontario (511, free developer key) · Finland (Fintraffic) · British Columbia (DriveBC) · Estonia (Tallinn, Tarktee) · Delaware (DelDOT live video) · New South Wales (Live Traffic NSW) · Calgary · Norway (Statens vegvesen) · Toronto · King County (WA) · Washington (WSDOT) · Catalonia (Servei Català de Trànsit) · Hong Kong (Transport Department) · Taiwan (Freeway Bureau, MOTC) · Québec (MTQ browser MP4, Montréal locations, regional webcams) · Iceland (Vegagerðin) · Oregon (TripCheck) · Japan (MLIT river cameras) · Italy (A22 Brennero motorway), plus opt-in New York City (NYC DOT TMC, needs your own NYC DOT agreement), opt-in Lithuania (Via Lietuva / Eismoinfo, photo licence unconfirmed) and opt-in Florida (FL511, individual personal use only; other use needs FDOT's written consent). Positions are published or attributed; poses are estimated priors **you calibrate by dragging a gizmo on the camera itself** | City APIs | 🟢 | | 📷 **Mapped ALPR Cameras** | License-plate-reader camera locations tagged by OpenStreetMap contributors, loaded one city-sized view at a time, with **SHOW NEAREST**. Locations and tags only: no plate data, no video | OpenStreetMap (incl. DeFlock mapping) | 🟢 | | 📷 **Street Level** | Street-level photos behind one panel, one chip per provider: coverage on the streets, image cones, an embedded viewer with full-screen **EXPAND**. Mapillary, Google Street View, KartaView and Panoramax | Mapillary · Google · KartaView · Panoramax | 🟢 KartaView, Panoramax · 🟡 Mapillary token · 🔴 Google Maps key | | 📻 **Radio** | Geolocated world radio with an **analog tuner** — drag the needle across up to 750 stations and the globe flies to each broadcaster | Radio Browser / broadcasters | 🟢 | diff --git a/changelog.d/1506-taiwan-highway-cctv-fallback.md b/changelog.d/1506-taiwan-highway-cctv-fallback.md index 41c3d044b..ded0e9440 100644 --- a/changelog.d/1506-taiwan-highway-cctv-fallback.md +++ b/changelog.d/1506-taiwan-highway-cctv-fallback.md @@ -1,3 +1,6 @@ -- Add a keyless Highway Bureau fallback for Taiwan CCTV when the Freeway Bureau - catalog is unavailable, keeping official camera coordinates and serving - bounded snapshots from MJPEG feeds (InoukT, #1506). +- Expand CCTV coverage with a keyless Taiwan Highway Bureau fallback, Québec + camera catalog and map preview, Ottawa traffic cameras, and 2,396 curated + image-backed cameras from Iceland, Oregon, and Japan (InoukT, #1506). +- Keep Québec 511 video browser-only, enforce provider-specific frame refresh + limits, and report recognized MLIT maintenance images as degraded instead of + healthy camera snapshots. diff --git a/config/cctv_sources.world-image-cameras.json b/config/cctv_sources.world-image-cameras.json new file mode 100644 index 000000000..cb3738ac6 --- /dev/null +++ b/config/cctv_sources.world-image-cameras.json @@ -0,0 +1,38338 @@ +[ + { + "id": "world-is-7075", + "name": "Almannaskarð - norður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.291877, + "lon": -15.028035, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/almannaskard_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/almannaskard_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7076", + "name": "Almannaskarð - suður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.282717, + "lon": -15.039817, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/almannaskard_3.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/almannaskard_3.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7185", + "name": "Almenningar", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.158108, + "lon": -19.0424, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/almenningar_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/almenningar_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7038", + "name": "Arnarneshæð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.099812, + "lon": -21.916253, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/arnarneshaed_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/arnarneshaed_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7143", + "name": "Arnarnesvegur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.088166, + "lon": -21.831622, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/arnarnesvegur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/arnarnesvegur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7085", + "name": "BB-göng_BO", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.072533, + "lon": -23.321167, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bb-gong_5.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bb-gong_5.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7083", + "name": "BB-göng_BR", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.028351, + "lon": -23.343915, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bb-gong_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bb-gong_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7084", + "name": "BB-göng_TU", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.0555, + "lon": -23.22625, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bb-gong_3.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bb-gong_3.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7107", + "name": "Bakkaselsbrekka", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.476392, + "lon": -18.665278, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bakkaselsbrekka_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bakkaselsbrekka_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7027", + "name": "Biskupsháls", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.561817, + "lon": -16.021983, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/biskupshals_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/biskupshals_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7063", + "name": "Blikdalsá", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.26805, + "lon": -21.829398, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/blikdalsa_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/blikdalsa_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7097", + "name": "Blönduós", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.668366, + "lon": -20.234482, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/blonduos_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/blonduos_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7052", + "name": "Bolungarvíkurgöng við Bolungarvík", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.143108, + "lon": -23.222907, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bolungarvikurgong_3.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bolungarvikurgong_3.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7053", + "name": "Bolungarvíkurgöng við Hnífsdal", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.117604, + "lon": -23.121938, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bolungarvikurgong_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bolungarvikurgong_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7096", + "name": "Brandagil", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.158283, + "lon": -21.056983, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/brandagil_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/brandagil_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7024", + "name": "Brattabrekka", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.866317, + "lon": -21.517767, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/brattabrekka_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/brattabrekka_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7016", + "name": "Breiðdalsheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.906147, + "lon": -14.598584, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/breiddalsheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/breiddalsheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7067", + "name": "Brekknaheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.178067, + "lon": -15.2321, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/brekknaheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/brekknaheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7051", + "name": "Bræðratunguvegur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.157328, + "lon": -20.362327, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/braedratunguvegur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/braedratunguvegur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7109", + "name": "Búlandshöfði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.941614, + "lon": -23.497806, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bulandshofdi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bulandshofdi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7039", + "name": "Bústaðabrú", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.125601, + "lon": -21.899461, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bustadabru_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/bustadabru_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7175", + "name": "Dettifoss", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.81686, + "lon": -16.445947, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/dettifoss_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/dettifoss_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7166", + "name": "Dýrafjarðargöng norður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.833918, + "lon": -23.228209, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/dyrafjardargong_3.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/dyrafjardargong_3.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7165", + "name": "Dýrafjarðargöng suður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.788544, + "lon": -23.205102, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/dyrafjardargong_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/dyrafjardargong_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7042", + "name": "Eldhraun", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.734772, + "lon": -18.20224, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/eldhraun_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/eldhraun_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7126", + "name": "Engidalur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.08368, + "lon": -21.943055, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/engidalur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/engidalur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7010", + "name": "Ennisháls", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.572462, + "lon": -21.323936, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/ennishals_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/ennishals_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7008", + "name": "Fagridalur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.120933, + "lon": -14.332117, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fagridalur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fagridalur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7077", + "name": "Festarfjall", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.857286, + "lon": -22.342569, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/festarfjall_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/festarfjall_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7102", + "name": "Finnafjörður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.0855, + "lon": -15.156867, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/finnafjordur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/finnafjordur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7009", + "name": "Fjarðarheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.266621, + "lon": -14.253634, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fjardarheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fjardarheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7119", + "name": "Fljót", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.089883, + "lon": -19.059717, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fljot_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fljot_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7066", + "name": "Fljótsheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.698564, + "lon": -17.499295, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fljotsheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fljotsheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7032", + "name": "Fossahlíð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.957933, + "lon": -22.78245, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fossahlid_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fossahlid_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7013", + "name": "Fremri-Háls", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.250876, + "lon": -15.816055, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fremri-hals_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/fremri-hals_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7092", + "name": "Fróðárheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.847631, + "lon": -23.476199, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/frodarheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/frodarheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7081", + "name": "Fáskrúðsfjarðargöng - norður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.011883, + "lon": -14.198683, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/faskrudsfjgong_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/faskrudsfjgong_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7082", + "name": "Fáskrúðsfjarðargöng - suður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.960417, + "lon": -14.172867, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/faskrudsfjgong_3.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/faskrudsfjgong_3.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7026", + "name": "Gauksmýri", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.346047, + "lon": -20.800297, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gauksmyri_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gauksmyri_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7114", + "name": "Gautavík", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.73725, + "lon": -14.345083, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gautavik_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gautavik_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7110", + "name": "Gautsdalur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.538256, + "lon": -21.842686, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gautsdalur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gautsdalur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7019", + "name": "Gemlufallsheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.942309, + "lon": -23.432798, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gemlufallsheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gemlufallsheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7079", + "name": "Gjábakki", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.249752, + "lon": -21.019507, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gjabakki_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gjabakki_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7148", + "name": "Grenivíkurvegur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.898222, + "lon": -18.066028, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/grenivikurvegur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/grenivikurvegur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7089", + "name": "Grundartangi", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.3563, + "lon": -21.805967, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/grundartangi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/grundartangi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7149", + "name": "Græfur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.184028, + "lon": -14.340167, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/graefur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/graefur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7158", + "name": "Gullfoss", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.306474, + "lon": -20.207642, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gullfoss_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gullfoss_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7184", + "name": "Gíghæð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.904852, + "lon": -22.418383, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gighaed_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gighaed_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7128", + "name": "Gígjukvísl", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.937763, + "lon": -17.34657, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gigjukvisl_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/gigjukvisl_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7091", + "name": "Haffjarðará", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.841883, + "lon": -22.321233, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/haffjardara_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/haffjardara_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7192", + "name": "Hafnarfjall", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.465117, + "lon": -21.96405, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hafnarfjall_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hafnarfjall_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7195", + "name": "Hafnarnes", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.278083, + "lon": -15.197433, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hafnarnes_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hafnarnes_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7189", + "name": "Hallsteinsnes", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.530875, + "lon": -22.33087, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hallsteinsnes_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hallsteinsnes_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7157", + "name": "Heiðarsporður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.937867, + "lon": -21.062867, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/heidarspordur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/heidarspordur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7177", + "name": "Hellisbrú", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.951933, + "lon": -21.02155, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hellisbru_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hellisbru_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7001", + "name": "Hellisheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.016823, + "lon": -21.343208, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hellisheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hellisheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7105", + "name": "Hestgerði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.192367, + "lon": -15.745, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hestgerdi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hestgerdi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7002", + "name": "Holtavörðuheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.988534, + "lon": -21.055462, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/holtavorduheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/holtavorduheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7188", + "name": "Hrafnanes", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.493841, + "lon": -23.319467, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hrafnanes_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hrafnanes_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7116", + "name": "Hvaldalsá", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.421664, + "lon": -14.533666, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hvaldalsa_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hvaldalsa_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7072", + "name": "Hvalnesskriður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.445883, + "lon": -14.508367, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hvalnesskridur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hvalnesskridur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7950", + "name": "Hveradalir", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.01815, + "lon": -21.3881, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hveradalir_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hveradalir_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7029", + "name": "Hálfdán", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.646498, + "lon": -23.712367, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/halfdan_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/halfdan_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7025", + "name": "Hámundarstaðaháls", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.953966, + "lon": -18.458446, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hamundarstadahals_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hamundarstadahals_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7057", + "name": "Héðinsfjarðargöng Siglufjarðarmegin", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.126469, + "lon": -18.891003, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hedinsfjardargong_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hedinsfjardargong_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7054", + "name": "Héðinsfjarðargöng Ólafsfjarðarmegin", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.073042, + "lon": -18.672672, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hedinsfjardargong_7.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hedinsfjardargong_7.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7056", + "name": "Héðinsfjarðargöng í Héðinsfirði Siglufjarðarmegin", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.106659, + "lon": -18.820808, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hedinsfjardargong_3.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hedinsfjardargong_3.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7055", + "name": "Héðinsfjarðargöng í Héðinsfirði Ólafsfjarðarmegin", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.100719, + "lon": -18.808873, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hedinsfjardargong_5.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hedinsfjardargong_5.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7048", + "name": "Hófaskarð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.299938, + "lon": -15.889139, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hofaskard_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/hofaskard_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7197", + "name": "Hólmur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.281267, + "lon": -15.47055, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/holmur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/holmur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7073", + "name": "Jökuldalur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.303438, + "lon": -15.219723, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/jokuldalur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/jokuldalur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7104", + "name": "Jökulsá á Dal", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.431483, + "lon": -14.594317, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/jokulsa_a_dal_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/jokulsa_a_dal_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7101", + "name": "Kaldakinn", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.744166, + "lon": -17.58806, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kaldakinn_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kaldakinn_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7115", + "name": "Kambar", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.012683, + "lon": -21.235, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kambar_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kambar_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7121", + "name": "Kambar brekka", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.00995, + "lon": -21.221667, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kambar_brekka_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kambar_brekka_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7144", + "name": "Kambar neðst", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.005433, + "lon": -21.220433, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kambar_nedst_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kambar_nedst_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7046", + "name": "Kambaskriður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.800384, + "lon": -13.890564, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kambaskridur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kambaskridur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7194", + "name": "Kauptún", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.081424, + "lon": -21.899733, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kauptun_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kauptun_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7133", + "name": "Kjálkafjörður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.59001, + "lon": -22.914407, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kjalkafjordur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kjalkafjordur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7059", + "name": "Kleifaheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.51205, + "lon": -23.6922, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kleifaheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kleifaheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7190", + "name": "Kleifarvatn", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.920643, + "lon": -22.012407, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kleifarvatn_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kleifarvatn_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7033", + "name": "Klettsháls", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.662483, + "lon": -22.58965, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/klettshals_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/klettshals_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7094", + "name": "Klettsháls - brekka", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.651417, + "lon": -22.576617, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/klettshals_-_brekka_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/klettshals_-_brekka_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7060", + "name": "Kolás", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.697217, + "lon": -21.632352, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kolas_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kolas_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7178", + "name": "Kotströnd", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.972967, + "lon": -21.140483, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kotstrond_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kotstrond_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7124", + "name": "Kringlan-Kringlumbr", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.132195, + "lon": -21.898917, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kringlan_3.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kringlan_3.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7130", + "name": "Kringlan-Miklabraut", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.132818, + "lon": -21.896473, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kringlan_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kringlan_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7023", + "name": "Kvísker", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.969783, + "lon": -16.421567, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kvisker_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/kvisker_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7034", + "name": "Landvegamót", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.879392, + "lon": -20.501199, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/landvegamot_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/landvegamot_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7098", + "name": "Langidalur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.52165, + "lon": -19.86015, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/langidalur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/langidalur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7151", + "name": "Laugará", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.81985, + "lon": -22.497817, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/laugara_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/laugara_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7061", + "name": "Laxárdalsheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.204994, + "lon": -21.330345, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/laxardalsheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/laxardalsheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7108", + "name": "Leirvogstungumelar", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.183531, + "lon": -21.681764, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/leirvogstungumelar_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/leirvogstungumelar_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7122", + "name": "Litla Kaffistofan", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.053222, + "lon": -21.491055, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/litla_kaffistofan_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/litla_kaffistofan_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7090", + "name": "Litli-Kroppur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.638183, + "lon": -21.4492, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/litli_kroppur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/litli_kroppur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7045", + "name": "Lyngdalsheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.203447, + "lon": -20.802666, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/lyngdalsheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/lyngdalsheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7021", + "name": "Lómagnúpur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.95665, + "lon": -17.499717, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/lomagnupur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/lomagnupur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7193", + "name": "Lónsbakki", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.702183, + "lon": -18.15035, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/lonsbakki_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/lonsbakki_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7028", + "name": "Markarfljót (Bakkafjöruvegamót)", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.620866, + "lon": -20.033304, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/markarfljot_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/markarfljot_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7030", + "name": "Miklidalur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.582402, + "lon": -23.851674, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/miklidalur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/miklidalur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7174", + "name": "Miðdegishæð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.8775, + "lon": -16.545833, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/middegishaed_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/middegishaed_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7113", + "name": "Mjósund", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.240359, + "lon": -14.175723, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/mjosund_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/mjosund_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7064", + "name": "Mosfellsheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.215677, + "lon": -21.341263, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/mosfellsheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/mosfellsheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7015", + "name": "Möðrudalsöræfi", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.456818, + "lon": -15.591021, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/modrudalsoraefi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/modrudalsoraefi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7131", + "name": "Múlagöng suður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.073167, + "lon": -18.537333, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/mulagong_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/mulagong_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7132", + "name": "Múlagöng vestur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.084, + "lon": -18.6065, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/mulagong_3.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/mulagong_3.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7145", + "name": "Mýrdalssandur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.480315, + "lon": -18.550563, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/myrdalssandur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/myrdalssandur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7037", + "name": "Mývatnsheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.615823, + "lon": -17.212958, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/myvatnsheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/myvatnsheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7069", + "name": "Mývatnsöræfi", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.65755, + "lon": -16.47965, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/myvatnsoraefi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/myvatnsoraefi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7095", + "name": "Norðdalur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.744617, + "lon": -22.078733, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/norddalur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/norddalur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7156", + "name": "Norðfjarðargöng-norður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.124482, + "lon": -13.915609, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/nordfjardargong_3.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/nordfjardargong_3.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7155", + "name": "Norðfjarðargöng-suður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.082813, + "lon": -14.053012, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/nordfjardargong_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/nordfjardargong_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7099", + "name": "Norðurárdalur í Skagafirði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.430683, + "lon": -19.162183, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/nordurard_skagaf_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/nordurard_skagaf_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7040", + "name": "Nónskarð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.095198, + "lon": -21.888131, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/nonskard_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/nonskard_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7169", + "name": "Pétursey", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.4701, + "lon": -19.251117, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/petursey_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/petursey_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7146", + "name": "Raufarhafnarvegur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.327167, + "lon": -15.980055, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/raufarhafnarvegur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/raufarhafnarvegur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7198", + "name": "Rauðimelur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.033757, + "lon": -22.080267, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/raudimelur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/raudimelur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7183", + "name": "Refasveit", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.718136, + "lon": -20.227673, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/refasveit_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/refasveit_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7118", + "name": "Reykjanesviti", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.817839, + "lon": -22.704767, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/reykjanesviti_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/reykjanesviti_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7044", + "name": "Reynisfjall", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.454317, + "lon": -19.056033, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/reynisfjall_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/reynisfjall_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7074", + "name": "Rósaselstorg", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.0024, + "lon": -22.60195, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/rosaselstorg_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/rosaselstorg_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7080", + "name": "Sandskeið", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.065583, + "lon": -21.58065, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/sandskeid_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/sandskeid_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7018", + "name": "Sandvíkurheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.893674, + "lon": -14.825577, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/sandvikurheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/sandvikurheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7150", + "name": "Sauðárkrókur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.742917, + "lon": -19.62225, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/saudarkrokur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/saudarkrokur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7078", + "name": "Selvogur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.845248, + "lon": -21.691278, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/selvogur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/selvogur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7049", + "name": "Siglufjarðarvegur við Herkonugil", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.179951, + "lon": -18.971278, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/siglufjardarvegur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/siglufjardarvegur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7036", + "name": "Skeiðavegamót", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.953267, + "lon": -20.701783, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/skeidavegamot_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/skeidavegamot_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7120", + "name": "Skinnastaður, Öxarfirði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.061442, + "lon": -16.445403, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/skinnastadur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/skinnastadur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7196", + "name": "Skógey", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.295274, + "lon": -15.320026, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/skogey_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/skogey_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7100", + "name": "Stafá", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.06965, + "lon": -19.298883, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/stafa_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/stafa_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7170", + "name": "Steinar", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.544382, + "lon": -19.694161, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/steinar_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/steinar_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7011", + "name": "Steingrímsfjarðarheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.749429, + "lon": -22.126183, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/steingrimsfjheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/steingrimsfjheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7005", + "name": "Strandarheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.000586, + "lon": -22.226954, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/strandarheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/strandarheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7160", + "name": "Strákagöng suður", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.1796, + "lon": -18.910667, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/strakagong_3.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/strakagong_3.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7159", + "name": "Strákagöng vestur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.184917, + "lon": -18.922667, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/strakagong_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/strakagong_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7187", + "name": "Sveifluháls, Vatnsskarð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.966326, + "lon": -21.940598, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/sveifluhals_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/sveifluhals_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7093", + "name": "Sveinatunga", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.84295, + "lon": -21.269167, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/sveinatunga_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/sveinatunga_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7031", + "name": "Svínadalur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.309117, + "lon": -21.741746, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/svinadalur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/svinadalur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7086", + "name": "Svínavatn", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.1061, + "lon": -20.702183, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/svinavatn_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/svinavatn_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7111", + "name": "Súðavíkurhlíð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.06425, + "lon": -22.986917, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/sudavikurhlid_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/sudavikurhlid_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7191", + "name": "Teygingarlækur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.8813, + "lon": -17.757167, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/teygingarlaekur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/teygingarlaekur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7065", + "name": "Tjörnes", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.129617, + "lon": -16.95305, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/tjornes_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/tjornes_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7182", + "name": "Varmahlíð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.55366, + "lon": -19.445514, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/varmahlid_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/varmahlid_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7022", + "name": "Vatnaleið", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.907717, + "lon": -22.86325, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vatnaleid_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vatnaleid_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7058", + "name": "Vatnsfjarðarháls", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.930983, + "lon": -22.535717, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vatnsfjardarhals_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vatnsfjardarhals_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7014", + "name": "Vatnsskarð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.509321, + "lon": -19.689764, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vatnsskard_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vatnsskard_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7047", + "name": "Vatnsskarð eystra", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.561104, + "lon": -13.994153, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vatnsskard_eystra_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vatnsskard_eystra_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7162", + "name": "Vaðlaheiðargöng - austur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.728371, + "lon": -17.91807, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vadlaheidargong_3.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vadlaheidargong_3.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7161", + "name": "Vaðlaheiðargöng - vestur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.693667, + "lon": -18.053667, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vadlaheidargong_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vadlaheidargong_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7103", + "name": "Vegaskarð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.44225, + "lon": -15.939483, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vegaskard_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vegaskard_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7127", + "name": "Vikurvegur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.132667, + "lon": -21.763667, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vikurvegur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vikurvegur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7071", + "name": "Vopnafjarðarheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.59614, + "lon": -15.311734, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vopnafjardarheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vopnafjardarheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7070", + "name": "Vopnafjarðarleið", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.658553, + "lon": -15.161115, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vopnafjardarleid_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vopnafjardarleid_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7152", + "name": "Víkurgerði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.897063, + "lon": -13.850671, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vikurgerdi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vikurgerdi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7006", + "name": "Víkurskarð", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.812633, + "lon": -18.00925, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vikurskard_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vikurskard_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7112", + "name": "Víðidalur", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.467183, + "lon": -20.518317, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vididalur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/vididalur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7125", + "name": "Ártúnsbrekka", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.124787, + "lon": -21.849255, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/artunsbrekka_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/artunsbrekka_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7117", + "name": "Ódrjúgsháls", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.555028, + "lon": -22.337805, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/odrjugshals_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/odrjugshals_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7050", + "name": "Ólafsfjarðarvegur við Sauðanes", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 66.043923, + "lon": -18.516821, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/olafsfjardarvegur_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/olafsfjardarvegur_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7003", + "name": "Öxnadalsheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.468042, + "lon": -18.693506, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/oxnadalsheidi_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/oxnadalsheidi_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7129", + "name": "Þrengslavegamót", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.038, + "lon": -21.456083, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/threngslavegamot_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/threngslavegamot_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7035", + "name": "Þrengsli", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 63.931028, + "lon": -21.392668, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/threngsli_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/threngsli_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7043", + "name": "Þröskuldar", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.550184, + "lon": -21.833513, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/throskuldar_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/throskuldar_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7020", + "name": "Þverárfjall", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.781272, + "lon": -20.013938, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/thverarfjall_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/thverarfjall_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7147", + "name": "Þverárfjall á Laxárdalsheiði", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 65.808028, + "lon": -19.847833, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/thverarfjall_laxardal_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/thverarfjall_laxardal_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-is-7088", + "name": "Þyrill", + "city": "Iceland", + "cityId": "iceland", + "provider": "Vegagerðin road cameras", + "lat": 64.388697, + "lon": -21.421562, + "feedType": "image", + "sourceKind": "vegagerdin-road", + "license": "Vegagerðin (Icelandic Road and Coastal Administration) public road camera", + "credit": "Icelandic Road and Coastal Administration (Vegagerðin)", + "url": "https://www.vegagerdin.is/vgdata/vefmyndavelar/thyrill_1.jpg", + "snapshotUrl": "https://www.vegagerdin.is/vgdata/vefmyndavelar/thyrill_1.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-jp-river-310497008", + "name": "中津隈8号橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.321083, + "lon": 130.449028, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497008.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497008.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497022", + "name": "久里崎橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.411111, + "lon": 130.010556, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497022.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497022.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497017", + "name": "今出橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.287917, + "lon": 130.125694, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497017.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497017.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497012", + "name": "今重橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.2335, + "lon": 130.2705, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497012.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497012.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497018", + "name": "北田橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.285958, + "lon": 130.093483, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497018.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497018.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497030", + "name": "塩田橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.125583, + "lon": 130.060083, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497030.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497030.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497014", + "name": "境川橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.247, + "lon": 130.218639, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497014.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497014.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497021", + "name": "大橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.425611, + "lon": 130.001611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497021.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497021.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497002", + "name": "学校橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.273136, + "lon": 130.324158, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497007", + "name": "小原橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.329583, + "lon": 130.458889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497007.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497007.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497026", + "name": "岩栗", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.2725, + "lon": 129.886111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497026.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497026.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497032", + "name": "巌橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.078517, + "lon": 130.067397, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497032.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497032.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497006", + "name": "幸津橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.361694, + "lon": 130.49775, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497006.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497006.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497009", + "name": "広円橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.315228, + "lon": 130.387825, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497009.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497009.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497024", + "name": "新岡口橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.445119, + "lon": 130.056775, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497024.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497024.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497010", + "name": "朝日橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.340783, + "lon": 130.364844, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497010.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497010.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497019", + "name": "杉橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.193333, + "lon": 130.030278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497019.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497019.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497023", + "name": "武内", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.227556, + "lon": 129.964194, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497023.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497023.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497001", + "name": "江上", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.247928, + "lon": 130.327239, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497025", + "name": "浜崎", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.446111, + "lon": 130.041944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497025.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497025.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497004", + "name": "牛会橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.417594, + "lon": 130.523825, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497004.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497004.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497015", + "name": "牛津江", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.248333, + "lon": 130.2, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497015.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497015.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497033", + "name": "石木津", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.092703, + "lon": 130.104261, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497033.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497033.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497013", + "name": "祇園", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.303667, + "lon": 130.203389, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497013.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497013.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497031", + "name": "組知橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.113728, + "lon": 130.089778, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497031.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497031.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497011", + "name": "船津", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.212183, + "lon": 130.302061, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497011.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497011.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497016", + "name": "船田橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.275, + "lon": 130.186944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497016.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497016.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497029", + "name": "菅野橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.174333, + "lon": 129.893889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497029.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497029.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-222819045", + "name": "西古川(排)空間監視", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.194442, + "lon": 130.150275, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/222819045.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/222819045.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497005", + "name": "酒井上橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.367867, + "lon": 130.532928, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497028", + "name": "長井手", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.243139, + "lon": 129.853139, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497028.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497028.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497003", + "name": "飯田橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.379167, + "lon": 130.538889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497020", + "name": "髙橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.212778, + "lon": 130.039167, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497020.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497020.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310497027", + "name": "黄金橋", + "city": "佐賀県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.272639, + "lon": 129.870417, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310497027.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310497027.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307180001", + "name": "但東ダム上流", + "city": "兵庫県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 35.48651, + "lon": 135.00575, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307180001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307180001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257445", + "name": "とん田川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.8025, + "lon": 143.824439, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257445.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257445.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257170", + "name": "アイヌ川 1.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.732642, + "lon": 142.418731, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257170.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257170.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257515", + "name": "アカタノンペ川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.893875, + "lon": 143.919856, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257515.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257515.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257498", + "name": "アセツツリ川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.002006, + "lon": 144.398606, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257498.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257498.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257457", + "name": "イワサキ川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.773611, + "lon": 143.870833, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257457.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257457.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257458", + "name": "ウエンナイ川 0.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 45.393889, + "lon": 141.706394, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257458.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257458.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257130", + "name": "ウッペツ川 1.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.791636, + "lon": 142.325523, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257130.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257130.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257531", + "name": "ウツベツ川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.920864, + "lon": 143.187501, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257531.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257531.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257452", + "name": "エトンビ川 1.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.817222, + "lon": 144.592773, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257452.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257452.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257567", + "name": "オケネ川 3.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.794383, + "lon": 143.130951, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257567.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257567.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257562", + "name": "オシタップ川 3.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.924261, + "lon": 143.424014, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257562.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257562.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257287", + "name": "オチャラッペ川 4.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.389167, + "lon": 140.025278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257287.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257287.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257383", + "name": "オバウシナイ川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.586761, + "lon": 142.135968, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257383.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257383.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257504", + "name": "オビラシケ川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.00205, + "lon": 144.478948, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257504.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257504.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257576", + "name": "オベトン川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.820797, + "lon": 143.656728, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257576.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257576.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257168", + "name": "オホーツナイ川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.78625, + "lon": 142.334828, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257168.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257168.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257466", + "name": "オムロシュベツ川1.3kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.840043, + "lon": 142.45826, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257466.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257466.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257253", + "name": "オロッコ川 1.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.856667, + "lon": 140.891667, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257253.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257253.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257442", + "name": "オロムシ川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.727444, + "lon": 143.791417, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257442.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257442.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257380", + "name": "カバユサンナイ川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.624556, + "lon": 141.022314, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257380.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257380.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257259", + "name": "キライチ川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.132222, + "lon": 141.188889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257259.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257259.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257470", + "name": "クサンル川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 45.394656, + "lon": 141.686867, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257470.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257470.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257368", + "name": "クスリサンベツ川 4.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.496944, + "lon": 141.141667, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257368.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257368.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257474", + "name": "クッチャロ川 2.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 45.130528, + "lon": 142.365502, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257474.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257474.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257214", + "name": "クラヌマ川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.321028, + "lon": 142.422483, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257214.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257214.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257350", + "name": "ケリマイ川 9.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.270278, + "lon": 142.685, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257350.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257350.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257500", + "name": "コイトイ川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.983578, + "lon": 144.154161, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257500.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257500.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257174", + "name": "コルコニウシベツ川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.467856, + "lon": 142.466332, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257174.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257174.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257441", + "name": "サクルー川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.198056, + "lon": 143.058616, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257441.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257441.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257548", + "name": "サックシュオルベツ川 20.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.229364, + "lon": 143.294177, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257548.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257548.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257543", + "name": "サッチャルベツ川 8.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.645481, + "lon": 143.189057, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257543.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257543.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257451", + "name": "サナブチ川 3.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.077778, + "lon": 143.509449, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257451.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257451.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257545", + "name": "サラベツ川 11.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.655911, + "lon": 143.177704, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257545.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257545.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257501", + "name": "サンタクンベ川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.985519, + "lon": 144.479936, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257501.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257501.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257373", + "name": "シャミチセ川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.481667, + "lon": 140.884167, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257373.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257373.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257418", + "name": "シュウトルマップ川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.191389, + "lon": 143.08306, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257418.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257418.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257448", + "name": "シュブシュブナイ川 2.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.783139, + "lon": 143.924667, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257448.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257448.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257154", + "name": "タヨロマ川 7.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.285875, + "lon": 142.400982, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257154.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257154.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257502", + "name": "タワラマップ川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.548781, + "lon": 144.974681, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257502.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257502.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257069", + "name": "ダルミ川 2.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.15308, + "lon": 141.6629, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257069.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257069.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257286", + "name": "チブタウシナイ川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.431944, + "lon": 140.011116, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257286.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257286.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257386", + "name": "チマイベツ川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.381908, + "lon": 140.915978, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257386.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257386.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257201", + "name": "チューブス川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.174444, + "lon": 142.383978, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257201.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257201.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257417", + "name": "トマップ川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.913056, + "lon": 144.179449, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257417.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257417.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257378", + "name": "ニタッポロ川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.775256, + "lon": 141.833583, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257378.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257378.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257155", + "name": "ヌッカクシ富良野川 14.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.452756, + "lon": 142.479478, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257155.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257155.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257136", + "name": "ヌッカクシ富良野川 2.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.363244, + "lon": 142.414201, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257136.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257136.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257226", + "name": "ヌッチ川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.1925, + "lon": 140.764172, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257226.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257226.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257551", + "name": "ヌップク川 8.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.796558, + "lon": 143.161063, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257551.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257551.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257095", + "name": "パンケチュウベシナイ川 0.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.21672, + "lon": 141.516389, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257095.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257095.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257447", + "name": "パンケビバウシ川 2.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.749722, + "lon": 143.509639, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257447.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257447.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257570", + "name": "パンケ仙美里川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.185086, + "lon": 143.590607, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257570.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257570.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257541", + "name": "パンケ新得川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.081817, + "lon": 142.818828, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257541.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257541.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257025", + "name": "パンケ歌志内川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.488094, + "lon": 141.913513, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257025.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257025.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257044", + "name": "パンケ歌志内川 8.25Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.480181, + "lon": 141.967311, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257044.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257044.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257522", + "name": "ピウカ川 2.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.910097, + "lon": 143.039513, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257522.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257522.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257346", + "name": "フシコベツ川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.531389, + "lon": 141.286394, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257346.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257346.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257471", + "name": "フーレップ川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.732603, + "lon": 142.740817, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257471.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257471.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257390", + "name": "ブウベツ川 2.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.550828, + "lon": 141.327483, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257390.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257390.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257135", + "name": "ベベルイ川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.348508, + "lon": 142.401444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257135.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257135.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257519", + "name": "ペケレベツ川 4.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.006992, + "lon": 142.874036, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257519.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257519.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257563", + "name": "ペンケオタソイ川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.075936, + "lon": 142.831991, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257563.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257563.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257058", + "name": "ペンケスナ川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.500203, + "lon": 141.9077, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257058.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257058.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257468", + "name": "ペンケナイ川 1.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.837994, + "lon": 142.481875, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257468.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257468.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257197", + "name": "ペンケニウプ川 7.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.483844, + "lon": 142.430371, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257197.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257197.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257431", + "name": "ペンケビバウシ川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.753889, + "lon": 143.510282, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257431.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257431.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257211", + "name": "ペンケ十号川 0.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.485389, + "lon": 142.419347, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257211.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257211.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257048", + "name": "ペンケ歌志内川 15.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.521186, + "lon": 142.034813, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257048.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257048.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257047", + "name": "ペンケ歌志内川 2.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.504336, + "lon": 141.926824, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257047.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257047.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257176", + "name": "ペーパン川 11.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.7402, + "lon": 142.580925, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257176.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257176.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257127", + "name": "ペーパン川 3.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.774, + "lon": 142.490069, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257127.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257127.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257572", + "name": "ホネオップ川 4.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.964447, + "lon": 142.912591, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257572.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257572.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257256", + "name": "ホンベツ川 0.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.706389, + "lon": 140.065839, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257256.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257256.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257061", + "name": "ポンアノロ川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.024614, + "lon": 141.860778, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257061.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257061.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257382", + "name": "ポンアヨロ川 4.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.465964, + "lon": 141.165892, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257382.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257382.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257097", + "name": "ポンウエンベツ川 4.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.062042, + "lon": 141.839324, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257097.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257097.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257166", + "name": "ポンウシベツ川 3.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.757611, + "lon": 142.423021, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257166.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257166.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257208", + "name": "ポンウシベツ川分水路 0.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.754578, + "lon": 142.431494, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257208.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257208.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257075", + "name": "ポントネ川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.2051, + "lon": 141.78825, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257075.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257075.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257511", + "name": "ポン多和川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.330822, + "lon": 144.60364, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257511.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257511.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257124", + "name": "ポン川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.728378, + "lon": 142.400538, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257124.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257124.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257199", + "name": "ポン布部川 3.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.307708, + "lon": 142.560596, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257199.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257199.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257435", + "name": "ポン止別川 2.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.856, + "lon": 144.458944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257435.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257435.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257121", + "name": "マップ川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.164311, + "lon": 141.930319, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257121.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257121.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257018", + "name": "ママチ川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.815336, + "lon": 141.644953, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257018.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257018.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257068", + "name": "ママチ川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.821861, + "lon": 141.655921, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257068.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257068.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257564", + "name": "メン川 5.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.925956, + "lon": 143.279894, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257564.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257564.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257034", + "name": "ヤリキレナイ川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.013889, + "lon": 141.783616, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257034.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257034.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257070", + "name": "ユカンボシ川 4.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.872831, + "lon": 141.591754, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257070.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257070.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257203", + "name": "ユクトラシュベツ川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.163986, + "lon": 142.565522, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257203.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257203.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257076", + "name": "ラウネナイ川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.020817, + "lon": 141.415314, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257076.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257076.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257246", + "name": "リヤムナイ川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.018611, + "lon": 140.570833, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257246.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257246.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257104", + "name": "ルルマップ川 2.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.934722, + "lon": 141.580008, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257104.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257104.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257402", + "name": "ロクシナイ川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.885361, + "lon": 141.766088, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257402.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257402.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257179", + "name": "ワッカウエンナイ川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.020803, + "lon": 142.408889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257179.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257179.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257257", + "name": "ワッカタサップ川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.86, + "lon": 140.908611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257257.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257257.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257205", + "name": "七号川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.839458, + "lon": 142.341681, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257205.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257205.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257090", + "name": "三樽別川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.112561, + "lon": 141.251117, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257090.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257090.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257406", + "name": "三毛別川 19.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.179389, + "lon": 141.780773, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257406.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257406.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257400", + "name": "三毛別川 2.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.255472, + "lon": 141.713588, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257400.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257400.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257351", + "name": "三石川 4.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.274722, + "lon": 142.609722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257351.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257351.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257117", + "name": "三笠幌内川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.23143, + "lon": 141.88707, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257117.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257117.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257444", + "name": "三線川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.020278, + "lon": 143.766944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257444.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257444.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257064", + "name": "三里川 3.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.017256, + "lon": 141.463682, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257064.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257064.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257371", + "name": "上鷲別富岸川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.362817, + "lon": 141.048803, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257371.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257371.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257461", + "name": "下エベコロベツ川 18.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 45.071389, + "lon": 141.83556, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257461.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257461.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257183", + "name": "下川パンケ川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.300464, + "lon": 142.619972, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257183.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257183.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257213", + "name": "下川ペンケ川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.286444, + "lon": 142.660644, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257213.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257213.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257565", + "name": "下牛首別川 3.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.787069, + "lon": 143.492493, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257565.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257565.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257039", + "name": "中の川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.084131, + "lon": 141.271039, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257039.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257039.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257010", + "name": "中の川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.117778, + "lon": 141.266393, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257010.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257010.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257438", + "name": "中土場川 7.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.133889, + "lon": 143.573607, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257438.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257438.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257157", + "name": "中士別十線川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.159872, + "lon": 142.451226, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257157.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257157.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257303", + "name": "中野川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.829147, + "lon": 140.743375, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257303.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257303.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257317", + "name": "中野川 4.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.704511, + "lon": 140.397592, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257317.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257317.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257294", + "name": "久根別川 13.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.921942, + "lon": 140.655458, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257294.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257294.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257270", + "name": "久根別川 2.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.839444, + "lon": 140.691117, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257270.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257270.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257510", + "name": "久著呂川 15.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.287619, + "lon": 144.368562, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257510.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257510.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257348", + "name": "乳呑川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.1625, + "lon": 142.791394, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257348.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257348.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257291", + "name": "亀田川 4.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.809167, + "lon": 140.756117, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257291.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257291.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257089", + "name": "二里川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.0297, + "lon": 141.451603, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257089.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257089.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257180", + "name": "五号川 1.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.721817, + "lon": 142.372081, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257180.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257180.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257193", + "name": "五線川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.138431, + "lon": 142.151252, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257193.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257193.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257479", + "name": "仁々志別川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.013611, + "lon": 144.362782, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257479.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257479.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257409", + "name": "仁頃川 7.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.899722, + "lon": 143.896949, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257409.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257409.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257132", + "name": "伊野川 5.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.745722, + "lon": 142.319707, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257132.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257132.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257544", + "name": "伏古別川 0.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.934958, + "lon": 143.1919, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257544.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257544.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257574", + "name": "伏古川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.933439, + "lon": 143.141808, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257574.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257574.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257088", + "name": "伏籠川 2.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.1339, + "lon": 141.383731, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257088.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257088.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257443", + "name": "佐呂間別川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.079444, + "lon": 143.936384, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257443.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257443.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257424", + "name": "佐呂間別川 17.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.942222, + "lon": 143.650278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257424.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257424.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257425", + "name": "佐呂間別川 20.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.006111, + "lon": 143.76056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257425.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257425.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257297", + "name": "佐女川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.680064, + "lon": 140.432947, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257297.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257297.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257578", + "name": "佐幌川 6.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.087758, + "lon": 142.832206, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257578.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257578.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257546", + "name": "佐野川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.247325, + "lon": 143.547839, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257546.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257546.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257252", + "name": "余市中の川 2.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.16, + "lon": 140.785278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257252.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257252.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257235", + "name": "余市川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.165556, + "lon": 140.769444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257235.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257235.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257233", + "name": "余市川 10.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.123056, + "lon": 140.735278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257233.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257233.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257234", + "name": "余市川 30.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.049722, + "lon": 140.824444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257234.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257234.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257177", + "name": "倉沼川 10.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.716694, + "lon": 142.535615, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257177.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257177.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257128", + "name": "倉沼川 5.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.745486, + "lon": 142.489652, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257128.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257128.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257228", + "name": "倶登山川 2.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.904444, + "lon": 140.743893, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257228.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257228.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257349", + "name": "元浦川 12.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.260833, + "lon": 142.763893, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257349.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257349.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257389", + "name": "元浦川 3.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.216389, + "lon": 142.695, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257389.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257389.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257094", + "name": "入志別川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.725953, + "lon": 142.066279, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257094.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257094.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257364", + "name": "入鹿別川 5.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.616969, + "lon": 141.924433, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257364.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257364.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257569", + "name": "共成川 5.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.163014, + "lon": 143.301975, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257569.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257569.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257464", + "name": "兵知安川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.968611, + "lon": 142.290833, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257464.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257464.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257401", + "name": "初山別川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.524167, + "lon": 141.776272, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257401.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257401.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257200", + "name": "初茶志内川 3.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.335722, + "lon": 142.379117, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257200.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257200.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257335", + "name": "別々川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.580278, + "lon": 141.423061, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257335.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257335.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257488", + "name": "別保川 5.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.993333, + "lon": 144.469449, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257488.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257488.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257533", + "name": "利別川 19.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.243664, + "lon": 143.555653, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257533.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257533.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257537", + "name": "利別川 67.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.464506, + "lon": 143.737999, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257537.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257537.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257538", + "name": "利別川 8.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.176044, + "lon": 143.587706, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257538.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257538.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257019", + "name": "利根別川 7.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.18303, + "lon": 141.74478, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257019.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257019.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257143", + "name": "剣淵川 13.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.100433, + "lon": 142.382488, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257143.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257143.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257153", + "name": "剣淵川 22.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.026239, + "lon": 142.405864, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257153.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257153.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257149", + "name": "剣淵川 4.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.16525, + "lon": 142.377016, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257149.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257149.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257096", + "name": "加茂川 1.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.10884, + "lon": 141.731, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257096.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257096.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257393", + "name": "勇払川 11.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.683333, + "lon": 141.673611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257393.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257393.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257325", + "name": "勇払川 6.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.678889, + "lon": 141.715278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257325.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257325.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257232", + "name": "勝納川 1.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.181667, + "lon": 141.008333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257232.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257232.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257156", + "name": "北一号川 0.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.349928, + "lon": 142.394347, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257156.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257156.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257122", + "name": "北光一の沢川 3.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.515842, + "lon": 141.947803, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257122.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257122.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257465", + "name": "北見幌別川 14.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.839722, + "lon": 142.476117, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257465.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257465.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257469", + "name": "北見幌別川 25.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.7976, + "lon": 142.391797, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257469.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257469.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257108", + "name": "十一号川 1.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.342789, + "lon": 141.860961, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257108.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257108.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257161", + "name": "十五号川 0.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.679569, + "lon": 142.393511, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257161.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257161.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257202", + "name": "十線川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.289236, + "lon": 142.381942, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257202.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257202.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257189", + "name": "千代ケ岡川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.645094, + "lon": 142.450239, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257189.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257189.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257553", + "name": "千住川 2.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.920594, + "lon": 143.266967, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257553.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257553.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257017", + "name": "千歳川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.818403, + "lon": 141.631276, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257017.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257017.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257035", + "name": "南六号川 5.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.962222, + "lon": 141.684171, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257035.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257035.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257071", + "name": "南利根別川 0.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.185911, + "lon": 141.755331, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257071.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257071.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257172", + "name": "南校川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.75145, + "lon": 142.355372, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257172.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257172.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257296", + "name": "南部陣屋川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.5216, + "lon": 140.377478, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257296.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257296.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257566", + "name": "厚内川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.806714, + "lon": 143.812978, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257566.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257566.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257001", + "name": "厚別川 1.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.046944, + "lon": 141.45306, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257357", + "name": "厚別川 16.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.520278, + "lon": 142.333338, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257357.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257357.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257332", + "name": "厚別川 6.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.446944, + "lon": 142.284449, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257332.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257332.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257063", + "name": "厚別川 8.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.989319, + "lon": 141.440663, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257063.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257063.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257282", + "name": "厚沢部川 22.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.883889, + "lon": 140.327227, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257282.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257282.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257281", + "name": "厚沢部川 7.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.923889, + "lon": 140.187222, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257281.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257281.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257046", + "name": "厚田川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.397222, + "lon": 141.445839, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257046.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257046.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257321", + "name": "厚真川 17.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.720833, + "lon": 141.877778, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257321.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257321.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257320", + "name": "厚真川 3.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.625833, + "lon": 141.853338, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257320.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257320.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257314", + "name": "原木川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.728531, + "lon": 141.033428, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257314.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257314.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257152", + "name": "双珠別川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.976289, + "lon": 142.399983, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257152.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257152.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257397", + "name": "古丹別川 18.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.230583, + "lon": 141.789579, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257397.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257397.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257407", + "name": "古丹別川 6.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.271028, + "lon": 141.717254, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257407.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257407.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257240", + "name": "古宇川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.144722, + "lon": 140.434161, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257240.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257240.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257330", + "name": "古川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.335556, + "lon": 142.363616, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257330.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257330.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257298", + "name": "古川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.801794, + "lon": 140.123897, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257298.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257298.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257514", + "name": "古川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.99285, + "lon": 144.174197, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257514.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257514.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257251", + "name": "古平冷水川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.256667, + "lon": 140.636944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257251.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257251.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257218", + "name": "古平川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.256667, + "lon": 140.645, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257218.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257218.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257312", + "name": "古武井川 0.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.784189, + "lon": 141.105483, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257312.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257312.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257573", + "name": "古舞川 4.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.813031, + "lon": 143.241874, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257573.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257573.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257278", + "name": "吉岡川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.443056, + "lon": 140.227228, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257278.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257278.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257361", + "name": "向別川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.186667, + "lon": 142.77195, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257361.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257361.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257481", + "name": "和天別川 3.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.955278, + "lon": 144.033616, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257481.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257481.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257229", + "name": "喜茂別川 3.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.795, + "lon": 140.966393, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257229.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257229.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257164", + "name": "基北川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.768358, + "lon": 142.385535, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257164.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257164.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257219", + "name": "堀株川 15.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.969167, + "lon": 140.67695, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257219.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257219.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257227", + "name": "堀株川 8.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.983889, + "lon": 140.613056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257227.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257227.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257030", + "name": "堺川 2.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.723056, + "lon": 142.019727, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257030.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257030.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257100", + "name": "堺川放水路 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.732972, + "lon": 142.066997, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257100.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257100.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257231", + "name": "塩谷川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.203611, + "lon": 140.922494, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257231.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257231.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257467", + "name": "声問川(旧川) 4.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 45.403252, + "lon": 141.7588, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257467.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257467.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257530", + "name": "売買川 2.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.89495, + "lon": 143.197658, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257530.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257530.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257542", + "name": "売買川分水路 2.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.834425, + "lon": 143.147897, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257542.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257542.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257036", + "name": "夕張川 15.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.984455, + "lon": 142.011044, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257036.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257036.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257512", + "name": "多和川 0.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.325458, + "lon": 144.60724, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257512.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257512.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257028", + "name": "多度志川 2.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.806667, + "lon": 142.034449, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257028.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257028.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257455", + "name": "大久保川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.790556, + "lon": 143.613056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257455.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257455.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257299", + "name": "大松前川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.433856, + "lon": 140.111886, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257299.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257299.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257272", + "name": "大野川 4.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.858056, + "lon": 140.646111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257272.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257272.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257111", + "name": "大願川 5.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.25722, + "lon": 141.76457, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257111.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257111.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257295", + "name": "天野川 16.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.747844, + "lon": 140.243294, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257295.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257295.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257280", + "name": "天野川 2.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.775556, + "lon": 140.144722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257280.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257280.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257098", + "name": "太鳳川 5.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.738694, + "lon": 142.036139, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257098.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257098.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257054", + "name": "奈井江川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.421736, + "lon": 141.879123, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257054.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257054.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257026", + "name": "奈江豊平川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.471578, + "lon": 141.904329, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257026.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257026.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257285", + "name": "姫川 2.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.972778, + "lon": 140.165838, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257285.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257285.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257185", + "name": "宇莫別川 3.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.596194, + "lon": 142.571117, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257185.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257185.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257367", + "name": "安平川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.625278, + "lon": 141.738889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257367.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257367.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257323", + "name": "安平川 14.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.724444, + "lon": 141.803894, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257323.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257323.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257322", + "name": "安平川 25.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.8175, + "lon": 141.821944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257322.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257322.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257283", + "name": "安野呂川 5.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.951944, + "lon": 140.258338, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257283.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257283.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257342", + "name": "富岸川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.384722, + "lon": 141.072228, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257342.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257342.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257450", + "name": "富美川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.138889, + "lon": 143.509717, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257450.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257450.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257134", + "name": "富良野川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.356289, + "lon": 142.38296, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257134.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257134.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257137", + "name": "富良野川 10.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.416372, + "lon": 142.427978, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257137.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257137.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257138", + "name": "富良野川 16.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.463711, + "lon": 142.463583, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257138.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257138.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257404", + "name": "小平蘂川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.017639, + "lon": 141.670056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257404.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257404.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257410", + "name": "小町川 3.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.808333, + "lon": 143.846393, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257410.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257410.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257440", + "name": "小石川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.822778, + "lon": 143.896106, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257440.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257440.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257165", + "name": "小股川 4.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.749336, + "lon": 142.422256, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257165.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257165.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257099", + "name": "小豆川 1.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.733625, + "lon": 141.864632, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257099.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257099.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257051", + "name": "小野津幌川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.053917, + "lon": 141.481336, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257051.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257051.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257356", + "name": "小鉾岸川 1.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.594444, + "lon": 140.641117, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257356.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257356.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257260", + "name": "尻別川 0.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.790278, + "lon": 140.933889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257260.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257260.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257220", + "name": "尻別川 19.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.809722, + "lon": 140.683893, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257220.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257220.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257238", + "name": "尻別川 37.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.885713, + "lon": 140.752998, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257238.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257238.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257237", + "name": "尻別川 53.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.860556, + "lon": 140.875833, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257237.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257237.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257265", + "name": "尻岸内川 1.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.761944, + "lon": 141.077222, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257265.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257265.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257494", + "name": "尾幌川 14.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.031836, + "lon": 144.617054, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257494.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257494.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257489", + "name": "尾幌川 2.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.006944, + "lon": 144.701116, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257489.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257489.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257339", + "name": "岡志別川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.427222, + "lon": 141.10945, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257339.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257339.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257013", + "name": "島松川 6.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.936536, + "lon": 141.561487, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257013.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257013.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257091", + "name": "左股川 1.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.049431, + "lon": 141.266403, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257091.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257091.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257158", + "name": "布礼別川 1.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.316983, + "lon": 142.40376, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257158.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257158.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257526", + "name": "帯広川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.929778, + "lon": 143.202686, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257526.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257526.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257528", + "name": "帯広川 21.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.804478, + "lon": 143.066296, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257528.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257528.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257525", + "name": "帯広川 6.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.921456, + "lon": 143.135892, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257525.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257525.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257268", + "name": "常盤川 1.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.820278, + "lon": 140.716394, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257268.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257268.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257388", + "name": "幌内川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.656444, + "lon": 141.624611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257388.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257388.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257067", + "name": "幌向川 24.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.16195, + "lon": 141.91867, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257067.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257067.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257020", + "name": "幌向川 3.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.14513, + "lon": 141.72132, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257020.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257020.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257509", + "name": "幌呂川 9.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.204519, + "lon": 144.262862, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257509.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257509.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257029", + "name": "幌新太刀別川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.787222, + "lon": 141.912504, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257029.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257029.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257434", + "name": "幾品川 2.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.8775, + "lon": 144.704171, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257434.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257434.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257575", + "name": "広内川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.076392, + "lon": 142.82165, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257575.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257575.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257478", + "name": "庶路川 2.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.990278, + "lon": 144.126949, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257478.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257478.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257032", + "name": "当別川 1.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.220278, + "lon": 141.526116, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257032.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257032.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257074", + "name": "当別川 7.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.2638, + "lon": 141.531168, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257074.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257074.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257133", + "name": "当麻川 4.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.838653, + "lon": 142.521824, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257133.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257133.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257194", + "name": "当麻熊の沢川 0.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.827833, + "lon": 142.578614, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257194.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257194.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257105", + "name": "待合川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.693333, + "lon": 142.058343, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257105.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257105.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257244", + "name": "後志種川 1.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.154167, + "lon": 140.775278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257244.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257244.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257024", + "name": "徳富川 4.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.5754, + "lon": 141.830458, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257024.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257024.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257078", + "name": "志寸川 2.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.588781, + "lon": 141.867782, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257078.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257078.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257059", + "name": "志幌加別川 9.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.029361, + "lon": 141.964332, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257059.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257059.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257113", + "name": "志文川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.161589, + "lon": 141.773031, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257113.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257113.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257190", + "name": "志比内川 3.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.644311, + "lon": 142.581452, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257190.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257190.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257196", + "name": "忠烈布川 3.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.298889, + "lon": 142.498338, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257196.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257196.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257031", + "name": "恵岱別川 5.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.709167, + "lon": 141.822227, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257031.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257031.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257554", + "name": "恵津美川 3.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.694844, + "lon": 143.12725, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257554.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257554.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257150", + "name": "愛別川 3.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.912206, + "lon": 142.572297, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257150.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257150.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257147", + "name": "愛宕新川 1.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.758367, + "lon": 142.427068, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257147.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257147.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257334", + "name": "慶能舞川 4.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.481667, + "lon": 142.212783, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257334.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257334.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257293", + "name": "戸切地川 3.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.844422, + "lon": 140.628306, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257293.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257293.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257496", + "name": "戻辺川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.960572, + "lon": 144.059572, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257496.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257496.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257086", + "name": "手稲土功川 0.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.132147, + "lon": 141.231606, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257086.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257086.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257255", + "name": "折川 0.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.744722, + "lon": 140.132506, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257255.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257255.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257289", + "name": "折戸川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.044722, + "lon": 140.808061, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257289.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257289.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257053", + "name": "抜羽の沢川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.25057, + "lon": 141.88565, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257053.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257053.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257561", + "name": "振別川 4.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.484956, + "lon": 143.275214, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257561.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257561.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257379", + "name": "支安平川 1.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.819383, + "lon": 141.841397, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257379.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257379.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257446", + "name": "支湧別川 8.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.829167, + "lon": 143.140838, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257446.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257446.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257337", + "name": "敷生川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.508611, + "lon": 141.273333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257337.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257337.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257421", + "name": "斜里川 13.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.783417, + "lon": 144.535222, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257421.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257421.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257420", + "name": "斜里川 2.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.901389, + "lon": 144.641116, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257420.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257420.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257215", + "name": "新タヨロマ川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.223333, + "lon": 142.373328, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257215.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257215.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257376", + "name": "新冠川 20.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.486556, + "lon": 142.433877, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257376.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257376.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257331", + "name": "新冠川 8.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.396944, + "lon": 142.37556, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257331.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257331.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257395", + "name": "新冠川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.368333, + "lon": 142.310278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257395.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257395.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257011", + "name": "新川 8.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.108775, + "lon": 141.298239, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257011.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257011.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257523", + "name": "新帯広川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.927547, + "lon": 143.140748, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257523.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257523.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257141", + "name": "新美深川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.479433, + "lon": 142.377166, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257141.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257141.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257119", + "name": "於札内川 3.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.460206, + "lon": 141.832952, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257119.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257119.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257347", + "name": "日高幌別川 4.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.175833, + "lon": 142.851949, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257347.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257347.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257391", + "name": "日高目名川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.359422, + "lon": 142.391208, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257391.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257391.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257370", + "name": "日高門別川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.478569, + "lon": 142.077914, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257370.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257370.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257549", + "name": "旧オベトン川 1.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.810042, + "lon": 143.659908, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257549.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257549.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257301", + "name": "旧久根別川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.827558, + "lon": 140.661828, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257301.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257301.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257092", + "name": "旧夕張川 11.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.044468, + "lon": 141.676296, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257092.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257092.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257080", + "name": "旧奈江豊平川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.475467, + "lon": 141.8781, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257080.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257080.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257558", + "name": "旧帯広川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.931461, + "lon": 143.217239, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257558.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257558.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257043", + "name": "旧幌向川 3.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.142731, + "lon": 141.6439, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257043.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257043.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257102", + "name": "旧幾春別川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.196769, + "lon": 141.7285, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257102.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257102.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257084", + "name": "旧琴似川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.134217, + "lon": 141.370117, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257084.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257084.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257022", + "name": "旧美唄川 3.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.32527, + "lon": 141.76276, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257022.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257022.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257499", + "name": "旧雪裡川 4.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.043981, + "lon": 144.419361, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257499.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257499.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257066", + "name": "早苗別川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.10135, + "lon": 141.56031, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257066.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257066.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257007", + "name": "早苗別川放水路 3.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.086667, + "lon": 141.559727, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257007.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257007.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257225", + "name": "昆布川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.794167, + "lon": 140.601671, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257225.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257225.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257372", + "name": "明野川 6.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.670061, + "lon": 141.661917, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257372.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257372.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257483", + "name": "星が浦川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.0125, + "lon": 144.30806, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257483.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257483.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257221", + "name": "星置川 1.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.135556, + "lon": 141.192217, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257221.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257221.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257495", + "name": "春別川 33.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.475803, + "lon": 145.058079, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257495.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257495.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257506", + "name": "春採川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.966972, + "lon": 144.39515, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257506.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257506.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257198", + "name": "智恵文川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.426217, + "lon": 142.402501, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257198.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257198.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257093", + "name": "最上川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.1203, + "lon": 141.7434, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257093.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257093.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257513", + "name": "最栄利別川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.469536, + "lon": 144.432283, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257513.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257513.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257003", + "name": "月寒川 4.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.040556, + "lon": 141.431671, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257062", + "name": "月寒川 7.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.025361, + "lon": 141.40571, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257062.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257062.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257195", + "name": "有利里川 3.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.370458, + "lon": 142.424793, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257195.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257195.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257374", + "name": "有珠川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.644722, + "lon": 141.551111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257374.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257374.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257081", + "name": "望月寒川 4.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.051203, + "lon": 141.399663, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257081.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257081.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257037", + "name": "望月寒川 7.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.021353, + "lon": 141.381797, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257037.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257037.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257055", + "name": "望来川 1.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.318133, + "lon": 141.427086, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257055.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257055.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257217", + "name": "朝日六線川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.119, + "lon": 142.614339, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257217.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257217.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257239", + "name": "朝里川 2.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.1575, + "lon": 141.043056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257239.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257239.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257275", + "name": "木古内川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.673611, + "lon": 140.431111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257275.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257275.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257433", + "name": "木禽川 1.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.856389, + "lon": 144.108168, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257433.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257433.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257535", + "name": "本別川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.122264, + "lon": 143.613611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257535.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257535.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257224", + "name": "朱太川 14.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.675833, + "lon": 140.306111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257224.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257224.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257223", + "name": "朱太川 3.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.756944, + "lon": 140.291116, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257223.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257223.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257103", + "name": "杉原谷川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.558514, + "lon": 141.854412, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257103.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257103.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257116", + "name": "材木川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.219658, + "lon": 141.495085, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257116.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257116.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257340", + "name": "来馬川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.411667, + "lon": 141.103617, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257340.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257340.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257167", + "name": "東光川 2.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.737589, + "lon": 142.400828, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257167.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257167.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257021", + "name": "東利根別川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.19344, + "lon": 141.77498, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257021.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257021.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257454", + "name": "東無加川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.788889, + "lon": 143.622227, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257454.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257454.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257266", + "name": "松倉川 2.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.784167, + "lon": 140.808611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257266.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257266.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257377", + "name": "板谷川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.543539, + "lon": 140.779658, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257377.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257377.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257014", + "name": "柏木川 5.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.915922, + "lon": 141.579591, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257014.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257014.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257527", + "name": "柏林台川 0.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.922825, + "lon": 143.158232, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257527.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257527.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257178", + "name": "栄川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.776411, + "lon": 142.338714, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257178.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257178.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257212", + "name": "桑の沢川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.294097, + "lon": 142.630049, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257212.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257212.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257248", + "name": "梅川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.209444, + "lon": 140.764161, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257248.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257248.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257360", + "name": "様似川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.129444, + "lon": 142.935278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257360.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257360.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257487", + "name": "標津川 14.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.554444, + "lon": 144.976342, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257487.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257487.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257486", + "name": "標津川 20.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.546003, + "lon": 144.939797, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257486.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257486.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257492", + "name": "標津川 5.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.637264, + "lon": 145.0829, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257492.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257492.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257115", + "name": "樺戸川 1.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.489222, + "lon": 141.853767, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257115.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257115.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257557", + "name": "機関庫の川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.884347, + "lon": 143.196533, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257557.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257557.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257365", + "name": "歌別川 2.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.009242, + "lon": 143.198231, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257365.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257365.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257432", + "name": "止別川 4.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.892194, + "lon": 144.481778, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257432.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257432.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257505", + "name": "武佐川 1.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.993314, + "lon": 144.426018, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257505.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257505.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257516", + "name": "歴舟川 13.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.494067, + "lon": 143.275608, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257516.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257516.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257173", + "name": "比布ウッペツ川 5.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.879097, + "lon": 142.481892, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257173.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257173.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257126", + "name": "比布川 4.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.870125, + "lon": 142.463669, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257126.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257126.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257363", + "name": "気仙川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.39635, + "lon": 140.909844, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257363.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257363.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257353", + "name": "気門別川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.474167, + "lon": 140.859728, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257353.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257353.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257405", + "name": "永寿川 3.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.833917, + "lon": 141.527883, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257405.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257405.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257191", + "name": "永山3号川 0.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.789158, + "lon": 142.436014, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257191.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257191.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257171", + "name": "永山二号川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.784836, + "lon": 142.40365, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257171.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257171.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257292", + "name": "汐泊川 6.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.800278, + "lon": 140.871672, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257292.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257292.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257123", + "name": "江丹別川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.792931, + "lon": 142.279809, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257123.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257123.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257131", + "name": "江丹別川 13.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.876803, + "lon": 142.252403, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257131.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257131.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257359", + "name": "沙流川 32.9kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.895833, + "lon": 142.556116, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257359.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257359.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257369", + "name": "沙流川 5.0kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.725978, + "lon": 142.313121, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257369.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257369.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257027", + "name": "沼田奔川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.807778, + "lon": 141.952504, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257027.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257027.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257222", + "name": "泊川 2.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.68, + "lon": 140.066661, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257222.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257222.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257309", + "name": "泥川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.887661, + "lon": 140.33246, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257309.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257309.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257273", + "name": "流渓川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.815278, + "lon": 140.621667, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257273.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257273.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257038", + "name": "浜益川 2.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.584167, + "lon": 141.418617, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257038.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257038.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257518", + "name": "浦幌川 0.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.794825, + "lon": 143.650167, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257518.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257518.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257517", + "name": "浦幌川 60.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.089061, + "lon": 143.603211, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257517.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257517.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257050", + "name": "浦臼内川 2.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.428939, + "lon": 141.816161, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257050.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257050.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257439", + "name": "清瀬川 2.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.24, + "lon": 143.266393, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257439.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257439.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257073", + "name": "清田川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.997244, + "lon": 141.433211, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257073.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257073.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257550", + "name": "清見二線川 2.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.931197, + "lon": 143.449158, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257550.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257550.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257539", + "name": "渋山川 3.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.883078, + "lon": 142.984829, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257539.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257539.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257437", + "name": "渚滑川 15.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.193333, + "lon": 143.07694, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257437.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257437.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257399", + "name": "温寧川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.154417, + "lon": 141.66225, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257399.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257399.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257145", + "name": "温根別川 2.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.187458, + "lon": 142.260757, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257145.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257145.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257429", + "name": "湧別川 35.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.006111, + "lon": 143.339722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257429.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257429.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257302", + "name": "湯の川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.785139, + "lon": 140.794742, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257302.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257302.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257318", + "name": "湯の沢川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.791833, + "lon": 140.795256, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257318.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257318.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257250", + "name": "湯内川 0.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.245278, + "lon": 140.708328, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257250.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257250.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257118", + "name": "滝田川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.434956, + "lon": 141.819485, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257118.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257118.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257087", + "name": "濁川 4.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.126964, + "lon": 141.2233, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257087.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257087.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257412", + "name": "無加川 28.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.758611, + "lon": 143.512504, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257412.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257412.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257411", + "name": "無加川 5.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.787778, + "lon": 143.718333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257411.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257411.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257503", + "name": "然内川 6.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.36315, + "lon": 144.991929, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257503.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257503.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257547", + "name": "然別川 8.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.018292, + "lon": 143.145966, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257547.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257547.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257023", + "name": "熊穴川 5.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.609125, + "lon": 141.935088, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257023.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257023.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257245", + "name": "熱郛川 8.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.670556, + "lon": 140.37195, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257245.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257245.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257129", + "name": "牛朱別川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.80265, + "lon": 142.518447, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257129.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257129.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257144", + "name": "犬牛別川 13.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.174058, + "lon": 142.273344, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257144.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257144.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257142", + "name": "犬牛別川 3.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.140972, + "lon": 142.360315, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257142.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257142.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257422", + "name": "猿間川 2.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.885, + "lon": 144.661393, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257422.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257422.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257243", + "name": "玉川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.057222, + "lon": 140.504444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257243.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257243.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257009", + "name": "琴似川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.091944, + "lon": 141.320838, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257009.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257009.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257008", + "name": "琴似発寒川 4.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.074167, + "lon": 141.288338, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257008.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257008.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257082", + "name": "琴似発寒川 8.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.05955, + "lon": 141.250219, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257082.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257082.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257423", + "name": "生田原川 19.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.918889, + "lon": 143.533329, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257423.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257423.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257436", + "name": "生田原川 9.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.986194, + "lon": 143.540722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257436.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257436.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257313", + "name": "田沢川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.901053, + "lon": 140.14805, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257313.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257313.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257057", + "name": "由仁川 9.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.946006, + "lon": 141.809307, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257057.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257057.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257042", + "name": "発寒川 2.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.14582, + "lon": 141.311104, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257042.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257042.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257041", + "name": "発寒川 2.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.147186, + "lon": 141.315375, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257041.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257041.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257258", + "name": "発足川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.035, + "lon": 140.551667, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257258.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257258.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257338", + "name": "登別川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.449444, + "lon": 141.170006, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257338.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257338.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257247", + "name": "登川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.181667, + "lon": 140.821393, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257247.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257247.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257254", + "name": "登延頃川 5.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.7475, + "lon": 140.941111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257254.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257254.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257336", + "name": "白老川 1.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.547778, + "lon": 141.341944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257336.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257336.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257345", + "name": "白老川 2.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.622222, + "lon": 141.267506, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257345.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257345.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257290", + "name": "目名川 2.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.811944, + "lon": 140.137783, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257290.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257290.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257579", + "name": "直別川 1.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.851361, + "lon": 143.859944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257579.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257579.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257449", + "name": "相内川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.803611, + "lon": 143.766671, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257449.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257449.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257333", + "name": "真沼津川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.348333, + "lon": 142.35695, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257333.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257333.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257242", + "name": "真狩川 17.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.768611, + "lon": 140.8025, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257242.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257242.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257288", + "name": "真駒内川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.418333, + "lon": 139.874727, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257288.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257288.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257005", + "name": "真駒内川 2.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.987717, + "lon": 141.350908, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257311", + "name": "矢尻川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.835925, + "lon": 141.140542, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257311.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257311.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257310", + "name": "知内川 1.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.600056, + "lon": 140.411747, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257310.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257310.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257276", + "name": "知内川 10.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.597778, + "lon": 140.327222, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257276.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257276.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257344", + "name": "知利別川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.355, + "lon": 141.021672, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257344.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257344.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257106", + "name": "知津狩川 8.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.275319, + "lon": 141.454754, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257106.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257106.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257508", + "name": "知西別川 0.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.979203, + "lon": 145.153836, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257508.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257508.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257279", + "name": "石崎川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.702222, + "lon": 140.026117, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257279.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257279.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257269", + "name": "石川 1.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.823889, + "lon": 140.731117, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257269.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257269.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257305", + "name": "砂蘭部川 0.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.255082, + "lon": 140.251572, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257305.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257305.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257381", + "name": "礼文華川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.585836, + "lon": 140.590622, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257381.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257381.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257107", + "name": "祝梅川 2.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.837769, + "lon": 141.687011, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257107.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257107.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257163", + "name": "神居川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.775033, + "lon": 142.314606, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257163.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257163.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257209", + "name": "神水川 1.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.813586, + "lon": 142.487661, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257209.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257209.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257277", + "name": "福島川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.485, + "lon": 140.253611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257277.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257277.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257072", + "name": "穴の川 1.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.959441, + "lon": 141.323156, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257072.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257072.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257188", + "name": "空知川 2.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.148739, + "lon": 142.601789, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257188.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257188.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257184", + "name": "空知川 9.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.123956, + "lon": 142.674076, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257184.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257184.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257568", + "name": "第二売買川 5.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.800333, + "lon": 143.118396, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257568.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257568.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257559", + "name": "第二柏林台川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.907533, + "lon": 143.145261, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257559.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257559.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257560", + "name": "第二鈴蘭川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.962239, + "lon": 143.205625, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257560.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257560.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257065", + "name": "篠路新川 4.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.126086, + "lon": 141.413352, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257065.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257065.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257004", + "name": "精進川 5.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.999167, + "lon": 141.36556, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257004.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257004.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257556", + "name": "糠内川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.783144, + "lon": 143.327127, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257556.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257556.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257316", + "name": "紋別川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.4918, + "lon": 140.352867, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257316.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257316.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257112", + "name": "納内幌内川 2.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.744319, + "lon": 142.154251, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257112.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257112.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257384", + "name": "絵笛川 2.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.203044, + "lon": 142.740711, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257384.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257384.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257414", + "name": "網走川 10.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.647778, + "lon": 143.991671, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257414.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257414.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257079", + "name": "総富地川 0.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.551578, + "lon": 141.861888, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257079.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257079.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257308", + "name": "緑川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.483078, + "lon": 140.257892, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257308.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257308.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257125", + "name": "置杵牛川 3.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.593961, + "lon": 142.486118, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257125.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257125.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257485", + "name": "羅臼川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.0215, + "lon": 145.18755, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257485.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257485.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257324", + "name": "美々川 3.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.723611, + "lon": 141.710833, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257324.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257324.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257049", + "name": "美唄川 5.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.32753, + "lon": 141.88549, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257049.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257049.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257056", + "name": "美唄新川 3.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.3321, + "lon": 141.852489, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257056.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257056.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257236", + "name": "美国川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.292222, + "lon": 140.597222, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257236.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257236.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257415", + "name": "美幌川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.821389, + "lon": 144.141393, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257415.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257415.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257162", + "name": "美深川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.479253, + "lon": 142.351431, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257162.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257162.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257206", + "name": "美瑛川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.499364, + "lon": 142.612806, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257206.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257206.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257186", + "name": "美瑛紅葉川 5.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.532108, + "lon": 142.521318, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257186.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257186.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257552", + "name": "美生川 19.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.801675, + "lon": 142.956716, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257552.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257552.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257521", + "name": "美生川 2.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.9118, + "lon": 143.062286, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257521.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257521.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257532", + "name": "美里別川 30.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.277928, + "lon": 143.42866, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257532.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257532.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257396", + "name": "羽幌川 10.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.313278, + "lon": 141.773444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257396.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257396.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257341", + "name": "胆振幌別川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.409444, + "lon": 141.090556, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257341.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257341.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257427", + "name": "興部川 1.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.472778, + "lon": 143.116949, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257427.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257427.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257428", + "name": "興部川 39.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.335, + "lon": 142.861949, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257428.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257428.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257476", + "name": "舌辛川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.119167, + "lon": 144.119167, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257476.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257476.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257426", + "name": "芭露川 2.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.147194, + "lon": 143.681361, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257426.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257426.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257555", + "name": "芽室川 12.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.915675, + "lon": 142.920209, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257555.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257555.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257520", + "name": "芽室川 2.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.919403, + "lon": 143.029753, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257520.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257520.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257577", + "name": "芽登川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.280319, + "lon": 143.426824, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257577.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257577.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257326", + "name": "苫小牧川 3.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.642222, + "lon": 141.572506, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257326.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257326.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257015", + "name": "茂漁川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.88935, + "lon": 141.568988, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257015.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257015.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257274", + "name": "茂辺地川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.769722, + "lon": 140.602783, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257274.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257274.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257507", + "name": "茂雪裡川 9.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.238217, + "lon": 144.319433, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257507.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257507.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257304", + "name": "茅部中の川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.105678, + "lon": 140.587144, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257304.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257304.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257497", + "name": "茶路川 23.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.074186, + "lon": 143.969153, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257497.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257497.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257477", + "name": "茶路川 3.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.970272, + "lon": 144.058217, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257477.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257477.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257580", + "name": "茶路川 11.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.015778, + "lon": 144.023861, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257580.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257580.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257581", + "name": "茶路川 15.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.040972, + "lon": 144.006167, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257581.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257581.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257264", + "name": "落部川 0.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.191944, + "lon": 140.420278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257264.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257264.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257300", + "name": "蒜沢川 3.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.852306, + "lon": 140.730033, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257300.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257300.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257419", + "name": "藻鼈川 5.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.289722, + "lon": 143.357222, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257419.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257419.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257230", + "name": "蘭島川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.196944, + "lon": 140.859161, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257230.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257230.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257540", + "name": "螺湾川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.306942, + "lon": 143.708501, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257540.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257540.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257114", + "name": "裏の沢川 2.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.008308, + "lon": 141.556234, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257114.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257114.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257216", + "name": "西内大部川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.128475, + "lon": 142.530432, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257216.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257216.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257484", + "name": "西別川 22.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.390364, + "lon": 145.126551, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257484.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257484.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257375", + "name": "西富岸川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.381486, + "lon": 141.067794, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257375.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257375.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257140", + "name": "西達布川 11.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.215631, + "lon": 142.500629, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257140.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257140.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257192", + "name": "西里川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.887122, + "lon": 142.236701, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257192.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257192.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257430", + "name": "訓子府川 17.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.756667, + "lon": 143.68444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257430.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257430.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257413", + "name": "訓子府川 3.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.785278, + "lon": 143.838616, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257413.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257413.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257472", + "name": "豊寒別川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 45.129228, + "lon": 142.394871, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257472.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257472.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257006", + "name": "豊平川 5.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.9658, + "lon": 141.31585, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257006.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257006.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257146", + "name": "豊栄川 3.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.335917, + "lon": 142.465944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257146.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257146.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257385", + "name": "豊泉川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.597153, + "lon": 140.643433, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257385.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257385.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257355", + "name": "貫気別川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.587222, + "lon": 140.699722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257355.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257355.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257328", + "name": "貫気別川 2.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.660278, + "lon": 142.273616, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257328.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257328.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257387", + "name": "赤川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.141522, + "lon": 142.826992, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257387.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257387.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257534", + "name": "足寄川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.242644, + "lon": 143.56365, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257534.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257534.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257083", + "name": "軽川 2.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.115753, + "lon": 141.236986, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257083.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257083.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257012", + "name": "輪厚川 3.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.9833, + "lon": 141.556599, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257012.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257012.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257060", + "name": "農場川 0.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.34175, + "lon": 141.673, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257060.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257060.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257151", + "name": "辺乙部川 5.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.028556, + "lon": 142.3605, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257151.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257151.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257101", + "name": "辺渓川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.516758, + "lon": 142.213861, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257101.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257101.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257175", + "name": "近文オホーツナイ川 0.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.780719, + "lon": 142.336722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257175.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257175.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257571", + "name": "途別川 1.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.905822, + "lon": 143.255419, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257571.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257571.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257529", + "name": "途別川 5.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.879558, + "lon": 143.236492, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257529.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257529.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257262", + "name": "遊楽部川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.263889, + "lon": 140.26695, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257262.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257262.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257263", + "name": "遊楽部川 6.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.263889, + "lon": 140.211944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257263.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257263.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257403", + "name": "遠別川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.718417, + "lon": 141.792722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257403.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257403.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257394", + "name": "遠浅川 10.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.76, + "lon": 141.743889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257394.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257394.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257319", + "name": "重内川 2.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.614014, + "lon": 140.404781, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257319.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257319.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257241", + "name": "野束川 1.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.970556, + "lon": 140.510556, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257241.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257241.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257002", + "name": "野津幌川 7.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.038056, + "lon": 141.48306, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257475", + "name": "釧路川 2.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.986389, + "lon": 144.396393, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257475.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257475.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257109", + "name": "鈴木の沢川 0.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.115619, + "lon": 141.75095, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257109.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257109.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257524", + "name": "鈴蘭川 1.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.952278, + "lon": 143.197737, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257524.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257524.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257120", + "name": "銀川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.555911, + "lon": 141.896822, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257120.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257120.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257210", + "name": "銅蘭川 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.8072, + "lon": 142.072117, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257210.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257210.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257327", + "name": "錦多峰川 2.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.628056, + "lon": 141.488339, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257327.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257327.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257490", + "name": "鐺別川 1.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.481111, + "lon": 144.451949, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257490.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257490.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257261", + "name": "長万部川 4.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.548611, + "lon": 140.354172, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257261.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257261.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257392", + "name": "長沼川 2.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.620808, + "lon": 141.889928, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257392.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257392.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257352", + "name": "長流川 2.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.489722, + "lon": 140.849722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257352.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257352.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257362", + "name": "長流川 24.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.584636, + "lon": 141.026399, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257362.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257362.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257354", + "name": "長流川 30.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.633611, + "lon": 141.033611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257354.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257354.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257016", + "name": "長都川 3.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.860711, + "lon": 141.622475, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257016.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257016.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257491", + "name": "阿寒川 10.8Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.074444, + "lon": 144.233616, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257491.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257491.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257493", + "name": "阿寒川 28.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.120061, + "lon": 144.140008, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257493.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257493.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257040", + "name": "阿野呂川 7.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.025278, + "lon": 141.881393, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257040.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257040.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257536", + "name": "陸別川 0.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.466753, + "lon": 143.749619, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257536.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257536.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257398", + "name": "雄信内川 7.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.830028, + "lon": 141.932671, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257398.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257398.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257182", + "name": "雄木禽川 1.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.499561, + "lon": 142.345992, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257182.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257182.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257169", + "name": "難波田川 1.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.765189, + "lon": 142.425643, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257169.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257169.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257207", + "name": "難波田川分水路 0.4Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.76215, + "lon": 142.432333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257207.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257207.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257204", + "name": "雨煙内川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.005194, + "lon": 142.160194, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257204.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257204.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257085", + "name": "雨煙別川 2.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.060092, + "lon": 141.793156, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257085.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257085.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257148", + "name": "雨竜川 25.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.215692, + "lon": 142.147069, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257148.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257148.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257187", + "name": "雨竜川 47.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.286447, + "lon": 142.165464, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257187.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257187.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257159", + "name": "雨紛川 2.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.704481, + "lon": 142.352103, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257159.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257159.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257480", + "name": "雪裡川 8.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.236944, + "lon": 144.327227, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257480.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257480.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257315", + "name": "青苗川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.080183, + "lon": 139.453953, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257315.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257315.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257358", + "name": "静内川 2.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.346667, + "lon": 142.385838, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257358.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257358.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257366", + "name": "静内川 9.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.382778, + "lon": 142.451111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257366.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257366.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257482", + "name": "音別川 3.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.904722, + "lon": 143.931949, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257482.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257482.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257160", + "name": "音威子府川 5.9Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.768717, + "lon": 142.249794, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257160.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257160.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257110", + "name": "音江川 3.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.700394, + "lon": 142.061182, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257110.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257110.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257052", + "name": "須部都川 0.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.33699, + "lon": 141.63389, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257052.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257052.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257463", + "name": "頓別川 12.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.993027, + "lon": 142.289217, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257463.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257463.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257459", + "name": "頓別川 29.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.971528, + "lon": 142.283125, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257459.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257459.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257473", + "name": "頓別川 59.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 45.049014, + "lon": 142.304353, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257473.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257473.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257460", + "name": "頓別川 60.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.828333, + "lon": 142.301393, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257460.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257460.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257329", + "name": "額平川 7.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.670556, + "lon": 142.263056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257329.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257329.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257181", + "name": "風連別川 12.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 44.248017, + "lon": 142.520765, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257181.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257181.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257306", + "name": "馬場川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.457497, + "lon": 139.860681, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257306.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257306.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257033", + "name": "馬追運河 7.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.012222, + "lon": 141.701116, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257033.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257033.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257453", + "name": "駒生川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.810556, + "lon": 144.126393, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257453.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257453.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257077", + "name": "高田五号線川 2.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.502728, + "lon": 141.864507, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257077.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257077.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257408", + "name": "高砂川 0.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.939611, + "lon": 141.657661, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257408.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257408.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257462", + "name": "鬼志別川 4.6Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 45.327222, + "lon": 142.114172, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257462.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257462.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257416", + "name": "魚無川 2.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.817778, + "lon": 144.108616, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257416.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257416.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257267", + "name": "鮫川 1.5Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.786111, + "lon": 140.783894, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257267.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257267.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257307", + "name": "鰔川 4.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.947242, + "lon": 140.183211, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257307.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257307.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257271", + "name": "鳴川 1.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.900556, + "lon": 140.691394, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257271.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257271.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257139", + "name": "鵡川 49.3Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.982708, + "lon": 142.399682, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257139.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257139.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257284", + "name": "鶉川 8.7Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 41.930556, + "lon": 140.323616, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257284.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257284.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257343", + "name": "鷲別川 1.1Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.362222, + "lon": 141.045006, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257343.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257343.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257249", + "name": "黒松内川 1.2Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 42.667222, + "lon": 140.299996, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257249.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257249.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100257456", + "name": "黒瀬川 1.0Kp", + "city": "北海道, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 43.916611, + "lon": 144.150611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100257456.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100257456.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221279046", + "name": "千葉県市川市市川南", + "city": "千葉県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 35.727633, + "lon": 139.899336, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221279046.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221279046.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221279063", + "name": "千葉県流山市西深井", + "city": "千葉県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 35.914583, + "lon": 139.889228, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221279063.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221279063.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425031", + "name": "上中", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.558412, + "lon": 135.705584, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425031.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425031.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425016", + "name": "上市", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.392972, + "lon": 135.852139, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425016.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425016.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425038", + "name": "上笠間", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.611375, + "lon": 136.028206, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425038.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425038.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425004", + "name": "下三橋", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.646778, + "lon": 135.801306, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425004.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425004.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425015", + "name": "下渕", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.383167, + "lon": 135.783111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425015.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425015.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425060", + "name": "下牧", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.573995, + "lon": 135.714884, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425060.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425060.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425033", + "name": "下田口", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.519934, + "lon": 136.04713, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425033.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425033.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425002", + "name": "中山", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.711111, + "lon": 135.76475, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425069", + "name": "中黒", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.382219, + "lon": 135.941708, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425069.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425069.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425013", + "name": "丹後庄", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.623312, + "lon": 135.78738, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425013.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425013.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425017", + "name": "丹波市", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.595639, + "lon": 135.832362, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425017.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425017.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425009", + "name": "九条", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.660302, + "lon": 135.787289, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425009.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425009.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425007", + "name": "今井", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.506514, + "lon": 135.792855, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425007.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425007.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425027", + "name": "今住", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.443751, + "lon": 135.76611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425027.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425027.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425054", + "name": "伊賀見", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.547557, + "lon": 136.141877, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425054.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425054.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425049", + "name": "伴堂", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.572667, + "lon": 135.769012, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425049.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425049.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425064", + "name": "佐名伝", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.380415, + "lon": 135.772201, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425064.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425064.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425004", + "name": "八条", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.662806, + "lon": 135.801625, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425004.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425004.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425016", + "name": "前栽", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.599712, + "lon": 135.817311, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425016.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425016.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425040", + "name": "勢野東", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.602605, + "lon": 135.701217, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425040.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425040.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425066", + "name": "南日裏", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.226488, + "lon": 135.840994, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425066.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425066.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425003", + "name": "古市", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.665545, + "lon": 135.838265, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425021", + "name": "吉田", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.577519, + "lon": 135.813215, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425021.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425021.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425008", + "name": "城戸", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.282497, + "lon": 135.748358, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425008.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425008.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425009", + "name": "壱分", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.675157, + "lon": 135.70702, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425009.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425009.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425053", + "name": "大網", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.550111, + "lon": 135.765167, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425053.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425053.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425019", + "name": "天理", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.597056, + "lon": 135.836194, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425019.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425019.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425017", + "name": "天理:ダム上流", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.588815, + "lon": 135.87772, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425017.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425017.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425012", + "name": "宮堂", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.601434, + "lon": 135.78579, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425012.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425012.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425052", + "name": "富本", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.561964, + "lon": 135.770266, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425052.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425052.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425068", + "name": "小川", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.403252, + "lon": 135.968876, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425068.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425068.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425030", + "name": "小平尾", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.658726, + "lon": 135.706658, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425030.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425030.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425011", + "name": "小泉", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.628866, + "lon": 135.759623, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425011.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425011.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425029", + "name": "小瀬", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.664954, + "lon": 135.70858, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425029.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425029.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425019", + "name": "岩井川:ダム上流", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.661753, + "lon": 135.870592, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425019.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425019.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425037", + "name": "岩﨑", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.479082, + "lon": 135.96474, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425037.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425037.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425005", + "name": "庵治", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.587, + "lon": 135.795778, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425008", + "name": "曙", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.511844, + "lon": 135.753828, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425008.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425008.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425023", + "name": "曲川", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.514629, + "lon": 135.769431, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425023.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425023.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425006", + "name": "曲川", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.512182, + "lon": 135.758839, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425006.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425006.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425055", + "name": "曽爾", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.511226, + "lon": 136.125631, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425055.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425055.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425051", + "name": "東但馬", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.56692, + "lon": 135.769877, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425051.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425051.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425050", + "name": "東但馬(かんでん川)", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.565985, + "lon": 135.770304, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425050.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425050.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425032", + "name": "松井", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.468885, + "lon": 135.979558, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425032.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425032.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425007", + "name": "松塚", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.516784, + "lon": 135.762242, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425007.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425007.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425006", + "name": "松塚(樋門上流)", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.521356, + "lon": 135.763553, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425006.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425006.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425063", + "name": "柳", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.418202, + "lon": 135.918975, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425063.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425063.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425015", + "name": "柳本", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.561695, + "lon": 135.840012, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425015.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425015.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425047", + "name": "梅戸橋", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.588307, + "lon": 135.76792, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425047.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425047.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425005", + "name": "横井(遊水地)", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.649377, + "lon": 135.827904, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425014", + "name": "横田", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.619226, + "lon": 135.80165, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425014.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425014.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425010", + "name": "横田(正田川)", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.616124, + "lon": 135.795963, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425010.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425010.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425022", + "name": "櫟本", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.619278, + "lon": 135.822417, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425022.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425022.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425002", + "name": "法蓮", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.689221, + "lon": 135.82755, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425018", + "name": "滝本", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.596209, + "lon": 135.871425, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425018.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425018.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425010", + "name": "瓦口", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.538111, + "lon": 135.718472, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425010.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425010.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425020", + "name": "田", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.592395, + "lon": 135.827869, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425020.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425020.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425018", + "name": "白川:ダム下流", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.623748, + "lon": 135.850383, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425018.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425018.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425045", + "name": "目安", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.596607, + "lon": 135.721203, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425045.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425045.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425048", + "name": "石見", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.573135, + "lon": 135.791412, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425048.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425048.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425024", + "name": "磐余", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.510306, + "lon": 135.847194, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425024.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425024.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425003", + "name": "磐築橋", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.523867, + "lon": 135.737219, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425043", + "name": "神南", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.600405, + "lon": 135.717168, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425043.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425043.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425056", + "name": "神末", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.503937, + "lon": 136.192727, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425056.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425056.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425001", + "name": "秋篠", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.705361, + "lon": 135.780361, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425014", + "name": "秦庄", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.543059, + "lon": 135.795484, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425014.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425014.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425041", + "name": "立野北", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.596842, + "lon": 135.693559, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425041.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425041.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425042", + "name": "立野南", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.589694, + "lon": 135.688222, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425042.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425042.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425039", + "name": "笠目", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.594194, + "lon": 135.743139, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425039.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425039.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425046", + "name": "結崎", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.581073, + "lon": 135.786217, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425046.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425046.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425057", + "name": "菅野", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.495111, + "lon": 136.175583, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425057.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425057.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425011", + "name": "萩原", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.527333, + "lon": 135.954917, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425011.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425011.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425036", + "name": "萩原(池谷川)", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.533555, + "lon": 135.959543, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425036.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425036.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425035", + "name": "萩原(町並川)", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.534483, + "lon": 135.953435, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425035.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425035.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425061", + "name": "薬井", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.587067, + "lon": 135.708899, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425061.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425061.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425013", + "name": "西但馬", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.571492, + "lon": 135.763332, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425013.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425013.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425067", + "name": "西原", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.176163, + "lon": 136.003703, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425067.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425067.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425034", + "name": "西山", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.481201, + "lon": 135.931187, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425034.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425034.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425065", + "name": "谷", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.307097, + "lon": 135.801694, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425065.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425065.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425028", + "name": "谷田", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.695, + "lon": 135.702639, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425028.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425028.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425058", + "name": "越", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.463124, + "lon": 135.797737, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425058.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425058.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425062", + "name": "達磨橋", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.5937, + "lon": 135.707691, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425062.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425062.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425001", + "name": "邑地", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.722818, + "lon": 135.980445, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425026", + "name": "野原西", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.340562, + "lon": 135.700373, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425026.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425026.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425044", + "name": "阿波", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.603838, + "lon": 135.739995, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425044.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425044.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425059", + "name": "飛鳥", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.481997, + "lon": 135.81435, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425059.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425059.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-307425012", + "name": "髙安西", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.613406, + "lon": 135.748676, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/307425012.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/307425012.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-107425025", + "name": "黒崎", + "city": "奈良県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.516972, + "lon": 135.869028, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/107425025.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/107425025.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121034104", + "name": "二股川0.8kL", + "city": "宮城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.726944, + "lon": 141.293889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121034104.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121034104.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121034091", + "name": "北上川下流10.8kR", + "city": "宮城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.525043, + "lon": 141.349722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121034091.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121034091.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121034097", + "name": "北上川下流30.6kL", + "city": "宮城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.645846, + "lon": 141.286494, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121034097.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121034097.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121034098", + "name": "北上川下流34.8kL", + "city": "宮城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.683611, + "lon": 141.286944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121034098.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121034098.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121034099", + "name": "北上川下流41.4kR", + "city": "宮城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.704474, + "lon": 141.277682, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121034099.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121034099.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121034101", + "name": "北上川下流43.6kR", + "city": "宮城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.722917, + "lon": 141.263806, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121034101.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121034101.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121034111", + "name": "吉田川16.0kR", + "city": "宮城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.443397, + "lon": 141.040282, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121034111.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121034111.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121034082", + "name": "多田川3.5kL", + "city": "宮城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.545796, + "lon": 140.947357, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121034082.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121034082.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121034107", + "name": "江合川1.2kL", + "city": "宮城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.537222, + "lon": 141.211111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121034107.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121034107.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121034085", + "name": "鳴瀬川23.5kL", + "city": "宮城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.529167, + "lon": 141.070278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121034085.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121034085.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121034132", + "name": "鳴瀬川23.5kL", + "city": "宮城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.529167, + "lon": 141.070278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121034132.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121034132.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311523007", + "name": "伊比井海岸", + "city": "宮崎県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 31.706414, + "lon": 131.458139, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311523007.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311523007.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311522003", + "name": "山内川調整池", + "city": "宮崎県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 31.882778, + "lon": 131.434167, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311522003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311522003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311531005", + "name": "岡元", + "city": "宮崎県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.565278, + "lon": 131.569164, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311531005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311531005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311523009", + "name": "広渡川河口", + "city": "宮崎県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 31.589833, + "lon": 131.407719, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311523009.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311523009.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311531006", + "name": "細見", + "city": "宮崎県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.566667, + "lon": 131.581386, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311531006.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311531006.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311528005", + "name": "鳥子橋", + "city": "宮崎県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.089719, + "lon": 131.396942, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311528005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311528005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537084", + "name": "三瀬川(宮前橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.70448, + "lon": 139.67051, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537084.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537084.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537038", + "name": "上台川(下野明橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.855971, + "lon": 140.343773, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537038.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537038.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537026", + "name": "丹生川(丹生川大橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.605201, + "lon": 140.374975, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537026.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537026.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537024", + "name": "丹生川(母袋橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.596211, + "lon": 140.495184, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537024.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537024.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537030", + "name": "丹生川(萱刈畑橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.614722, + "lon": 140.45006, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537030.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537030.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537025", + "name": "丹生川(行沢橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.61546, + "lon": 140.475787, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537025.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537025.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537011", + "name": "乱川(中乱川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.394617, + "lon": 140.34884, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537011.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537011.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537009", + "name": "乱川(本郷橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.39235, + "lon": 140.417968, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537009.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537009.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537019", + "name": "乱川(養老橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.413551, + "lon": 140.478787, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537019.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537019.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537070", + "name": "五十川(JR橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.671908, + "lon": 139.620695, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537070.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537070.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537061", + "name": "京田川(京田橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.78127, + "lon": 139.932599, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537061.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537061.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537063", + "name": "京田川(山田橋上流付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.860381, + "lon": 139.847272, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537063.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537063.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537062", + "name": "京田川(落合橋上流付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.827439, + "lon": 139.868822, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537062.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537062.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537085", + "name": "倉沢川(仙納橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.524768, + "lon": 139.785275, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537085.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537085.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537008", + "name": "倉津川(みどり橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.362118, + "lon": 140.36871, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537008.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537008.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537015", + "name": "倉津川(上宿橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.371069, + "lon": 140.343347, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537015.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537015.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537082", + "name": "内川(上内川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.728105, + "lon": 139.840164, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537082.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537082.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537095", + "name": "前川(前川新橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.149289, + "lon": 140.271018, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537095.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537095.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537094", + "name": "前川(南陽市小岩沢付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.096977, + "lon": 140.210309, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537094.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537094.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537010", + "name": "前川(喜多松橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.159295, + "lon": 140.282836, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537010.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537010.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537035", + "name": "升形川(八幡橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.748996, + "lon": 140.234342, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537035.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537035.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537050", + "name": "吉野川(花見橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.052315, + "lon": 140.158854, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537050.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537050.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537051", + "name": "吉野川(長畑橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.149752, + "lon": 140.171978, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537051.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537051.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537046", + "name": "堀立川(掘立川中央橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.919589, + "lon": 140.102892, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537046.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537046.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537036", + "name": "大以良川(西宿橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.814566, + "lon": 140.357552, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537036.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537036.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537065", + "name": "大山川(尾浦橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.74585, + "lon": 139.766221, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537065.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537065.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537066", + "name": "大山川(観山橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.782826, + "lon": 139.809179, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537066.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537066.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537031", + "name": "大旦川(二ツ橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.480335, + "lon": 140.362229, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537031.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537031.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537029", + "name": "大旦川(大旦橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.503076, + "lon": 140.396862, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537029.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537029.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537047", + "name": "天王川(天王川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.962031, + "lon": 140.155678, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537047.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537047.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537022", + "name": "富並川(富並川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.542829, + "lon": 140.336008, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537022.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537022.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221054038", + "name": "小松淵下流(左岸部)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.612233, + "lon": 140.173058, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221054038.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221054038.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537077", + "name": "小牧川(こがね橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.895074, + "lon": 139.855399, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537077.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537077.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537100", + "name": "小白川(大巻橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.023627, + "lon": 139.977043, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537100.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537100.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537013", + "name": "小鶴沢川(小鶴沢橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.30424, + "lon": 140.262564, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537013.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537013.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537048", + "name": "屋代川(中橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.005643, + "lon": 140.19771, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537048.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537048.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537089", + "name": "屋代川(屋代川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.013704, + "lon": 140.241029, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537089.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537089.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537017", + "name": "市の沢川(市の沢川樋門付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.375661, + "lon": 140.205991, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537017.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537017.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221055026", + "name": "広田水位観測所", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.8839, + "lon": 139.837797, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221055026.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221055026.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537071", + "name": "庄内小国川(岩川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.604563, + "lon": 139.577093, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537071.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537071.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537081", + "name": "庄内高瀬川(月見橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.035001, + "lon": 139.911138, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537081.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537081.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537007", + "name": "押切川(新原崎橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.382365, + "lon": 140.404748, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537007.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537007.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537040", + "name": "指首野川(西山橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.767904, + "lon": 140.290561, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537040.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537040.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537069", + "name": "新井田川(旭新橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.922725, + "lon": 139.852824, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537069.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537069.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537073", + "name": "日向川(日向橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.979322, + "lon": 139.868365, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537073.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537073.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537074", + "name": "日向川(鳥海橋上付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.988337, + "lon": 139.938478, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537074.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537074.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537028", + "name": "日塔川(柳町一本橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.438565, + "lon": 140.400939, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537028.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537028.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537034", + "name": "最上小国川(義経大橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.754985, + "lon": 140.416015, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537034.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537034.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537042", + "name": "最上小国川(舟形小付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.695757, + "lon": 140.329557, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537042.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537042.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537096", + "name": "最上小国川(赤倉温泉付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.710295, + "lon": 140.554233, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537096.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537096.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537049", + "name": "最上川(松川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.913807, + "lon": 140.119271, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537049.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537049.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537075", + "name": "月光川(尻引橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.020617, + "lon": 139.908872, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537075.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537075.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537067", + "name": "月光川(鳥海大橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.06718, + "lon": 139.882391, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537067.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537067.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537023", + "name": "朧気川(朧気橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.594401, + "lon": 140.401025, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537023.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537023.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537020", + "name": "村山野川(野川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.420915, + "lon": 140.380726, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537020.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537020.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537005", + "name": "村山高瀬川(北柳橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.299906, + "lon": 140.349956, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537018", + "name": "沼川(幸田橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.372628, + "lon": 140.276856, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537018.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537018.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537087", + "name": "泉田川(仁田山橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.82741, + "lon": 140.364498, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537087.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537087.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537086", + "name": "温海川(月見橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.614758, + "lon": 139.610052, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537086.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537086.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537078", + "name": "湯尻川(白山関根橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.727807, + "lon": 139.781842, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537078.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537078.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537052", + "name": "犬川(橋本橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.01493, + "lon": 140.052681, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537052.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537052.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537080", + "name": "田沢川(相沢橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.891534, + "lon": 139.980111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537080.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537080.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537033", + "name": "白水川(新白水川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.445573, + "lon": 140.381262, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537033.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537033.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537032", + "name": "白水川(源氏坂橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.43724, + "lon": 140.401586, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537032.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537032.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537021", + "name": "白水川(蟹沢橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.447405, + "lon": 140.368023, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537021.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537021.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537060", + "name": "相沢川(田沢橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.893839, + "lon": 139.979253, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537060.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537060.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537041", + "name": "真室川(真室川町川ノ内)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.901769, + "lon": 140.256188, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537041.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537041.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537014", + "name": "石子沢川(柳沢1号橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.328696, + "lon": 140.264554, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537014.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537014.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537053", + "name": "砂川(鶴巻橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.986471, + "lon": 140.14993, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537053.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537053.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537006", + "name": "立谷川(山寺芭蕉橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.311053, + "lon": 140.429564, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537006.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537006.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537012", + "name": "立谷川(立谷川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.324218, + "lon": 140.348325, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537012.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537012.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537059", + "name": "立谷沢川(木ノ沢橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.714715, + "lon": 140.007044, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537059.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537059.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537056", + "name": "織機川(織機橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.070511, + "lon": 140.122848, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537056.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537056.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537057", + "name": "置賜白川(中郷橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.019089, + "lon": 139.973459, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537057.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537057.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537058", + "name": "置賜野川(平泉橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.098243, + "lon": 139.989429, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537058.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537058.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537044", + "name": "羽黒川(羽黒川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.921045, + "lon": 140.130358, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537044.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537044.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537043", + "name": "羽黒川(羽黒橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.862623, + "lon": 140.152287, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537043.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537043.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537099", + "name": "荒川(沖庭橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.103589, + "lon": 139.745273, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537099.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537099.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537098", + "name": "荒川(越中里橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.140311, + "lon": 139.739876, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537098.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537098.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537068", + "name": "荒瀬川(八幡橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.96635, + "lon": 139.934578, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537068.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537068.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537101", + "name": "萩生川(二反田橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.058375, + "lon": 139.990743, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537101.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537101.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537064", + "name": "藤島川(藤浪橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.764725, + "lon": 139.897242, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537064.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537064.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537039", + "name": "角川(鹿ノ沢橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.705238, + "lon": 140.137696, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537039.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537039.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221054010", + "name": "角間沢排水樋管", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.72585, + "lon": 140.187803, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221054010.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221054010.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537054", + "name": "誕生川(莅橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.990007, + "lon": 140.074911, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537054.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537054.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537091", + "name": "赤川(本郷橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.611146, + "lon": 139.832108, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537091.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537091.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537027", + "name": "野尻川(野尻川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.633701, + "lon": 140.382142, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537027.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537027.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537037", + "name": "金山川(金山中付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.884452, + "lon": 140.334592, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537037.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537037.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537076", + "name": "青竜寺川(丸岡分水付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.679615, + "lon": 139.829019, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537076.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537076.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537097", + "name": "青竜寺川(栄橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.777293, + "lon": 139.839236, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537097.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537097.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537079", + "name": "青竜寺川(高坂橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.705104, + "lon": 139.808707, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537079.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537079.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537001", + "name": "須川(嘉平橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.099273, + "lon": 140.306354, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537093", + "name": "須川(常盤橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.217675, + "lon": 140.311815, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537093.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537093.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537092", + "name": "須川(東宮橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.14637, + "lon": 140.281162, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537092.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537092.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537004", + "name": "馬見ヶ崎川(右京橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.299468, + "lon": 140.336695, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537004.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537004.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537016", + "name": "馬見ヶ崎川(唐松橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.242764, + "lon": 140.388064, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537016.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537016.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537002", + "name": "馬見ヶ崎川(愛宕橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.248513, + "lon": 140.360265, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537003", + "name": "馬見ヶ崎川(諏訪橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.317481, + "lon": 140.32099, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537045", + "name": "鬼面川(大樽橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.913563, + "lon": 140.067487, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537045.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537045.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537088", + "name": "鮭川(大沢橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.886165, + "lon": 140.216136, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537088.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537088.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537055", + "name": "黒川(新馬場橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.020682, + "lon": 140.081274, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537055.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537055.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537083", + "name": "黒瀬川(荒富橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.72861, + "lon": 139.888444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537083.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537083.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537072", + "name": "鼠ヶ関川(田元橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.535477, + "lon": 139.617391, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537072.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537072.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101537090", + "name": "鼠ヶ関川(鼠ヶ関川橋付近)", + "city": "山形県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.557697, + "lon": 139.550271, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101537090.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101537090.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221335001", + "name": "亀甲橋下流", + "city": "山梨県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 35.697219, + "lon": 138.686108, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221335001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221335001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221335042", + "name": "早川橋", + "city": "山梨県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 35.432839, + "lon": 138.422108, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221335042.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221335042.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221335008", + "name": "釜無川K220", + "city": "山梨県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 35.690744, + "lon": 138.473306, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221335008.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221335008.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769036", + "name": "ふれあい橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.840278, + "lon": 141.861389, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769036.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769036.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221024009", + "name": "ダム右岸下流", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.342917, + "lon": 141.320078, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221024009.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221024009.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769105", + "name": "上早瀬橋下流", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.335416, + "lon": 141.533472, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769105.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769105.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769095", + "name": "上有住", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.194328, + "lon": 141.600014, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769095.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769095.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769023", + "name": "上根子橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.379167, + "lon": 141.054444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769023.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769023.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769008", + "name": "上米内橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.746796, + "lon": 141.204786, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769008.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769008.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769065", + "name": "上鹿合", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.125278, + "lon": 140.970278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769065.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769065.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769003", + "name": "下厨川", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.749167, + "lon": 141.118056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769024", + "name": "下小舟渡", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.392222, + "lon": 141.118611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769024.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769024.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769047", + "name": "下戸鎖", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.091389, + "lon": 141.703333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769047.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769047.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769040", + "name": "下町", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.801667, + "lon": 141.659167, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769040.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769040.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769019", + "name": "下苗代沢", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.9625, + "lon": 141.216389, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769019.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769019.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769098", + "name": "中井大橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.0875, + "lon": 141.713333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769098.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769098.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221023070", + "name": "中津川浅岸", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.714167, + "lon": 141.179725, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221023070.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221023070.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769083", + "name": "中通川樋門(内)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.955278, + "lon": 141.2525, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769083.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769083.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769082", + "name": "中通川樋門(外)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.955278, + "lon": 141.2525, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769082.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769082.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769025", + "name": "亀ケ森", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.47709, + "lon": 141.251221, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769025.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769025.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769102", + "name": "光興寺橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.338611, + "lon": 141.520278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769102.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769102.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769058", + "name": "八幡舘", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.180644, + "lon": 141.153658, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769058.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769058.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769043", + "name": "八日町", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.192385, + "lon": 141.764252, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769043.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769043.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769002", + "name": "凹道坂橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.777103, + "lon": 141.110576, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769092", + "name": "加妻川水門(内)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.896111, + "lon": 141.270194, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769092.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769092.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769091", + "name": "加妻川水門(外)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.896111, + "lon": 141.270556, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769091.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769091.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769009", + "name": "北矢幅", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.616944, + "lon": 141.144444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769009.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769009.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769093", + "name": "十日市場", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.026389, + "lon": 141.613889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769093.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769093.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769013", + "name": "古川橋(上流)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.874167, + "lon": 141.160556, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769013.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769013.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769067", + "name": "吸川", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.922222, + "lon": 141.134167, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769067.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769067.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769072", + "name": "吸川水門上流", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.913889, + "lon": 141.126944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769072.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769072.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769073", + "name": "吸川水門下流", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.914167, + "lon": 141.128056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769073.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769073.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769057", + "name": "堀野", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.29143, + "lon": 141.292382, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769057.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769057.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769045", + "name": "夏井町早坂", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.215984, + "lon": 141.774294, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769045.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769045.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769113", + "name": "大ヶ口", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.375556, + "lon": 141.886944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769113.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769113.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769079", + "name": "大原(川内橋)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.016111, + "lon": 141.397778, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769079.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769079.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769056", + "name": "大向", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.237778, + "lon": 141.419444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769056.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769056.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769042", + "name": "大川目", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.191365, + "lon": 141.741223, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769042.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769042.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769112", + "name": "大槌橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.363056, + "lon": 141.903056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769112.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769112.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769110", + "name": "大浜渡橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.328611, + "lon": 141.889444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769110.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769110.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769107", + "name": "大渡橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.272778, + "lon": 141.874722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769107.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769107.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769069", + "name": "大田沼", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.753889, + "lon": 141.211667, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769069.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769069.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769026", + "name": "大迫", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.466874, + "lon": 141.281927, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769026.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769026.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769054", + "name": "大野", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.282955, + "lon": 141.627336, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769054.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769054.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769041", + "name": "子木地", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.933691, + "lon": 141.822644, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769041.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769041.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769004", + "name": "宇曽沢", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.670278, + "lon": 141.248056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769004.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769004.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769051", + "name": "宇部", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.129857, + "lon": 141.783827, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769051.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769051.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769028", + "name": "宮古中央IC", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.628623, + "lon": 141.919477, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769028.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769028.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769090", + "name": "宮田", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.9275, + "lon": 141.339444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769090.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769090.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769005", + "name": "寺沢橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.682057, + "lon": 141.182106, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769109", + "name": "小川", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.267222, + "lon": 141.838333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769109.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769109.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769006", + "name": "小貝沢橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.706506, + "lon": 141.274819, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769006.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769006.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769044", + "name": "山形", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.151944, + "lon": 141.574444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769044.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769044.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769060", + "name": "岩崎", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.281111, + "lon": 141.048611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769060.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769060.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769030", + "name": "川井", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.598611, + "lon": 141.680278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769030.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769030.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769031", + "name": "川井(上流)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.593048, + "lon": 141.674505, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769031.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769031.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221023027", + "name": "布佐", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.932222, + "lon": 141.2475, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221023027.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221023027.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769011", + "name": "彦部橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.519444, + "lon": 141.194167, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769011.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769011.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769071", + "name": "徳沢川樋門(内)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.005556, + "lon": 141.110556, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769071.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769071.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769070", + "name": "徳沢川樋門(外)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.004617, + "lon": 141.110556, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769070.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769070.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769010", + "name": "志和", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.553056, + "lon": 141.108333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769010.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769010.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769077", + "name": "折壁", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.937222, + "lon": 141.449722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769077.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769077.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769097", + "name": "折壁橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.141111, + "lon": 141.488611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769097.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769097.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769086", + "name": "摺沢(雲南田橋)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.994167, + "lon": 141.3125, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769086.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769086.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769074", + "name": "新山川水門上流", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.911667, + "lon": 141.131111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769074.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769074.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769075", + "name": "新山川水門下流", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.911944, + "lon": 141.130833, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769075.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769075.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769018", + "name": "新松川橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.892164, + "lon": 141.094666, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769018.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769018.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769039", + "name": "新橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.98544, + "lon": 141.734458, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769039.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769039.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769059", + "name": "新田", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.240556, + "lon": 140.991111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769059.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769059.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769061", + "name": "新町(国)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.397222, + "lon": 140.768911, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769061.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769061.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769020", + "name": "新町橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.977359, + "lon": 141.224656, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769020.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769020.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769052", + "name": "新町橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.114446, + "lon": 141.812854, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769052.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769052.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769015", + "name": "昇瀬橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.684931, + "lon": 140.911835, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769015.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769015.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769100", + "name": "明神前", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.058889, + "lon": 141.715, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769100.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769100.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769014", + "name": "春木場橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.689707, + "lon": 140.945025, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769014.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769014.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769094", + "name": "昭和橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.1425, + "lon": 141.578333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769094.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769094.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769048", + "name": "普代", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.004444, + "lon": 141.883889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769048.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769048.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769049", + "name": "普代村羅賀", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.001944, + "lon": 141.882778, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769049.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769049.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769104", + "name": "東舘", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.328333, + "lon": 141.528333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769104.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769104.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769038", + "name": "松前川", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.915, + "lon": 141.928333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769038.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769038.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769022", + "name": "栗山", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.984207, + "lon": 141.501846, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769022.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769022.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769103", + "name": "沢田橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.300109, + "lon": 141.402262, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769103.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769103.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769081", + "name": "流矢", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.994167, + "lon": 141.306944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769081.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769081.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769055", + "name": "瀬月内橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.343333, + "lon": 141.422778, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769055.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769055.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769021", + "name": "田子", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.041667, + "lon": 141.431944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769021.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769021.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769032", + "name": "田鎖橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.616944, + "lon": 141.905, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769032.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769032.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769017", + "name": "田頭", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.909167, + "lon": 141.076111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769017.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769017.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769108", + "name": "甲子町", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.255556, + "lon": 141.751667, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769108.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769108.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769062", + "name": "白鳥橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.036667, + "lon": 141.118056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769062.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769062.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221023020", + "name": "盛南大橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.692225, + "lon": 141.136111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221023020.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221023020.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769078", + "name": "矢越(本町橋)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.9325, + "lon": 141.426111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769078.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769078.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769088", + "name": "神の田", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.915278, + "lon": 141.329722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769088.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769088.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769089", + "name": "神の田(梅田橋)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.914444, + "lon": 141.328889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769089.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769089.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769106", + "name": "福泉寺橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.358056, + "lon": 141.566944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769106.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769106.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769027", + "name": "稲荷橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.501789, + "lon": 141.325727, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769027.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769027.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769037", + "name": "穴沢", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.858333, + "lon": 141.673611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769037.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769037.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769033", + "name": "繁の木橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.628056, + "lon": 141.788333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769033.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769033.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769068", + "name": "老松橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.833056, + "lon": 141.188611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769068.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769068.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769064", + "name": "胆沢川橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.165833, + "lon": 141.09, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769064.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769064.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769114", + "name": "臼澤橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.360556, + "lon": 141.88, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769114.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769114.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769087", + "name": "興田", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.050833, + "lon": 141.365833, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769087.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769087.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769016", + "name": "舘篠橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.78179, + "lon": 140.949284, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769016.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769016.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769029", + "name": "茂市", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.619444, + "lon": 141.806389, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769029.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769029.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769053", + "name": "萩の渡", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.303333, + "lon": 141.655, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769053.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769053.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769007", + "name": "薬師神社前", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.713637, + "lon": 141.185179, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769007.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769007.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769084", + "name": "西前橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.96, + "lon": 141.248333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769084.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769084.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221023073", + "name": "観音山鉄塔", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.981389, + "lon": 141.163056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221023073.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221023073.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769001", + "name": "諸葛橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.708071, + "lon": 141.110419, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769034", + "name": "豊間根", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.511437, + "lon": 141.911752, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769034.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769034.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769101", + "name": "越喜来橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.119904, + "lon": 141.81148, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769101.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769101.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769050", + "name": "野田", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.113056, + "lon": 141.816389, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769050.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769050.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769096", + "name": "金平橋付近", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.026944, + "lon": 141.594722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769096.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769096.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769046", + "name": "長内", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.183701, + "lon": 141.770797, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769046.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769046.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769080", + "name": "長坂", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.994702, + "lon": 141.251152, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769080.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769080.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769085", + "name": "長坂(安養寺)", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.001667, + "lon": 141.255833, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769085.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769085.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769099", + "name": "長安寺橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.105278, + "lon": 141.69, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769099.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769099.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769066", + "name": "長袋橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.08, + "lon": 140.999444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769066.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769066.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769035", + "name": "関谷", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.474539, + "lon": 141.929262, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769035.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769035.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769063", + "name": "鳴瀬橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.235556, + "lon": 141.3125, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769063.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769063.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769111", + "name": "鵜住居", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.337639, + "lon": 141.870648, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769111.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769111.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769012", + "name": "鶴飼橋", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.849032, + "lon": 141.165487, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769012.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769012.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-100769076", + "name": "黄海", + "city": "岩手県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 38.847778, + "lon": 141.294444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/100769076.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/100769076.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-108705103", + "name": "出原川/山県郡北広島町木次", + "city": "広島県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.637492, + "lon": 132.563695, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/108705103.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/108705103.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-108705107", + "name": "天井川/三原市沼田東町七宝", + "city": "広島県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.386892, + "lon": 133.036107, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/108705107.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/108705107.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-122549008", + "name": "JR橋箇所 旧吉野川右岸12k4付近", + "city": "徳島県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.133333, + "lon": 134.529444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/122549008.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/122549008.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-122549006", + "name": "穴吹川左岸箇所 吉野川右岸42k2付近", + "city": "徳島県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 34.055042, + "lon": 134.174453, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/122549006.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/122549006.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121531017", + "name": "五反田", + "city": "新潟県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.690781, + "lon": 139.025686, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121531017.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121531017.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121531016", + "name": "庄瀬", + "city": "新潟県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.720731, + "lon": 139.045786, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121531016.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121531016.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121531015", + "name": "新光町", + "city": "新潟県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.903102, + "lon": 139.020914, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121531015.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121531015.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121531019", + "name": "栗林", + "city": "新潟県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.662547, + "lon": 138.970814, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121531019.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121531019.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221320035", + "name": "平山橋上流", + "city": "東京都, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 35.649581, + "lon": 139.3811, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221320035.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221320035.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221320005", + "name": "日野橋水位観測所", + "city": "東京都, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 35.684319, + "lon": 139.413178, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221320005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221320005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009005", + "name": "上内田川(菊鹿町長谷橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.035278, + "lon": 130.756944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009029", + "name": "井芹川(西部水道センター)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.793886, + "lon": 130.671386, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009029.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009029.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009055", + "name": "今泉川(松島町三石橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.499167, + "lon": 130.409444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009055.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009055.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009043", + "name": "佐敷川(芦北町佐敷)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.306386, + "lon": 130.502775, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009043.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009043.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009041", + "name": "免田川(あさぎり町あさぎり橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.231942, + "lon": 130.885831, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009041.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009041.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009004", + "name": "合志川(泗水町福本)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.922219, + "lon": 130.774722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009004.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009004.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009027", + "name": "坪井川(天満橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.785831, + "lon": 130.655, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009027.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009027.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009028", + "name": "坪井川(鶴羽田橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.860831, + "lon": 130.721389, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009028.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009028.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009007", + "name": "境川(玉名市南大門橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.931108, + "lon": 130.538889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009007.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009007.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009050", + "name": "大鞘川(新橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.54503, + "lon": 130.627863, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009050.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009050.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009049", + "name": "大鞘川(第二大鞘橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.551944, + "lon": 130.621108, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009049.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009049.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009010", + "name": "天明新川(南区八幡補給水橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.745833, + "lon": 130.685275, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009010.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009010.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009033", + "name": "小川(球磨村渡)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.238333, + "lon": 130.694164, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009033.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009033.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009048", + "name": "小田浦川(芦北町新町橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.348333, + "lon": 130.501108, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009048.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009048.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009035", + "name": "山田川(人吉市染戸橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.218611, + "lon": 130.760553, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009035.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009035.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009003", + "name": "岩野川(山鹿市小坂橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.069722, + "lon": 130.694997, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009040", + "name": "川辺川(宮園橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.440275, + "lon": 130.856386, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009040.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009040.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009039", + "name": "川辺川(横手公園)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.433331, + "lon": 130.860278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009039.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009039.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009038", + "name": "川辺川(白水団地)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.426386, + "lon": 130.856944, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009038.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009038.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009037", + "name": "川辺川(相良村川辺大橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.256386, + "lon": 130.813889, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009037.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009037.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009053", + "name": "広瀬川(本渡町法泉寺橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.4725, + "lon": 130.183333, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009053.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009053.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009034", + "name": "御溝川(人吉市瓦屋町)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.226111, + "lon": 130.754442, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009034.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009034.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009013", + "name": "御船川(御船町下鶴橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.710278, + "lon": 130.836667, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009013.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009013.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009009", + "name": "志賀瀬川(南小国町役場付近)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.098611, + "lon": 131.069997, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009009.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009009.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009002", + "name": "木葉川(玉東町木葉)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.914722, + "lon": 130.627497, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009045", + "name": "水俣川(新水俣橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.211944, + "lon": 130.408056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009045.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009045.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009046", + "name": "水俣川(水俣市中央公園)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.207778, + "lon": 130.408331, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009046.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009046.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009047", + "name": "水俣川(水俣市古城)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.205, + "lon": 130.420831, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009047.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009047.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009042", + "name": "氷川(立神橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.549442, + "lon": 130.699444, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009042.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009042.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009030", + "name": "波多川(三角町塩谷橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.616942, + "lon": 130.490831, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009030.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009030.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009014", + "name": "津留川(美里町大窪)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.617222, + "lon": 130.855553, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009014.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009014.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009052", + "name": "流藻川(流藻川五号橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.479719, + "lon": 130.598331, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009052.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009052.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009044", + "name": "湯の浦川(芦北町湯浦)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.275831, + "lon": 130.5, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009044.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009044.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009011", + "name": "潤川(宇土市三拾町)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.693886, + "lon": 130.673053, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009011.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009011.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-122829055", + "name": "球磨川左岸22k700坂本町川嶽", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.401602, + "lon": 130.650178, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/122829055.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/122829055.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009054", + "name": "町山口川(天草市古川町)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.456944, + "lon": 130.186389, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009054.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009054.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009019", + "name": "白川(みらい大橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.852778, + "lon": 130.797219, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009019.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009019.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009022", + "name": "白川(南阿蘇村中松合上橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.828056, + "lon": 131.034997, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009022.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009022.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009021", + "name": "白川(大津町瀬田)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.871667, + "lon": 130.936667, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009021.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009021.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009016", + "name": "白川(熊本市下南部)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.825278, + "lon": 130.755278, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009016.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009016.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009020", + "name": "白川(第一馬場楠堰)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.852497, + "lon": 130.851942, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009020.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009020.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009017", + "name": "白川(龍田1丁目)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.831667, + "lon": 130.760553, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009017.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009017.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009018", + "name": "白川(龍田町弓削)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.848611, + "lon": 130.776667, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009018.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009018.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009015", + "name": "白川(龍田陳内4丁目)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.824167, + "lon": 130.753056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009015.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009015.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009012", + "name": "秋津川(益城町惣領)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.779442, + "lon": 130.802775, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009012.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009012.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009008", + "name": "筑後川(小国町消防署付近)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.125, + "lon": 131.063056, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009008.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009008.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009031", + "name": "網津川(宇土市住吉町)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.698886, + "lon": 130.598611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009031.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009031.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009032", + "name": "網田川(なかがわ橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.669442, + "lon": 130.551111, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009032.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009032.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009036", + "name": "胸川(人吉市間橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.200278, + "lon": 130.764719, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009036.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009036.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-222826009", + "name": "舟島(余内)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.944719, + "lon": 130.719997, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/222826009.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/222826009.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009001", + "name": "菊池川(菊池市藤田)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.977222, + "lon": 130.823611, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009051", + "name": "鏡川(八代農業高校付近)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.564442, + "lon": 130.660831, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009051.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009051.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009006", + "name": "関川(南関町竜瀬橋)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.059164, + "lon": 130.544719, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009006.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009006.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009025", + "name": "黒川(ふれあい水辺公園)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.972778, + "lon": 131.055, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009025.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009025.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009024", + "name": "黒川(阿蘇市内牧)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.9725, + "lon": 131.041389, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009024.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009024.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009026", + "name": "黒川(阿蘇市古城)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.970833, + "lon": 131.129722, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009026.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009026.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-311009023", + "name": "黒川(阿蘇市跡ヶ瀬)", + "city": "熊本県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 32.935275, + "lon": 131.005556, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/311009023.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/311009023.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-104353166", + "name": "滓上川(学校前橋)", + "city": "石川県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 36.373404, + "lon": 136.571024, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/104353166.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/104353166.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310256002", + "name": "上釣橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.812197, + "lon": 130.534247, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310256002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310256002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310249004", + "name": "下八重谷橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.260011, + "lon": 130.669431, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310249004.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310249004.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310253003", + "name": "下曰佐", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.541447, + "lon": 130.430675, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310253003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310253003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310249002", + "name": "中川原橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.189603, + "lon": 130.557661, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310249002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310249002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310249003", + "name": "串毛橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.204817, + "lon": 130.648778, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310249003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310249003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310249001", + "name": "光延橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.246931, + "lon": 130.700878, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310249001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310249001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310249006", + "name": "十篭橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.250431, + "lon": 130.764006, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310249006.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310249006.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310256001", + "name": "四角橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.761019, + "lon": 130.493567, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310256001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310256001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310253004", + "name": "塩原", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.566383, + "lon": 130.431819, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310253004.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310253004.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310242002", + "name": "山王橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.584639, + "lon": 130.432658, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310242002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310242002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310253002", + "name": "平成橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.499283, + "lon": 130.518478, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310253002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310253002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310254003", + "name": "新村橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.171178, + "lon": 130.456853, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310254003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310254003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310254002", + "name": "松原橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.175331, + "lon": 130.485114, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310254002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310254002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310250001", + "name": "桜橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.823356, + "lon": 130.860328, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310250001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310250001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310242003", + "name": "片峰新橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.586756, + "lon": 130.478125, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310242003.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310242003.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310254001", + "name": "畔切橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.0465, + "lon": 130.460542, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310254001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310254001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310253001", + "name": "筒井橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.540164, + "lon": 130.483106, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310253001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310253001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310250002", + "name": "藪瀬", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.847319, + "lon": 130.871214, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310250002.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310250002.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310249005", + "name": "蛍橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.222675, + "lon": 130.707314, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310249005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310249005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310243001", + "name": "西縄手橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.318025, + "lon": 130.501469, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310243001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310243001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310255001", + "name": "長音寺橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.730264, + "lon": 130.954711, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310255001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310255001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310253005", + "name": "隅田橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.566819, + "lon": 130.458139, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310253005.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310253005.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-310242001", + "name": "雨水橋", + "city": "福岡県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 33.630117, + "lon": 130.468122, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/310242001.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/310242001.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101793085", + "name": "北須川", + "city": "福島県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.147371, + "lon": 140.45349, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101793085.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101793085.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101793015", + "name": "只見川 瑞光寺橋", + "city": "福島県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 37.531028, + "lon": 139.723194, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101793015.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101793015.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101793136", + "name": "矢田川 矢田川橋", + "city": "福島県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 36.972985, + "lon": 140.890533, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101793136.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101793136.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-101793135", + "name": "馬渡川 馬渡橋", + "city": "福島県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 36.985453, + "lon": 140.871517, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/101793135.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/101793135.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221045028", + "name": "下川沿", + "city": "秋田県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.268139, + "lon": 140.471669, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221045028.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221045028.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121043129", + "name": "雄物川右岸 1.4k", + "city": "秋田県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.694528, + "lon": 140.080389, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121043129.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121043129.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-121043137", + "name": "雄物川左岸 28.0k(下流)", + "city": "秋田県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 39.538722, + "lon": 140.210972, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/121043137.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/121043137.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221271004", + "name": "木島大橋", + "city": "茨城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 36.4968, + "lon": 140.489597, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221271004.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221271004.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221270041", + "name": "田中川水門", + "city": "茨城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 36.140556, + "lon": 140.518336, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221270041.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221270041.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221261027", + "name": "筑西市福岡新田地先", + "city": "茨城県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 36.214014, + "lon": 140.007989, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221261027.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221261027.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-105121167", + "name": "切明橋", + "city": "長野県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 36.809664, + "lon": 138.620039, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/105121167.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/105121167.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-221016020", + "name": "美山橋", + "city": "青森県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 40.521681, + "lon": 140.211728, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/221016020.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/221016020.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-222858021", + "name": "大塚原", + "city": "鹿児島県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 31.400139, + "lon": 130.958378, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/222858021.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/222858021.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-222858019", + "name": "新川西", + "city": "鹿児島県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 31.358517, + "lon": 131.000275, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/222858019.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/222858019.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-jp-river-222858014", + "name": "霧島大橋", + "city": "鹿児島県, JP", + "cityId": "unknown", + "provider": "MLIT river cameras", + "lat": 31.436803, + "lon": 130.950831, + "feedType": "image", + "sourceKind": "mlit-river", + "license": "MLIT 川の防災情報 river camera (CC BY 4.0 compatible; see site terms)", + "credit": "Ministry of Land, Infrastructure, Transport and Tourism (MLIT) — 川の防災情報", + "url": "https://cam.river.go.jp/cam/now/222858014.jpg", + "snapshotUrl": "https://cam.river.go.jp/cam/now/222858014.jpg", + "frameRefreshMs": 600000 + }, + { + "id": "world-or-764", + "name": "3rd St at Harwood MP18.35", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.3029, + "lon": -120.8549, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/3rd St at Harwood_pid3527.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/3rd St at Harwood_pid3527.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-684", + "name": "82nd Ave at NE Tillamook", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53726, + "lon": -122.57897, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at NE Tillamook_pid3201.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at NE Tillamook_pid3201.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1038", + "name": "Barview Jetty Lookout (USCG)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5703, + "lon": -123.95608, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Barview Jetty Lookout_pid4457.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Barview Jetty Lookout_pid4457.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1190", + "name": "Bend NW Arizona Ave at NW Bond St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05157, + "lon": -121.31637, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Bend NW Arizona Ave at NW Bond St_pid4754.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Bend NW Arizona Ave at NW Bond St_pid4754.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1191", + "name": "Bend NW Colorado Ave at NW Wall St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05231, + "lon": -121.31775, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Bend Colorado Ave at Wall St_pid4756.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Bend Colorado Ave at Wall St_pid4756.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1189", + "name": "Bend Parkway US97 at Colorado Couplet", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05197, + "lon": -121.30732, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/dummy camera name_pid4752.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/dummy camera name_pid4752.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1187", + "name": "Bend SW Colorado Ave at SW Industrial Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05079, + "lon": -121.31922, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Bend SW Colorado Ave at SW Industrial Dr_pid4748.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Bend SW Colorado Ave at SW Industrial Dr_pid4748.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1193", + "name": "Cape Disappointment Ilwaco - WA (USCG)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.27611, + "lon": -124.05138, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cape Disappointment Ilwaco_pid4760.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cape Disappointment Ilwaco_pid4760.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1130", + "name": "Cape Kiwanda Dr @ Webb Park Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.21548, + "lon": -123.96946, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Pelican Brewing_pid4640.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Pelican Brewing_pid4640.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-768", + "name": "Century Drive at MP 21.11", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.99178, + "lon": -121.65663, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Century Dr at MP 21.11 E_pid3545.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Century Dr at MP 21.11 E_pid3545.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-771", + "name": "Century Drive at MP 21.11", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.99178, + "lon": -121.65663, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Century Dr at MP 21.11 W_pid3557.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Century Dr at MP 21.11 W_pid3557.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1274", + "name": "Chetco River Harbor (USCG)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.04663, + "lon": -124.26788, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Chetco River Harbor (USCG)_pid4918.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Chetco River Harbor (USCG)_pid4918.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-645", + "name": "Clackamas Co - 101st at Sunnyside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43347, + "lon": -122.55976, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/101st at Sunnyside_pid3037.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/101st at Sunnyside_pid3037.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1018", + "name": "Clackamas Co - 105th at Sunnyside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43369, + "lon": -122.55534, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/105th at Sunnyside_pid4417.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/105th at Sunnyside_pid4417.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-884", + "name": "Clackamas Co - 119th at Sunnyside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43008, + "lon": -122.54065, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/119th at Sunnyside_pid4011.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/119th at Sunnyside_pid4011.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-885", + "name": "Clackamas Co - 122nd at Summers Lane", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41854, + "lon": -122.53798, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/122nd at Summers Lane_pid4015.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/122nd at Summers Lane_pid4015.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-647", + "name": "Clackamas Co - 122nd at Sunnyside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42881, + "lon": -122.53802, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/122nd at Sunnyside_pid3041.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/122nd at Sunnyside_pid3041.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-964", + "name": "Clackamas Co - 12th at Washington St ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.35991, + "lon": -122.60149, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/12th at Washington St_pid4309.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/12th at Washington St_pid4309.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-649", + "name": "Clackamas Co - 142nd at Sunnyside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42497, + "lon": -122.51747, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/142nd at Sunnyside_pid3049.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/142nd at Sunnyside_pid3049.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-965", + "name": "Clackamas Co - 14th at Washington St ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36143, + "lon": -122.60001, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/14th at Washington St_pid4311.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/14th at Washington St_pid4311.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-650", + "name": "Clackamas Co - 152nd at Sunnyside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42532, + "lon": -122.50727, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/152nd at Sunnyside_pid3053.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/152nd at Sunnyside_pid3053.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-651", + "name": "Clackamas Co - 162nd at Sunnyside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42703, + "lon": -122.49687, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/162nd at Sunnyside_pid3057.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/162nd at Sunnyside_pid3057.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1301", + "name": "Clackamas Co - 172nd Ave at Misty Dr and Vogel Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42919, + "lon": -122.48575, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/172nd Ave at Misty Dr and Vogel Rd_pid4972.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/172nd Ave at Misty Dr and Vogel Rd_pid4972.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1300", + "name": "Clackamas Co - 172nd Ave at Rock Creek Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41466, + "lon": -122.48554, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/172nd Ave at Rock Creek Blvd_pid4970.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/172nd Ave at Rock Creek Blvd_pid4970.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-747", + "name": "Clackamas Co - 21st at Adams", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44194, + "lon": -122.63963, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/21st at Adams_pid3455.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/21st at Adams_pid3455.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-746", + "name": "Clackamas Co - 21st at Washington", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44261, + "lon": -122.6398, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/21st at Washington_pid3459.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/21st at Washington_pid3459.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-748", + "name": "Clackamas Co - 21st at Washington", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44261, + "lon": -122.6398, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/21st at Washington W_pid3463.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/21st at Washington W_pid3463.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1323", + "name": "Clackamas Co - 82nd Dr at Fred Meyer North", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40549, + "lon": -122.56889, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/82nd Dr at Fred Meyer North_pid5016.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/82nd Dr at Fred Meyer North_pid5016.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1324", + "name": "Clackamas Co - 82nd Dr at Fred Meyer South", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40377, + "lon": -122.56892, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/82nd Dr at Fred Meyer South_pid5018.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/82nd Dr at Fred Meyer South_pid5018.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1496", + "name": "Clackamas Co - 82nd Dr at Jennifer St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3995, + "lon": -122.56859, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/82nd Dr at Jennifer St_pid5371.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/82nd Dr at Jennifer St_pid5371.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1320", + "name": "Clackamas Co - 82nd Dr at Tolbert St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41261, + "lon": -122.56821, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/82nd Dr at Tolbert St_pid5010.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/82nd Dr at Tolbert St_pid5010.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-643", + "name": "Clackamas Co - 82nd at Sunnyside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43255, + "lon": -122.57924, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/82nd at Sunnyside_pid3069.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/82nd at Sunnyside_pid3069.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-890", + "name": "Clackamas Co - 92nd at Bob Schumacher", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45055, + "lon": -122.56872, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/92nd at Bob Schumacher_pid4035.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/92nd at Bob Schumacher_pid4035.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-654", + "name": "Clackamas Co - 92nd at JCB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45676, + "lon": -122.56868, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/92nd at JCB_pid3073.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/92nd at JCB_pid3073.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-644", + "name": "Clackamas Co - 93rd at Sunnyside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43336, + "lon": -122.5695, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/93rd at Sunnyside_pid3077.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/93rd at Sunnyside_pid3077.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1346", + "name": "Clackamas Co - 95th Ave at Commerce Cir", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.335, + "lon": -122.77339, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/95th Ave at Commerce Cir_pid5062.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/95th Ave at Commerce Cir_pid5062.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-966", + "name": "Clackamas Co - Abernethy 17th at Washington St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36397, + "lon": -122.59701, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Abernethy17th at Washington St_pid4313.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Abernethy17th at Washington St_pid4313.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1326", + "name": "Clackamas Co - Beavercreek Rd at Clairmont Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3268, + "lon": -122.5665, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Clairmont Dr_pid5022.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Clairmont Dr_pid5022.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1328", + "name": "Clackamas Co - Beavercreek Rd at Clarkes Fire Station", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.23435, + "lon": -122.47547, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Clarkes Fire Station_pid5026.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Clarkes Fire Station_pid5026.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1343", + "name": "Clackamas Co - Beavercreek Rd at Fir St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33258, + "lon": -122.57911, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Fir St_pid5056.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Fir St_pid5056.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1342", + "name": "Clackamas Co - Beavercreek Rd at Fred Meyer", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33297, + "lon": -122.58252, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Fred Meyer_pid5054.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Fred Meyer_pid5054.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-888", + "name": "Clackamas Co - Beavercreek Rd at Maple Lane", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33108, + "lon": -122.572, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Maple Lane_pid4027.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Maple Lane_pid4027.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1327", + "name": "Clackamas Co - Beavercreek Rd at Meyers Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.31975, + "lon": -122.55796, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Meyers Rd_pid5024.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Meyers Rd_pid5024.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1341", + "name": "Clackamas Co - Beavercreek Rd at South Ridge Center", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33342, + "lon": -122.58562, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at South Ridge Center_pid5052.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at South Ridge Center_pid5052.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1340", + "name": "Clackamas Co - Beavercreek Rd at Theater and Hilltop Mall", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33367, + "lon": -122.59158, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Theater and Hilltop Mall_pid5050.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Theater and Hilltop Mall_pid5050.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1339", + "name": "Clackamas Co - Beavercreek Rd at Warner Milne Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33644, + "lon": -122.59842, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Warner Milne Rd_pid5048.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Beavercreek Rd at Warner Milne Rd_pid5048.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-889", + "name": "Clackamas Co - Beavercreek at Henrici", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30963, + "lon": -122.54716, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Beavercreek at Henrici_pid4031.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Beavercreek at Henrici_pid4031.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-672", + "name": "Clackamas Co - Bell Rd at Johnson Creek Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45595, + "lon": -122.59285, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Bell Rd at Johnson Creek Blvd_pid3153.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Bell Rd at Johnson Creek Blvd_pid3153.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1309", + "name": "Clackamas Co - Bob Schumacher Rd at Causey Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44155, + "lon": -122.5682, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Bob Schumacher Rd at Causey Ave_pid4988.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Bob Schumacher Rd at Causey Ave_pid4988.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1023", + "name": "Clackamas Co - Bob Schumacher at Monterey", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43845, + "lon": -122.56705, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Bob Schumacher at Monterey_pid4427.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Bob Schumacher at Monterey_pid4427.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1353", + "name": "Clackamas Co - Boones Ferry Rd at Bryant Rd and Firwood Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4086, + "lon": -122.72315, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Bryant Rd and Firwood Rd_pid5076.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Bryant Rd and Firwood Rd_pid5076.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1355", + "name": "Clackamas Co - Boones Ferry Rd at Kruse Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41568, + "lon": -122.71596, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Kruse Way_pid5080.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Kruse Way_pid5080.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1358", + "name": "Clackamas Co - Boones Ferry Rd at Lanewood St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41235, + "lon": -122.71733, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Lanewood St_pid5086.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Lanewood St_pid5086.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1357", + "name": "Clackamas Co - Boones Ferry Rd at Madrona St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40686, + "lon": -122.72619, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Madrona St_pid5084.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Madrona St_pid5084.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1354", + "name": "Clackamas Co - Boones Ferry Rd at Oakridge Rd and Reese Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41075, + "lon": -122.719, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Oakridge Rd and Reese Rd_pid5078.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Oakridge Rd and Reese Rd_pid5078.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-670", + "name": "Clackamas Co - Boones Ferry Rd at Wilsonville Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30291, + "lon": -122.7726, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Wilsonville Rd_pid3145.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Wilsonville Rd_pid3145.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1329", + "name": "Clackamas Co - Canby Ferry North", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30119, + "lon": -122.69269, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Canby Ferry North_pid5028.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Canby Ferry North_pid5028.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1330", + "name": "Clackamas Co - Canby Ferry South", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.29852, + "lon": -122.69246, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Canby Ferry South_pid5030.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Canby Ferry South_pid5030.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1356", + "name": "Clackamas Co - Country Club Rd at Wembley Park Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42377, + "lon": -122.69785, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Country Club Rd at Wembley Park Rd_pid5082.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Country Club Rd at Wembley Park Rd_pid5082.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1344", + "name": "Clackamas Co - Elligsen Rd at Parkway Ave and Argyle Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33551, + "lon": -122.76542, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Elligsen Rd at Parkway Ave and Argyle Ave_pid5058.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Elligsen Rd at Parkway Ave and Argyle Ave_pid5058.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1345", + "name": "Clackamas Co - Elligsen Rd at Parkway Center Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33553, + "lon": -122.76205, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Elligsen Rd at Parkway Center Dr_pid5060.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Elligsen Rd at Parkway Center Dr_pid5060.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1017", + "name": "Clackamas Co - Harmony Rd at Aquatic Center Driveway", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43233, + "lon": -122.58888, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Harmony Rd at Aquatic Center Driveway_pid4415.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Harmony Rd at Aquatic Center Driveway_pid4415.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1290", + "name": "Clackamas Co - Harmony Rd at Fuller Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43257, + "lon": -122.58711, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Harmony Rd at Fuller_pid4950.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Harmony Rd at Fuller_pid4950.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-655", + "name": "Clackamas Co - Hunter Bluff at JCB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45612, + "lon": -122.56261, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Hunter Bluff at JCB_pid3081.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Hunter Bluff at JCB_pid3081.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-656", + "name": "Clackamas Co - Jennifer at Evelyn", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40342, + "lon": -122.5639, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Jennifer at Evelyn_pid3085.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Jennifer at Evelyn_pid3085.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1495", + "name": "Clackamas Co - Johnson Creek Blvd at 79th Pl", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45702, + "lon": -122.58203, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Johnson Creek Blvd at 79th Pl_pid5369.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Johnson Creek Blvd at 79th Pl_pid5369.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-886", + "name": "Clackamas Co - Johnson Creek Blvd at Fuller Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45684, + "lon": -122.57503, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Johnson Creek Blvd at Fuller Rd_pid4019.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Johnson Creek Blvd at Fuller Rd_pid4019.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1020", + "name": "Clackamas Co - Johnson Creek Blvd at Linwood", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45614, + "lon": -122.59898, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Johnson Creek Blvd at Linwood_pid4421.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Johnson Creek Blvd at Linwood_pid4421.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1307", + "name": "Clackamas Co - Johnson Creek Blvd at Linwood Ave and Flavel Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45611, + "lon": -122.59899, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Johnson Creek Blvd at Linwood Ave and Flavel Dr_pid4984.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Johnson Creek Blvd at Linwood Ave and Flavel Dr_pid4984.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1319", + "name": "Clackamas Co - Johnson Rd at Deer Creek Ln", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42399, + "lon": -122.58289, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Johnson Rd at Deer Creek Ln_pid5008.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Johnson Rd at Deer Creek Ln_pid5008.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1497", + "name": "Clackamas Co - Kerr Pkwky at McNary Pkwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43548, + "lon": -122.72009, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Kerr Pkwky at McNary_pid5373.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Kerr Pkwky at McNary_pid5373.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1308", + "name": "Clackamas Co - King Rd at Bell Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44791, + "lon": -122.59281, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/King Rd at Bell Ave_pid4986.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/King Rd at Bell Ave_pid4986.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1021", + "name": "Clackamas Co - King Rd at Linwood Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44795, + "lon": -122.59894, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/King Rd at Linwood Ave_pid4423.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/King Rd at Linwood Ave_pid4423.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-778", + "name": "Clackamas Co - Kinsman at Barber St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.31027, + "lon": -122.77864, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Kinsman at Barber St_pid3585.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Kinsman at Barber St_pid3585.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1332", + "name": "Clackamas Co - Knights Bridge Rd at Arndt Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.26058, + "lon": -122.733, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Knights Bridge Rd at Arndt Rd_pid5034.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Knights Bridge Rd at Arndt Rd_pid5034.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-961", + "name": "Clackamas Co - Lake at Webster", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42369, + "lon": -122.59298, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Lake at Webster_pid4303.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Lake at Webster_pid4303.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1335", + "name": "Clackamas Co - Molalla Ave at Clairmont Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33122, + "lon": -122.58631, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Molalla Ave at Clairmont Way_pid5040.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Molalla Ave at Clairmont Way_pid5040.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1337", + "name": "Clackamas Co - Molalla Ave at Fir St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.32882, + "lon": -122.58427, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Molalla Ave at Fir St_pid5044.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Molalla Ave at Fir St_pid5044.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1336", + "name": "Clackamas Co - Molalla Ave at Gaffney Ln", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3299, + "lon": -122.58523, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Molalla Ave at Gaffney Ln_pid5042.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Molalla Ave at Gaffney Ln_pid5042.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1334", + "name": "Clackamas Co - Molalla Ave at Safeway and McDonalds", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33534, + "lon": -122.58973, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Molalla Ave at Safeway and McDonalds_pid5038.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Molalla Ave at Safeway and McDonalds_pid5038.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1333", + "name": "Clackamas Co - Molalla Ave at Warner Milne Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33675, + "lon": -122.5908, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Molalla Ave at Warner Milne Rd_pid5036.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Molalla Ave at Warner Milne Rd_pid5036.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-963", + "name": "Clackamas Co - Molalla at Beavercreek Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33385, + "lon": -122.5885, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Molalla at Beavercree_pid4307.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Molalla at Beavercree_pid4307.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1312", + "name": "Clackamas Co - Monterey Ave at 85th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43825, + "lon": -122.57564, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Monterey Ave at 85th A_pid4994.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Monterey Ave at 85th A_pid4994.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1315", + "name": "Clackamas Co - Oatfield Rd at Concord Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41136, + "lon": -122.62143, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Oatfield Rd at Concord Rd_pid5000.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Oatfield Rd at Concord Rd_pid5000.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1318", + "name": "Clackamas Co - Oatfield Rd at Jennings Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3972, + "lon": -122.60056, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Oatfield Rd at Jennings Ave_pid5006.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Oatfield Rd at Jennings Ave_pid5006.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1313", + "name": "Clackamas Co - Oatfield Rd at Park Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43023, + "lon": -122.63275, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Oatfield Rd at Park Ave_pid4996.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Oatfield Rd at Park Ave_pid4996.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1317", + "name": "Clackamas Co - Oatfield Rd at Roethe Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4032, + "lon": -122.61058, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Oatfield Rd at Roethe Rd_pid5004.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Oatfield Rd at Roethe Rd_pid5004.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1316", + "name": "Clackamas Co - Oatfield Rd at Thiessen Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40817, + "lon": -122.6174, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Oatfield Rd at Thiessen Rd_pid5002.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Oatfield Rd at Thiessen Rd_pid5002.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1022", + "name": "Clackamas Co - Otty Rd at Fuller Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45139, + "lon": -122.57674, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Otty Rd at Fuller Rd_pid4425.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Otty Rd at Fuller Rd_pid4425.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-749", + "name": "Clackamas Co - Park at 27th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43018, + "lon": -122.63608, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Park at 27th Ave_pid3467.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Park at 27th Ave_pid3467.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-779", + "name": "Clackamas Co - Parkway at Town Center Loop", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30942, + "lon": -122.76436, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Parkway at Town Center Loop W_pid3589.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Parkway at Town Center Loop W_pid3589.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-780", + "name": "Clackamas Co - Parkway at Town Center Loop", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30942, + "lon": -122.76436, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Parkway at Town Center Loop E_pid3593.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Parkway at Town Center Loop E_pid3593.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-962", + "name": "Clackamas Co - Prairie Schooner Way at Washington St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.37087, + "lon": -122.58728, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Prairie Schooner Wa_pid4305.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Prairie Schooner Wa_pid4305.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1325", + "name": "Clackamas Co - Redland Rd at Abernethy Rd and Holcomb Blvd ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36455, + "lon": -122.58704, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Redland Rd at Abernethy Rd and Holcomb Blvd_pid5020.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Redland Rd at Abernethy Rd and Holcomb Blvd_pid5020.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-887", + "name": "Clackamas Co - Rosemont at Santa Anita", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36928, + "lon": -122.6466, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Rosemont at Santa Anita_pid4023.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Rosemont at Santa Anita_pid4023.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1359", + "name": "Clackamas Co - Sequoia Pkwy at Hazel Dell Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.26738, + "lon": -122.67481, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sequoia Pkwy at Hazel Dell Way_pid5088.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sequoia Pkwy at Hazel Dell Way_pid5088.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1331", + "name": "Clackamas Co - Stafford Rd at 65th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33592, + "lon": -122.74352, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Stafford Rd at 65th Ave_pid5032.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Stafford Rd at 65th Ave_pid5032.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-822", + "name": "Clackamas Co - Stafford Rd at Ek Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36686, + "lon": -122.70838, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Stafford Rd at Ek Rd_pid3762.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Stafford Rd at Ek Rd_pid3762.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1498", + "name": "Clackamas Co - Stafford Rd at Overlook Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.39681, + "lon": -122.68817, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Stafford Rd at Overlook Dr_pid5375.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Stafford Rd at Overlook Dr_pid5375.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1352", + "name": "Clackamas Co - Stafford and Wilsonville at Advance and Boeckman", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.31755, + "lon": -122.74374, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Stafford and Wilsonville at Advance and Boeckman_pid5074.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Stafford and Wilsonville at Advance and Boeckman_pid5074.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-824", + "name": "Clackamas Co - Stafford at Boeckman Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.31754, + "lon": -122.74373, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Stafford at Boeckman Rd_pid3770.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Stafford at Boeckman Rd_pid3770.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1310", + "name": "Clackamas Co - Stevens Rd at Bob Schumacher Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43561, + "lon": -122.56389, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Stevens Rd at Bob Schumacher Rd_pid4990.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Stevens Rd at Bob Schumacher Rd_pid4990.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1311", + "name": "Clackamas Co - Stevens Rd at Gramor", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43487, + "lon": -122.56192, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Stevens Rd at Gramor_pid4992.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Stevens Rd at Gramor_pid4992.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1302", + "name": "Clackamas Co - Sunnybrook Blvd at 84th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43005, + "lon": -122.57699, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at 84th Ave_pid4974.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at 84th Ave_pid4974.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1303", + "name": "Clackamas Co - Sunnybrook Blvd at 8600 Block", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42988, + "lon": -122.57405, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at 8600 Block_pid4976.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at 8600 Block_pid4976.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1305", + "name": "Clackamas Co - Sunnybrook Blvd at 93rd Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42981, + "lon": -122.56828, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at 93rd Ave_pid4980.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at 93rd Ave_pid4980.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1306", + "name": "Clackamas Co - Sunnybrook Blvd at 97th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42947, + "lon": -122.56331, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at 97th Ave_pid4982.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at 97th Ave_pid4982.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1304", + "name": "Clackamas Co - Sunnybrook Blvd at Oak Bluff Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4299, + "lon": -122.57116, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at Oak Bluff Blvd_pid4978.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at Oak Bluff Blvd_pid4978.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1019", + "name": "Clackamas Co - Sunnybrook Blvd at Sunnyside Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43374, + "lon": -122.55212, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at Sunnyside Rd_pid4419.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnybrook Blvd at Sunnyside Rd_pid4419.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1294", + "name": "Clackamas Co - Sunnyside Rd at 117th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43175, + "lon": -122.5439, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 117th Ave_pid4958.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 117th Ave_pid4958.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1295", + "name": "Clackamas Co - Sunnyside Rd at 132nd Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42673, + "lon": -122.52772, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 132nd Ave_pid4960.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 132nd Ave_pid4960.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1296", + "name": "Clackamas Co - Sunnyside Rd at 147th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42487, + "lon": -122.51237, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 147th Ave_pid4962.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 147th Ave_pid4962.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1297", + "name": "Clackamas Co - Sunnyside Rd at 157th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42681, + "lon": -122.50178, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 157th Ave_pid4964.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 157th Ave_pid4964.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1298", + "name": "Clackamas Co - Sunnyside Rd at 169th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4269, + "lon": -122.48955, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 169th Ave_pid4966.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 169th Ave_pid4966.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1299", + "name": "Clackamas Co - Sunnyside Rd at 172nd Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42633, + "lon": -122.48574, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 172nd Ave_pid4968.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 172nd Ave_pid4968.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1291", + "name": "Clackamas Co - Sunnyside Rd at 8600 Block", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43322, + "lon": -122.57497, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 8600 Block_pid4952.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 8600 Block_pid4952.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1292", + "name": "Clackamas Co - Sunnyside Rd at 9000 Block", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43328, + "lon": -122.57108, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 9000 Block_pid4954.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at 9000 Block_pid4954.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1293", + "name": "Clackamas Co - Sunnyside Rd at Stevens Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4334, + "lon": -122.56169, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at Stevens Rd_pid4956.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sunnyside Rd at Stevens Rd_pid4956.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-671", + "name": "Clackamas Co - Town Center Lp West at Wilsonville Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30292, + "lon": -122.76581, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Town Center Lp West at Wilsonville Rd._pid3149.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Town Center Lp West at Wilsonville Rd._pid3149.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-646", + "name": "Clackamas Co - Valley View at Sunnyside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43328, + "lon": -122.54858, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Valley View at Sunnyside_pid3089.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Valley View at Sunnyside_pid3089.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1338", + "name": "Clackamas Co - Warner Milne and Warner Parrott at Linn and Leland", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33644, + "lon": -122.60494, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Warner Milne and Warner Parrott at Linn and Leland_pid5046.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Warner Milne and Warner Parrott at Linn and Leland_pid5046.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1322", + "name": "Clackamas Co - Webster Rd at Clackamas Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41082, + "lon": -122.59042, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Webster Rd at Clackamas Rd_pid5014.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Webster Rd at Clackamas Rd_pid5014.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1321", + "name": "Clackamas Co - Webster Rd at Thiessen Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41614, + "lon": -122.59327, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Webster Rd at Thiessen Rd_pid5012.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Webster Rd at Thiessen Rd_pid5012.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1348", + "name": "Clackamas Co - Wilsonville Rd at Brown Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30228, + "lon": -122.786, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Wilsonville Rd at Brown Rd_pid5066.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Wilsonville Rd at Brown Rd_pid5066.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1349", + "name": "Clackamas Co - Wilsonville Rd at Kinsman Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30292, + "lon": -122.77797, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Wilsonville Rd at Kinsman Rd_pid5068.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Wilsonville Rd at Kinsman Rd_pid5068.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1351", + "name": "Clackamas Co - Wilsonville Rd at Town Center Loop East", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30297, + "lon": -122.76028, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Wilsonville Rd at Town Center Loop East_pid5072.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Wilsonville Rd at Town Center Loop East_pid5072.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1350", + "name": "Clackamas Co - Wilsonville Rd at Town Center Loop West", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30292, + "lon": -122.76581, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Wilsonville Rd at Town Center Loop West_pid5070.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Wilsonville Rd at Town Center Loop West_pid5070.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1347", + "name": "Clackamas Co - Wilsonville Rd at Willamette Way East", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.29873, + "lon": -122.79278, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Wilsonville Rd at Willamette Way East_pid5064.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Wilsonville Rd at Willamette Way East_pid5064.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-365", + "name": "Clackamas County - US26 at ZigZag - Hoodland", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.34479, + "lon": -121.948, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ZigZag_pid1511.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ZigZag_pid1511.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-943", + "name": "Coburg - I-5 at Van Duyn Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.13704, + "lon": -123.0514, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Van Duyn Rd N_pid4249.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Van Duyn Rd N_pid4249.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1269", + "name": "Coos River Charleston (USCG)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.35072, + "lon": -124.33686, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Coos River Charleston USCG_pid4908.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Coos River Charleston USCG_pid4908.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-334", + "name": "Crook Co - OR380 at Paulina", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.13108, + "lon": -119.96998, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Paulina_pid1362.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Paulina_pid1362.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-657", + "name": "Crook County - Juniper Canyon Fire Station", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.19319, + "lon": -120.75376, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Juniper Canyon Fire Station_pid3093.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Juniper Canyon Fire Station_pid3093.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1163", + "name": "Dead Indian Memorial Rd at Clover Creek Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.29946, + "lon": -122.25116, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Dead Indian Memorial Rd EB at Clover Creek MP28.35_pid4704.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Dead Indian Memorial Rd EB at Clover Creek MP28.35_pid4704.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1164", + "name": "Dead Indian Memorial Rd at Clover Creek Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.29945, + "lon": -122.25116, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Dead Indian Memorial Rd SB at Clover Creek MP28.35_pid4706.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Dead Indian Memorial Rd SB at Clover Creek MP28.35_pid4706.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1268", + "name": "Depoe Bay (USCG)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.80902, + "lon": -124.0623, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Depoe Bay USCG_pid4906.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Depoe Bay USCG_pid4906.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-915", + "name": "Eugene - 11th at Bailey Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.04803, + "lon": -123.14801, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/11th at Bailey Hill_pid4137.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/11th at Bailey Hill_pid4137.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-920", + "name": "Eugene - 11th at Bertelsen", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.04803, + "lon": -123.16249, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/11th at Bertelsen_pid4157.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/11th at Bertelsen_pid4157.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-916", + "name": "Eugene - 11th at Garfield", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.04777, + "lon": -123.12291, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/11th at Garfield_pid4141.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/11th at Garfield_pid4141.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-921", + "name": "Eugene - 11th at McKinley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.04787, + "lon": -123.12989, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/11th at McKinley_pid4161.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/11th at McKinley_pid4161.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-924", + "name": "Eugene - 11th at Oak Patch", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.04792, + "lon": -123.1354, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/11th at Oak Patch_pid4173.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/11th at Oak Patch_pid4173.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-918", + "name": "Eugene - 6th at Blair", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05324, + "lon": -123.10706, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/6th at Blair_pid4149.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/6th at Blair_pid4149.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-922", + "name": "Eugene - 6th at Chambers", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05326, + "lon": -123.11853, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/6th at Chambers_pid4165.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/6th at Chambers_pid4165.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-923", + "name": "Eugene - 6th at Charnelton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05323, + "lon": -123.09574, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/6th at Charnelton_pid4169.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/6th at Charnelton_pid4169.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-914", + "name": "Eugene - 6th at Garfield", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05334, + "lon": -123.1228, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/6th at Garfield_pid4133.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/6th at Garfield_pid4133.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-917", + "name": "Eugene - 7th at Chambers", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05215, + "lon": -123.11828, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/7th at Chambers_pid4145.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/7th at Chambers_pid4145.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-913", + "name": "Eugene - 7th at Jefferson", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05213, + "lon": -123.10189, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/7th at Jefferson_pid4129.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/7th at Jefferson_pid4129.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-919", + "name": "Eugene - 8th at Charnelton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05097, + "lon": -123.09579, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/8th at Charnelton_pid4153.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/8th at Charnelton_pid4153.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-958", + "name": "Eugene - Coburg Rd at I-105 EB Onramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.06229, + "lon": -123.08022, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Coburg Rd at I-105 EB Onramp_pid4297.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Coburg Rd at I-105 EB Onramp_pid4297.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-959", + "name": "Eugene - Coburg Rd at I-105 Flyover Ramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.06319, + "lon": -123.0792, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Coburg Rd at I-105 Flyover R_pid4299.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Coburg Rd at I-105 Flyover R_pid4299.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-956", + "name": "Eugene - Ferry St. Bridge Viaduct at 6th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05322, + "lon": -123.08664, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Ferry Street Bridge Viaduct at 6th Ave_pid4293.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Ferry Street Bridge Viaduct at 6th Ave_pid4293.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-957", + "name": "Eugene - Ferry Street Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05794, + "lon": -123.08404, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Ferry Street Bridge_pid4295.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Ferry Street Bridge_pid4295.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1184", + "name": "Grays Harbor Westport - WA (USCG)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.90436, + "lon": -124.12111, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Grays Harbor Westport - WA_pid4742.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Grays Harbor Westport - WA_pid4742.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1100", + "name": "Hwy82 at Bramlet Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.61009, + "lon": -117.60111, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Hwy82 at Bramlet Rd W_pid4580.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Hwy82 at Bramlet Rd W_pid4580.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1101", + "name": "Hwy82 at Bramlet Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.61009, + "lon": -117.60111, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Hwy82 at Bramlet Rd E_pid4582.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Hwy82 at Bramlet Rd E_pid4582.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1375", + "name": "I-105 at Coburg Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.06256, + "lon": -123.07263, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR126 at Coburg Rd_pid5122.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR126 at Coburg Rd_pid5122.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1367", + "name": "I-105 at Country Club", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.0611, + "lon": -123.08673, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR126 at Country Club_pid5102.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR126 at Country Club_pid5102.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-302", + "name": "I-205 Washington - Vancouver at Mill Plain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.62119, + "lon": -122.55998, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-205_Mill Plain_pid761.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-205_Mill Plain_pid761.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-289", + "name": "I-205 at 10th West Linn", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3472, + "lon": -122.65082, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i20510th_pid663.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i20510th_pid663.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-220", + "name": "I-205 at 92nd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46449, + "lon": -122.56808, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i20592nd_pid532.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i20592nd_pid532.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-286", + "name": "I-205 at 99E", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36701, + "lon": -122.59599, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i20599E_pid660.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i20599E_pid660.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-103", + "name": "I-205 at Airport Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.57143, + "lon": -122.54986, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205arprt_pid533.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205arprt_pid533.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-290", + "name": "I-205 at Blankenship Road", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.35742, + "lon": -122.66501, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205blnk_pid664.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205blnk_pid664.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1013", + "name": "I-205 at Division SB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50482, + "lon": -122.56553, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-205 at Division SB_pid4407.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-205 at Division SB_pid4407.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-225", + "name": "I-205 at Foster", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47928, + "lon": -122.56554, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205fstr_pid535.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205fstr_pid535.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-258", + "name": "I-205 at Gladstone", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.38484, + "lon": -122.57966, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205Gladstone_pid536.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205Gladstone_pid536.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1012", + "name": "I-205 at Glisan SB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52616, + "lon": -122.56593, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-205 at Glisan SB_pid4405.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-205 at Glisan SB_pid4405.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-105", + "name": "I-205 at Government Island", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58449, + "lon": -122.5433, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205govt_pid537.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205govt_pid537.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1039", + "name": "I-205 at I-5 Ramps", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36985, + "lon": -122.75002, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-205 at I-5 Ramps_pid4459.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-205 at I-5 Ramps_pid4459.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-226", + "name": "I-205 at Johnson Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45674, + "lon": -122.57375, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205jcrk_pid539.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205jcrk_pid539.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-256", + "name": "I-205 at Lawnfield Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41857, + "lon": -122.57465, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205Lawnfield_pid540.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205Lawnfield_pid540.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-257", + "name": "I-205 at OR212 -224", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40735, + "lon": -122.57069, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205hwy212_pid538.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205hwy212_pid538.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-287", + "name": "I-205 at OR43", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36192, + "lon": -122.61184, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205OR43_pid661.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205OR43_pid661.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-259", + "name": "I-205 at Park Place - OR213", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.37516, + "lon": -122.58771, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205ParkHwy213_pid541.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205ParkHwy213_pid541.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-227", + "name": "I-205 at Powell", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49769, + "lon": -122.56558, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205powl_pid497.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205powl_pid497.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-101", + "name": "I-205 at Prescott St.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55555, + "lon": -122.56765, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205pres_pid542.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205pres_pid542.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-291", + "name": "I-205 at Stafford Road", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36999, + "lon": -122.70643, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205staf_pid665.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205staf_pid665.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-228", + "name": "I-205 at Stark", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5182, + "lon": -122.56474, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205strk_pid543.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205strk_pid543.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1067", + "name": "I-205 at Strawberry", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.39343, + "lon": -122.57607, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-205 at Strawberry SB_pid4515.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-205 at Strawberry SB_pid4515.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1233", + "name": "I-205 at Sunnybrook", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42963, + "lon": -122.56492, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-205 at Sunnybrook NB_pid4838.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-205 at Sunnybrook NB_pid4838.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-255", + "name": "I-205 at Sunnyside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43359, + "lon": -122.56556, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205Sunnyside_pid544.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205Sunnyside_pid544.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-102", + "name": "I-205 at US30BY (Lombard)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56051, + "lon": -122.56265, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205Killingsworth_pid534.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205Killingsworth_pid534.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-288", + "name": "I-205 at Willamette Falls Viewpoint", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.35166, + "lon": -122.62824, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i205VWpt_pid662.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i205VWpt_pid662.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-108", + "name": "I-405 at Everett", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52742, + "lon": -122.68711, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i405everett_pid545.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i405everett_pid545.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-106", + "name": "I-405 at Fourth", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50615, + "lon": -122.68217, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i405fourth_pid546.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i405fourth_pid546.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1211", + "name": "I-405 at Fremont Bridge (Top of Arch)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53636, + "lon": -122.68525, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-405 at Fremont Top_pid4795.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-405 at Fremont Top_pid4795.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-107", + "name": "I-405 at Montgomery", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51248, + "lon": -122.68935, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i405montgom_pid547.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i405montgom_pid547.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1212", + "name": "I-405 at SW Alder", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52175, + "lon": -122.68541, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-405 at SW Alder NB_pid4797.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-405 at SW Alder NB_pid4797.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1213", + "name": "I-405 at SW Jefferson", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51696, + "lon": -122.6883, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-405 at SW Jefferson_pid4799.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-405 at SW Jefferson_pid4799.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-270", + "name": "I-5 California at Black Butte", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.38202, + "lon": -122.37478, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/BlackButte_pid607.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/BlackButte_pid607.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-265", + "name": "I-5 California at Hilt", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.99306, + "lon": -122.60975, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Hilt_pid611.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Hilt_pid611.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-264", + "name": "I-5 California at North Hilt", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.99627, + "lon": -122.61042, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NorthHilt_pid613.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NorthHilt_pid613.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-269", + "name": "I-5 California at North Weed", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.42947, + "lon": -122.40259, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NorthWeed_pid614.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NorthWeed_pid614.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-267", + "name": "I-5 California at South Yreka", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.68597, + "lon": -122.63559, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/WaltersRd_pid615.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/WaltersRd_pid615.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-268", + "name": "I-5 California at Weed Airport", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.47444, + "lon": -122.45306, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/WeedAirport_pid616.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/WeedAirport_pid616.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-266", + "name": "I-5 California at Yreka", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.73194, + "lon": -122.63271, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Yreka_pid617.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Yreka_pid617.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-363", + "name": "I-5 Near Goshen", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.97546, + "lon": -123.00999, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5@Goshen_pid1504.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5@Goshen_pid1504.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-231", + "name": "I-5 Salem at Exit 258", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.98434, + "lon": -122.99357, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/HayesvilleInterch-S_pid651.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/HayesvilleInterch-S_pid651.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-359", + "name": "I-5 Salem at Kuebler Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.89029, + "lon": -122.99555, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5atKueblerRdSouthSalem_pid1496.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5atKueblerRdSouthSalem_pid1496.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-792", + "name": "I-5 Salem at OR22", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.91536, + "lon": -122.98886, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at ORE22_pid3641.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at ORE22_pid3641.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-309", + "name": "I-5 Washington - Vancouver at Main Street", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.65962, + "lon": -122.66588, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5_Main_pid770.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5_Main_pid770.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-303", + "name": "I-5 Washington - Vancouver at 134th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.71831, + "lon": -122.65543, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5_134th_pid762.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5_134th_pid762.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-306", + "name": "I-5 Washington - Vancouver at 29th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.64217, + "lon": -122.66222, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5_29th_pid767.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5_29th_pid767.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-307", + "name": "I-5 Washington - Vancouver at 78th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.67667, + "lon": -122.66481, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5_78th_pid768.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5_78th_pid768.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-308", + "name": "I-5 Washington - Vancouver at 99th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.69317, + "lon": -122.66187, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5_99st_pid769.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5_99st_pid769.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-310", + "name": "I-5 Washington - Vancouver at Mill Plain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.63152, + "lon": -122.66535, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5_Millplain_pid771.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5_Millplain_pid771.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-311", + "name": "I-5 Washington - Vancouver at SR-14", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.62452, + "lon": -122.67057, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5_SR14_pid772.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5_SR14_pid772.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-321", + "name": "I-5 at Arndt Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.26025, + "lon": -122.78641, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5atArndtRd_pid798.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5atArndtRd_pid798.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-389", + "name": "I-5 at Ashland - North Mountain Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.21103, + "lon": -122.70034, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5atN.MountainAve_pid1637.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5atN.MountainAve_pid1637.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-491", + "name": "I-5 at Barton Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.76678, + "lon": -123.331, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Barton Rd_pid2392.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Barton Rd_pid2392.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-727", + "name": "I-5 at Battlecreek Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.86856, + "lon": -123.00375, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Battlecreek Rd SB_pid3379.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Battlecreek Rd SB_pid3379.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-113", + "name": "I-5 at Brier Place", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46944, + "lon": -122.68012, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5brier_pid551.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5brier_pid551.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1181", + "name": "I-5 at Broadway", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53686, + "lon": -122.66814, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Broadway N_pid4737.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Broadway N_pid4737.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-403", + "name": "I-5 at CA Border (Siskiyou)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.00549, + "lon": -122.61518, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Siskiyou I-5 SB at MP.2_pid1685.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Siskiyou I-5 SB at MP.2_pid1685.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-404", + "name": "I-5 at CA Border (Siskiyou)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.00549, + "lon": -122.61518, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Siskiyou I-5 NB at MP.2_pid1688.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Siskiyou I-5 NB at MP.2_pid1688.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-590", + "name": "I-5 at Canyon Mt", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.82689, + "lon": -123.26019, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Canyon Mt SB_pid2824.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Canyon Mt SB_pid2824.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-588", + "name": "I-5 at Canyon Mt\r\n", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.82689, + "lon": -123.26019, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Canyon Mt NB_pid2816.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Canyon Mt NB_pid2816.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-111", + "name": "I-5 at Capitol", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4538, + "lon": -122.71666, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5capitol_pid556.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5capitol_pid556.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-245", + "name": "I-5 at Carman Drive", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40815, + "lon": -122.74318, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5carman_pid557.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5carman_pid557.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1234", + "name": "I-5 at Chadwick Ln", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.98627, + "lon": -123.33081, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Chadwick Ln NB_pid4840.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Chadwick Ln NB_pid4840.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1029", + "name": "I-5 at Coburg NB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.17144, + "lon": -123.06076, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Coburg NB_pid4439.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Coburg NB_pid4439.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1028", + "name": "I-5 at Coburg SB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.17144, + "lon": -123.06076, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Coburg SB_pid4437.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Coburg SB_pid4437.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-130", + "name": "I-5 at Columbia", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58639, + "lon": -122.68044, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5columbia_pid558.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5columbia_pid558.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1421", + "name": "I-5 at Commercial St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.85577, + "lon": -123.01253, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Commercial St SB_pid5213.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Commercial St SB_pid5213.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-490", + "name": "I-5 at Cottage Grove - 2 miles south", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.75225, + "lon": -123.14477, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Cottage Grove 2mi South_pid2388.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Cottage Grove 2mi South_pid2388.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-555", + "name": "I-5 at Cottage Grove - 2 miles south", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.75225, + "lon": -123.14477, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Cottage Grove 2mi South_pid2680.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Cottage Grove 2mi South_pid2680.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-519", + "name": "I-5 at Crowson Rd - Siskiyou Chain Up Area", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.15781, + "lon": -122.64759, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Siskiyou Chain Up Area N_pid2515.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Siskiyou Chain Up Area N_pid2515.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1174", + "name": "I-5 at Crowson Rd - Siskiyou Chain Up Area", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.17246, + "lon": -122.65788, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Crowson Rd S_pid4726.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Crowson Rd S_pid4726.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-663", + "name": "I-5 at Del Rio Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.29019, + "lon": -123.35649, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Del Rio Rd NB_pid3117.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Del Rio Rd NB_pid3117.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-664", + "name": "I-5 at Del Rio Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.29019, + "lon": -123.35649, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Del Rio Rd. SB_pid3121.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Del Rio Rd. SB_pid3121.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1417", + "name": "I-5 at Delaney Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.84252, + "lon": -123.00826, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 NB at Delaney Rd_pid5205.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 NB at Delaney Rd_pid5205.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1408", + "name": "I-5 at Dever Conner", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.72986, + "lon": -123.05319, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Hoefer Dr South_pid5189.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Hoefer Dr South_pid5189.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1409", + "name": "I-5 at Dever Conner", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.72986, + "lon": -123.05319, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Hoefer Dr North_pid5191.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Hoefer Dr North_pid5191.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-612", + "name": "I-5 at East Pine", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.37888, + "lon": -122.90408, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at East Pine_pid2916.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at East Pine_pid2916.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1123", + "name": "I-5 at Egge Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.11776, + "lon": -123.04734, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Egge Rd S_pid4626.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Egge Rd S_pid4626.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1124", + "name": "I-5 at Egge Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.11776, + "lon": -123.04734, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Egge Rd N_pid4628.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Egge Rd N_pid4628.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-141", + "name": "I-5 at Elligsen Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33631, + "lon": -122.76975, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5elligs_pid559.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5elligs_pid559.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-460", + "name": "I-5 at Exit 162", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.70762, + "lon": -123.21911, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Exit 162 NB_pid2265.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Exit 162 NB_pid2265.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-461", + "name": "I-5 at Exit 162", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.70762, + "lon": -123.21911, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Exit 162 SB_pid2270.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Exit 162 SB_pid2270.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-179", + "name": "I-5 at Exit 6 Near Siskiyou Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.07246, + "lon": -122.60612, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5atExit6_pid625.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5atExit6_pid625.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-126", + "name": "I-5 at Fremont", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54723, + "lon": -122.67882, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5fremont_pid560.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5fremont_pid560.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-769", + "name": "I-5 at Garfield", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.31169, + "lon": -122.85008, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Garfield_pid3549.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Garfield_pid3549.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-127", + "name": "I-5 at Going", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55775, + "lon": -122.67896, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5going_pid561.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5going_pid561.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1235", + "name": "I-5 at Grant Smith Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.14753, + "lon": -123.36462, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Grant Smith Rd_pid4842.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Grant Smith Rd_pid4842.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1033", + "name": "I-5 at Grants Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.43777, + "lon": -123.29001, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Grants Pass MP 55_pid4447.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Grants Pass MP 55_pid4447.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1063", + "name": "I-5 at Grants Pass Exit MP58", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.4648, + "lon": -123.32359, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Grants Pass Exit MP58 SB_pid4507.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Grants Pass Exit MP58 SB_pid4507.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1064", + "name": "I-5 at Grants Pass Exit MP58", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.4648, + "lon": -123.32359, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Grants Pass Exit MP58 NB_pid4509.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Grants Pass Exit MP58 NB_pid4509.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-109", + "name": "I-5 at Haines", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43709, + "lon": -122.74455, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5haines_pid562.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5haines_pid562.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-476", + "name": "I-5 at Hugo", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.53673, + "lon": -123.36976, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Hugo NB_pid2340.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Hugo NB_pid2340.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-477", + "name": "I-5 at Hugo", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.53673, + "lon": -123.36976, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Hugo SB_pid2344.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Hugo SB_pid2344.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-387", + "name": "I-5 at I-105", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.06378, + "lon": -123.04974, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 SB at I-105_pid1612.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 SB at I-105_pid1612.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-139", + "name": "I-5 at I-205", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36809, + "lon": -122.75896, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5i205_pid563.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5i205_pid563.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-116", + "name": "I-5 at I-405 - Naito Parkway", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5017, + "lon": -122.67338, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5at405_pid549.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5at405_pid549.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1147", + "name": "I-5 at Interstate Bridge NB (Midspan)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.61789, + "lon": -122.67505, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 Bridge NB Mid_pid4674.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 Bridge NB Mid_pid4674.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1145", + "name": "I-5 at Interstate Bridge NB (South End)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.6128, + "lon": -122.6782, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 Bridge NB S.End_pid4670.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 Bridge NB S.End_pid4670.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1148", + "name": "I-5 at Interstate Bridge SB (North End)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.6202, + "lon": -122.67417, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 Bridge SB North_pid4676.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 Bridge SB North_pid4676.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1146", + "name": "I-5 at Interstate Bridge SB (South End)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.61396, + "lon": -122.67783, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 Bridge SB S.End_pid4672.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 Bridge SB S.End_pid4672.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1214", + "name": "I-5 at Iowa", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48323, + "lon": -122.67886, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Iowa VMS_pid4801.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Iowa VMS_pid4801.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1176", + "name": "I-5 at Kerby", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54396, + "lon": -122.67537, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Kerby_pid4730.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Kerby_pid4730.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-333", + "name": "I-5 at Lake Creek - South of ORE228", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.35911, + "lon": -123.06086, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/LakeCreek_pid1355.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/LakeCreek_pid1355.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-129", + "name": "I-5 at Lombard", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.57877, + "lon": -122.67886, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5lombard_pid565.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5lombard_pid565.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-138", + "name": "I-5 at Lower Boones Road", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.39657, + "lon": -122.74682, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5lboon_pid564.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5lboon_pid564.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-115", + "name": "I-5 at Macadam", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49423, + "lon": -122.6733, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5macadam_pid566.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5macadam_pid566.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-131", + "name": "I-5 at Marine Drive", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.60408, + "lon": -122.68304, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5marine_pid567.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5marine_pid567.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1216", + "name": "I-5 at Marquam Bridge (Lower Deck Mid Span)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50799, + "lon": -122.66917, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Marquam Bridge (Upper Deck West)_pid4805.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Marquam Bridge (Upper Deck West)_pid4805.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1185", + "name": "I-5 at Marquam Bridge (Upper Deck East)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5092, + "lon": -122.66726, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Marquam Bridge (Upper Deck East)_pid4744.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Marquam Bridge (Upper Deck East)_pid4744.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1215", + "name": "I-5 at Marquam Bridge (Upper Deck West) ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50766, + "lon": -122.66985, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Marquam Bridge (Upper Deck West)_pid4803.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Marquam Bridge (Upper Deck West)_pid4803.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-900", + "name": "I-5 at Martin Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.75657, + "lon": -123.09645, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Martin CreekN_pid4077.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Martin CreekN_pid4077.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-526", + "name": "I-5 at Medford - 12th St.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.32328, + "lon": -122.86574, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 Medford Barnett Rd N_pid2543.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 Medford Barnett Rd N_pid2543.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-524", + "name": "I-5 at Medford - Barnett Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.316, + "lon": -122.85513, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 Medford Barnett Rd_pid2535.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 Medford Barnett Rd_pid2535.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-787", + "name": "I-5 at Medford Viaduct", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.33142, + "lon": -122.87054, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Medford Viaduct_pid3621.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Medford Viaduct_pid3621.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-114", + "name": "I-5 at Miles", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47135, + "lon": -122.67723, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5miles_pid568.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5miles_pid568.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-614", + "name": "I-5 at Mill Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.8964, + "lon": -122.9861, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Mill Creek_pid2924.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Mill Creek_pid2924.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-117", + "name": "I-5 at Morrison Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52099, + "lon": -122.66586, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5morrison_pid569.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5morrison_pid569.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-426", + "name": "I-5 at Myrtle Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.02425, + "lon": -123.29748, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/MyrtleCreekN_pid1814.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/MyrtleCreekN_pid1814.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-427", + "name": "I-5 at Myrtle Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.02425, + "lon": -123.29748, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/MyrtleCreekS_pid1819.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/MyrtleCreekS_pid1819.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1113", + "name": "I-5 at Myrtle Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.02619, + "lon": -123.29968, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Myrtle Creek NB_pid4606.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Myrtle Creek NB_pid4606.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1116", + "name": "I-5 at Myrtle Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.02214, + "lon": -123.29913, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Myrtle Creek NB2_pid4612.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Myrtle Creek NB2_pid4612.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1415", + "name": "I-5 at N Jefferson", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.79883, + "lon": -123.03264, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 SB at N Jefferson_pid5201.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 SB at N Jefferson_pid5201.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1416", + "name": "I-5 at N Jefferson", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.79883, + "lon": -123.03264, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 NB at N Jefferson_pid5203.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 NB at N Jefferson_pid5203.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-726", + "name": "I-5 at N. Phoenix Rd. (Fern Valley)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.28123, + "lon": -122.81531, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at N. Phoenix Rd. (Fern Valley)_pid3375.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at N. Phoenix Rd. (Fern Valley)_pid3375.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-364", + "name": "I-5 at Near ORE 225 McVay Hwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.02854, + "lon": -123.02985, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5SouthEugene_pid1507.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5SouthEugene_pid1507.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-356", + "name": "I-5 at North Albany", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.68103, + "lon": -123.05409, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NorthAlbany_pid1489.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NorthAlbany_pid1489.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-770", + "name": "I-5 at North Medford Interchange", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.35024, + "lon": -122.87698, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at North Medford Interchange_pid3553.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at North Medford Interchange_pid3553.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-140", + "name": "I-5 at Norwood", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.35355, + "lon": -122.76467, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5norwoo_pid570.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5norwoo_pid570.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-230", + "name": "I-5 at Nyberg", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.38287, + "lon": -122.75188, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5nyberg_pid571.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5nyberg_pid571.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-229", + "name": "I-5 at OR217", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42083, + "lon": -122.7462, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5217_pid548.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5217_pid548.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-857", + "name": "I-5 at OR34", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.55614, + "lon": -123.06104, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at ORE34 NB_pid3903.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at ORE34 NB_pid3903.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-432", + "name": "I-5 at OR569 Beltline", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.08392, + "lon": -123.04486, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 NB at Beltline_pid1872.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 NB at Beltline_pid1872.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-577", + "name": "I-5 at OR569 Beltline", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.08394, + "lon": -123.04874, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 SB at Beltline_pid2774.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 SB at Beltline_pid2774.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-110", + "name": "I-5 at ORE99W - Barbur Blvd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44359, + "lon": -122.74062, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5at99w_pid550.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5at99w_pid550.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1420", + "name": "I-5 at Perkins", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.03013, + "lon": -122.98364, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 SB at Perkins_pid5211.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 SB at Perkins_pid5211.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-320", + "name": "I-5 at Perkins Road", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.0275, + "lon": -122.9842, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5atPerkinsRd_pid797.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5atPerkinsRd_pid797.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-543", + "name": "I-5 at Phoenix", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.29221, + "lon": -122.8268, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Phoenix N_pid2623.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Phoenix N_pid2623.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-542", + "name": "I-5 at Phoenix", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.2925, + "lon": -122.82729, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Phoenix S_pid2627.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Phoenix S_pid2627.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-585", + "name": "I-5 at Rice Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.52648, + "lon": -123.30975, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Rice Hill SB_pid2808.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Rice Hill SB_pid2808.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-589", + "name": "I-5 at Rice Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.52648, + "lon": -123.30975, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Rice Hill NB_pid2820.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Rice Hill NB_pid2820.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-881", + "name": "I-5 at Roberts Mountain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.11135, + "lon": -123.35445, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Roberts Mountain N_pid3999.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Roberts Mountain N_pid3999.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-882", + "name": "I-5 at Roberts Mountain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.11135, + "lon": -123.35445, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Roberts Mountain S_pid4003.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Roberts Mountain S_pid4003.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-905", + "name": "I-5 at Roberts Mountain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.10496, + "lon": -123.36112, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Roberts Mnt N_pid4097.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Roberts Mnt N_pid4097.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-906", + "name": "I-5 at Roberts Mountain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.10496, + "lon": -123.36112, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Roberts Mtn S_pid4101.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Roberts Mtn S_pid4101.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-758", + "name": "I-5 at Rogue River", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.43191, + "lon": -123.17028, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Rogue River NB_pid3503.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Rogue River NB_pid3503.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-759", + "name": "I-5 at Rogue River", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.43191, + "lon": -123.17028, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Rogue River SB_pid3507.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Rogue River SB_pid3507.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-128", + "name": "I-5 at Rosa Parks Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5697, + "lon": -122.67895, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5portlandblvd_pid572.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5portlandblvd_pid572.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-119", + "name": "I-5 at Rose Quarter - Southbound Ramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53028, + "lon": -122.66607, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/RqI5ramp_pid593.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/RqI5ramp_pid593.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-124", + "name": "I-5 at Rose Quarter - Weidler", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53438, + "lon": -122.66655, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Rqweidler_pid596.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Rqweidler_pid596.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-123", + "name": "I-5 at Rose Quarter - Winning Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53307, + "lon": -122.66777, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Rqwinning_pid597.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Rqwinning_pid597.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1144", + "name": "I-5 at Roseburg", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.20084, + "lon": -123.35962, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Roseburg MP123_pid4668.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Roseburg MP123_pid4668.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-967", + "name": "I-5 at Roseburg - Exit 124", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.21096, + "lon": -123.35496, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Exit 124 NB_pid4315.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Exit 124 NB_pid4315.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-495", + "name": "I-5 at Roseburg - Garden Valley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.22709, + "lon": -123.36157, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Roseburg - Garden Valley Exit S_pid2408.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Roseburg - Garden Valley Exit S_pid2408.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-968", + "name": "I-5 at Roseburg - Garden Valley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.22709, + "lon": -123.36157, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Garden Valley NB_pid4317.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Garden Valley NB_pid4317.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-285", + "name": "I-5 at Roseburg - Milepost 120", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.16664, + "lon": -123.3656, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/RoseburgSouthMP120 SB_pid676.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/RoseburgSouthMP120 SB_pid676.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-522", + "name": "I-5 at Sexton Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.59884, + "lon": -123.38441, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SextonSummitN_pid2527.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SextonSummitN_pid2527.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-523", + "name": "I-5 at Sexton Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.59884, + "lon": -123.38441, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SextonSummitS_pid2531.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SextonSummitS_pid2531.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1418", + "name": "I-5 at Silverton Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.96751, + "lon": -122.9902, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I5 NB @ Silverton Rd_pid5207.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I5 NB @ Silverton Rd_pid5207.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1419", + "name": "I-5 at Silverton Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.96751, + "lon": -122.9902, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 SB at Silverton Rd_pid5209.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 SB at Silverton Rd_pid5209.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1157", + "name": "I-5 at Siskiyou", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.05229, + "lon": -122.60902, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou MP3.68 NB_pid4692.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou MP3.68 NB_pid4692.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1159", + "name": "I-5 at Siskiyou", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.09242, + "lon": -122.60286, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou MP6.87 SB_pid4696.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou MP6.87 SB_pid4696.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1160", + "name": "I-5 at Siskiyou", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.09242, + "lon": -122.60286, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou MP6.87NB_pid4698.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou MP6.87NB_pid4698.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1161", + "name": "I-5 at Siskiyou", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.13114, + "lon": -122.63203, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou 10N_pid4700.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou 10N_pid4700.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1162", + "name": "I-5 at Siskiyou", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.13114, + "lon": -122.63203, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou 10S_pid4702.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou 10S_pid4702.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-399", + "name": "I-5 at Siskiyou Exit 1", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.01611, + "lon": -122.61294, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Siskiyou I-5 SB at Exit 1_pid1669.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Siskiyou I-5 SB at Exit 1_pid1669.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-402", + "name": "I-5 at Siskiyou Exit 1", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.01611, + "lon": -122.61294, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Siskiyou I-5 NB at Exit 1_pid1682.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Siskiyou I-5 NB at Exit 1_pid1682.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1155", + "name": "I-5 at Siskiyou Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.06332, + "lon": -122.60288, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou Summit S_pid4690.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Siskiyou Summit S_pid4690.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-626", + "name": "I-5 at South Salem - Enchanted Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.8245, + "lon": -123.0165, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Enchanted Way_pid2968.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Enchanted Way_pid2968.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1142", + "name": "I-5 at Stage Road Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.73518, + "lon": -123.37089, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Stage Road Pass SB_pid4664.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Stage Road Pass SB_pid4664.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1143", + "name": "I-5 at Stage Road Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.73518, + "lon": -123.37089, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Stage Road Pass NB_pid4666.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Stage Road Pass NB_pid4666.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-458", + "name": "I-5 at Sutherlin", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.3892, + "lon": -123.33727, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Sutherlin NB_pid2257.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Sutherlin NB_pid2257.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-459", + "name": "I-5 at Sutherlin", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.3892, + "lon": -123.33727, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Sutherlin SB_pid2261.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Sutherlin SB_pid2261.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-723", + "name": "I-5 at Table Rock", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.36308, + "lon": -122.88565, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Table Rock_pid3359.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Table Rock_pid3359.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-112", + "name": "I-5 at Terwilliger", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47015, + "lon": -122.68909, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5terwil_pid573.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5terwil_pid573.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-838", + "name": "I-5 at Terwilliger", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47635, + "lon": -122.67896, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Terwilliger_pid3826.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Terwilliger_pid3826.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1088", + "name": "I-5 at US20 MP 233.2", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.62998, + "lon": -123.06256, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at US20 MP 233.2 SB_pid4556.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at US20 MP 233.2 SB_pid4556.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1238", + "name": "I-5 at Upton Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.38952, + "lon": -122.91848, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 NB at Upton Rd_pid4848.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 NB at Upton Rd_pid4848.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-246", + "name": "I-5 at Victory", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59644, + "lon": -122.68373, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5Victory_pid574.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5Victory_pid574.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-541", + "name": "I-5 at Willamette River Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.03871, + "lon": -123.04791, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Willamette River Bridge_pid2619.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Willamette River Bridge_pid2619.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1378", + "name": "I-5 at Willamette River Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.03862, + "lon": -123.04802, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Willamette River Bridge SB_pid5128.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Willamette River Bridge SB_pid5128.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-142", + "name": "I-5 at Wilsonville Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30315, + "lon": -122.76901, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i5wilson_pid575.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i5wilson_pid575.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-634", + "name": "I-5 at Woodburn", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.15138, + "lon": -122.87967, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-5 at Woodburn_pid3001.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-5 at Woodburn_pid3001.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-989", + "name": "I-82 Washington at Plymouth Port of Entry", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.94719, + "lon": -119.33623, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-82 at Plymouth Port of Entry_pid4359.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-82 at Plymouth Port of Entry_pid4359.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-473", + "name": "I-82 at I-84 - Westland Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.8008, + "lon": -119.3859, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-82 at I-84_pid2321.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-82 at I-84_pid2321.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1132", + "name": "I-82 at Umatilla", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.92285, + "lon": -119.3242, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-82 at Umatilla NB_pid4644.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-82 at Umatilla NB_pid4644.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1133", + "name": "I-82 at Umatilla", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.92285, + "lon": -119.3242, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-82 at Umatilla SB_pid4646.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-82 at Umatilla SB_pid4646.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1026", + "name": "I-84 Boardman at Bombing Range Rd EB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.83362, + "lon": -119.62318, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I84 Bombing Range Rd EB_pid4433.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I84 Bombing Range Rd EB_pid4433.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-537", + "name": "I-84 Boardman at Bombing Range Rd WB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.83362, + "lon": -119.62318, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I84 Bombing Range Rd_pid2600.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I84 Bombing Range Rd_pid2600.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-154", + "name": "I-84 at 102nd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54448, + "lon": -122.55889, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i84102nd_pid576.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i84102nd_pid576.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-104", + "name": "I-84 at 105th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54766, + "lon": -122.55519, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i84105th_pid577.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i84105th_pid577.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1099", + "name": "I-84 at 122nd WB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54689, + "lon": -122.53821, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at 122nd WB_pid4578.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at 122nd WB_pid4578.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-375", + "name": "I-84 at 148th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54242, + "lon": -122.50928, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i84@148th_pid1579.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i84@148th_pid1579.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1208", + "name": "I-84 at 162nd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54217, + "lon": -122.49509, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 EB at 162nd_pid4789.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 EB at 162nd_pid4789.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-376", + "name": "I-84 at 181st", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54129, + "lon": -122.47686, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i84@181st_pid1580.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i84@181st_pid1580.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-378", + "name": "I-84 at 223rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54189, + "lon": -122.43399, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i84@223rd_pid1582.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i84@223rd_pid1582.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1207", + "name": "I-84 at 238th Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53952, + "lon": -122.41853, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at 238th Dr_pid4787.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at 238th Dr_pid4787.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-379", + "name": "I-84 at 257th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54487, + "lon": -122.39041, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i84@257th_pid1583.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i84@257th_pid1583.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-146", + "name": "I-84 at 28th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53036, + "lon": -122.63511, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i8428th_pid578.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i8428th_pid578.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-147", + "name": "I-84 at 37th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53392, + "lon": -122.62568, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i8437th_pid579.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i8437th_pid579.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-148", + "name": "I-84 at 53rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52723, + "lon": -122.60881, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i8453rd_pid580.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i8453rd_pid580.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1183", + "name": "I-84 at 67th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53367, + "lon": -122.59443, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at 67th W_pid4740.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at 67th W_pid4740.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-150", + "name": "I-84 at 82nd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53289, + "lon": -122.57891, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i8482nd_pid582.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i8482nd_pid582.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1106", + "name": "I-84 at Alder Creek Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.68314, + "lon": -117.65963, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Alder CreekW_pid4592.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Alder CreekW_pid4592.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1107", + "name": "I-84 at Alder Creek Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.68314, + "lon": -117.65963, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Alder CreekE_pid4594.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Alder CreekE_pid4594.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-241", + "name": "I-84 at Arlington", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.71963, + "lon": -120.20511, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Arlington_pid600.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Arlington_pid600.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-796", + "name": "I-84 at Baker Valley Rest Area", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.92243, + "lon": -117.82422, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Baker Valley W_pid3656.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Baker Valley W_pid3656.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-728", + "name": "I-84 at Barnhart Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.69109, + "lon": -118.93364, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Barnhart EB_pid3385.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Barnhart EB_pid3385.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-982", + "name": "I-84 at Brewery Grade EB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59929, + "lon": -121.16899, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Brewery Grade EB_pid4345.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Brewery Grade EB_pid4345.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-983", + "name": "I-84 at Brewery Grade WB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59929, + "lon": -121.16899, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Brewery Grade WB_pid4347.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Brewery Grade WB_pid4347.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1057", + "name": "I-84 at Cabbage Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59194, + "lon": -118.64443, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP220.59 WB_pid4495.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP220.59 WB_pid4495.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1058", + "name": "I-84 at Cabbage Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59194, + "lon": -118.64443, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP220.59 EB_pid4497.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP220.59 EB_pid4497.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-208", + "name": "I-84 at Cabbage Hill - Deadman Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.60035, + "lon": -118.50341, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/DeadmanP-CabbageHill_pid623.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/DeadmanP-CabbageHill_pid623.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1055", + "name": "I-84 at Cabbage Hill MP220.83", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59542, + "lon": -118.61732, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP220.83 WB_pid4491.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP220.83 WB_pid4491.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1056", + "name": "I-84 at Cabbage Hill MP220.83", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59542, + "lon": -118.61732, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP220.83 EB_pid4493.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP220.83 EB_pid4493.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1053", + "name": "I-84 at Cabbage Hill MP221.45", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59109, + "lon": -118.61096, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP221.45 WB_pid4487.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP221.45 WB_pid4487.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1054", + "name": "I-84 at Cabbage Hill MP221.45", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59109, + "lon": -118.61096, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP221.45 EB_pid4489.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP221.45 EB_pid4489.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1051", + "name": "I-84 at Cabbage Hill MP222.35", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58333, + "lon": -118.62233, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP222.35 WB_pid4483.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP222.35 WB_pid4483.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1052", + "name": "I-84 at Cabbage Hill MP222.35", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58333, + "lon": -118.62233, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP222.35 EB_pid4485.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP222.35 EB_pid4485.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1049", + "name": "I-84 at Cabbage Hill MP223.52", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58569, + "lon": -118.59933, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP223.52 WB_pid4479.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP223.52 WB_pid4479.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1050", + "name": "I-84 at Cabbage Hill MP223.52", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58569, + "lon": -118.59933, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP223.52 EB_pid4481.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Cabbage Hill MP223.52 EB_pid4481.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-205", + "name": "I-84 at Cascade Locks", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.66931, + "lon": -121.88484, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/CascadeLocksWB_pid620.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/CascadeLocksWB_pid620.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-572", + "name": "I-84 at Celilo", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.64343, + "lon": -120.979, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Celilo_pid2748.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Celilo_pid2748.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-474", + "name": "I-84 at Clover Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.11459, + "lon": -117.95979, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Clover Creek EB_pid2325.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Clover Creek EB_pid2325.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1043", + "name": "I-84 at Deadman Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59977, + "lon": -118.50186, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at DeadmanPassW_pid4467.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at DeadmanPassW_pid4467.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1044", + "name": "I-84 at Deadman Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59977, + "lon": -118.50186, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at DeadmanPassE_pid4469.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at DeadmanPassE_pid4469.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-844", + "name": "I-84 at Echo", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.75381, + "lon": -119.15255, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Echo WB_pid3850.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Echo WB_pid3850.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-845", + "name": "I-84 at Echo", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.75381, + "lon": -119.15255, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Echo EB_pid3854.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Echo EB_pid3854.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-377", + "name": "I-84 at Fairview", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53891, + "lon": -122.44903, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i84@207th_pid1581.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i84@207th_pid1581.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-803", + "name": "I-84 at Farewell Bend", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.30163, + "lon": -117.2384, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Farewell Bend EB_pid3686.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Farewell Bend EB_pid3686.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-804", + "name": "I-84 at Farewell Bend", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.30163, + "lon": -117.2384, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Farewell Bend WB_pid3690.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Farewell Bend WB_pid3690.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1153", + "name": "I-84 at Farewell Bend", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.28628, + "lon": -117.21718, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Farewell Bend 353 E_pid4686.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Farewell Bend 353 E_pid4686.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1154", + "name": "I-84 at Farewell Bend", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.28628, + "lon": -117.21718, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Farewell Bend 353 W_pid4688.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Farewell Bend 353 W_pid4688.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-797", + "name": "I-84 at Gekeler", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.31147, + "lon": -118.05243, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Gekeler E_pid3659.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Gekeler E_pid3659.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-152", + "name": "I-84 at Halsey (Lower)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53213, + "lon": -122.5659, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i84halseyl_pid585.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i84halseyl_pid585.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-429", + "name": "I-84 at Hood River Exit 64 A", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.71061, + "lon": -121.50208, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Hood River Exit 64a_pid1863.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Hood River Exit 64a_pid1863.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-153", + "name": "I-84 at I-205", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53111, + "lon": -122.5658, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i84at205_pid583.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i84at205_pid583.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1065", + "name": "I-84 at Ladd Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.21363, + "lon": -118.02594, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at LaddCrk270E_pid4511.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at LaddCrk270E_pid4511.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1066", + "name": "I-84 at Ladd Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.21363, + "lon": -118.02594, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at LaddCrk270W_pid4513.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at LaddCrk270W_pid4513.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-765", + "name": "I-84 at Ladd Creek Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.18917, + "lon": -117.99389, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Ladd Creek Summit_pid3531.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Ladd Creek Summit_pid3531.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-240", + "name": "I-84 at LePage Park - John Day River", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.72919, + "lon": -120.65276, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/LePagePark-JohnDay_pid632.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/LePagePark-JohnDay_pid632.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-145", + "name": "I-84 at Lloyd Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52976, + "lon": -122.64923, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i84lloyd_pid587.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i84lloyd_pid587.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-242", + "name": "I-84 at Lorenzen Road", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.71822, + "lon": -119.01476, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/LorenzenRoad_pid635.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/LorenzenRoad_pid635.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-790", + "name": "I-84 at MP 267", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.25952, + "lon": -118.02323, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at MP 267_pid3633.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at MP 267_pid3633.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-990", + "name": "I-84 at MP309", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.72282, + "lon": -117.77275, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at MP309_pid4361.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at MP309_pid4361.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1206", + "name": "I-84 at Marine Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54446, + "lon": -122.40131, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Marine Dr_pid4785.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Marine Dr_pid4785.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1041", + "name": "I-84 at Meacham", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51322, + "lon": -118.43253, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Meacham WB MP237.10_pid4463.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Meacham WB MP237.10_pid4463.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1042", + "name": "I-84 at Meacham", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51322, + "lon": -118.43253, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Meacham EB MP237.10_pid4465.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Meacham EB MP237.10_pid4465.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1037", + "name": "I-84 at Meacham EB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47922, + "lon": -118.40119, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Meacham EB_pid4455.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Meacham EB_pid4455.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1036", + "name": "I-84 at Meacham WB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47922, + "lon": -118.40119, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Meacham WB_pid4453.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Meacham WB_pid4453.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-720", + "name": "I-84 at Medical Springs WB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.87116, + "lon": -117.81706, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Medical Springs_pid3347.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Medical Springs_pid3347.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-144", + "name": "I-84 at Metro Bldg.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52746, + "lon": -122.66069, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/i84metro_pid588.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/i84metro_pid588.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1059", + "name": "I-84 at Mission", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.60159, + "lon": -118.63999, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Mission WB_pid4499.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Mission WB_pid4499.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1060", + "name": "I-84 at Mission", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.60159, + "lon": -118.63999, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Mission EB_pid4501.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Mission EB_pid4501.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-568", + "name": "I-84 at Multnomah Falls Parking", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.57908, + "lon": -122.12074, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Multnomah Falls Parking_pid2732.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Multnomah Falls Parking_pid2732.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-487", + "name": "I-84 at North Powder", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.01481, + "lon": -117.9191, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/North Powder_pid2379.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/North Powder_pid2379.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1431", + "name": "I-84 at North Powder", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.01481, + "lon": -117.9191, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at N Powder S_pid5234.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at N Powder S_pid5234.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-953", + "name": "I-84 at OR244 Hilgard", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.34536, + "lon": -118.22511, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at ORE244 Hilgard_pid4287.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at ORE244 Hilgard_pid4287.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-794", + "name": "I-84 at Pendleton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.68691, + "lon": -118.91574, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton E_pid3650.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton E_pid3650.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-795", + "name": "I-84 at Pendleton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.68691, + "lon": -118.91574, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton W_pid3653.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton W_pid3653.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1282", + "name": "I-84 at Pendleton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.63972, + "lon": -118.68663, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton 215.85 WB_pid4934.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton 215.85 WB_pid4934.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1283", + "name": "I-84 at Pendleton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.63972, + "lon": -118.68663, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton 215.85 EB_pid4936.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton 215.85 EB_pid4936.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1284", + "name": "I-84 at Pendleton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.66151, + "lon": -118.79025, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton MP210.36 WB_pid4938.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton MP210.36 WB_pid4938.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1285", + "name": "I-84 at Pendleton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.66151, + "lon": -118.79025, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton MP210.36 EB_pid4940.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton MP210.36 EB_pid4940.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-840", + "name": "I-84 at Pendleton MP214", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.6565, + "lon": -118.7168, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton_pid3834.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton_pid3834.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-841", + "name": "I-84 at Pendleton MP214", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.6565, + "lon": -118.7168, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton MP214_pid3838.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton MP214_pid3838.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1286", + "name": "I-84 at Pendleton MP215.69", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.6418, + "lon": -118.68953, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton 215.69W_pid4942.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton 215.69W_pid4942.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1287", + "name": "I-84 at Pendleton MP215.69", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.6418, + "lon": -118.68953, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton 215.69E_pid4944.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pendleton 215.69E_pid4944.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-398", + "name": "I-84 at Plano Road Interchange", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.54953, + "lon": -117.42147, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 At Plano Road_pid1662.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 At Plano Road_pid1662.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1383", + "name": "I-84 at Pleasant Valley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.659, + "lon": -117.60101, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pleasant Valley WB_pid5138.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pleasant Valley WB_pid5138.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1384", + "name": "I-84 at Pleasant Valley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.659, + "lon": -117.60101, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Pleasant Valley EB_pid5140.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Pleasant Valley EB_pid5140.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1045", + "name": "I-84 at Poverty Flats", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58965, + "lon": -118.554, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Poverty Flats WB_pid4471.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Poverty Flats WB_pid4471.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1046", + "name": "I-84 at Poverty Flats", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58965, + "lon": -118.554, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Poverty Flats EB_pid4473.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Poverty Flats EB_pid4473.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1047", + "name": "I-84 at Poverty Flats Gate", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58327, + "lon": -118.58935, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Poverty Flats Gate_pid4475.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Poverty Flats Gate_pid4475.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1048", + "name": "I-84 at Poverty Flats Off Ramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58327, + "lon": -118.58935, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Poverty Flats Off Ramp_pid4477.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Poverty Flats Off Ramp_pid4477.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-397", + "name": "I-84 at Rye Valley Interchange", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.44522, + "lon": -117.32564, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 EB at Rye Valley_pid1661.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 EB at Rye Valley_pid1661.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-211", + "name": "I-84 at Snake River", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.00876, + "lon": -116.94171, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Snake River_pid654.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Snake River_pid654.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-849", + "name": "I-84 at Snake River", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.0084, + "lon": -116.942, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Snake River_pid3870.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Snake River_pid3870.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1040", + "name": "I-84 at Spring Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3893, + "lon": -118.31953, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Spring Creek EB_pid4461.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Spring Creek EB_pid4461.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-791", + "name": "I-84 at Stanfield", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.7602, + "lon": -119.1862, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Stanfield_pid3637.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Stanfield_pid3637.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-658", + "name": "I-84 at US97 Biggs Jct.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.6713, + "lon": -120.83428, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at US97 Biggs Jct._pid3097.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at US97 Biggs Jct._pid3097.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-210", + "name": "I-84 at Weatherby Rest Area", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.49611, + "lon": -117.3675, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Weatherby_pid657.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Weatherby_pid657.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1125", + "name": "I-84 at Wyeth Scale Ramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.68788, + "lon": -121.70189, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-84 at Wyeth Scale Ramp W_pid4630.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-84 at Wyeth Scale Ramp W_pid4630.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-942", + "name": "Idaho - I-84 at US95 Junction EB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.96971, + "lon": -116.91239, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ID I-84 at US95 Junction EB_pid4245.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ID I-84 at US95 Junction EB_pid4245.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-941", + "name": "Idaho - I-84 at US95 Junction WB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.96971, + "lon": -116.91239, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ID I-84 at US95 Junction WB_pid4241.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ID I-84 at US95 Junction WB_pid4241.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-940", + "name": "Idaho - I-84 at Black Canyon W", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.86522, + "lon": -116.77713, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ID I-84 at Black Canyon N_pid4237.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ID I-84 at Black Canyon N_pid4237.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-950", + "name": "Idaho - US95 Pavement at Midvale Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.44494, + "lon": -116.79902, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ID US95 Pavement at Midvale Hill_pid4277.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ID US95 Pavement at Midvale Hill_pid4277.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-946", + "name": "Idaho - US95 at Ion Summit NW", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.29447, + "lon": -116.98568, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US95 at Ion Summit NW_pid4261.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US95 at Ion Summit NW_pid4261.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-947", + "name": "Idaho - US95 at Ion Summit SB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.29447, + "lon": -116.98568, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US95 at Ion Summit SB_pid4265.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US95 at Ion Summit SB_pid4265.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-948", + "name": "Idaho - US95 at Midvale Hill NE", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.44494, + "lon": -116.79902, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ID US95 at Midvale Hill NE_pid4269.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ID US95 at Midvale Hill NE_pid4269.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-949", + "name": "Idaho - US95 at Midvale Hill SW", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.44494, + "lon": -116.79902, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ID US95 at Midvale Hill SW_pid4273.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ID US95 at Midvale Hill SW_pid4273.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-529", + "name": "Jackson County - Dead Indian Memorial Rd. Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.25023, + "lon": -122.50944, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Dead Indian Memorial Rd E_pid2554.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Dead Indian Memorial Rd E_pid2554.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-528", + "name": "Jackson County - Dead Indian Memorial Rd. Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.25023, + "lon": -122.50944, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Dead Indian Memorial Rd W_pid2558.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Dead Indian Memorial Rd W_pid2558.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1289", + "name": "Klamath Falls - Westside Road", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.5871, + "lon": -122.087, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Westside Road MP 6.06_pid4948.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Westside Road MP 6.06_pid4948.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-370", + "name": "Ladd Canyon at Charles Reynolds", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.23381, + "lon": -118.01328, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/LaddCreekBase_pid1554.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/LaddCreekBase_pid1554.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1456", + "name": "N Broadway at Larrabee", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53347, + "lon": -122.67141, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Broadway at Larrabee CAM231_pid5286.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Broadway at Larrabee CAM231_pid5286.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1186", + "name": "NW Murray at US26 EB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52164, + "lon": -122.81563, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NW Murray @ US26 EB_pid4746.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NW Murray @ US26 EB_pid4746.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1395", + "name": "OR11 at Crockett Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.97384, + "lon": -118.38704, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR11 at Crocket Rd N_pid5162.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR11 at Crocket Rd N_pid5162.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1396", + "name": "OR11 at Crockett Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.97384, + "lon": -118.38704, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR11 at Crocket Rd S_pid5164.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR11 at Crocket Rd S_pid5164.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1399", + "name": "OR11 at Dry Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.85519, + "lon": -118.39943, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR11 at Dry Creek NB_pid5170.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR11 at Dry Creek NB_pid5170.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1400", + "name": "OR11 at Dry Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.85519, + "lon": -118.39943, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR11 at Dry Creek SB_pid5172.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR11 at Dry Creek SB_pid5172.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-851", + "name": "OR11 at OR204", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.83558, + "lon": -118.42187, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE11 at OR204 EB_pid3878.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE11 at OR204 EB_pid3878.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-852", + "name": "OR11 at OR204", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.83558, + "lon": -118.42187, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE11 at OR204 NB_pid3882.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE11 at OR204 NB_pid3882.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-853", + "name": "OR11 at OR204", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.83558, + "lon": -118.42187, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE11 at OR204 WB_pid3886.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE11 at OR204 WB_pid3886.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-912", + "name": "OR126 at 52nd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05551, + "lon": -122.93822, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-105 at 52nd_pid4125.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-105 at 52nd_pid4125.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1086", + "name": "OR126 at 52nd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05551, + "lon": -122.93822, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/I-105 at 52nd E_pid4552.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/I-105 at 52nd E_pid4552.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1089", + "name": "OR126 at Central Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05271, + "lon": -123.29306, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE126 at Central Rd EB_pid4558.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE126 at Central Rd EB_pid4558.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1090", + "name": "OR126 at Central Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05271, + "lon": -123.29306, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE126 at Central Rd WB_pid4560.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE126 at Central Rd WB_pid4560.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-548", + "name": "OR126 at Cushman", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.98504, + "lon": -124.04531, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE126 at Cushman_pid2651.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE126 at Cushman_pid2651.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1363", + "name": "OR126 at Green Hill Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05161, + "lon": -123.20831, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR569 at Green Hill Rd EB_pid5094.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR569 at Green Hill Rd EB_pid5094.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-902", + "name": "OR126 at McKenzie", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.17278, + "lon": -122.22689, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE126 at McKenzie E_pid4085.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE126 at McKenzie E_pid4085.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-903", + "name": "OR126 at McKenzie", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.17278, + "lon": -122.22689, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE126 at McKenzie W_pid4089.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE126 at McKenzie W_pid4089.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1278", + "name": "OR126 at Powell Butte", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.24872, + "lon": -121.0503, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR126 at Powell Butte WB Hwy MP6.72_pid4926.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR126 at Powell Butte WB Hwy MP6.72_pid4926.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1279", + "name": "OR126 at Powell Butte", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.24872, + "lon": -121.0503, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR126 at Powell Butte EB Hwy MP6.72_pid4928.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR126 at Powell Butte EB Hwy MP6.72_pid4928.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-928", + "name": "OR126 at Territorial Hwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05431, + "lon": -123.35205, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE126 at Territorial Hwy EB_pid4187.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE126 at Territorial Hwy EB_pid4187.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1194", + "name": "OR126 at Walterville", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.06875, + "lon": -122.8036, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR126 at Walterville_pid4761.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR126 at Walterville_pid4761.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1195", + "name": "OR126 at Walterville", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.06875, + "lon": -122.8036, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR126 at Walterville WB_pid4763.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR126 at Walterville WB_pid4763.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-842", + "name": "OR126 at Walton (Cougar/Badger Pass)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05435, + "lon": -123.53312, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE126 at Veneta_pid3842.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE126 at Veneta_pid3842.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-843", + "name": "OR126 at Walton (Cougar/Badger Pass)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05435, + "lon": -123.53312, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE126 at Veneta_pid3846.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE126 at Veneta_pid3846.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-438", + "name": "OR126 – Highland Ave at SW 5th St ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.26955, + "lon": -121.17324, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Redmond Highland_pid1893.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Redmond Highland_pid1893.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1168", + "name": "OR127 Cornelius Pass at MP3.08", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.61368, + "lon": -122.8592, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR127 Cornelius Pass MP3.08_pid4714.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR127 Cornelius Pass MP3.08_pid4714.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1169", + "name": "OR127 Cornelius Pass at MP3.08", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.61368, + "lon": -122.8592, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR127 Cornelius Pass MP3.08 S_pid4716.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR127 Cornelius Pass MP3.08 S_pid4716.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-412", + "name": "OR132 Delta Hwy Near Valley River", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.07646, + "lon": -123.10578, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Delta Hwy at Valley River_pid1754.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Delta Hwy at Valley River_pid1754.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-407", + "name": "OR132 Delta Hwy Near Woodfield ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.07491, + "lon": -123.10485, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Delta Hwy_pid1732.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Delta Hwy_pid1732.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-880", + "name": "OR138 at Diamond Lake Jct", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.12657, + "lon": -122.132, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE138 at Diamond Lake Jct. W_pid3995.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE138 at Diamond Lake Jct. W_pid3995.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-538", + "name": "OR138 at Marvin Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.45884, + "lon": -123.43577, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Marvin Hill EB_pid2604.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Marvin Hill EB_pid2604.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-539", + "name": "OR138 at Marvin Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.45894, + "lon": -123.4357, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Marvin Hill WB_pid2609.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Marvin Hill WB_pid2609.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-466", + "name": "OR138 at OR230 Diamond Lake", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.12657, + "lon": -122.132, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE230 at ORE138 Diamond Lake_pid2289.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE230 at ORE138 Diamond Lake_pid2289.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-467", + "name": "OR138 at OR230 Diamond Lake", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.12657, + "lon": -122.132, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE230 at ORE138 Diamond Lake_pid2293.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE230 at ORE138 Diamond Lake_pid2293.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1236", + "name": "OR138 near US97", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.08096, + "lon": -121.82868, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR138 near US97 E_pid4844.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR138 near US97 E_pid4844.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1237", + "name": "OR138 near US97", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.08096, + "lon": -121.82868, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR138 near US97 W_pid4846.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR138 near US97 W_pid4846.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-533", + "name": "OR140 at Adel", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.17732, + "lon": -119.89586, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE140 at Adel_pid2584.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE140 at Adel_pid2584.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-465", + "name": "OR140 at Bly", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.40274, + "lon": -121.04595, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE140 at Bly_pid2285.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE140 at Bly_pid2285.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-213", + "name": "OR140 at Bly Mtn", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.35376, + "lon": -121.39835, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/BlyMtn_pid606.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/BlyMtn_pid606.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-571", + "name": "OR140 at Doak Mountain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.3516, + "lon": -121.98145, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE140 at Doak Mountain_pid2744.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE140 at Doak Mountain_pid2744.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-251", + "name": "OR140 at Lake of the Woods", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.39592, + "lon": -122.205, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/LakeoftheWoods_pid743.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/LakeoftheWoods_pid743.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1024", + "name": "OR140 at Medford Lake Creek Scales", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.43214, + "lon": -122.62033, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE140 at Medford Lake Creek Scales_pid4429.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE140 at Medford Lake Creek Scales_pid4429.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-580", + "name": "OR140 at Nevada State Line", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.00401, + "lon": -119.33521, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE140 at Nevada State Line E_pid2782.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE140 at Nevada State Line E_pid2782.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-579", + "name": "OR140 at Nevada State Line", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.00401, + "lon": -119.33521, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE140 at Nevada State Line W_pid2786.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE140 at Nevada State Line W_pid2786.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-544", + "name": "OR140 at Quartz Mountain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.32098, + "lon": -120.81385, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Quartz Mtn_pid2640.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Quartz Mtn_pid2640.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-488", + "name": "OR140 at Warner Mtn Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.23809, + "lon": -120.29421, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE140 at Warner Mtn Summit_pid2380.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE140 at Warner Mtn Summit_pid2380.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-815", + "name": "OR18 at 8th St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.27515, + "lon": -122.99959, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE18 at 8th St_pid3734.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE18 at 8th St_pid3734.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-820", + "name": "OR18 at Fernwood Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.29898, + "lon": -122.94698, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE18 at Fernwood Rd_pid3754.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE18 at Fernwood Rd_pid3754.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-814", + "name": "OR18 at Fulquartz Landing", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.27068, + "lon": -123.00905, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE18 at Fulquartz Landing_pid3730.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE18 at Fulquartz Landing_pid3730.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-279", + "name": "OR18 at Murphy Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.07213, + "lon": -123.71508, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/MurphyHill_pid643.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/MurphyHill_pid643.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1381", + "name": "OR18 at Murphy Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.07213, + "lon": -123.71508, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR18 WB at Murphy Hill_pid5134.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR18 WB at Murphy Hill_pid5134.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-169", + "name": "OR18 at OR22 - Valley Junction", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.06205, + "lon": -123.56799, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ValleyJunction_pid656.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ValleyJunction_pid656.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-816", + "name": "OR18 at Waterfront St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.28478, + "lon": -122.97925, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE18 at Waterfront St_pid3738.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE18 at Waterfront St_pid3738.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-817", + "name": "OR18 at Wynooski Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.29061, + "lon": -122.96061, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE18 at Wynooski Rd_pid3742.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE18 at Wynooski Rd_pid3742.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1397", + "name": "OR201 at Adrian", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.73263, + "lon": -117.07495, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR201 at Adrian NB_pid5166.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR201 at Adrian NB_pid5166.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1398", + "name": "OR201 at Adrian", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.73263, + "lon": -117.07495, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR201 at Adrian SB_pid5168.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR201 at Adrian SB_pid5168.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-802", + "name": "OR201 at Weiser", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.21619, + "lon": -116.98683, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE201 at Weiser_pid3682.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE201 at Weiser_pid3682.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-858", + "name": "OR201N at I-84 EB Onramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.25949, + "lon": -117.17915, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE201N at I-84 EB Onramp_pid3907.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE201N at I-84 EB Onramp_pid3907.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-800", + "name": "OR201N at I-84 WB Onramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.25949, + "lon": -117.17915, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE201N at I-84 WB Onramp_pid3674.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE201N at I-84 WB Onramp_pid3674.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1446", + "name": "OR203 at Catherine Creek Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.09741, + "lon": -117.67024, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR203 @ Catherine Creek Summit SB MP14.05_pid5264.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR203 @ Catherine Creek Summit SB MP14.05_pid5264.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1447", + "name": "OR203 at Catherine Creek Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.09741, + "lon": -117.67024, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR203 at Catherine Creek Summit NB MP14.05_pid5266.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR203 at Catherine Creek Summit NB MP14.05_pid5266.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-978", + "name": "OR204 at Elgin", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56777, + "lon": -117.94508, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE204 at Elgin_pid4337.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE204 at Elgin_pid4337.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1061", + "name": "OR204 at Spout Springs", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.75706, + "lon": -118.05435, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE204 at Spout Springs_pid4503.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE204 at Spout Springs_pid4503.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1111", + "name": "OR204 at Spout Springs", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.75706, + "lon": -118.05435, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE204 at Spout Springs WB_pid4602.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE204 at Spout Springs WB_pid4602.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1015", + "name": "OR204 at Tollgate", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.78543, + "lon": -118.10945, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE204 at Tollgate_pid4411.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE204 at Tollgate_pid4411.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-767", + "name": "OR204 at Tollgate Sand Shed", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.79015, + "lon": -118.24599, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE204 at Tollgate Sand Shed_pid3541.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE204 at Tollgate Sand Shed_pid3541.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-360", + "name": "OR205 at Frenchglen", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.82738, + "lon": -118.9148, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR205 at Frenchglen_pid5188.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR205 at Frenchglen_pid5188.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1426", + "name": "OR207 at OHV Park", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.0263, + "lon": -119.67786, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR207 at OHV Park SB MP21.72_pid5223.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR207 at OHV Park SB MP21.72_pid5223.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1427", + "name": "OR207 at OHV Park", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.0263, + "lon": -119.67786, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR207 at OHV Park NB MP21.72_pid5225.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR207 at OHV Park NB MP21.72_pid5225.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-798", + "name": "OR213 at Beavercreek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33168, + "lon": -122.5747, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at Beavercreek_pid3666.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at Beavercreek_pid3666.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1105", + "name": "OR214 at Silver Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.8535, + "lon": -122.66132, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR214 at Silver CrE_pid4590.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR214 at Silver CrE_pid4590.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1104", + "name": "OR214 at Silver Ridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.85368, + "lon": -122.66202, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR214 at Silver CrW_pid4588.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR214 at Silver CrW_pid4588.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-157", + "name": "OR217 at Allen", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47911, + "lon": -122.79119, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/217allen_pid404.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/217allen_pid404.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-158", + "name": "OR217 at Denney", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47169, + "lon": -122.78583, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/217denney_pid516.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/217denney_pid516.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-161", + "name": "OR217 at Greenburg", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44269, + "lon": -122.77623, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/217green_pid517.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/217green_pid517.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-159", + "name": "OR217 at Hall", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46386, + "lon": -122.78636, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/217hall_pid519.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/217hall_pid519.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1182", + "name": "OR217 at OR99W", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43486, + "lon": -122.76224, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR217 at OR99W SB_pid4738.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR217 at OR99W SB_pid4738.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-160", + "name": "OR217 at Scholls Ferry Road", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45054, + "lon": -122.78461, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/217scholls_pid520.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/217scholls_pid520.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-156", + "name": "OR217 at Tualatin Valley Hwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49098, + "lon": -122.79244, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/217tv_pid521.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/217tv_pid521.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-155", + "name": "OR217 at Walker", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49919, + "lon": -122.79147, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/217walker_pid522.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/217walker_pid522.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-722", + "name": "OR218 at Prindle Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.93972, + "lon": -120.23159, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE218 at Prindle Hill_pid3355.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE218 at Prindle Hill_pid3355.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1121", + "name": "OR219 at Chehalem Mt.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.35468, + "lon": -122.96428, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE219 at Chehalem N_pid4622.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE219 at Chehalem N_pid4622.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1122", + "name": "OR219 at Chehalem Mt.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.35468, + "lon": -122.96428, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE219 at Chehalem S_pid4624.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE219 at Chehalem S_pid4624.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-818", + "name": "OR219 at OR18", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.29023, + "lon": -122.94748, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE219 at ORE18_pid3746.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE219 at ORE18_pid3746.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-819", + "name": "OR219 at Springbrook Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.29354, + "lon": -122.94956, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE219 at Springbrook Rd_pid3750.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE219 at Springbrook Rd_pid3750.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1468", + "name": "OR219 at Woodland Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.15088, + "lon": -122.88596, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR219 at Woodland Ave_pid5310.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR219 at Woodland Ave_pid5310.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-859", + "name": "OR22 at Butler Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.00737, + "lon": -123.38765, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE22 at Butler Hill EB_pid3911.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE22 at Butler Hill EB_pid3911.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-860", + "name": "OR22 at Butler Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.00737, + "lon": -123.38765, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE22 at Butler HillWB_pid3915.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE22 at Butler HillWB_pid3915.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1083", + "name": "OR22 at Cordon Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.90781, + "lon": -122.96394, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE22 at Cordon Rd EB_pid4547.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE22 at Cordon Rd EB_pid4547.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1084", + "name": "OR22 at Cordon Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.90781, + "lon": -122.96394, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE22 at Cordon Rd WB_pid4549.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE22 at Cordon Rd WB_pid4549.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-221", + "name": "OR22 at Detroit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.72616, + "lon": -122.13563, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Detroit1_pid622.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Detroit1_pid622.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-463", + "name": "OR22 at Detroit Ranger Station", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.7326, + "lon": -122.16974, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR22 at Detroit Ranger Station_pid2277.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR22 at Detroit Ranger Station_pid2277.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1030", + "name": "OR22 at Eola EB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.93047, + "lon": -123.11436, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE22 at Eola EB_pid4441.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE22 at Eola EB_pid4441.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1031", + "name": "OR22 at Eola WB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.93047, + "lon": -123.11436, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE22 at Eola B_pid4443.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE22 at Eola B_pid4443.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-855", + "name": "OR22 at OSCI Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.88624, + "lon": -122.92135, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE22 at OSCI Hill WB_pid3894.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE22 at OSCI Hill WB_pid3894.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-856", + "name": "OR22 at OSCI Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.88624, + "lon": -122.92135, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE22 at OSCI Hill EB_pid3898.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE22 at OSCI Hill EB_pid3898.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-632", + "name": "OR22 at Santiam Park", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.77653, + "lon": -122.56339, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE22 at Santiam Park EB_pid2993.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE22 at Santiam Park EB_pid2993.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-633", + "name": "OR22 at Santiam Park", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.77653, + "lon": -122.56339, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE22 at Santiam Park WB_pid2997.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE22 at Santiam Park WB_pid2997.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-641", + "name": "OR221 at Glen Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.95025, + "lon": -123.0515, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE221 at Glenn Creek_pid3029.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE221 at Glenn Creek_pid3029.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-642", + "name": "OR221 at Orchard Heights", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.95327, + "lon": -123.05269, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE221 at Orchard Heights_pid3033.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE221 at Orchard Heights_pid3033.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-904", + "name": "OR222 EB at I-5 NB Ramps", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.9181, + "lon": -123.01488, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE222 EB at I-5 SB Ramps_pid4093.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE222 EB at I-5 SB Ramps_pid4093.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-830", + "name": "OR224 a Harrison St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44666, + "lon": -122.63218, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE 224 a Harrison St_pid3794.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE 224 a Harrison St_pid3794.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1167", + "name": "OR224 at 122nd Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.408, + "lon": -122.53763, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE224 at 122nd Ave_pid4712.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE224 at 122nd Ave_pid4712.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-832", + "name": "OR224 at 135th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41047, + "lon": -122.5246, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE224 at 135th Ave_pid3802.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE224 at 135th Ave_pid3802.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1175", + "name": "OR224 at Evelyn St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40766, + "lon": -122.55849, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR224 a Evelyn St E_pid4728.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR224 a Evelyn St E_pid4728.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-854", + "name": "OR224 at Harmony Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43004, + "lon": -122.6057, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE224 at Harmony Rd_pid3890.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE224 at Harmony Rd_pid3890.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-829", + "name": "OR224 at Johnson Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42245, + "lon": -122.58203, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE 224 at Johnson Rd_pid3790.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE 224 at Johnson Rd_pid3790.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1196", + "name": "OR224 at OR213", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42203, + "lon": -122.57699, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR224 at OR213 WB_pid4765.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR224 at OR213 WB_pid4765.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-831", + "name": "OR224 at ORE212 ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40947, + "lon": -122.50491, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE224 at OR212_pid3798.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE224 at OR212_pid3798.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-951", + "name": "OR225 at 30th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.01348, + "lon": -123.02454, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE225 at 30th Ave_pid4281.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE225 at 30th Ave_pid4281.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-450", + "name": "OR238 at Jacksonville Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.29126, + "lon": -122.99404, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Jacksonville Hill WB_pid1977.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Jacksonville Hill WB_pid1977.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1460", + "name": "OR238 at Jacksonville Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.29126, + "lon": -122.99404, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR238 at Jacksonville Hill WB_pid5294.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR238 at Jacksonville Hill WB_pid5294.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1387", + "name": "OR244 at Ukiah-Hilgard Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.18369, + "lon": -118.52995, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR244 at Ukiah-Hilgard Summit EB_pid5146.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR244 at Ukiah-Hilgard Summit EB_pid5146.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1388", + "name": "OR244 at Ukiah-Hilgard Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.18369, + "lon": -118.52995, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR244 at Ukiah-Hilgard Summit WB_pid5148.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR244 at Ukiah-Hilgard Summit WB_pid5148.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1413", + "name": "OR245 at Dooley Mtn", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.57281, + "lon": -117.83901, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR245 @ Dooley Mtn N_pid5197.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR245 @ Dooley Mtn N_pid5197.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1414", + "name": "OR245 at Dooley Mtn", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.57281, + "lon": -117.83901, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR245 @ Dooley Mtn S_pid5199.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR245 @ Dooley Mtn S_pid5199.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1140", + "name": "OR3 at Flora MP 9.4", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.89137, + "lon": -117.26252, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE3 at Flora MP9.4_pid4660.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE3 at Flora MP9.4_pid4660.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-191", + "name": "OR31 at Paisley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.69282, + "lon": -120.54261, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Paisley_pid2415.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Paisley_pid2415.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1095", + "name": "OR31 at Silver Lake MP47.3", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.128, + "lon": -121.05044, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SWZT011 - Trailer K_pid4570.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SWZT011 - Trailer K_pid4570.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1288", + "name": "OR331 at Pendleton MP4.6", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.63716, + "lon": -118.6838, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR331 at Pendleton MP4.6 I-84 MP216E_pid4946.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR331 at Pendleton MP4.6 I-84 MP216E_pid4946.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1096", + "name": "OR34 at Columbus", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.55599, + "lon": -123.08273, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE34 at Columbus EB_pid4572.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE34 at Columbus EB_pid4572.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1097", + "name": "OR34 at Columbus", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.55599, + "lon": -123.08273, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE34 at Columbus WB_pid4574.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE34 at Columbus WB_pid4574.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-861", + "name": "OR34 at Peoria Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.5637, + "lon": -123.23519, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE34 at Peoria Rd EB_pid3919.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE34 at Peoria Rd EB_pid3919.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-850", + "name": "OR35 at Meadows Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.31122, + "lon": -121.64452, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE35 at Meadows Dr SB_pid3874.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE35 at Meadows Dr SB_pid3874.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-911", + "name": "OR35 at Parkdale Maint", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51753, + "lon": -121.56578, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE35 at Parkdale Maint SB_pid4121.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE35 at Parkdale Maint SB_pid4121.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-485", + "name": "OR370 at Lone Pine Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.33085, + "lon": -121.08852, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE370 at Lone Pine Rd_pid2369.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE370 at Lone Pine Rd_pid2369.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-486", + "name": "OR370 at Lone Pine Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.33085, + "lon": -121.08852, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE370 at Lone Pine Rd._pid2373.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE370 at Lone Pine Rd._pid2373.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1109", + "name": "OR38 at Scottsburg ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.65537, + "lon": -123.82343, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE38 at ScottsburgW_pid4598.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE38 at ScottsburgW_pid4598.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1110", + "name": "OR38 at Scottsburg ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.65537, + "lon": -123.82343, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE38 at ScottsburgE_pid4600.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE38 at ScottsburgE_pid4600.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-615", + "name": "OR38 at Wells Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.67491, + "lon": -123.80364, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Hwy38 at Wells Creek_pid2928.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Hwy38 at Wells Creek_pid2928.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-492", + "name": "OR42 at Camas Mountain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.0652, + "lon": -123.64956, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE42 at Camas Mountain_pid2396.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE42 at Camas Mountain_pid2396.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-493", + "name": "OR42 at Camas Mountain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.0652, + "lon": -123.64956, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE42 at Camas Mountain_pid2400.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE42 at Camas Mountain_pid2400.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-516", + "name": "OR42 at Coos County Line", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.96334, + "lon": -123.84756, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE42 at Coos County Line_pid2502.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE42 at Coos County Line_pid2502.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-828", + "name": "OR42 at Coos County Line", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.96334, + "lon": -123.84756, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE42 at Coos County Line_pid3786.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE42 at Coos County Line_pid3786.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-480", + "name": "OR42 at Coquille", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.17426, + "lon": -124.19721, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE42 at Coquille_pid2353.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE42 at Coquille_pid2353.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-531", + "name": "OR42 at Coquille", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.17426, + "lon": -124.19717, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE42 at Coquille S_pid2576.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE42 at Coquille S_pid2576.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-969", + "name": "OR42 at OR542 (Powers Jct.)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.03214, + "lon": -124.11289, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE42 at ORE542 (Powers Jct.) EB_pid4319.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE42 at ORE542 (Powers Jct.) EB_pid4319.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-970", + "name": "OR42 at OR542 (Powers Jct.)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.03214, + "lon": -124.11289, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE42 at ORE542 (Powers Jct.) WB_pid4321.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE42 at ORE542 (Powers Jct.) WB_pid4321.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1098", + "name": "OR47 at Stub Stewart Park", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.73924, + "lon": -123.19938, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE47 at Stub Stewart Park SB_pid4576.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE47 at Stub Stewart Park SB_pid4576.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1149", + "name": "OR551 at Ehlen Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.23069, + "lon": -122.7745, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE551 at Ehlen Rd S_pid4678.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE551 at Ehlen Rd S_pid4678.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1150", + "name": "OR551 at Ehlen Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.23069, + "lon": -122.7745, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE551 at Ehlen Rd N_pid4680.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE551 at Ehlen Rd N_pid4680.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-369", + "name": "OR569 Beltline Near NW Expressway", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.09774, + "lon": -123.14498, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/EugeneBeltline_pid1523.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/EugeneBeltline_pid1523.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-400", + "name": "OR569 Beltline at Coburg Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.08781, + "lon": -123.06726, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE569 at Coburg Rd_pid1672.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE569 at Coburg Rd_pid1672.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-388", + "name": "OR569 Beltline at Delta Hwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.09182, + "lon": -123.09888, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE569WBatDeltaHwy_pid1613.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE569WBatDeltaHwy_pid1613.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-525", + "name": "OR569 Beltline at River Ave.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.09619, + "lon": -123.10897, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Eugene River Ave._pid2539.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Eugene River Ave._pid2539.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-431", + "name": "OR569 Beltline at River Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.09718, + "lon": -123.12807, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Beltline at River Rd_pid1869.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Beltline at River Rd_pid1869.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1377", + "name": "OR569 at Barger Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.08476, + "lon": -123.17214, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR569 at Barger Dr_pid5126.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR569 at Barger Dr_pid5126.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1365", + "name": "OR569 at OR126/W 11th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.04801, + "lon": -123.17315, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR569 at OR126 W 11thEB_pid5106.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR569 at OR126 W 11thEB_pid5106.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1366", + "name": "OR569 at OR126/W 11th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.04801, + "lon": -123.17315, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR569 at OR126 W 11th WB_pid5108.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR569 at OR126 W 11th WB_pid5108.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1376", + "name": "OR569 at OR99", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.09658, + "lon": -123.1663, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR569 at OR99_pid5124.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR569 at OR99_pid5124.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1369", + "name": "OR569 at Roosevelt Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.0648, + "lon": -123.17338, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR569 at Roosevelt Blvd SB_pid5110.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR569 at Roosevelt Blvd SB_pid5110.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1370", + "name": "OR569 at Roosevelt Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.0648, + "lon": -123.17338, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR569 at Roosevelt Blvd NB_pid5112.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR569 at Roosevelt Blvd NB_pid5112.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1118", + "name": "OR58 EB at MP0.86", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.99247, + "lon": -122.99438, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE58 EB MP0.86_pid4616.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE58 EB MP0.86_pid4616.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1117", + "name": "OR58 at MP0.86", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.99247, + "lon": -122.99438, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE58 WB MP0.86_pid4614.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE58 WB MP0.86_pid4614.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-639", + "name": "OR58 at Salt Creek Tunnel", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.61698, + "lon": -122.13565, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE58 at Salt Creek Tunnel WB_pid3021.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE58 at Salt Creek Tunnel WB_pid3021.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-640", + "name": "OR58 at Salt Creek Tunnel", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.61698, + "lon": -122.13565, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE58 at Salt Creek Tunnel EB_pid3025.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE58 at Salt Creek Tunnel EB_pid3025.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-207", + "name": "OR58 at Willamette Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.59702, + "lon": -122.03383, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/WillamettePass_pid658.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/WillamettePass_pid658.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-721", + "name": "OR58 at Willamette Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.59702, + "lon": -122.03386, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Willamette Pass_pid3351.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Willamette Pass_pid3351.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1009", + "name": "OR6 at Fairview WB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46689, + "lon": -123.75859, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE6 at Fairview WB_pid4399.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE6 at Fairview WB_pid4399.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1087", + "name": "OR6 at Gales Creek Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.61255, + "lon": -123.24407, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE6 at Gales Creek Rd_pid4554.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE6 at Gales Creek Rd_pid4554.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-395", + "name": "OR6 at Lees Camp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58953, + "lon": -123.53511, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Lees Camp_pid1655.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Lees Camp_pid1655.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1008", + "name": "OR6 at Olsen Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46213, + "lon": -123.79162, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE6 at Olsen Rd EB_pid4397.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE6 at Olsen Rd EB_pid4397.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1135", + "name": "OR62 at Commerce Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.37071, + "lon": -122.86476, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE62 at Commerce Dr_pid4650.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE62 at Commerce Dr_pid4650.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-876", + "name": "OR62 at Delta Waters", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.35945, + "lon": -122.86157, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE62 at Delta Waters_pid3979.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE62 at Delta Waters_pid3979.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1136", + "name": "OR62 at Fowler Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.41214, + "lon": -122.85584, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE62 at Fowler Dr_pid4652.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE62 at Fowler Dr_pid4652.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1138", + "name": "OR62 at Gregory Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.41003, + "lon": -122.86373, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE62 at Gregory Rd_pid4656.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE62 at Gregory Rd_pid4656.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1091", + "name": "OR62 at Linn Rd Eagle Point ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.47253, + "lon": -122.81178, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE62 at Linn Rd Eagle Point SB_pid4562.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE62 at Linn Rd Eagle Point SB_pid4562.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1092", + "name": "OR62 at Linn Rd Eagle Point ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.47252, + "lon": -122.81181, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE62 at Linn Rd Eagle Point NB_pid4564.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE62 at Linn Rd Eagle Point NB_pid4564.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1032", + "name": "OR62 at OR140 (Leigh Way)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.42314, + "lon": -122.8514, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE62 at ORE140 (Leigh Way)_pid4445.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE62 at ORE140 (Leigh Way)_pid4445.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-788", + "name": "OR62 at Poplar", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.35434, + "lon": -122.87024, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE62 at Poplar_pid3625.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE62 at Poplar_pid3625.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1131", + "name": "OR62 at Rogue Valley Mall Ent ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.34643, + "lon": -122.88103, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE62 at Rogue Valley Mall Ent_pid4642.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE62 at Rogue Valley Mall Ent_pid4642.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-613", + "name": "OR62 at Union Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.90696, + "lon": -122.4447, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE62 at Union Creek_pid2920.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE62 at Union Creek_pid2920.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1139", + "name": "OR62 at Vilas Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.38967, + "lon": -122.86539, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE62 at Vilas Rd_pid4658.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE62 at Vilas Rd_pid4658.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1385", + "name": "OR66 Green Springs Hwy at OR140", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.19105, + "lon": -121.80386, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR66 Green Springs Hwy at OR140_pid5142.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR66 Green Springs Hwy at OR140_pid5142.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-757", + "name": "OR7 at Sumpter", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.71702, + "lon": -118.16314, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE7 at Sumpter_pid3499.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE7 at Sumpter_pid3499.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1448", + "name": "OR78 at Folly Farm", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.09677, + "lon": -118.22841, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR78 at Folly Farm EB MP60.88_pid5268.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR78 at Folly Farm EB MP60.88_pid5268.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1449", + "name": "OR78 at Folly Farm", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.09677, + "lon": -118.22841, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR78 at Folly Farm WB MP60.88_pid5270.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR78 at Folly Farm WB MP60.88_pid5270.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-960", + "name": "OR8 (TV Hwy) at Brookwood Ave ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50061, + "lon": -122.93121, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE8 (TV Hwy) at Brookwood Ave_pid4301.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE8 (TV Hwy) at Brookwood Ave_pid4301.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-945", + "name": "OR8 at 185th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49421, + "lon": -122.86742, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE8 at 185th Ave_pid4257.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE8 at 185th Ave_pid4257.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-944", + "name": "OR8 at Cornelius Pass Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49738, + "lon": -122.90235, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE8 at Cornelius Pass Rd_pid4253.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE8 at Cornelius Pass Rd_pid4253.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1442", + "name": "OR8 at Murray Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48944, + "lon": -122.82634, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR8 at Murray Blvd_pid5256.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR8 at Murray Blvd_pid5256.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1444", + "name": "OR82 at Minam Big Canyon", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.62017, + "lon": -117.70135, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR82 at Minam EB MP34.9_pid5260.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR82 at Minam EB MP34.9_pid5260.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1445", + "name": "OR82 at Minam Big Canyon", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.62017, + "lon": -117.70135, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR82 at Minam WB MP34.9_pid5262.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR82 at Minam WB MP34.9_pid5262.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1027", + "name": "OR82 at Minam Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.60168, + "lon": -117.76889, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE82 at Minam Summit_pid4435.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE82 at Minam Summit_pid4435.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1108", + "name": "OR82 at Minam Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.60168, + "lon": -117.76889, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE82 at Minam Summit W_pid4596.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE82 at Minam Summit W_pid4596.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1393", + "name": "OR86 at Halfway Valley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.83517, + "lon": -117.11848, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR86 at Halfway Valley WB_pid5158.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR86 at Halfway Valley WB_pid5158.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1394", + "name": "OR86 at Halfway Valley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.83517, + "lon": -117.11848, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR86 at Halfway Valley EB_pid5160.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR86 at Halfway Valley EB_pid5160.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1170", + "name": "OR99E at MP0.42", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.64168, + "lon": -123.06632, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR99E NB @ MP.42_pid4718.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR99E NB @ MP.42_pid4718.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1171", + "name": "OR99E at MP0.42", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.64168, + "lon": -123.06632, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR99E SB @ MP.42_pid4720.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR99E SB @ MP.42_pid4720.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-846", + "name": "OR99W at 2nd St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.2093, + "lon": -123.19797, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at 2nd St NB_pid3858.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at 2nd St NB_pid3858.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-847", + "name": "OR99W at 2nd St ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.2093, + "lon": -123.19911, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at 2nd St SB_pid3862.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at 2nd St SB_pid3862.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1141", + "name": "OR99W at 5th St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.2797, + "lon": -123.00922, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at 5th St_pid4662.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at 5th St_pid4662.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-686", + "name": "OR99W at Brier", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47321, + "lon": -122.67916, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at Brier_pid3205.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at Brier_pid3205.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-453", + "name": "OR99W at Durham Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40467, + "lon": -122.79668, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR99W at Durham Rd_pid2107.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR99W at Durham Rd_pid2107.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-954", + "name": "OR99W at HWY36 Junction City", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.193, + "lon": -123.20272, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at HWY36 Junction City_pid4289.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at HWY36 Junction City_pid4289.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1410", + "name": "OR99W at Home Acres Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.29607, + "lon": -122.9896, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR99W at Home Acres Rd SB_pid5193.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR99W at Home Acres Rd SB_pid5193.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1412", + "name": "OR99W at Home Acres Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.29607, + "lon": -122.9896, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR99W at Home Acres Rd NB_pid5195.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR99W at Home Acres Rd NB_pid5195.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1450", + "name": "OR99W at Lafayette Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.22934, + "lon": -123.17097, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR99W SB @ Lafayette_pid5272.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR99W SB @ Lafayette_pid5272.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-452", + "name": "OR99W at McDonald", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41855, + "lon": -122.78765, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR99W at McDonald_pid2110.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR99W at McDonald_pid2110.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-668", + "name": "OR99W at Meineke Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36081, + "lon": -122.85635, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at Meineke Rd_pid3137.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at Meineke Rd_pid3137.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-813", + "name": "OR99W at OR18", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.26995, + "lon": -123.01805, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at ORE18_pid3726.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at ORE18_pid3726.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-892", + "name": "OR99W at Rex Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.32243, + "lon": -122.89461, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at Rex Hill_pid4043.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at Rex Hill_pid4043.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-893", + "name": "OR99W at Rex Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.32243, + "lon": -122.89461, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at Rex Hill N_pid4047.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at Rex Hill N_pid4047.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-667", + "name": "OR99W at SW Edy Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36646, + "lon": -122.84804, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR99W at SW Edy Rd_pid3133.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR99W at SW Edy Rd_pid3133.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-821", + "name": "OR99W at Springbrook Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3064, + "lon": -122.94658, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at Springbrook Rd_pid3758.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at Springbrook Rd_pid3758.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-669", + "name": "OR99W at Sunset Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.35319, + "lon": -122.86803, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at Sunset Blvd_pid3141.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at Sunset Blvd_pid3141.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-666", + "name": "OR99W at Tualatin Sherwood", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36988, + "lon": -122.84311, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR99W at Tualatin Sherwood_pid3129.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR99W at Tualatin Sherwood_pid3129.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-394", + "name": "ORE38 at Elkton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.63467, + "lon": -123.56367, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Elkton_pid1652.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Elkton_pid1652.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-927", + "name": "Oakridge - OR58 at Crestview St.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.74461, + "lon": -122.46713, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE58 at Crestview E_pid4183.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE58 at Crestview E_pid4183.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1494", + "name": "Portand - NE Vancouver St at NE Russell", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54107, + "lon": -122.66801, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Vancouver St at NE Russell CAM246_pid5367.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Vancouver St at NE Russell CAM246_pid5367.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-676", + "name": "Portland - 11th at Milwaukie N", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50329, + "lon": -122.65457, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/11th at Milwaukie N_pid3169.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/11th at Milwaukie N_pid3169.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-677", + "name": "Portland - 11th at Milwaukie S", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50314, + "lon": -122.65414, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/11th at Milwaukie S_pid3173.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/11th at Milwaukie S_pid3173.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-678", + "name": "Portland - 12th at Clinton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5036, + "lon": -122.65381, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/12th at Clinton_pid3177.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/12th at Clinton_pid3177.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-679", + "name": "Portland - 12th at Division", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50494, + "lon": -122.6536, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/12th at Division_pid3181.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/12th at Division_pid3181.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-680", + "name": "Portland - 4th at Lincoln", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50816, + "lon": -122.68207, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/4th at Lincoln_pid3185.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/4th at Lincoln_pid3185.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-562", + "name": "Portland - 82nd Ave at Division St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5048, + "lon": -122.57866, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at Division St_pid2684.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at Division St_pid2684.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-557", + "name": "Portland - 82nd Ave at Duke St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47586, + "lon": -122.57902, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at Duke St_pid2688.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at Duke St_pid2688.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-558", + "name": "Portland - 82nd Ave at Foster Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48278, + "lon": -122.57889, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at Foster Rd_pid2692.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at Foster Rd_pid2692.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-564", + "name": "Portland - 82nd Ave at Glisan St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52638, + "lon": -122.57903, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at Glisan St_pid2696.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at Glisan St_pid2696.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-560", + "name": "Portland - 82nd Ave at Powell Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49743, + "lon": -122.57875, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at Powell Blvd E_pid2704.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at Powell Blvd E_pid2704.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-559", + "name": "Portland - 82nd Ave at Powell Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49743, + "lon": -122.57875, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at Powell Blvd N_pid2708.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at Powell Blvd N_pid2708.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-565", + "name": "Portland - 82nd Ave at Sandy Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55242, + "lon": -122.57867, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at Sandy Blvd_pid2712.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at Sandy Blvd_pid2712.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-556", + "name": "Portland - 82nd Ave at Springwater", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46444, + "lon": -122.57903, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at Springwater_pid2716.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at Springwater_pid2716.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-563", + "name": "Portland - 82nd Ave at Washington St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51839, + "lon": -122.57899, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at Washington St_pid2720.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at Washington St_pid2720.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-561", + "name": "Portland - 82nd Ave at Woodward St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50131, + "lon": -122.57873, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE213 at Woodward St_pid2724.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE213 at Woodward St_pid2724.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-681", + "name": "Portland - 8th at Division", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50573, + "lon": -122.65745, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/8th at Division_pid3189.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/8th at Division_pid3189.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-682", + "name": "Portland - 8th at Division Place", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50476, + "lon": -122.65796, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/8th at Division Place_pid3193.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/8th at Division Place_pid3193.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1224", + "name": "Portland - Division at 101st", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50432, + "lon": -122.55957, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Division at 101st_pid4821.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Division at 101st_pid4821.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1255", + "name": "Portland - Division at 104th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50436, + "lon": -122.55639, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 104th_pid4881.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 104th_pid4881.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1225", + "name": "Portland - Division at 115th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50417, + "lon": -122.5448, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Division at 115th_pid4823.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Division at 115th_pid4823.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1226", + "name": "Portland - Division at 119th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50412, + "lon": -122.5409, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Division at 119th_pid4825.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Division at 119th_pid4825.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1242", + "name": "Portland - Division at 125th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50402, + "lon": -122.53478, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 125th_pid4856.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 125th_pid4856.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1250", + "name": "Portland - Division at 12th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50493, + "lon": -122.65372, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 12th_pid4871.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 12th_pid4871.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1243", + "name": "Portland - Division at 130th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50405, + "lon": -122.52996, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 130th_pid4858.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 130th_pid4858.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1256", + "name": "Portland - Division at 136th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50409, + "lon": -122.52368, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 136th_pid4883.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 136th_pid4883.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1257", + "name": "Portland - Division at 139th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5041, + "lon": -122.52096, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 139th_pid4885.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 139th_pid4885.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1246", + "name": "Portland - Division at 152nd ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50429, + "lon": -122.507, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 152nd_pid4863.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 152nd_pid4863.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1258", + "name": "Portland - Division at 154th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50434, + "lon": -122.50513, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 154th_pid4887.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 154th_pid4887.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1259", + "name": "Portland - Division at 160th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50449, + "lon": -122.49856, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 160th_pid4889.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 160th_pid4889.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1247", + "name": "Portland - Division at 162nd NWC ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50462, + "lon": -122.49673, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 162nd NWC_pid4865.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 162nd NWC_pid4865.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1248", + "name": "Portland - Division at 162nd SWC ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5045, + "lon": -122.49672, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 162nd SWC_pid4867.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 162nd SWC_pid4867.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1260", + "name": "Portland - Division at 166th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5046, + "lon": -122.49157, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 166th_pid4891.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 166th_pid4891.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1249", + "name": "Portland - Division at 174th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50465, + "lon": -122.48467, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 174th_pid4869.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 174th_pid4869.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1217", + "name": "Portland - Division at 20th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50483, + "lon": -122.64507, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Division at 20th_pid4807.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Division at 20th_pid4807.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1218", + "name": "Portland - Division at 26th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50481, + "lon": -122.63961, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Division at 26th_pid4809.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Division at 26th_pid4809.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1219", + "name": "Portland - Division at 34th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50479, + "lon": -122.62956, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Division at 34th_pid4811.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Division at 34th_pid4811.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1221", + "name": "Portland - Division at 60th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50536, + "lon": -122.60167, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Division at 60th_pid4815.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Division at 60th_pid4815.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1222", + "name": "Portland - Division at 76th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50539, + "lon": -122.58527, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Division at 76th_pid4817.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Division at 76th_pid4817.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1251", + "name": "Portland - Division at 80th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50525, + "lon": -122.58086, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 80th_pid4873.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 80th_pid4873.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1252", + "name": "Portland - Division at 84th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50463, + "lon": -122.57679, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 84th_pid4875.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 84th_pid4875.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1223", + "name": "Portland - Division at 87th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5046, + "lon": -122.57424, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Division at 87th_pid4819.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Division at 87th_pid4819.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1253", + "name": "Portland - Division at 89th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50451, + "lon": -122.57175, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 89th_pid4877.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 89th_pid4877.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1254", + "name": "Portland - Division at 92nd ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50448, + "lon": -122.56863, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Division at 92nd_pid4879.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Division at 92nd_pid4879.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1503", + "name": "Portland - E Burnside at MLK", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52294, + "lon": -122.6615, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/E Burnside at MLK_pid5385.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/E Burnside at MLK_pid5385.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-683", + "name": "Portland - Foster at Holgate", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49026, + "lon": -122.59829, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Foster at Holgate_pid3197.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Foster at Holgate_pid3197.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1501", + "name": "Portland - Going at Greeley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55604, + "lon": -122.69275, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Going at Greeley_pid5381.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Going at Greeley_pid5381.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1261", + "name": "Portland - N Columbia at Macrum ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.59531, + "lon": -122.73039, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Columbia at Macrum_pid4893.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Columbia at Macrum_pid4893.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1372", + "name": "Portland - N Greeley at Adidas Dr N", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56019, + "lon": -122.69465, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Greeley at Adidas Driveway N_pid5116.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Greeley at Adidas Driveway N_pid5116.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1466", + "name": "Portland - N Greeley at Rosa Parks Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56999, + "lon": -122.69576, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Greeley at Rosa Parks Way_pid5306.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Greeley at Rosa Parks Way_pid5306.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1502", + "name": "Portland - N Interstate at Going", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55613, + "lon": -122.68232, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Inters at Going_pid5383.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Inters at Going_pid5383.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1499", + "name": "Portland - N Interstate at Greeley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54472, + "lon": -122.6774, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Interstate at Greeley_pid5377.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Interstate at Greeley_pid5377.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1493", + "name": "Portland - N Interstate at Larrabee", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53197, + "lon": -122.67096, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Inter at Larrabee_pid5365.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Inter at Larrabee_pid5365.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1489", + "name": "Portland - N Interstate at Larrabee N", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53643, + "lon": -122.67437, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Interstate at Larrabee N_pid5357.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Interstate at Larrabee N_pid5357.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1464", + "name": "Portland - N Interstate at Multnomah", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52972, + "lon": -122.6673, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Interstate at Multnomah_pid5302.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Interstate at Multnomah_pid5302.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1462", + "name": "Portland - N Interstate at Oregon/Lloyd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52858, + "lon": -122.66578, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Interstate at Oregon Lloyd_pid5345.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Interstate at Oregon Lloyd_pid5345.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1230", + "name": "Portland - N Lombard at Chautauqua", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.57711, + "lon": -122.70793, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Lombard at Chautauqua_pid4833.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Lombard at Chautauqua_pid4833.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1231", + "name": "Portland - N Lombard at Fiske", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58041, + "lon": -122.7183, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Lombard at Fiske_pid4835.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Lombard at Fiske_pid4835.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1228", + "name": "Portland - N Lombard at Peninsular", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.57714, + "lon": -122.69737, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Lombard at Peninsular_pid4829.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Lombard at Peninsular_pid4829.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1229", + "name": "Portland - N Lombard at Wabash", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.57714, + "lon": -122.70278, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Lombard at Wabash_pid4831.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Lombard at Wabash_pid4831.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1463", + "name": "Portland - N Ramsay at Wheeler/Williams", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53311, + "lon": -122.66672, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/N Ramsay at Wheeler Williams_pid5347.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/N Ramsay at Wheeler Williams_pid5347.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1465", + "name": "Portland - NE 122nd at SE Halsey St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53356, + "lon": -122.53764, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE 122nd at SE Halsey St_pid5304.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE 122nd at SE Halsey St_pid5304.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1453", + "name": "Portland - NE 82nd & McDaniel H.S.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54241, + "lon": -122.57891, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE 82nd & McDaniel H.S._pid5280.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE 82nd & McDaniel H.S._pid5280.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1487", + "name": "Portland - NE 82nd at Schuyler", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53577, + "lon": -122.57895, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE 82nd at Schuyler_pid5353.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE 82nd at Schuyler_pid5353.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1486", + "name": "Portland - NE 82nd at Siskiyou", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54446, + "lon": -122.57888, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE 82nd at Siskiyou_pid5351.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE 82nd at Siskiyou_pid5351.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1485", + "name": "Portland - NE 82nd at Tillamook", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53718, + "lon": -122.57902, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE 82nd at Tillamook_pid5349.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE 82nd at Tillamook_pid5349.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1198", + "name": "Portland - NE Airport Way at 122nd NWC", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5658, + "lon": -122.53367, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 122nd NWC_pid4781.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 122nd NWC_pid4781.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1197", + "name": "Portland - NE Airport Way at 122nd SWC", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56545, + "lon": -122.53396, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 122nd SWC_pid4779.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 122nd SWC_pid4779.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1199", + "name": "Portland - NE Airport Way at 138th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56195, + "lon": -122.52112, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 138th_pid4777.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 138th_pid4777.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1200", + "name": "Portland - NE Airport Way at 148th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55957, + "lon": -122.51028, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 148th_pid4775.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 148th_pid4775.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1201", + "name": "Portland - NE Airport Way at 158th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55759, + "lon": -122.50021, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 158th_pid4773.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 158th_pid4773.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1202", + "name": "Portland - NE Airport Way at 82nd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58094, + "lon": -122.57259, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 82nd_pid4771.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ 82nd_pid4771.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1203", + "name": "Portland - NE Airport Way at Holman", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56796, + "lon": -122.54432, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ Holman_pid4769.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ Holman_pid4769.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1204", + "name": "Portland - NE Airport Way at Win Sivers", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56737, + "lon": -122.53763, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ Win Sivers_pid4767.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Airport Way @ Win Sivers_pid4767.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1467", + "name": "Portland - NE Broadway at Vancouver", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53512, + "lon": -122.66765, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Broadway at Vancouver_pid5308.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Broadway at Vancouver_pid5308.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1430", + "name": "Portland - NE Columbia at 42nd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.57185, + "lon": -122.62069, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Columbia at 42nd_pid5274.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Columbia at 42nd_pid5274.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1425", + "name": "Portland - NE Columbia at 60th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56877, + "lon": -122.60055, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Columbia at 0th_pid5221.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Columbia at 0th_pid5221.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1424", + "name": "Portland - NE Columbia at 80th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56515, + "lon": -122.58047, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Columbia at 80th_pid5219.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Columbia at 80th_pid5219.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1484", + "name": "Portland - NE Grand at Broadway", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53501, + "lon": -122.66092, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Grand at Broadway_pid5342.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Grand at Broadway_pid5342.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1483", + "name": "Portland - NE Grand at Everett", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52519, + "lon": -122.66072, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Grand at Everett_pid5340.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Grand at Everett_pid5340.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1266", + "name": "Portland - NE Lloyd at 7th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52758, + "lon": -122.65866, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Lloyd at 7th CAM35_pid4902.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Lloyd at 7th CAM35_pid4902.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1490", + "name": "Portland - NE MLK Jr Blvd at Lloyd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52655, + "lon": -122.66156, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE MLK Jr Blvd at Lloyd_pid5359.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE MLK Jr Blvd at Lloyd_pid5359.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1482", + "name": "Portland - NE MLK Jr Blvd at Weidler", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5343, + "lon": -122.66164, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE MLK Jr Blvd at Weidler CAM276_pid5338.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE MLK Jr Blvd at Weidler CAM276_pid5338.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1505", + "name": "Portland - NE MLK at Fremont", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54839, + "lon": -122.66155, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE MLK at Fremont_pid5389.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE MLK at Fremont_pid5389.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1506", + "name": "Portland - NE MLK at Killingsworth", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56282, + "lon": -122.6614, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE MLK at Killingswo_pid5391.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE MLK at Killingswo_pid5391.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1507", + "name": "Portland - NE MLK at Rosa Parks", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56988, + "lon": -122.66148, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE MLK at Rosa Parks_pid5393.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE MLK at Rosa Parks_pid5393.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1508", + "name": "Portland - NE MLK at Russell", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54086, + "lon": -122.66165, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE MLK at Russell_pid5395.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE MLK at Russell_pid5395.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1509", + "name": "Portland - NE MLK at Tillamook", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53793, + "lon": -122.66166, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE MLK at Tillamook_pid5397.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE MLK at Tillamook_pid5397.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1457", + "name": "Portland - NE Multnomah at Wheeler", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53084, + "lon": -122.66596, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NE Multnomah at Wheeler CAM232_pid5288.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NE Multnomah at Wheeler CAM232_pid5288.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1488", + "name": "Portland - NW Broadway at Lovejoy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52975, + "lon": -122.6777, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NW Broadway at Lovejoy_pid5355.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NW Broadway at Lovejoy_pid5355.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1240", + "name": "Portland - NW Couch at 15th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52357, + "lon": -122.68671, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NW Couch at 15th_pid4852.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NW Couch at 15th_pid4852.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1491", + "name": "Portland - NW Glisan at 16th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52636, + "lon": -122.68733, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NW Glisan at 16th_pid5361.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NW Glisan at 16th_pid5361.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1492", + "name": "Portland - NW Naito at Davis", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5246, + "lon": -122.67015, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/NW Naito at Davis_pid5363.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/NW Naito at Davis_pid5363.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1504", + "name": "Portland - OR99E at NE Columbia Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58097, + "lon": -122.66107, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/OR99E at NE Columbia_pid5387.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/OR99E at NE Columbia_pid5387.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-163", + "name": "Portland - OR99W at Bertha", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47085, + "lon": -122.6885, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/99wbertha_pid530.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/99wbertha_pid530.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-685", + "name": "Portland - OR99W at Capitol", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45335, + "lon": -122.72113, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at Capitol_pid3209.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at Capitol_pid3209.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-688", + "name": "Portland - OR99W at Hamilton S", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48978, + "lon": -122.68218, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at Hamilton S_pid3217.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at Hamilton S_pid3217.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-691", + "name": "Portland - OR99W at Taylors Ferry", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4562, + "lon": -122.71414, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at Taylors Ferry_pid3229.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at Taylors Ferry_pid3229.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-812", + "name": "Portland - SE 122nd at Division NEC", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50413, + "lon": -122.53765, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/122nd at Division NS_pid3722.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/122nd at Division NS_pid3722.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-807", + "name": "Portland - SE 122nd at Division SWC", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50411, + "lon": -122.53762, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE 122nd at Division EW_pid3702.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE 122nd at Division EW_pid3702.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1452", + "name": "Portland - SE 82nd & Flavel", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46848, + "lon": -122.57914, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE 82nd & Flavel_pid5278.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE 82nd & Flavel_pid5278.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1451", + "name": "Portland - SE 82nd & Yamhill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51625, + "lon": -122.57884, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE 82nd & Yamhill_pid5276.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE 82nd & Yamhill_pid5276.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1386", + "name": "Portland - SE 82nd and Knapp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4704, + "lon": -122.57916, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE 82nd and Knapp_pid5144.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE 82nd and Knapp_pid5144.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1510", + "name": "Portland - SE 82nd at Boise", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4922, + "lon": -122.57875, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE 82nd at Boise_pid5399.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE 82nd at Boise_pid5399.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1380", + "name": "Portland - SE 82nd at Clinton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50342, + "lon": -122.57861, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE 82nd at Clinton_pid5132.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE 82nd at Clinton_pid5132.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1500", + "name": "Portland - SE 82nd at Harrison St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50838, + "lon": -122.57866, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/82nd at Harrison St_pid5379.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/82nd at Harrison St_pid5379.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1511", + "name": "Portland - SE 82nd at Lafayette", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49627, + "lon": -122.57875, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE 82nd at Lafayette_pid5401.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE 82nd at Lafayette_pid5401.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1379", + "name": "Portland - SE 82nd at Schiller", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48797, + "lon": -122.57878, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE 82nd at Schiller_pid5130.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE 82nd at Schiller_pid5130.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1407", + "name": "Portland - SE Ankeny at 11th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52224, + "lon": -122.65469, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Ankeny at 11th Ave_pid5186.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Ankeny at 11th Ave_pid5186.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1277", + "name": "Portland - SE Grand Ave at SE Madison St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51294, + "lon": -122.66092, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Grand Ave at SE Madison St_pid4924.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Grand Ave at SE Madison St_pid4924.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1280", + "name": "Portland - SE Hawthorne at SE 7th St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51225, + "lon": -122.65855, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE Hawthorne at SE 7th St_pid4930.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE Hawthorne at SE 7th St_pid4930.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1382", + "name": "Portland - SE Holgate at 122nd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48969, + "lon": -122.53771, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Holgate at 122nd_pid5136.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Holgate at 122nd_pid5136.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-806", + "name": "Portland - SW 6th at I-405", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50978, + "lon": -122.68368, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SW 6th at I-405_pid3698.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SW 6th at I-405_pid3698.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1281", + "name": "Portland - SW Capitol Hwy at Sunset Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47877, + "lon": -122.69322, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SW Capitol Hwy at Sunset Blvd_pid4932.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SW Capitol Hwy at Sunset Blvd_pid4932.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-690", + "name": "Portland - SW Naito Pkwy at Market", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51127, + "lon": -122.67597, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/ORE99W at Market_pid3225.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/ORE99W at Market_pid3225.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-692", + "name": "Portland - Sandy Blvd at 77th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55036, + "lon": -122.58374, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sandy Blvd at 77th_pid3233.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sandy Blvd at 77th_pid3233.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-699", + "name": "Portland - US30 at 29th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54646, + "lon": -122.71101, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at 29th_pid3261.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at 29th_pid3261.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1241", + "name": "Portland - W Burnside at 15th ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52289, + "lon": -122.68652, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/W Burnside at 15th_pid4854.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/W Burnside at 15th_pid4854.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-809", + "name": "Portland - W Burnside at 24th Pl", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52397, + "lon": -122.70129, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/W Burnside at 24th Pl_pid3710.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/W Burnside at 24th Pl_pid3710.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-811", + "name": "Portland - W Burnside at 2nd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52308, + "lon": -122.67236, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/W Burnside at 2nd_pid3718.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/W Burnside at 2nd_pid3718.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-810", + "name": "Portland - W Burnside at Tichner", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52292, + "lon": -122.71122, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/W. Burnside at Tichner_pid3714.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/W. Burnside at Tichner_pid3714.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1262", + "name": "RampGate I-84 EB at Union Interchange", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.2957, + "lon": -118.03969, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/RampGate I84 EB at Union Interchange_pid4895.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/RampGate I84 EB at Union Interchange_pid4895.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1263", + "name": "RampGate I-84 WB at Union Interchange", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.29293, + "lon": -118.03509, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/RampGate I84 WB at Union Interchange_pid4897.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/RampGate I84 WB at Union Interchange_pid4897.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-263", + "name": "Redmond at Roberts Field", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.25257, + "lon": -121.16359, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/RedmondAirport_pid649.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/RedmondAirport_pid649.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1459", + "name": "SE 82nd & Woodstock CAM237", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47964, + "lon": -122.57898, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE 82nd & Woodstock_pid5292.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE 82nd & Woodstock_pid5292.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1455", + "name": "SE 82nd at Mill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51013, + "lon": -122.57864, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE 82nd at Mill_pid5284.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE 82nd at Mill_pid5284.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1458", + "name": "SE 82nd at SE Foster ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48272, + "lon": -122.57901, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SE 82nd at SE Foster_pid5290.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SE 82nd at SE Foster_pid5290.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-274", + "name": "SR 299 California at Cedar Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.56056, + "lon": -120.28722, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/CedarPass_pid608.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/CedarPass_pid608.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-987", + "name": "SR-14 Washington - Bridge of the Gods", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.66274, + "lon": -121.90538, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SR14 at Bridge of the Gods_pid4355.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SR14 at Bridge of the Gods_pid4355.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-988", + "name": "SR-14 Washington - Hood River Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.7241, + "lon": -121.49023, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SR14 at Hood River Bridge_pid4357.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SR14 at Hood River Bridge_pid4357.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-312", + "name": "SR-14 Washington - Vancouver at I-205", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.6022, + "lon": -122.54632, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SR14_i-205e_pid773.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SR14_i-205e_pid773.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-313", + "name": "SR-14 Washington - Vancouver at I-205", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.60474, + "lon": -122.55723, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SR14_i-205w_pid774.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SR14_i-205w_pid774.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-314", + "name": "SR-500 Washington - Vancouver at 112th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.66206, + "lon": -122.5584, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SR500_112_pid775.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SR500_112_pid775.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-315", + "name": "SR-500 Washington - Vancouver at Thurston", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.65451, + "lon": -122.58713, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SR500_Thurston_pid776.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SR500_Thurston_pid776.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-514", + "name": "Salem - 12th and State", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.93704, + "lon": -123.0272, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/12th and State_pid2426.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/12th and State_pid2426.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-515", + "name": "Salem - 25th and State", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.93256, + "lon": -123.01015, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/25th and State_pid2430.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/25th and State_pid2430.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-478", + "name": "Salem - Center and 17th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.93939, + "lon": -123.01814, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Center and 17th_pid2422.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Center and 17th_pid2422.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-497", + "name": "Salem - Commercial and 12th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.89432, + "lon": -123.03628, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Commercial and 12th_pid2434.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Commercial and 12th_pid2434.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-499", + "name": "Salem - Commercial and Center", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.94374, + "lon": -123.03878, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Commercial and Center_pid2438.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Commercial and Center_pid2438.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-500", + "name": "Salem - Commercial and Fairview", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.91354, + "lon": -123.04521, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Commercial and Fairview_pid2442.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Commercial and Fairview_pid2442.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-501", + "name": "Salem - Commercial and Kuebler", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.88212, + "lon": -123.0303, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Commercial and Kuebler_pid2446.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Commercial and Kuebler_pid2446.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-502", + "name": "Salem - Commercial and Market", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.952, + "lon": -123.03506, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Commercial and Market_pid2450.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Commercial and Market_pid2450.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-503", + "name": "Salem - Commercial and Mission", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.93326, + "lon": -123.04394, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Commercial and Mission_pid2454.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Commercial and Mission_pid2454.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-504", + "name": "Salem - Commercial and Trade", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.93848, + "lon": -123.04151, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Commercial and Trade_pid2458.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Commercial and Trade_pid2458.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-505", + "name": "Salem - Edgewater and Wallace", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.94479, + "lon": -123.04891, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Edgewater and Wallace_pid2462.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Edgewater and Wallace_pid2462.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-506", + "name": "Salem - Fairgrounds and Silverton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.96006, + "lon": -123.01563, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Fairgrounds and Silverton_pid2466.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Fairgrounds and Silverton_pid2466.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-549", + "name": "Salem - Hawthorne and State", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.92794, + "lon": -122.99361, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Hawthorn and State_pid2655.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Hawthorn and State_pid2655.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-508", + "name": "Salem - Kuebler and Liberty", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.88294, + "lon": -123.06128, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Kuebler and Liberty_pid2470.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Kuebler and Liberty_pid2470.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-507", + "name": "Salem - Kuebler at I-5", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.88536, + "lon": -122.99962, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Kuebler at I5_pid2474.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Kuebler at I5_pid2474.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-509", + "name": "Salem - Lancaster and Center", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.93971, + "lon": -122.98297, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Lancaster and Center_pid2478.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Lancaster and Center_pid2478.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-540", + "name": "Salem - Lancaster and Devonshire", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.96592, + "lon": -122.9835, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Lancaster and Devonshire_pid2615.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Lancaster and Devonshire_pid2615.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-510", + "name": "Salem - Lancaster and Market", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.95017, + "lon": -122.98372, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Lancaster and Market_pid2482.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Lancaster and Market_pid2482.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-511", + "name": "Salem - Lancaster and Rickey", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.91513, + "lon": -122.98021, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Lancaster and Rickey_pid2486.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Lancaster and Rickey_pid2486.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-512", + "name": "Salem - Liberty and Marion", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.94441, + "lon": -123.03662, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Liberty and Marion_pid2490.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Liberty and Marion_pid2490.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-498", + "name": "Salem - Market and 17th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.94877, + "lon": -123.01341, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Market and 17th_pid2494.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Market and 17th_pid2494.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-513", + "name": "Salem - Market and Broadway", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.9511, + "lon": -123.0315, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Market and Broadway_pid2498.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Market and Broadway_pid2498.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1265", + "name": "Siuslaw River Florence (USCG)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.01861, + "lon": -124.13636, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Siuslaw River Florence_pid4901.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Siuslaw River Florence_pid4901.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1239", + "name": "Sprague River Rd at Lone Pine Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.55426, + "lon": -121.61866, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sprague River Rd at Lone Pine Rd_pid4850.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sprague River Rd at Lone Pine Rd_pid4850.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-986", + "name": "US101 Washington - Astoria Megler Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.2348, + "lon": -123.87166, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101_AstoriaMeglerBri_pid4353.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101_AstoriaMeglerBri_pid4353.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-277", + "name": "US101 at Astoria - ODOT District Office", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.18785, + "lon": -123.85347, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/AstoriaUS101MeglerBrNB_pid392.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/AstoriaUS101MeglerBrNB_pid392.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-713", + "name": "US101 at Astoria Bridge (Center Span)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.19371, + "lon": -123.851, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Astoria Bridge (Center)_pid3318.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Astoria Bridge (Center)_pid3318.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-714", + "name": "US101 at Astoria Bridge (North Span)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.19666, + "lon": -123.85278, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Astoria Bridge (North Span)_pid3322.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Astoria Bridge (North Span)_pid3322.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-411", + "name": "US101 at Brookings", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.05506, + "lon": -124.27359, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Hwy 101 at Brookings NB_pid1804.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Hwy 101 at Brookings NB_pid1804.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-410", + "name": "US101 at Brookings", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.05506, + "lon": -124.27359, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Hwy 101 at Brookings SB_pid1807.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Hwy 101 at Brookings SB_pid1807.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-610", + "name": "US101 at Bullards Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.14882, + "lon": -124.39561, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Bullards Bridge N_pid2908.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Bullards Bridge N_pid2908.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-611", + "name": "US101 at Bullards Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.14882, + "lon": -124.39561, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Bullards Bridge W_pid2912.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Bullards Bridge W_pid2912.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-469", + "name": "US101 at Camp Rilea", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.12138, + "lon": -123.92577, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Camp Rilea_pid2301.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Camp Rilea_pid2301.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1025", + "name": "US101 at Cannon Beach NB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.90996, + "lon": -123.94987, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Cannon Beach SB_pid4431.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Cannon Beach SB_pid4431.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-254", + "name": "US101 at Cape Cove", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.12833, + "lon": -124.12305, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/CapeCove_pid618.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/CapeCove_pid618.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1134", + "name": "US101 at Cape Cove", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.12833, + "lon": -124.12305, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cape Cove NB_pid4648.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cape Cove NB_pid4648.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-972", + "name": "US101 at E. Beaver Ln (Beaver Hill) NB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.2096, + "lon": -124.30703, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at E. Beaver Lane (Beaver Hill) NB_pid4325.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at E. Beaver Lane (Beaver Hill) NB_pid4325.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-971", + "name": "US101 at E. Beaver Ln. (Beaver Hill) SB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.2096, + "lon": -124.30703, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at E. Beaver Lane (Beaver Hill) SB_pid4323.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at E. Beaver Lane (Beaver Hill) SB_pid4323.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-711", + "name": "US101 at Gardiner Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.76297, + "lon": -124.12825, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Gardiner Hill 1_pid3309.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Gardiner Hill 1_pid3309.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-712", + "name": "US101 at Gardiner Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.76297, + "lon": -124.12825, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Gardiner Hill 2_pid3313.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Gardiner Hill 2_pid3313.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-475", + "name": "US101 at Gold Beach", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.42905, + "lon": -124.41323, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Gold Beach_pid2336.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Gold Beach_pid2336.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1178", + "name": "US101 at Harbor St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.16254, + "lon": -123.8968, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Harbor St_pid4732.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Harbor St_pid4732.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-172", + "name": "US101 at Lincoln City", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.99569, + "lon": -124.00531, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/LincolnCityUS101_pid634.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/LincolnCityUS101_pid634.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-171", + "name": "US101 at Lincoln City - Logan Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.99569, + "lon": -124.00531, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/LincolnCityLogan_pid633.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/LincolnCityLogan_pid633.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-631", + "name": "US101 at Lincoln City - D River Wayside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.96706, + "lon": -124.01688, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Lincoln City at D River_pid2989.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Lincoln City at D River_pid2989.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-489", + "name": "US101 at McCullough Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.43415, + "lon": -124.22081, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Mc Cullough Bridge_pid2384.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Mc Cullough Bridge_pid2384.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1179", + "name": "US101 at Neptune Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.16008, + "lon": -123.90064, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Neptune Dr_pid4734.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Neptune Dr_pid4734.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-575", + "name": "US101 at Newport - Yaquina Bay Bridge N", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.62452, + "lon": -124.05941, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Yaquina Bay Bridge_pid2770.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Yaquina Bay Bridge_pid2770.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-578", + "name": "US101 at Newport - Yaquina Bay Bridge S", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.62454, + "lon": -124.05944, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Yaquina Bay Bridge N_pid2778.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Yaquina Bay Bridge N_pid2778.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-576", + "name": "US101 at Newport - Yaquina Bay Jetty", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.62311, + "lon": -124.05742, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Yaquina Bay Jetty_pid2766.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Yaquina Bay Jetty_pid2766.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-704", + "name": "US101 at North of Cushing Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.71996, + "lon": -124.1378, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at North of Cushing Creek N_pid3269.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at North of Cushing Creek N_pid3269.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-703", + "name": "US101 at North of Cushing Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.71996, + "lon": -124.1378, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at North of Cushing Creek S_pid3273.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at North of Cushing Creek S_pid3273.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-708", + "name": "US101 at North of SR197", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.89984, + "lon": -124.13705, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at North of SR197 N_pid3277.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at North of SR197 N_pid3277.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-707", + "name": "US101 at North of SR197", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.89984, + "lon": -124.13705, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at North of SR197 S_pid3281.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at North of SR197 S_pid3281.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1126", + "name": "US101 at OR126 S", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.97461, + "lon": -124.10312, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at ORE126 S_pid4632.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at ORE126 S_pid4632.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1165", + "name": "US101 at OR42S", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.11895, + "lon": -124.39831, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at OR42S NB_pid4708.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at OR42S NB_pid4708.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1166", + "name": "US101 at OR42S", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.11895, + "lon": -124.39831, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at OR42S SB_pid4710.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at OR42S SB_pid4710.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-517", + "name": "US101 at Port Orford", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.74319, + "lon": -124.49011, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Port Orford_pid2507.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Port Orford_pid2507.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-518", + "name": "US101 at Port Orford Storm", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.74319, + "lon": -124.49011, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Port Orford Storm_pid2511.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Port Orford Storm_pid2511.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-479", + "name": "US101 at Reedsport", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.70112, + "lon": -124.10767, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Reedsport_pid2349.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Reedsport_pid2349.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-974", + "name": "US101 at Reedsport", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.70112, + "lon": -124.10767, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at Reedsport S_pid4329.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at Reedsport S_pid4329.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-282", + "name": "US101 at Seaside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.96512, + "lon": -123.92425, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Seaside_pid652.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Seaside_pid652.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1010", + "name": "US101 at Seaside MP 22.50 SB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.97442, + "lon": -123.92736, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at MP22.50 SB_pid4401.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at MP22.50 SB_pid4401.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-701", + "name": "US101 at South of Cushing Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.70553, + "lon": -124.1261, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at South of Cushing Creek N_pid3285.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at South of Cushing Creek N_pid3285.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-702", + "name": "US101 at South of Cushing Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.70553, + "lon": -124.1261, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at South of Cushing Creek S_pid3289.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at South of Cushing Creek S_pid3289.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-705", + "name": "US101 at South of US199", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.77947, + "lon": -124.17971, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at South of US199 N_pid3293.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at South of US199 N_pid3293.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-706", + "name": "US101 at South of US199", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.77947, + "lon": -124.17971, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US101 at South of US199 S_pid3297.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US101 at South of US199 S_pid3297.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-898", + "name": "US197 at Tygh Ridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.34324, + "lon": -121.14249, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US197 at Tygh Ridge N_pid4069.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US197 at Tygh Ridge N_pid4069.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-724", + "name": "US199 at Grants Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.42055, + "lon": -123.35676, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US199 at Grants Pass_pid3363.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US199 at Grants Pass_pid3363.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-725", + "name": "US199 at Grants Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.42055, + "lon": -123.35676, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US199 at Grants Pass SB_pid3367.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US199 at Grants Pass SB_pid3367.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-521", + "name": "US199 at Hayes Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.32996, + "lon": -123.59136, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/HayesHillSummit_pid2523.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/HayesHillSummit_pid2523.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-750", + "name": "US199 at OR46 (Cave Junction)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.16249, + "lon": -123.64674, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US199 at ORE46 (Cave Junction)_pid3471.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US199 at ORE46 (Cave Junction)_pid3471.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-751", + "name": "US199 at Ringuette St (Grants Pass)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.42332, + "lon": -123.33953, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US199 at Ringuette St NB_pid3475.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US199 at Ringuette St NB_pid3475.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-752", + "name": "US199 at Ringuette St (Grants Pass)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.42332, + "lon": -123.33953, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US199 at Ringuette St SB_pid3479.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US199 at Ringuette St SB_pid3479.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-710", + "name": "US199 at South of Oregon State Line", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.99402, + "lon": -123.72021, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US199 at S of OR State Line E_pid3301.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US199 at S of OR State Line E_pid3301.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-709", + "name": "US199 at South of Oregon State Line", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.99402, + "lon": -123.72021, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US199 at S of OR State Line W_pid3305.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US199 at S of OR State Line W_pid3305.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-718", + "name": "US20 at Bend - Butler Market Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.07905, + "lon": -121.30461, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Butler Market_pid3338.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Butler Market_pid3338.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-992", + "name": "US20 at Buck Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.57443, + "lon": -119.91024, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Buck Creek_pid4365.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Buck Creek_pid4365.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1085", + "name": "US20 at Camp Sherman MP91.40", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.38624, + "lon": -121.66456, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SWZT010 - Trailer J_pid4551.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SWZT010 - Trailer J_pid4551.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1374", + "name": "US20 at Cooley Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.11236, + "lon": -121.31258, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Cooley Rd_pid5120.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Cooley Rd_pid5120.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-661", + "name": "US20 at Drinkwater Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.7706, + "lon": -118.12911, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Drinkwater Pass_pid3109.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Drinkwater Pass_pid3109.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-662", + "name": "US20 at Drinkwater Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.78388, + "lon": -118.33723, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Drinkwater Pass_pid3113.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Drinkwater Pass_pid3113.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-625", + "name": "US20 at Dudlee Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.59352, + "lon": -123.52596, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Dudlee Hill_pid2964.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Dudlee Hill_pid2964.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-530", + "name": "US20 at Hampton", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.67444, + "lon": -120.23817, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Hampton_pid2565.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Hampton_pid2565.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-496", + "name": "US20 at Horse Ridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.90011, + "lon": -120.98703, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Horse Ridge_pid2418.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Horse Ridge_pid2418.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-955", + "name": "US20 at Parkway On-Ramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.07504, + "lon": -121.30289, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Parkway On-Ramp_pid4291.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Parkway On-Ramp_pid4291.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-877", + "name": "US20 at Pioneer Mountain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.67438, + "lon": -123.89081, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Pioneer Mountain EB_pid3983.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Pioneer Mountain EB_pid3983.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-878", + "name": "US20 at Pioneer Mountain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.67438, + "lon": -123.89081, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Pioneer Mountain WB_pid3987.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Pioneer Mountain WB_pid3987.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-401", + "name": "US20 at Santiam Jct", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.43628, + "lon": -121.93815, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Santiam Jct_pid1675.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Santiam Jct_pid1675.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-719", + "name": "US20 at Santiam Jct", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.43648, + "lon": -121.93806, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Santiam Jct WB_pid3342.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Santiam Jct WB_pid3342.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-567", + "name": "US20 at Santiam Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.422, + "lon": -121.85731, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Santiam Pass_pid2728.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Santiam Pass_pid2728.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1443", + "name": "US20 at Santiam Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.422, + "lon": -121.8573, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Santiam Pass WB_pid5258.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Santiam Pass WB_pid5258.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-236", + "name": "US20 at Sisters", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.29501, + "lon": -121.55902, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Sisters_pid653.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Sisters_pid653.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1127", + "name": "US20 at Spring Hill Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.64211, + "lon": -123.10756, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Spring Hill Dr E_pid4634.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Spring Hill Dr E_pid4634.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1129", + "name": "US20 at Spring Hill Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.64211, + "lon": -123.10756, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Spring Hill Dr N_pid4636.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Spring Hill Dr N_pid4636.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1128", + "name": "US20 at Spring Hill Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.64211, + "lon": -123.10756, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Spring Hill Dr W_pid4638.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Spring Hill Dr W_pid4638.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1428", + "name": "US20 at Stinking Water Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.69175, + "lon": -118.53866, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Stinking Water Summit EB_pid5227.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Stinking Water Summit EB_pid5227.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1429", + "name": "US20 at Stinking Water Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.69175, + "lon": -118.53866, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Stinking Water Summit WB_pid5229.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Stinking Water Summit WB_pid5229.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-464", + "name": "US20 at Sweet Home", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.41004, + "lon": -122.65274, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Sweet Home_pid2282.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Sweet Home_pid2282.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-332", + "name": "US20 at Tombstone", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.39548, + "lon": -122.14151, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20atTombstone_pid1354.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20atTombstone_pid1354.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-297", + "name": "US20 at US395 - Riley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.54125, + "lon": -119.5036, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at US395 Riley_pid2569.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at US395 Riley_pid2569.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-879", + "name": "US20 at US395 Burns", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.61422, + "lon": -119.02047, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at US395 Burns EB_pid3991.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at US395 Burns EB_pid3991.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1137", + "name": "US20 at Ward-Hamby Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05492, + "lon": -121.24636, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Ward-Hamby Rd_pid4654.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Ward-Hamby Rd_pid4654.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1172", + "name": "US20 at Waverly Dr SE", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.6321, + "lon": -123.07323, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Waverly Dr WB_pid4722.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Waverly Dr WB_pid4722.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1173", + "name": "US20 at Waverly Dr SE", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.6321, + "lon": -123.07323, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 at Waverly Dr EB_pid4724.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 at Waverly Dr EB_pid4724.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1264", + "name": "US20 at Weldwood Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.51557, + "lon": -122.89629, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US20 EB at Weldwood Dr_pid4899.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US20 EB at Weldwood Dr_pid4899.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1016", + "name": "US26 @ Crook County Line MP16.3", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.41207, + "lon": -120.98841, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/SWZT009 - Trailer I_pid4413.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/SWZT009 - Trailer I_pid4413.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1273", + "name": "US26 EB at Vista Ridge Tunnel (East End)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51571, + "lon": -122.69676, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 EB at Vista Ridge Tunnel (East End)_pid4916.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 EB at Vista Ridge Tunnel (East End)_pid4916.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1272", + "name": "US26 EB at Vista Ridge Tunnel (West End)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51586, + "lon": -122.69806, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Vista Ridger W_pid4914.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Vista Ridger W_pid4914.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-408", + "name": "US26 Near Warm Springs", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.79526, + "lon": -121.33056, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 Near Warm Springs_pid1742.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 Near Warm Springs_pid1742.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1270", + "name": "US26 WB at Vista Ridge Tunnel (East End)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51583, + "lon": -122.69554, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 WB at Vista Ridge Tunnel (East End)_pid4910.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 WB at Vista Ridge Tunnel (East End)_pid4910.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1271", + "name": "US26 WB at Vista Ridge Tunnel (West End)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51618, + "lon": -122.69816, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 WB @ Vista Ridge Tunnel (West End)_pid4912.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 WB @ Vista Ridge Tunnel (West End)_pid4912.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-327", + "name": "US26 at 185th Street", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54143, + "lon": -122.8678, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26_185th_pid1329.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26_185th_pid1329.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-693", + "name": "US26 at 21st", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49941, + "lon": -122.64453, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at 21st_pid3237.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at 21st_pid3237.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1209", + "name": "US26 at 267th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46549, + "lon": -122.38743, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 EB at 267th_pid4791.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 EB at 267th_pid4791.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1210", + "name": "US26 at 267th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46549, + "lon": -122.38743, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 WB at 267th_pid4793.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 WB at 267th_pid4793.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-694", + "name": "US26 at 39th SW", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49747, + "lon": -122.62246, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at 39th SW_pid3241.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at 39th SW_pid3241.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-433", + "name": "US26 at Arlie Mitchell Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.33134, + "lon": -121.91279, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 EB at Arlie Mitchell Rd._pid1875.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 EB at Arlie Mitchell Rd._pid1875.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-368", + "name": "US26 at Austin Junction", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.57479, + "lon": -118.49194, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/AustinJunction_pid1522.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/AustinJunction_pid1522.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-248", + "name": "US26 at Bethany", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53288, + "lon": -122.8429, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26Bethany_pid524.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26Bethany_pid524.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-446", + "name": "US26 at Blue Box Pass Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.20802, + "lon": -121.69786, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Blue Box Pass_pid1919.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Blue Box Pass_pid1919.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-349", + "name": "US26 at Brightwood", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3761, + "lon": -122.03533, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Brightwood2_pid1381.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Brightwood2_pid1381.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-799", + "name": "US26 at Brogan Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.27741, + "lon": -117.64913, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Brogan Hill_pid3670.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Brogan Hill_pid3670.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1368", + "name": "US26 at Cairo Jct Roundabout", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.98855, + "lon": -117.00721, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Cairo Jct Roundabout_pid5104.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Cairo Jct Roundabout_pid5104.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-793", + "name": "US26 at Camelot Court Overpass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50653, + "lon": -122.74929, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Camelot_pid3646.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Camelot_pid3646.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-326", + "name": "US26 at Cedar Hills", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51447, + "lon": -122.7941, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26CedarHills_pid1328.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26CedarHills_pid1328.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-416", + "name": "US26 at Cherryville Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36687, + "lon": -122.14291, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Cherryville Dr_pid2332.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Cherryville Dr_pid2332.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-328", + "name": "US26 at Cornelius Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55357, + "lon": -122.9006, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26Cornelius_pid1330.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26Cornelius_pid1330.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1093", + "name": "US26 at David Douglas Park", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.89776, + "lon": -123.67999, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at David Douglas ParkWB_pid4566.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at David Douglas ParkWB_pid4566.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-167", + "name": "US26 at East Vista Ridge Tunnel", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51538, + "lon": -122.69277, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26tunnelE_pid529.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26tunnelE_pid529.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1422", + "name": "US26 at Eldorado Summit ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.34412, + "lon": -118.08811, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Eldorado EB_pid5215.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Eldorado EB_pid5215.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1423", + "name": "US26 at Eldorado Summit ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.34412, + "lon": -118.08811, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Eldorado WB_pid5217.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Eldorado WB_pid5217.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-417", + "name": "US26 at Firwood Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.37609, + "lon": -122.22311, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Firwood Rd_pid2331.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Firwood Rd_pid2331.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-419", + "name": "US26 at Frog Lake", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.22876, + "lon": -121.70028, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Frog Lake VMS_pid1773.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Frog Lake VMS_pid1773.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-203", + "name": "US26 at Government Camp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30123, + "lon": -121.74129, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/GovernmentCamp_pid624.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/GovernmentCamp_pid624.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-440", + "name": "US26 at Government Camp Maint", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30184, + "lon": -121.744, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Govn Camp Maint_pid1899.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Govn Camp Maint_pid1899.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-418", + "name": "US26 at Govt Camp Lp Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30263, + "lon": -121.76868, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Govt Camp Lp Rd_pid1776.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Govt Camp Lp Rd_pid1776.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-329", + "name": "US26 at Helvetia", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56464, + "lon": -122.9264, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26Helvetia_pid1331.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26Helvetia_pid1331.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-435", + "name": "US26 at Hwy35", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.28315, + "lon": -121.71364, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Hwy35_pid1881.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Hwy35_pid1881.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-280", + "name": "US26 at Jefferson Off-Ramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51246, + "lon": -122.70289, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26Jefferson_pid525.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26Jefferson_pid525.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-527", + "name": "US26 at Keyes Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.55214, + "lon": -120.04165, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Keyes Summit_pid2550.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Keyes Summit_pid2550.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1011", + "name": "US26 at MP3.82", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.90256, + "lon": -123.8712, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at MP3.82 WB_pid4403.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at MP3.82 WB_pid4403.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-164", + "name": "US26 at Milwaukie", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50129, + "lon": -122.6541, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26pwlmilw_pid590.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26pwlmilw_pid590.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-247", + "name": "US26 at Murray", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52189, + "lon": -122.81529, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26Murray_pid526.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26Murray_pid526.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-837", + "name": "US26 at OR216 Jct", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.13251, + "lon": -121.60809, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at ORE216 Jct_pid3822.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at ORE216 Jct_pid3822.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-276", + "name": "US26 at OR217", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50797, + "lon": -122.77776, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26_217_pid523.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26_217_pid523.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-534", + "name": "US26 at Ochoco Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.50025, + "lon": -120.38832, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Ochoco Summit_pid2588.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Ochoco Summit_pid2588.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1102", + "name": "US26 at Picture Gorge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.49784, + "lon": -119.60021, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Picture GorW_pid4584.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Picture GorW_pid4584.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1103", + "name": "US26 at Picture Gorge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.49784, + "lon": -119.60021, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Picture GorE_pid4586.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Picture GorE_pid4586.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-420", + "name": "US26 at Quartz Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.84196, + "lon": -123.51895, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26Quartzcrk_pid1786.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26Quartzcrk_pid1786.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-165", + "name": "US26 at Ross Island Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50168, + "lon": -122.66093, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26ribridge_pid591.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26ribridge_pid591.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-908", + "name": "US26 at Run Away Truck Ramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30502, + "lon": -121.81695, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Run Away Truck Ramp WB_pid4109.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Run Away Truck Ramp WB_pid4109.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-695", + "name": "US26 at SE 26th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49787, + "lon": -122.63974, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at SE 26th_pid3245.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at SE 26th_pid3245.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-696", + "name": "US26 at SE 33rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49671, + "lon": -122.63161, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at SE 33rd_pid3249.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at SE 33rd_pid3249.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-698", + "name": "US26 at SE 39th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4972, + "lon": -122.62276, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at SE 39th_pid3257.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at SE 39th_pid3257.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-697", + "name": "US26 at SE Foster", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49739, + "lon": -122.61151, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at SE Foster_pid3253.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at SE Foster_pid3253.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1062", + "name": "US26 at Sandy Maintenance", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41373, + "lon": -122.3107, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Sandy Maintenance EB_pid4505.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Sandy Maintenance EB_pid4505.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-910", + "name": "US26 at Ski Bowl West", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3029, + "lon": -121.7787, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Ski Bowl West EB_pid4117.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Ski Bowl West EB_pid4117.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-443", + "name": "US26 at Staleys Junction", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.68278, + "lon": -123.19676, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Staleys Junction_pid1912.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Staleys Junction_pid1912.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-629", + "name": "US26 at Staleys Junction", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.68278, + "lon": -123.19676, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Staleys Junction2_pid2981.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Staleys Junction2_pid2981.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-630", + "name": "US26 at Staleys Junction", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.68278, + "lon": -123.19676, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Staleys Junction3_pid2985.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Staleys Junction3_pid2985.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-462", + "name": "US26 at Sunset Rest Area", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.79717, + "lon": -123.46215, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Sunset Rest Area_pid2310.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Sunset Rest Area_pid2310.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-294", + "name": "US26 at Sylvan Interchange - Skyline", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50845, + "lon": -122.73595, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26Sylvan_pid675.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26Sylvan_pid675.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-569", + "name": "US26 at Timber Jct", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.7596, + "lon": -123.30139, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Timber Jct_pid2736.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Timber Jct_pid2736.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1362", + "name": "US26 at Timber Jct", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.7596, + "lon": -123.30139, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Timber Jct W_pid5092.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Timber Jct W_pid5092.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-437", + "name": "US26 at Trillium Lake", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.28413, + "lon": -121.72479, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Trillium Lake EB_pid1887.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Trillium Lake EB_pid1887.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-907", + "name": "US26 at USFS Rd 35", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.30694, + "lon": -121.85444, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at USFS Rd EB_pid4105.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at USFS Rd EB_pid4105.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-753", + "name": "US26 at Unity", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.44075, + "lon": -118.19319, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at Unity WB_pid3483.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at Unity WB_pid3483.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-330", + "name": "US26 at Washington Park", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50737, + "lon": -122.70953, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26Washington_pid1332.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26Washington_pid1332.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-909", + "name": "US26 at West of Mirror Lake Trailhead", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.306, + "lon": -121.78977, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US26 at West of Mirror Lake Trailhead WB_pid4113.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US26 at West of Mirror Lake Trailhead WB_pid4113.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-281", + "name": "US26 at Zoo Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50701, + "lon": -122.71921, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/26Zoo_pid498.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/26Zoo_pid498.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-536", + "name": "US30 at Bradley Wayside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.1708, + "lon": -123.43891, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at Bradley Wayside_pid2596.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at Bradley Wayside_pid2596.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-471", + "name": "US30 at Lewis and Clark Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.09594, + "lon": -122.96946, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at Lewis and Clark Bridge_pid2316.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at Lewis and Clark Bridge_pid2316.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-835", + "name": "US30 at Lewis and Clark Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.09594, + "lon": -122.96946, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at Lewis and Clark Bridge NB_pid3814.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at Lewis and Clark Bridge NB_pid3814.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-836", + "name": "US30 at Lewis and Clark Bridge", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.09594, + "lon": -122.96946, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at Lewis and Clark Bridge EB_pid3818.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at Lewis and Clark Bridge EB_pid3818.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1180", + "name": "US30 at Millard Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.83884, + "lon": -122.8377, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at Millard Rd W_pid4736.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at Millard Rd W_pid4736.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1454", + "name": "US30 at Millard Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.83914, + "lon": -122.83769, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 EB at Millard Rd MP26.96_pid5282.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 EB at Millard Rd MP26.96_pid5282.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-894", + "name": "US30 at Rainier Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.09593, + "lon": -123.02109, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at Rainier Summit WB_pid4051.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at Rainier Summit WB_pid4051.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-895", + "name": "US30 at Rainier Summit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.09593, + "lon": -123.02109, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at Rainier Summit EB_pid4055.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at Rainier Summit EB_pid4055.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1034", + "name": "US30 at St Johns Bridge NB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.57555, + "lon": -122.75964, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at St Johns Bridge NB_pid4449.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at St Johns Bridge NB_pid4449.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1035", + "name": "US30 at St Johns Bridge SB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.57555, + "lon": -122.75964, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at St Johns Bridge SB_pid4451.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at St Johns Bridge SB_pid4451.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-754", + "name": "US30 at St Johns Bridge Top", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.58431, + "lon": -122.76655, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at St Johns Bridge Top_pid3487.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at St Johns Bridge Top_pid3487.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1119", + "name": "US30 at Tongue Point", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.1925, + "lon": -123.76105, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at Tongue Pnt E_pid4618.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at Tongue Pnt E_pid4618.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1120", + "name": "US30 at Tongue Point", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 46.1925, + "lon": -123.76105, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US30 at Tongue Pnt W_pid4620.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US30 at Tongue Pnt W_pid4620.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-532", + "name": "US395 at Alkali Lake", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.96836, + "lon": -119.99357, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US395 at Alkali Lake_pid2580.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US395 at Alkali Lake_pid2580.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-766", + "name": "US395 at Battle Mountain", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.27005, + "lon": -118.97776, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US395 at Battle Mountain_pid3536.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US395 at Battle Mountain_pid3536.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1389", + "name": "US395 at Cape Horn", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.29958, + "lon": -119.00458, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US395 at Cape Horn S_pid5150.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US395 at Cape Horn S_pid5150.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1390", + "name": "US395 at Cape Horn", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.29958, + "lon": -119.00458, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US395 at Cape Horn S_pid5153.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US395 at Cape Horn S_pid5153.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-202", + "name": "US395 at Lakeview", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.17242, + "lon": -120.34726, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Lakeview_pid2412.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Lakeview_pid2412.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-472", + "name": "US395 at Stanfield Interchange", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.76377, + "lon": -119.20434, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US395 at Stanfield Interchange_pid2317.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US395 at Stanfield Interchange_pid2317.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-545", + "name": "US395 at Valley Falls - ORE31", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.48064, + "lon": -120.28225, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US395 at Valley Falls_pid2635.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US395 at Valley Falls_pid2635.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-756", + "name": "US395B at Long Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.706, + "lon": -119.10822, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US395B at Long Creek_pid3495.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US395B at Long Creek_pid3495.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-761", + "name": "US395C at Canyon City", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.39905, + "lon": -118.94709, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US395C at Canyon City_pid3515.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US395C at Canyon City_pid3515.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-755", + "name": "US395C at Seneca", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.13827, + "lon": -118.97216, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US395C at Seneca_pid3491.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US395C at Seneca_pid3491.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-901", + "name": "US730 at Hatrock", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.90254, + "lon": -119.17391, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US730 at Hatrock_pid4081.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US730 at Hatrock_pid4081.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1391", + "name": "US730 at Rockfall Area", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.99975, + "lon": -118.97652, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US730 at Rockfall EB_pid5154.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US730 at Rockfall EB_pid5154.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1392", + "name": "US730 at Rockfall Area", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.99975, + "lon": -118.97652, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US730 at Rockfall WB_pid5156.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US730 at Rockfall WB_pid5156.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-381", + "name": "US95 at Basque Station", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.41121, + "lon": -117.86204, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Basque_pid1597.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Basque_pid1597.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1401", + "name": "US95 at Blue Mtn Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.31911, + "lon": -117.81907, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US95 at Blue Mtn NB_pid5174.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US95 at Blue Mtn NB_pid5174.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1402", + "name": "US95 at Blue Mtn Pass", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.31911, + "lon": -117.81907, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US95 at Blue Mtn SB_pid5176.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US95 at Blue Mtn SB_pid5176.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1114", + "name": "US95 at Burns Jct", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.77757, + "lon": -117.84783, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US95 at Burns Jct SB_pid4608.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US95 at Burns Jct SB_pid4608.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1115", + "name": "US95 at Burns Jct", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.77736, + "lon": -117.84783, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US95 at Burns Jct NB_pid4610.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US95 at Burns Jct NB_pid4610.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-382", + "name": "US95 at Jordan Valley", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.9797, + "lon": -117.05336, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/JordanValley_pid1598.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/JordanValley_pid1598.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1403", + "name": "US95 at McDermitt", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.00014, + "lon": -117.71804, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US95 at Nevada NB_pid5178.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US95 at Nevada NB_pid5178.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1404", + "name": "US95 at McDermitt", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.00014, + "lon": -117.71804, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US95 at Nevada SB_pid5180.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US95 at Nevada SB_pid5180.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1405", + "name": "US95 at Rome Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.85079, + "lon": -117.60601, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US95 at Rome Hill NB_pid5182.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US95 at Rome Hill NB_pid5182.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1406", + "name": "US95 at Rome Hill", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.85079, + "lon": -117.60601, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US95 at Rome Hill SB_pid5184.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US95 at Rome Hill SB_pid5184.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-717", + "name": "US97 Bend - Ramp to Wall and Revere", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.06755, + "lon": -121.30889, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Wall and Revere_pid3334.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Wall and Revere_pid3334.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-272", + "name": "US97 California at Mt. Hebron", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.75748, + "lon": -122.06532, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/MtHebron_pid612.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/MtHebron_pid612.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-273", + "name": "US97 California at Dorris", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.9845, + "lon": -121.90567, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Dorris_pid609.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Dorris_pid609.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-271", + "name": "US97 California at Grass Lake", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 41.63326, + "lon": -122.19296, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/GrassLake_pid610.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/GrassLake_pid610.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-406", + "name": "US97 Near OR138 Jct - Milepoint 214", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.06591, + "lon": -121.82514, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at MP214 Near ORE138 Jct_pid1729.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at MP214 Near ORE138 Jct_pid1729.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1188", + "name": "US97 Ramp at Arizona-Colorado", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05166, + "lon": -121.30892, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 Ramp at Arizona-Colorado_pid4750.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 Ramp at Arizona-Colorado_pid4750.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-984", + "name": "US97 at Bend Scales NB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.94912, + "lon": -121.34956, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Lava Butte Scales NB_pid4349.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Lava Butte Scales NB_pid4349.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-985", + "name": "US97 at Bend Scales SB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.94912, + "lon": -121.34956, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Lava Butte Scales SB_pid4351.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Lava Butte Scales SB_pid4351.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-660", + "name": "US97 at Biggs Jct", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.66953, + "lon": -120.83333, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Biggs Jct_pid3105.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Biggs Jct_pid3105.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-237", + "name": "US97 at Chemult", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.2235, + "lon": -121.78639, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Chemult_pid621.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Chemult_pid621.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-673", + "name": "US97 at Colorado", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.05197, + "lon": -121.30732, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Colorado_pid3157.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Colorado_pid3157.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-839", + "name": "US97 at Cooley Rd.", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.10955, + "lon": -121.29476, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Cooley Rd_pid3830.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Cooley Rd_pid3830.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-896", + "name": "US97 at Cow Canyon", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.90404, + "lon": -120.93793, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Cow Canyon N_pid4063.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Cow Canyon N_pid4063.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-897", + "name": "US97 at Cow Canyon", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.90404, + "lon": -120.93793, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Cow Canyon S_pid4065.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Cow Canyon S_pid4065.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-456", + "name": "US97 at Crescent", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.46236, + "lon": -121.69624, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Crescent North_pid2119.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Crescent North_pid2119.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1192", + "name": "US97 at Dan Obrien Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.25856, + "lon": -121.80239, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Dan Obrien Way NB_pid4758.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Dan Obrien Way NB_pid4758.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1205", + "name": "US97 at Dan Obrien Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.25855, + "lon": -121.80238, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Dan Obrien Way SB_pid4783.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Dan Obrien Way SB_pid4783.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1151", + "name": "US97 at Drafter Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.72037, + "lon": -121.47196, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Drafter Rd N_pid4682.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Drafter Rd N_pid4682.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1152", + "name": "US97 at Drafter Rd S", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.72037, + "lon": -121.47196, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Drafter Rd S_pid4684.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Drafter Rd S_pid4684.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-674", + "name": "US97 at Empire Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.091, + "lon": -121.30058, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Empire_pid3161.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Empire_pid3161.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1373", + "name": "US97 at Empire NB Off-Ramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.08481, + "lon": -121.30061, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Empire NB Off-Ramp MP135.88_pid5118.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Empire NB Off-Ramp MP135.88_pid5118.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-848", + "name": "US97 at Evergreen / ORE126", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.27271, + "lon": -121.1695, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Evergreen_pid3866.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Evergreen_pid3866.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-296", + "name": "US97 at Green Springs Interchange", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.19257, + "lon": -121.79871, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Green Springs Interchange_pid708.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Green Springs Interchange_pid708.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-192", + "name": "US97 at Juniper Butte", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.47596, + "lon": -121.19416, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Juniper Butte_pid2562.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Juniper Butte_pid2562.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-627", + "name": "US97 at Kent", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.19383, + "lon": -120.69589, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Kent_pid2973.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Kent_pid2973.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-198", + "name": "US97 at LaPine", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.67448, + "lon": -121.50037, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/LaPine_pid630.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/LaPine_pid630.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-197", + "name": "US97 at Lava Butte", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.90677, + "lon": -121.35743, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/LavaButte_pid631.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/LavaButte_pid631.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-447", + "name": "US97 at Lava Butte", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.90677, + "lon": -121.35743, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Lava Butte S_pid1923.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Lava Butte S_pid1923.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-570", + "name": "US97 at Modoc Point", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.44446, + "lon": -121.86808, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Modoc Point_pid2740.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Modoc Point_pid2740.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-786", + "name": "US97 at Mt Identifier", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.99043, + "lon": -120.84933, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Mt Identifier_pid3617.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Mt Identifier_pid3617.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-975", + "name": "US97 at Murphy Rd Exit", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.01303, + "lon": -121.32006, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Murphy Rd Exit_pid4331.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Murphy Rd Exit_pid4331.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-547", + "name": "US97 at Ogden Wayside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.39073, + "lon": -121.1903, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Ogden Wayside N_pid2643.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Ogden Wayside N_pid2643.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-546", + "name": "US97 at Ogden Wayside", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.39091, + "lon": -121.19013, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Ogden Wayside S_pid2647.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Ogden Wayside S_pid2647.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-973", + "name": "US97 at Powers Rd ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.02897, + "lon": -121.31551, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Powers Rd_pid4327.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Powers Rd_pid4327.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-991", + "name": "US97 at Reed Market Bend Parkway", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.03878, + "lon": -121.30755, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Reed Market Bend Parkway_pid4363.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Reed Market Bend Parkway_pid4363.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-979", + "name": "US97 at Revere Parkway On-Ramp ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.06805, + "lon": -121.30752, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Revere On-Ramp Bend Parkway_pid4339.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Revere On-Ramp Bend Parkway_pid4339.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-891", + "name": "US97 at Robal Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.10266, + "lon": -121.29943, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Robal Rd_pid4039.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Robal Rd_pid4039.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1364", + "name": "US97 at Robal SB On-Ramp", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.10075, + "lon": -121.29719, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Robal SB On-Ramp_pid5096.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Robal SB On-Ramp_pid5096.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-659", + "name": "US97 at Rocking Horse", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.00212, + "lon": -121.32803, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Rocking Horse_pid3101.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Rocking Horse_pid3101.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-976", + "name": "US97 at Rocking Horse", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.00113, + "lon": -121.3288, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Rocking Horse NB_pid4333.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Rocking Horse NB_pid4333.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-899", + "name": "US97 at SW 61st St S", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.18115, + "lon": -121.24373, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at SW 61st St S_pid4073.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at SW 61st St S_pid4073.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-535", + "name": "US97 at Sand Creek", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.82256, + "lon": -121.83395, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Sand Creek_pid2592.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Sand Creek_pid2592.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-980", + "name": "US97 at Shaniko NB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.00614, + "lon": -120.75247, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Shaniko NB_pid4341.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Shaniko NB_pid4341.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-981", + "name": "US97 at Shaniko SB", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.00614, + "lon": -120.75247, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Shaniko SB_pid4343.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Shaniko SB_pid4343.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-439", + "name": "US97 at Spring Creek (Bottom of Grade)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.65397, + "lon": -121.87792, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Spring Creek Bottom_pid1890.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Spring Creek Bottom_pid1890.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-405", + "name": "US97 at Spring Creek (Top of Grade)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 42.6795, + "lon": -121.85625, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Spring Creek (Top of Grade)_pid1726.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Spring Creek (Top of Grade)_pid1726.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1232", + "name": "US97 at US20 Overpass Bend Pkwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.07675, + "lon": -121.30352, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at US20 Overpass Bend Pkwy_pid4836.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at US20 Overpass Bend Pkwy_pid4836.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-760", + "name": "US97 at US26 Jct", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.6388, + "lon": -121.12957, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at US26 Jct NB_pid3511.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at US26 Jct NB_pid3511.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-789", + "name": "US97 at Wasco", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.60839, + "lon": -120.72366, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/US97 at Wasco_pid3629.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/US97 at Wasco_pid3629.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1276", + "name": "Umpqua River/Winchester Bay (USCG)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 43.66689, + "lon": -124.20589, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Umpqua River Winchester Bay (USCG)_pid4922.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Umpqua River Winchester Bay (USCG)_pid4922.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-785", + "name": "Washington Co - Brookwood Blvd at Evergreen", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55077, + "lon": -122.92618, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Brookwood Blvd at Evergreen_pid3613.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Brookwood Blvd at Evergreen_pid3613.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-784", + "name": "Washington Co - Brookwood Blvd at Huffman", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55693, + "lon": -122.92658, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Brookwood Blvd at Huffman_pid3609.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Brookwood Blvd at Huffman_pid3609.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-783", + "name": "Washington Co - Brookwood Blvd at US26", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56319, + "lon": -122.92599, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Brookwood Blvd at US26_pid3605.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Brookwood Blvd at US26_pid3605.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-781", + "name": "Washington Co - Cornell Rd at Saltzman Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52554, + "lon": -122.80651, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Saltzman Rd_pid3597.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Saltzman Rd_pid3597.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-782", + "name": "Washington Co - Glencoe Rd at Scotch Church Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.57266, + "lon": -123.00471, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Glencoe Rd at Scotch Church Rd_pid3601.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Glencoe Rd at Scotch Church Rd_pid3601.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-875", + "name": "Washington County - 158th Ave at Walker Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51671, + "lon": -122.83971, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/158th Ave at Walker Rd_pid3975.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/158th Ave at Walker Rd_pid3975.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-999", + "name": "Washington County - 175th Ave at Kemmer Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45136, + "lon": -122.85746, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/175th Ave at Kemmer Rd_pid4379.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/175th Ave at Kemmer Rd_pid4379.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1072", + "name": "Washington County - 175th Ave at Rigert Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46191, + "lon": -122.85711, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/175th Ave at Rigert Rd_pid4525.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/175th Ave at Rigert Rd_pid4525.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1073", + "name": "Washington County - 175th Ave at Scholls Ferry Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42757, + "lon": -122.85378, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/175th Ave at Scholls Ferry Rd_pid4527.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/175th Ave at Scholls Ferry Rd_pid4527.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-623", + "name": "Washington County - 185th Ave at Baseline Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51578, + "lon": -122.86768, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/185th Ave at Baseline Rd_pid2932.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/185th Ave at Baseline Rd_pid2932.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-605", + "name": "Washington County - 185th Ave at Cornell Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53404, + "lon": -122.86776, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/185th Ave at Cornell Rd_pid2828.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/185th Ave at Cornell Rd_pid2828.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-582", + "name": "Washington County - 185th Ave at Evergreen Pkwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53829, + "lon": -122.86729, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/185th and Evergreen_pid2794.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/185th and Evergreen_pid2794.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-933", + "name": "Washington County - 185th Ave at Johnson St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50024, + "lon": -122.8672, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/185th Ave at Johnson St_pid4209.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/185th Ave at Johnson St_pid4209.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-926", + "name": "Washington County - 185th Ave at Rock Creek Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54526, + "lon": -122.86766, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/185th Ave at Rock Creek Blvd_pid4181.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/185th Ave at Rock Creek Blvd_pid4181.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-996", + "name": "Washington County - 185th Ave at Springville Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.56231, + "lon": -122.86757, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/185th Ave at Springville Rd_pid4373.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/185th Ave at Springville Rd_pid4373.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-606", + "name": "Washington County - 185th Ave at Walker Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5278, + "lon": -122.86727, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/185th Ave at Walker Rd_pid2832.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/185th Ave at Walker Rd_pid2832.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-624", + "name": "Washington County - 185th Ave at West Union Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55813, + "lon": -122.86739, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/185th Ave at West Union Rd_pid2936.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/185th Ave at West Union Rd_pid2936.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1474", + "name": "Washington County - 209th Ave at Blanton St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49228, + "lon": -122.89173, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/209th Ave at Blanton St_pid5322.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/209th Ave at Blanton St_pid5322.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1476", + "name": "Washington County - 209th Ave at Kinnaman Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48944, + "lon": -122.89222, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/209th Ave at Kinnaman Rd_pid5326.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/209th Ave at Kinnaman Rd_pid5326.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1432", + "name": "Washington County - 65th Ave at Borland Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.37684, + "lon": -122.74385, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/65th Ave at Borland Rd_pid5236.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/65th Ave at Borland Rd_pid5236.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-864", + "name": "Washington County - 65th Ave at Sagert St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.37558, + "lon": -122.74385, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/65th Ave at Sagert St_pid3971.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/65th Ave at Sagert St_pid3971.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1437", + "name": "Washington County - 72nd Ave at Durham Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.39907, + "lon": -122.749, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/72nd Ave at Durham Rd_pid5246.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/72nd Ave at Durham Rd_pid5246.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1436", + "name": "Washington County - 72nd Ave at Trimet", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3974, + "lon": -122.74909, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/72nd Ave at Trimet_pid5244.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/72nd Ave at Trimet_pid5244.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1080", + "name": "Washington County - Bald Peak Rd at Southwind Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41907, + "lon": -123.0511, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Bald Peak Rd at Southwind Dr_pid4541.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Bald Peak Rd at Southwind Dr_pid4541.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1074", + "name": "Washington County - Barnes Rd at 118th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51969, + "lon": -122.80126, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at 118th Ave_pid4529.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at 118th Ave_pid4529.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-930", + "name": "Washington County - Barnes Rd at Baltic Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5099, + "lon": -122.77543, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Baltic Ave_pid4197.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Baltic Ave_pid4197.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1075", + "name": "Washington County - Barnes Rd at Baltic Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50935, + "lon": -122.77458, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Baltic Rd_pid4531.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Baltic Rd_pid4531.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-936", + "name": "Washington County - Barnes Rd at Burnside Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51595, + "lon": -122.7458, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Burnside Rd_pid4221.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Burnside Rd_pid4221.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1076", + "name": "Washington County - Barnes Rd at Burnside Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51596, + "lon": -122.74685, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Burnside Rd_pid4533.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Burnside Rd_pid4533.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1000", + "name": "Washington County - Barnes Rd at Cedar Hills Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5163, + "lon": -122.7922, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Cedar Hills Blvd_pid4381.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Cedar Hills Blvd_pid4381.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1077", + "name": "Washington County - Barnes Rd at Peterkort Center", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51223, + "lon": -122.77927, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Peterkort Center_pid4535.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Barnes Rd at Peterkort Center_pid4535.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1478", + "name": "Washington County - Baseline Rd at 170th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51252, + "lon": -122.85184, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Baseline Rd at 170th Ave_pid5330.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Baseline Rd at 170th Ave_pid5330.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-929", + "name": "Washington County - Bethany Blvd at West Union Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54446, + "lon": -122.83886, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Bethany Blvd at West Union Rd_pid4193.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Bethany Blvd at West Union Rd_pid4193.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-872", + "name": "Washington County - Boones Ferry Rd at Martinazzi Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3847, + "lon": -122.75912, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Martinazzi Ave_pid3967.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Boones Ferry Rd at Martinazzi Ave_pid3967.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-744", + "name": "Washington County - Brookwood Blvd at Main St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52005, + "lon": -122.93695, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Brookwood Blvd at Main St_pid3447.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Brookwood Blvd at Main St_pid3447.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1081", + "name": "Washington County - Bull Mountain Rd at Peachtree Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41565, + "lon": -122.8183, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Bull Mountain Rd at Peachtree Dr_pid4543.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Bull Mountain Rd at Peachtree Dr_pid4543.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-743", + "name": "Washington County - Cornelius Pass Rd at Baseline Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5152, + "lon": -122.90129, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Baseline Rd_pid3443.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Baseline Rd_pid3443.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1435", + "name": "Washington County - Cornelius Pass Rd at Blanton St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49262, + "lon": -122.90026, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Blanton St_pid5242.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Blanton St_pid5242.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-602", + "name": "Washington County - Cornelius Pass Rd at Cornell", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5397, + "lon": -122.90052, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Cornell_pid2836.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Cornell_pid2836.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-826", + "name": "Washington County - Cornelius Pass Rd at Evergreen Pkwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54637, + "lon": -122.89994, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Evergreen Pkwy_pid3778.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Evergreen Pkwy_pid3778.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-994", + "name": "Washington County - Cornelius Pass Rd at Frances St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50867, + "lon": -122.90204, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Frances St_pid4369.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Frances St_pid4369.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1475", + "name": "Washington County - Cornelius Pass Rd at Kinnaman St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48875, + "lon": -122.90218, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Kinnaman St_pid5324.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Kinnaman St_pid5324.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-993", + "name": "Washington County - Cornelius Pass Rd at Tualatin Valley Hwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49749, + "lon": -122.90218, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Tualatin Valley Hwy_pid4367.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Tualatin Valley Hwy_pid4367.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-995", + "name": "Washington County - Cornelius Pass Rd at Wilkins St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52699, + "lon": -122.89968, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Wilkins St_pid4371.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornelius Pass Rd at Wilkins St_pid4371.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-742", + "name": "Washington County - Cornell Rd at 143rd Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53072, + "lon": -122.82449, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at 143rd Ave_pid3439.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at 143rd Ave_pid3439.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-873", + "name": "Washington County - Cornell Rd at 158th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52957, + "lon": -122.84027, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at 158th Ave_pid3963.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at 158th Ave_pid3963.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-869", + "name": "Washington County - Cornell Rd at 173rd Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53474, + "lon": -122.85456, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at 173rd Ave_pid3959.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at 173rd Ave_pid3959.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-740", + "name": "Washington County - Cornell Rd at 25th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53066, + "lon": -122.9569, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at 25th Ave_pid3423.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at 25th Ave_pid3423.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1078", + "name": "Washington County - Cornell Rd at 87th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52963, + "lon": -122.76517, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at 87th Ave_pid4537.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at 87th Ave_pid4537.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-870", + "name": "Washington County - Cornell Rd at Bethany Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52963, + "lon": -122.84306, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Bethany Blvd_pid3955.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Bethany Blvd_pid3955.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-739", + "name": "Washington County - Cornell Rd at Brookwood Pkwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5327, + "lon": -122.93805, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Brookwood Pkwy_pid3431.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Brookwood Pkwy_pid3431.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1079", + "name": "Washington County - Cornell Rd at Cedar Hills Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52628, + "lon": -122.79235, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Cedar Hills Blvd_pid4539.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Cedar Hills Blvd_pid4539.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-738", + "name": "Washington County - Cornell Rd at Century Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53424, + "lon": -122.91197, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Century Blvd_pid3427.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Century Blvd_pid3427.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-603", + "name": "Washington County - Cornell Rd at Evergreen Pkwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53449, + "lon": -122.8617, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Evergreen Pkwy_pid2840.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Evergreen Pkwy_pid2840.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-741", + "name": "Washington County - Cornell Rd at Murray Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.52667, + "lon": -122.81417, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Murray Blvd_pid3435.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Murray Blvd_pid3435.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-825", + "name": "Washington County - Cornell Rd at Rock Creek Tr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53872, + "lon": -122.89072, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Rock Creek Tr_pid3774.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Rock Creek Tr_pid3774.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-925", + "name": "Washington County - Cornell Rd at Stucki Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.53456, + "lon": -122.87782, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Stucki Ave_pid4177.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Cornell Rd at Stucki Ave_pid4177.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-733", + "name": "Washington County - Dartmouth St at 72nd Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43316, + "lon": -122.75125, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Dartmouth St at 72nd Ave_pid3403.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Dartmouth St at 72nd Ave_pid3403.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-734", + "name": "Washington County - Dartmouth St at Costco", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43449, + "lon": -122.75624, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Dartmouth St at Costco_pid3407.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Dartmouth St at Costco_pid3407.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1473", + "name": "Washington County - Durham Rd at 108th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40418, + "lon": -122.78797, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Durham Rd at 108th Ave_pid5320.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Durham Rd at 108th Ave_pid5320.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1470", + "name": "Washington County - Durham Rd at 79th Ave ", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40431, + "lon": -122.75828, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Durham Rd at 79th Ave_pid5314.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Durham Rd at 79th Ave_pid5314.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1471", + "name": "Washington County - Durham Rd at 88th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40421, + "lon": -122.76791, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Durham Rd at 88th Ave_pid5316.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Durham Rd at 88th Ave_pid5316.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-871", + "name": "Washington County - Durham Rd at 92nd Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40426, + "lon": -122.77145, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Durham Rd at 92nd Ave_pid3951.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Durham Rd at 92nd Ave_pid3951.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1472", + "name": "Washington County - Durham Rd at 98th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40429, + "lon": -122.77762, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Durham Rd at 98th Ave_pid5318.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Durham Rd at 98th Ave_pid5318.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-865", + "name": "Washington County - Durham Rd at Hall Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40438, + "lon": -122.76472, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Durham Rd at Hall Blvd_pid3947.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Durham Rd at Hall Blvd_pid3947.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-866", + "name": "Washington County - Durham Rd at Summerfield Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40414, + "lon": -122.79465, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Durham Rd at Summerfield Dr_pid3943.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Durham Rd at Summerfield Dr_pid3943.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-867", + "name": "Washington County - Durham Rd at Upper Boones Ferry Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40221, + "lon": -122.7525, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Durham Rd at Upper Boones Ferry Rd_pid3939.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Durham Rd at Upper Boones Ferry Rd_pid3939.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1005", + "name": "Washington County - Evergreen Blvd at 229th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.55036, + "lon": -122.90993, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Evergreen Blvd at 229th Ave_pid4391.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Evergreen Blvd at 229th Ave_pid4391.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-604", + "name": "Washington County - Evergreen Pkwy at Rock Creek Trail", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54538, + "lon": -122.88588, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Evergreen Pkwy at Rock Creek Trail_pid2844.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Evergreen Pkwy at Rock Creek Trail_pid2844.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-874", + "name": "Washington County - Evergreen Pkwy at Stucki Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54069, + "lon": -122.87433, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Evergreen Pkwy at Stucki Ave_pid3931.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Evergreen Pkwy at Stucki Ave_pid3931.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-621", + "name": "Washington County - Farmington Rd at 170th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48196, + "lon": -122.85169, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Farmington Rd at 170th Ave_pid2952.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Farmington Rd at 170th Ave_pid2952.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-997", + "name": "Washington County - Farmington Rd at 209th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46653, + "lon": -122.89268, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Farmington Rd at 209th Ave_pid4375.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Farmington Rd at 209th Ave_pid4375.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1070", + "name": "Washington County - Fern Hill Rd at Geiger Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50185, + "lon": -123.08944, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Fern Hill Rd at Geiger Rd_pid4521.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Fern Hill Rd at Geiger Rd_pid4521.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-827", + "name": "Washington County - Fern Hill Rd at Taylor Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51048, + "lon": -123.09123, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Fern Hill Rd at Taylor Way_pid3782.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Fern Hill Rd at Taylor Way_pid3782.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1071", + "name": "Washington County - Fern Hill Rd at Taylor Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51041, + "lon": -123.09144, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Fern Hill Rd at Taylor Way_pid4523.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Fern Hill Rd at Taylor Way_pid4523.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1440", + "name": "Washington County - Grabhorn Rd at Farmington Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46619, + "lon": -122.89248, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Grabhorn Rd at Farmington Rd_pid5252.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Grabhorn Rd at Farmington Rd_pid5252.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1441", + "name": "Washington County - Grabhorn Rd at Tile Flat Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43279, + "lon": -122.88609, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Grabhorn Rd at Tile Flat Rd_pid5254.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Grabhorn Rd at Tile Flat Rd_pid5254.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-998", + "name": "Washington County - Greenburg Rd at Washington Square Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44588, + "lon": -122.7765, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Greenburg Rd at Washington Square Rd_pid4377.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Greenburg Rd at Washington Square Rd_pid4377.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-619", + "name": "Washington County - Murray Blvd at Allen Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.47661, + "lon": -122.82638, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Allen Blvd_pid2948.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Allen Blvd_pid2948.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-863", + "name": "Washington County - Murray Blvd at Beard St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45296, + "lon": -122.82617, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Beard St_pid3927.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Beard St_pid3927.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1001", + "name": "Washington County - Murray Blvd at Farmington Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48579, + "lon": -122.82613, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Farmington Rd_pid4383.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Farmington Rd_pid4383.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-862", + "name": "Washington County - Murray Blvd at Hart Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.46554, + "lon": -122.82631, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Hart_pid3923.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Hart_pid3923.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-620", + "name": "Washington County - Murray Blvd at Jenkins Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.50371, + "lon": -122.82648, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Jenkins Rd_pid2940.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Jenkins Rd_pid2940.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-618", + "name": "Washington County - Murray Blvd at Maverick St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45555, + "lon": -122.82638, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Maverick St_pid2944.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Maverick St_pid2944.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-935", + "name": "Washington County - Murray Blvd at Millikan Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49446, + "lon": -122.82626, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Millikan Way_pid4217.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Millikan Way_pid4217.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-736", + "name": "Washington County - Murray Blvd at Walker Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51088, + "lon": -122.82217, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Walker Rd_pid3415.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Murray Blvd at Walker Rd_pid3415.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1006", + "name": "Washington County - Nyberg St at 65th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.38267, + "lon": -122.74515, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Nyberg St at 65th Ave_pid4393.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Nyberg St at 65th Ave_pid4393.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-583", + "name": "Washington County - Nyberg St at Fred Meyer Access", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.38275, + "lon": -122.75629, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Nyberg St at Fred Meyer Access_pid2798.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Nyberg St at Fred Meyer Access_pid2798.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-591", + "name": "Washington County - Nyberg St at I-5", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3825, + "lon": -122.7535, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Nyberg St at I-5_pid2848.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Nyberg St at I-5_pid2848.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1481", + "name": "Washington County - River Rd at Davis Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49405, + "lon": -122.93993, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/River Rd at Davis Rd_pid5336.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/River Rd at Davis Rd_pid5336.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-616", + "name": "Washington County - Roy Rogers Rd at Beef Bend Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40053, + "lon": -122.85193, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Roy Rogers at Beef Bend_pid2956.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Roy Rogers at Beef Bend_pid2956.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-732", + "name": "Washington County - Roy Rogers Rd at Borchers Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.3714, + "lon": -122.84674, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Roy Rogers Rd at Borchers Dr_pid3399.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Roy Rogers Rd at Borchers Dr_pid3399.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1433", + "name": "Washington County - Roy Rogers Rd at Jean Louise Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41955, + "lon": -122.85198, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Roy Rogers Rd at Jean Louise Rd_pid5238.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Roy Rogers Rd at Jean Louise Rd_pid5238.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-599", + "name": "Washington County - Roy Rogers Rd at Scholls Sherwood Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.38139, + "lon": -122.85639, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Roy Rogers Rd at Scholls Sherwood Rd_pid2852.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Roy Rogers Rd at Scholls Sherwood Rd_pid2852.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-932", + "name": "Washington County - Scholls Ferry Rd at 121st Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44418, + "lon": -122.80034, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at 121st Ave_pid4205.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at 121st Ave_pid4205.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-601", + "name": "Washington County - Scholls Ferry Rd at 125th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44361, + "lon": -122.80518, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at 125th Ave_pid2856.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at 125th Ave_pid2856.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1003", + "name": "Washington County - Scholls Ferry Rd at Blackbird Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.43201, + "lon": -122.83981, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Blackbird Dr_pid4387.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Blackbird Dr_pid4387.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-600", + "name": "Washington County - Scholls Ferry Rd at Hall Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45703, + "lon": -122.78255, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Hall Blvd_pid2860.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Hall Blvd_pid2860.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-617", + "name": "Washington County - Scholls Ferry Rd at Murray Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4383, + "lon": -122.82627, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Murray Blvd_pid2960.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Murray Blvd_pid2960.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-931", + "name": "Washington County - Scholls Ferry Rd at Nimbus", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.44734, + "lon": -122.78972, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Nimbus_pid4201.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Nimbus_pid4201.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-735", + "name": "Washington County - Scholls Ferry Rd at Roy Rogers Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.42638, + "lon": -122.85351, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Roy Rogers Rd_pid3411.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Roy Rogers Rd_pid3411.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1004", + "name": "Washington County - Scholls Ferry Rd at Teal Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.4353, + "lon": -122.83151, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Teal Blvd_pid4389.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Teal Blvd_pid4389.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1069", + "name": "Washington County - Scholls Ferry Rd at Teufel Hill Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.41913, + "lon": -122.88508, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Teufel Hill Rd_pid4519.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd at Teufel Hill Rd_pid4519.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-581", + "name": "Washington County - Scholls Ferry at OR217", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.45052, + "lon": -122.78562, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd_pid2790.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Scholls Ferry Rd_pid2790.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1438", + "name": "Washington County - Susbauer Rd at Hornecker Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.54307, + "lon": -123.04042, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Susbauer Rd at Hornecker Rd_pid5248.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Susbauer Rd at Hornecker Rd_pid5248.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1439", + "name": "Washington County - Susbauer Rd at Long Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.5389, + "lon": -123.04198, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Susbauer Rd at Long Rd_pid5250.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Susbauer Rd at Long Rd_pid5250.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1082", + "name": "Washington County - Timber Rd at Railroad Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.71979, + "lon": -123.29501, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Timber Rd at Railroad Ave_pid4545.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Timber Rd at Railroad Ave_pid4545.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1007", + "name": "Washington County - Tualatin Rd at Boones Ferry Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.38423, + "lon": -122.76422, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Rd at Boones Ferry Rd_pid4395.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Rd at Boones Ferry Rd_pid4395.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1068", + "name": "Washington County - Tualatin Sherwood Rd at 115th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.37106, + "lon": -122.79558, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at 115th Ave_pid4517.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at 115th Ave_pid4517.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-597", + "name": "Washington County - Tualatin Sherwood Rd at 124th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36926, + "lon": -122.80583, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at 124th Ave_pid2864.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at 124th Ave_pid2864.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-594", + "name": "Washington County - Tualatin Sherwood Rd at 89th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.38126, + "lon": -122.76792, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at 89th_pid2868.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at 89th_pid2868.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-595", + "name": "Washington County - Tualatin Sherwood Rd at 95th", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.37894, + "lon": -122.77454, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at 95th_pid2872.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at 95th_pid2872.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-729", + "name": "Washington County - Tualatin Sherwood Rd at Avery St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.37275, + "lon": -122.79221, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Avery St_pid3387.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Avery St_pid3387.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-598", + "name": "Washington County - Tualatin Sherwood Rd at Baler Way", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36781, + "lon": -122.83897, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Baler Way_pid2876.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Baler Way_pid2876.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-593", + "name": "Washington County - Tualatin Sherwood Rd at Boones Ferry Rd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.38137, + "lon": -122.76451, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Boones Ferry Rd_pid2880.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Boones Ferry Rd_pid2880.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1480", + "name": "Washington County - Tualatin Sherwood Rd at Langer Farms Pkwy", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36761, + "lon": -122.83596, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Langer Farms Pkwy_pid5334.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Langer Farms Pkwy_pid5334.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-592", + "name": "Washington County - Tualatin Sherwood Rd at Martinazzi Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.38128, + "lon": -122.75924, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Martinazzi Ave_pid2884.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Martinazzi Ave_pid2884.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-731", + "name": "Washington County - Tualatin Sherwood Rd at OR99W", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36999, + "lon": -122.84318, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at OR99W_pid3395.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at OR99W_pid3395.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-730", + "name": "Washington County - Tualatin Sherwood Rd at Oregon St", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.36831, + "lon": -122.81632, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Oregon St_pid3391.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Oregon St_pid3391.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-596", + "name": "Washington County - Tualatin Sherwood Rd at Teton Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.37798, + "lon": -122.78228, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Teton Ave_pid2888.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Sherwood Rd at Teton Ave_pid2888.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-934", + "name": "Washington County - Tualatin Valley Hwy at 185th Ave", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.49412, + "lon": -122.8672, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Valley Hwy at 185th Ave_pid4213.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Valley Hwy at 185th Ave_pid4213.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1002", + "name": "Washington County - Tualatin Valley Hwy at Murray Blvd", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.48954, + "lon": -122.82611, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Tualatin Valley Hwy at Murray Blvd_pid4385.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Tualatin Valley Hwy at Murray Blvd_pid4385.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-868", + "name": "Washington County - Upper Boones Ferry Rd at Carman Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.40521, + "lon": -122.74901, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Upper Boones Ferry Rd at Carman Dr_pid3935.JPG", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Upper Boones Ferry Rd at Carman Dr_pid3935.JPG", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1479", + "name": "Washington County - Walker Rd at Meadow Dr", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 45.51341, + "lon": -122.82816, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Walker Rd at Meadow Dr_pid5332.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Walker Rd at Meadow Dr_pid5332.jpg", + "frameRefreshMs": 300000 + }, + { + "id": "world-or-1267", + "name": "Yaquina Bay Newport (USCG)", + "city": "Oregon", + "cityId": "oregon", + "provider": "TripCheck (ODOT)", + "lat": 44.62413, + "lon": -124.06289, + "feedType": "image", + "sourceKind": "tripcheck-odot", + "license": "Oregon DOT TripCheck public CCTV inventory", + "credit": "Oregon Department of Transportation", + "url": "https://www.tripcheck.com/roadcams/cams/Yaquina Bay Newport USCG_pid4904.jpg", + "snapshotUrl": "https://www.tripcheck.com/roadcams/cams/Yaquina Bay Newport USCG_pid4904.jpg", + "frameRefreshMs": 300000 + } +] diff --git a/docs/CCTV_INTEGRATION.md b/docs/CCTV_INTEGRATION.md index 9cd81f837..ab3108da2 100644 --- a/docs/CCTV_INTEGRATION.md +++ b/docs/CCTV_INTEGRATION.md @@ -1,8 +1,9 @@ # CCTV integration workflow Use this workflow when adding a camera provider or repairing an existing feed. -The CCTV layer gets its catalog and media through the local server; keep -provider-specific network access and URL policy on the server side. +The CCTV catalog comes through the local server; media normally does too. Keep +provider-specific URL policy on the server, including any validated browser-only +media URL permitted by the exception below. ## 1. Check the source before coding @@ -90,11 +91,23 @@ Catalog and media loaders must also: - avoid persistent frame storage unless the provider's terms explicitly allow it and the design has been reviewed. -For live media, use the existing media proxy and supported feed type (`mjpeg`, -`mp4`, `webm`, or `hls`) rather than adding a direct browser stream. Validate -the upstream content type and bound or cancel streams according to the -existing proxy behavior. Read [SECURITY.md](../SECURITY.md) before changing -URL validation, redirects, or proxy behavior. +For live media, prefer the existing proxy and supported feed type (`mjpeg`, +`mp4`, `webm`, or `hls`). A direct browser-only video is a narrow fallback for +a source whose terms allow embedding when the browser can play it but the app +server cannot fetch it. Build its URL from a validated provider ID on the +server; never accept a browser-supplied media URL. Render it in a native DOM +`