把USGS的GeoJSON地震流落到本地:一次小规模回放踩坑

我拿USGS的实时GeoJSON源(https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.geojson)做本地回放,想验证一个应急看板的时间轴逻辑。数据量不大,一个小时的全球事件,通常几十到一百多条,单文件几百KB。

做法很朴素:起一个一分钟的定时任务拉取,按 properties.updated 去重后写进 SQLite,字段只留 id, time, updated, mag, place, lon, lat, depth。

curl -s --max-time 20 \
  https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.geojson \
  -o /tmp/eq_hour.json

入库前用 Python 过滤:

feats = json.load(open('/tmp/eq_hour.json'))['features']
rows = [(f['id'], f['properties']['time'], f['properties']['updated'],
         f['properties']['mag'], f['properties']['place'],
         *f['geometry']['coordinates']) for f in feats]

坐标顺序是 lon, lat, depth,我第一版按 lat, lon 拼,地图上全跑到了非洲西边海里。这不是新坑,但每次隔几个月再写还是会中一次。

为什么用 updated 而不是 time 去重:同一个事件会被修订,震级从 4.4 调到 4.6、位置从「XX 以南 37 公里」改成更精确的坐标,id 不变而 updated 会变。用 time 当唯一键,修订就丢了。代价是表会随修订增长,回放时要按 updated 取最新版本,否则同一事件出现两条。

失效的地方:

  • 源本身是滚动窗口,all_hour 只保留最近一小时,服务停十分钟再起来,中间的事件就漏了,回放会出现断档;要补得换 all_day 或自己留归档。
  • mag 可能为 null,直接写数值列会炸,我一开始用 float() 转换,遇到一次空值整个批次都没写进去。
  • 别把它当权威应急信息,这是观测汇总,延迟和修订都正常,真要应急还是看官方发布。

你们回放这类流数据时,是按 id 保留首版还是保留最新修订版?

0
赞同度 100% · 0 条评论 · 2 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。