Spaces:
Running
Running
Publish sanitized drone sightings private preview from control plane
Browse files- README.md +20 -13
- app.py +5 -0
- dataset_bundle/README.md +25 -0
- dataset_bundle/daily_area_rollup.csv +12 -0
- dataset_bundle/event_sources.csv +13 -0
- dataset_bundle/events.csv +12 -0
- dataset_bundle/limitations_and_blind_spots.md +8 -0
- dataset_bundle/methodology.md +17 -0
- dataset_bundle/monitored_areas.csv +0 -0
- dataset_bundle/public_release_manifest.json +60 -0
- dataset_bundle/quality_checks.md +13 -0
- dataset_bundle/schema_notes.md +12 -0
- public_copy.json +5 -0
- public_space_app.py +170 -0
- requirements.txt +2 -0
README.md
CHANGED
|
@@ -1,13 +1,20 @@
|
|
| 1 |
-
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
-
sdk: gradio
|
| 7 |
-
sdk_version:
|
| 8 |
-
app_file: app.py
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: Drone Sightings Map
|
| 3 |
+
emoji: 🛸
|
| 4 |
+
colorFrom: red
|
| 5 |
+
colorTo: blue
|
| 6 |
+
sdk: gradio
|
| 7 |
+
sdk_version: 5.23.1
|
| 8 |
+
app_file: app.py
|
| 9 |
+
python_version: 3.11
|
| 10 |
+
---
|
| 11 |
+
|
| 12 |
+
# Drone Sightings Near Covered U.S. Military and Civilian Areas
|
| 13 |
+
|
| 14 |
+
# Drone Sightings Near Covered U.S. Military and Civilian Areas
|
| 15 |
+
|
| 16 |
+
This private preview shows reported drone sightings from news stories over official covered military and civilian areas.
|
| 17 |
+
|
| 18 |
+
Use the built-in time slider and play button in the map to watch red dots appear across time.
|
| 19 |
+
|
| 20 |
+
This release tracks reported drone sightings and does not prove intent, threat, wrongdoing, or a verified security breach.
|
app.py
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pathlib import Path
|
| 2 |
+
|
| 3 |
+
from public_space_app import build_app
|
| 4 |
+
|
| 5 |
+
app = build_app(Path(__file__).with_name("public_copy.json"))
|
dataset_bundle/README.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Drone Sightings Near Covered U.S. Military and Civilian Areas
|
| 2 |
+
|
| 3 |
+
A small, review-oriented slice of U.S. news-reported drone sightings mapped against official covered-area registries.
|
| 4 |
+
|
| 5 |
+
This release tracks reported drone sightings from news stories and does not prove intent, wrongdoing, threat, or a verified security breach.
|
| 6 |
+
|
| 7 |
+
## Included Files
|
| 8 |
+
|
| 9 |
+
- `events.csv`
|
| 10 |
+
- `monitored_areas.csv`
|
| 11 |
+
- `event_sources.csv`
|
| 12 |
+
- `daily_area_rollup.csv`
|
| 13 |
+
- `public_release_manifest.json`
|
| 14 |
+
- `methodology.md`
|
| 15 |
+
- `limitations_and_blind_spots.md`
|
| 16 |
+
- `quality_checks.md`
|
| 17 |
+
- `schema_notes.md`
|
| 18 |
+
|
| 19 |
+
## Caveats
|
| 20 |
+
|
| 21 |
+
- This release tracks reported drone sightings from news stories, not verified federal incident records.
|
| 22 |
+
- A reported sighting does not by itself prove intent, threat, wrongdoing, or the presence of a hostile actor.
|
| 23 |
+
- Events are plotted at the covered-area point or centroid, not at a freehand geocoded story location.
|
| 24 |
+
- Some event dates use article publication dates as bounded proxies when an observed date is not extractable from the story.
|
| 25 |
+
- Ambiguous multi-area stories stay in the internal review queue and are not plotted in the public dataset.
|
dataset_bundle/daily_area_rollup.csv
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"event_date","area_id","area_name","area_type","civ_mil_class","state","event_count","source_count"
|
| 2 |
+
"2026-01-29","faa:x44:fl","MIAMI","airport","civilian","FL","1","1"
|
| 3 |
+
"2026-01-29","faa:swf:ny","NEW YORK STEWART INTL","airport","civilian","NY","1","1"
|
| 4 |
+
"2026-02-02","eia:64529:ms","Golden Triangle","power_plant","civilian","MS","1","1"
|
| 5 |
+
"2026-03-07","dod:francis-s-gabreski-airport:ny","Francis S Gabreski Airport","military_installation","military","NY","1","1"
|
| 6 |
+
"2026-03-09","dod:barksdale-air-force-base:la","Barksdale Air Force Base","military_installation","military","LA","1","1"
|
| 7 |
+
"2026-03-09","dod:joint-base-mcguire-dix-lakehurst:nj","Joint Base McGuire-Dix-Lakehurst","military_installation","military","NJ","1","1"
|
| 8 |
+
"2026-03-14","dod:capital-airport:il","Capital Airport","military_installation","military","IL","1","1"
|
| 9 |
+
"2026-03-19","dod:pentagon:va","Pentagon","military_installation","military","VA","1","2"
|
| 10 |
+
"2026-03-19","bts:717:dc","Washington, DC","port","civilian","DC","1","1"
|
| 11 |
+
"2026-03-20","faa:t27:ny","INDEPENDENT","airport","civilian","NY","1","1"
|
| 12 |
+
"2026-04-16","faa:nuq:ca","MOFFETT FEDERAL AIRFIELD","airport","civilian","CA","1","1"
|
dataset_bundle/event_sources.csv
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"event_id","canonical_url","publisher","title","published_at","article_date","date_quality","content_sha256"
|
| 2 |
+
"event:dod:capital-airport:il:2026-03-14:0001","https://www.ibtimes.com/luminous-flying-object-halts-berlin-brandenburg-airports-operation-30-minutes-after-mystery-light-3799213","ibtimes.com","Luminous Flying Object Halts Berlin Brandenburg Airport's Operation For 30 Minutes After Mystery Light Sparks Security Panic","2026-03-15T09:13:40+00:00","2026-03-14","observed_date","b8c355ecaa2c1b80109df21f3a161c57c188ac2c9930b5a2699fd845942bad07"
|
| 3 |
+
"event:faa:nuq:ca:2026-04-16:0002","https://nypost.com/2026/04/16/us-news/huge-blank-white-airship-sparks-alarm-over-remote-town/","nypost.com","Huge blank white airship sparks alarm over remote town","2026-04-16T22:59:24+00:00","2026-04-16","observed_date","d7cc08f23530aa6a09bf9c078b8a9affb1e9dcced324ba5956939281168265e0"
|
| 4 |
+
"event:eia:64529:ms:2026-02-02:0003","https://www.wcbi.com/u-k-says-sightings-of-rogue-drones-near-military-bases-doubled-last-year-amid-tension-with-russia/","wcbi.com","U.K. says sightings of ""rogue drones"" near military bases doubled last year amid tension with Russia","2026-02-02T22:08:34+00:00","2026-02-02","observed_date","dc6241b336d2c757ff288eeaac3a2b9c95adc465fefc533688ce48c37e7e2e02"
|
| 5 |
+
"event:dod:francis-s-gabreski-airport:ny:2026-03-07:0004","https://www.newsday.com/long-island/politics/suffolk-drone-reports-nw5o3iot","newsday.com","Suffolk drone detection system finds mostly real estate agents taking to the skies","2026-03-08T01:33:21.906000+00:00","2026-03-07","observed_date","d4a3193d0a06b42456c01e68dc348f63eb71d3895d78c5df4fecddaade262c6e"
|
| 6 |
+
"event:dod:joint-base-mcguire-dix-lakehurst:nj:2026-03-09:0005","https://www.thedailybeast.com/leak-reveals-major-drone-incident-at-louisiana-air-force-base-in-trumps-war/","thedailybeast.com","Leak Reveals Major Drone Incident at Air Force Base in Trump’s War","2026-03-20T15:30:00+00:00","2026-03-09","observed_date","da273e8e4dd66a06b323cc30a3f31aa888120f7b65f1225af76482644dd7bb26"
|
| 7 |
+
"event:faa:swf:ny:2026-01-29:0006","https://hudsonvalleycountry.com/ixp/705/p/ny-drone-flight-delays/","hudsonvalleycountry.com","New York Airports Among Most at Risk of Drone-Related Flight Delays","2026-01-29T19:07:04+00:00","2026-01-29","observed_date","2499f7fc7c31e6bb337864c43837f80689d160f4f40c22eeca86cdc91ac635ab"
|
| 8 |
+
"event:faa:x44:fl:2026-01-29:0007","https://wrrv.com/ny-drone-flight-delays/","wrrv.com","New York Airports Among Most at Risk of Drone-Related Flight Delays","2026-01-30T01:08:00+00:00","2026-01-29","observed_date","3d2b2af3745d5a38e28f1be1b5acf4166ca2838509735814fb8939e539ba00d1"
|
| 9 |
+
"event:faa:t27:ny:2026-03-20:0008","https://www.naturalnews.com/2026-03-19-mysterious-trio-ufos-spotted-new-york-city.html","naturalnews.com","Mysterious trio of UFOs spotted over NYC: Advanced technology or government secrets? â NaturalNews.com","2026-03-20T02:30:00+00:00","2026-03-20","report_date_proxy","9a353bc5aa0e8923a524b9b6b9184f4b639124ff2f1d3062b6cd0ee9790e509c"
|
| 10 |
+
"event:dod:barksdale-air-force-base:la:2026-03-09:0009","https://www.mediaite.com/media/news/alarming-number-of-unauthorized-drones-spotted-over-us-air-base/","mediaite.com","Alarming Number of ‘Unauthorized Drones’ Spotted Over US Air Base","2026-03-20T16:22:01+00:00","2026-03-09","observed_date","6351d848188be60cd7ee2843a78e75848e6754670f4e23f2f9ca2c846a937bc1"
|
| 11 |
+
"event:bts:717:dc:2026-03-19:0010","https://wtop.com/national-security/2026/03/unidentified-drones-spotted-over-dc-military-base/","wtop.com","Unidentified drones spotted over DC military base - WTOP News","2026-03-19T17:04:00+00:00","2026-03-19","observed_date","4bf04ad8f34ddc1403c906831677dfda1fde8cd6a951cd47c02a23f8ce182ccc"
|
| 12 |
+
"event:dod:pentagon:va:2026-03-19:0011","https://wcti12.com/news/nation-world/unidentified-drones-fly-over-fort-mcnair-expert-calls-it-security-concern","wcti12.com","Unidentified drones reported flying over Fort McNair; expert calls it security concern","2026-03-19T17:53:19+00:00","2026-03-19","report_date_proxy","0bbc40c4045441687417002b83d0ac920a520101d590a3b36e41c71e509dc915"
|
| 13 |
+
"event:dod:pentagon:va:2026-03-19:0011","https://wset.com/news/nation-world/unidentified-drones-fly-over-fort-mcnair-expert-calls-it-security-concern","wset.com","Unidentified drones reported flying over Fort McNair; expert calls it security concern","2026-03-19T17:53:19+00:00","2026-03-19","report_date_proxy","0bbc40c4045441687417002b83d0ac920a520101d590a3b36e41c71e509dc915"
|
dataset_bundle/events.csv
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"event_id","event_date","date_quality","area_id","area_name","area_type","civ_mil_class","state","lat","lon","primary_source_url","source_count","confidence_label","review_status","dedupe_cluster_id","headline","summary"
|
| 2 |
+
"event:dod:capital-airport:il:2026-03-14:0001","2026-03-14","observed_date","dod:capital-airport:il","Capital Airport","military_installation","military","IL","39.84881","-89.668794","https://www.ibtimes.com/luminous-flying-object-halts-berlin-brandenburg-airports-operation-30-minutes-after-mystery-light-3799213","1","medium","auto_included","cluster:0001","Luminous Flying Object Halts Berlin Brandenburg Airport's Operation For 30 Minutes After Mystery Light Sparks Security Panic","U.S. Luminous Flying Object Halts Berlin Brandenburg Airport's Operation For 30 Minutes After Mystery Light Sparks Security Panic Berlin Brandenburg Airport lights were halted after a luminous object appeared above a Bundeswehr hangar, sparking 30‑min shutdown By Marty Vergel Bae"
|
| 3 |
+
"event:faa:nuq:ca:2026-04-16:0002","2026-04-16","observed_date","faa:nuq:ca","MOFFETT FEDERAL AIRFIELD","airport","civilian","CA","37.416144","-122.049129","https://nypost.com/2026/04/16/us-news/huge-blank-white-airship-sparks-alarm-over-remote-town/","1","medium","auto_included","cluster:0002","Huge blank white airship sparks alarm over remote town","Switch between CA and NY editions here."
|
| 4 |
+
"event:eia:64529:ms:2026-02-02:0003","2026-02-02","observed_date","eia:64529:ms","Golden Triangle","power_plant","civilian","MS","33.418888","-88.61888","https://www.wcbi.com/u-k-says-sightings-of-rogue-drones-near-military-bases-doubled-last-year-amid-tension-with-russia/","1","medium","auto_included","cluster:0003","U.K. says sightings of ""rogue drones"" near military bases doubled last year amid tension with Russia","U.K. says sightings of “rogue drones” near military bases doubled last year amid tension with Russia February 2, 2026 CBS News , (CBS NEWS) – CBS News reports that the U.K. government wants to give military personnel new powers to shoot down unidentified drones near British bases"
|
| 5 |
+
"event:dod:francis-s-gabreski-airport:ny:2026-03-07:0004","2026-03-07","observed_date","dod:francis-s-gabreski-airport:ny","Francis S Gabreski Airport","military_installation","military","NY","40.836088","-72.642224","https://www.newsday.com/long-island/politics/suffolk-drone-reports-nw5o3iot","1","medium","auto_included","cluster:0004","Suffolk drone detection system finds mostly real estate agents taking to the skies","Long Island Politics Suffolk drone detection system finds mostly real estate agents taking to the skies Suffolk County Sheriff Errol Toulon, left, investigator Sgt. Richard Tedesco and Chief Deputy Sheriff Christopher Brockmeyer with drones used for public safety at the Suffolk C"
|
| 6 |
+
"event:dod:joint-base-mcguire-dix-lakehurst:nj:2026-03-09:0005","2026-03-09","observed_date","dod:joint-base-mcguire-dix-lakehurst:nj","Joint Base McGuire-Dix-Lakehurst","military_installation","military","NJ","40.001498","-74.48298","https://www.thedailybeast.com/leak-reveals-major-drone-incident-at-louisiana-air-force-base-in-trumps-war/","1","medium","auto_included","cluster:0005","Leak Reveals Major Drone Incident at Air Force Base in Trump’s War","A drone sighting at one of America’s most important military bases was more serious than previously reported, according to a leaked document. A shelter-in-place order was issued at Barksdale Air Force Base in Louisiana on March 9 after an “unmanned aerial system” was spotted over"
|
| 7 |
+
"event:faa:swf:ny:2026-01-29:0006","2026-01-29","observed_date","faa:swf:ny","NEW YORK STEWART INTL","airport","civilian","NY","41.504111","-74.104833","https://hudsonvalleycountry.com/ixp/705/p/ny-drone-flight-delays/","1","medium","auto_included","cluster:0006","New York Airports Among Most at Risk of Drone-Related Flight Delays","New York Airports Among Most at Risk of Drone-Related Flight Delays Tigman Tigman Published: January 29, 2026 Photo by Samuel Corum/Getty Images Share on Facebook Share on Twitter New research has revealed the U.S. cities where your flight is most likely to be disrupted by drones"
|
| 8 |
+
"event:faa:x44:fl:2026-01-29:0007","2026-01-29","observed_date","faa:x44:fl","MIAMI","airport","civilian","FL","25.778333","-80.170278","https://wrrv.com/ny-drone-flight-delays/","1","medium","auto_included","cluster:0007","New York Airports Among Most at Risk of Drone-Related Flight Delays","New York Airports Among Most at Risk of Drone-Related Flight Delays Tigman Tigman Published: January 29, 2026 Photo by Samuel Corum/Getty Images Share on Facebook Share on Twitter New research has revealed the U.S. cities where your flight is most likely to be disrupted by drones"
|
| 9 |
+
"event:faa:t27:ny:2026-03-20:0008","2026-03-20","report_date_proxy","faa:t27:ny","INDEPENDENT","airport","civilian","NY","41.492778","-74.104361","https://www.naturalnews.com/2026-03-19-mysterious-trio-ufos-spotted-new-york-city.html","1","medium","auto_included","cluster:0008","Mysterious trio of UFOs spotted over NYC: Advanced technology or government secrets? â NaturalNews.com","Three luminous orbs were filmed over Queens, New York, moving in a synchronized triangular formation before vanishing abruptlyâbehavior inconsistent with known aviation physics. The eyewitness, a drone operator, ruled out conventional drones or aircraft. Local resident Charlie "
|
| 10 |
+
"event:dod:barksdale-air-force-base:la:2026-03-09:0009","2026-03-09","observed_date","dod:barksdale-air-force-base:la","Barksdale Air Force Base","military_installation","military","LA","32.497199","-93.611988","https://www.mediaite.com/media/news/alarming-number-of-unauthorized-drones-spotted-over-us-air-base/","1","medium","auto_included","cluster:0009","Alarming Number of ‘Unauthorized Drones’ Spotted Over US Air Base","Alarming Number of ‘Unauthorized Drones’ Spotted Over US Air Base Tom Durante Mar 20th, 2026, 12:22 pm Share X Facebook Copy Link (Staff Sgt. Corey Hook/U.S. Air Force via AP) A concerning amount of unidentified drones were reportedly spotted over a U.S. Air Force base earlier th"
|
| 11 |
+
"event:bts:717:dc:2026-03-19:0010","2026-03-19","observed_date","bts:717:dc","Washington, DC","port","civilian","DC","38.893753","-77.014578","https://wtop.com/national-security/2026/03/unidentified-drones-spotted-over-dc-military-base/","1","medium","auto_included","cluster:0010","Unidentified drones spotted over DC military base - WTOP News","Home » National Security News » Unidentified drones spotted over… Unidentified drones spotted over DC military base Luke Lukert | llukert@wtop.com March 19, 2026, 1:04 PM Share This: share on facebook share on X share on threads share on linkedin share on email print WTOP Nationa"
|
| 12 |
+
"event:dod:pentagon:va:2026-03-19:0011","2026-03-19","report_date_proxy","dod:pentagon:va","Pentagon","military_installation","military","VA","38.87351","-77.053826","https://wcti12.com/news/nation-world/unidentified-drones-fly-over-fort-mcnair-expert-calls-it-security-concern","2","medium","auto_included","cluster:0011","Unidentified drones reported flying over Fort McNair; expert calls it security concern","WASHINGTON (7News) — Unidentified drones were detected by U.S. officials above the Washington, D.C., Army base where Secretary of State Marco Rubio and Defense Secretary Pete Hegseth live."
|
dataset_bundle/limitations_and_blind_spots.md
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Limitations And Blind Spots
|
| 2 |
+
|
| 3 |
+
- This release tracks reported drone sightings from news stories and does not prove intent, wrongdoing, threat, or a verified security breach.
|
| 4 |
+
- This is a news-based secondary-reporting dataset, not a verified government incident ledger.
|
| 5 |
+
- Stories behind paywalls, JavaScript-heavy pages, or blocked fetches can fall out of the slice.
|
| 6 |
+
- Event points are covered-area centroids or official point locations, not narrative story coordinates.
|
| 7 |
+
- Publication dates are used as bounded proxies when a direct observation date is not extractable.
|
| 8 |
+
- Ambiguous multi-area stories stay in the internal review queue and are excluded from the public map.
|
dataset_bundle/methodology.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Drone Sightings Near Covered U.S. Military and Civilian Areas
|
| 2 |
+
|
| 3 |
+
## What This Shows
|
| 4 |
+
This release shows a bounded set of U.S. news-reported drone sightings mapped to official military and civilian covered-area registries.
|
| 5 |
+
|
| 6 |
+
## How The Slice Was Built
|
| 7 |
+
- Covered areas come from official U.S. government sources for military installations, airports, power plants, and ports.
|
| 8 |
+
- News candidates are harvested through a bounded search layer and then fetched as raw article HTML for deterministic parsing.
|
| 9 |
+
- Stories are matched only to covered-area registry entries and deduped into area-scoped events.
|
| 10 |
+
- When a story mentions more than one plausible area and a single primary area cannot be resolved deterministically, the story is kept out of the public map.
|
| 11 |
+
|
| 12 |
+
## Source Window
|
| 13 |
+
- Start: `2026-01-01`
|
| 14 |
+
- End: `2026-04-20`
|
| 15 |
+
|
| 16 |
+
## What This Does Not Prove
|
| 17 |
+
This release tracks reported drone sightings from news stories and does not prove intent, threat, wrongdoing, illegality, or the identity of any aircraft operator.
|
dataset_bundle/monitored_areas.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dataset_bundle/public_release_manifest.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"public_version": "drone-sightings-slice-2026-04-v1-smoke",
|
| 3 |
+
"title": "Drone Sightings Near Covered U.S. Military and Civilian Areas",
|
| 4 |
+
"release_date": "2026-04-20T16:30:36.960494+00:00",
|
| 5 |
+
"source_run_name": "drone_sightings_smoke_20260420",
|
| 6 |
+
"slice_description": "A small, review-oriented slice of U.S. news-reported drone sightings mapped against official covered-area registries.",
|
| 7 |
+
"source_window": {
|
| 8 |
+
"start_date": "2026-01-01",
|
| 9 |
+
"end_date": "2026-04-20",
|
| 10 |
+
"window_days": 109
|
| 11 |
+
},
|
| 12 |
+
"counts": {
|
| 13 |
+
"events": 11,
|
| 14 |
+
"monitored_areas": 36702,
|
| 15 |
+
"event_sources": 12,
|
| 16 |
+
"daily_area_rollup_rows": 11,
|
| 17 |
+
"article_candidates": 12,
|
| 18 |
+
"article_fetch_failed": 0
|
| 19 |
+
},
|
| 20 |
+
"covered_area_counts_by_type": {
|
| 21 |
+
"airport": 19407,
|
| 22 |
+
"military_installation": 821,
|
| 23 |
+
"port": 370,
|
| 24 |
+
"power_plant": 16104
|
| 25 |
+
},
|
| 26 |
+
"event_counts_by_type": {
|
| 27 |
+
"military_installation": 5,
|
| 28 |
+
"airport": 4,
|
| 29 |
+
"power_plant": 1,
|
| 30 |
+
"port": 1
|
| 31 |
+
},
|
| 32 |
+
"event_counts_by_class": {
|
| 33 |
+
"military": 5,
|
| 34 |
+
"civilian": 6
|
| 35 |
+
},
|
| 36 |
+
"quality_summary": {
|
| 37 |
+
"unresolved_area_share": 0.0,
|
| 38 |
+
"article_fetch_failure_share": 0.0,
|
| 39 |
+
"duplicate_cluster_share": 0.090909,
|
| 40 |
+
"report_date_proxy_share": 0.181818
|
| 41 |
+
},
|
| 42 |
+
"included_tables": [
|
| 43 |
+
"events.csv",
|
| 44 |
+
"monitored_areas.csv",
|
| 45 |
+
"event_sources.csv",
|
| 46 |
+
"daily_area_rollup.csv",
|
| 47 |
+
"public_release_manifest.json",
|
| 48 |
+
"methodology.md",
|
| 49 |
+
"limitations_and_blind_spots.md",
|
| 50 |
+
"quality_checks.md",
|
| 51 |
+
"schema_notes.md"
|
| 52 |
+
],
|
| 53 |
+
"caveats": [
|
| 54 |
+
"This release tracks reported drone sightings from news stories, not verified federal incident records.",
|
| 55 |
+
"A reported sighting does not by itself prove intent, threat, wrongdoing, or the presence of a hostile actor.",
|
| 56 |
+
"Events are plotted at the covered-area point or centroid, not at a freehand geocoded story location.",
|
| 57 |
+
"Some event dates use article publication dates as bounded proxies when an observed date is not extractable from the story.",
|
| 58 |
+
"Ambiguous multi-area stories stay in the internal review queue and are not plotted in the public dataset."
|
| 59 |
+
]
|
| 60 |
+
}
|
dataset_bundle/quality_checks.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Quality Checks
|
| 2 |
+
|
| 3 |
+
- Event rows: `11`
|
| 4 |
+
- Monitored areas: `36702`
|
| 5 |
+
- Event source rows: `12`
|
| 6 |
+
- Article fetch failure share: `0.0`
|
| 7 |
+
- Duplicate cluster share: `0.090909`
|
| 8 |
+
- Unresolved area share: `0.0`
|
| 9 |
+
|
| 10 |
+
## Public Integrity Language
|
| 11 |
+
|
| 12 |
+
- This release tracks reported drone sightings and does not assign guilt, threat level, or motive.
|
| 13 |
+
- Raw article HTML and long text excerpts are not included in the public bundle.
|
dataset_bundle/schema_notes.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Schema Notes
|
| 2 |
+
|
| 3 |
+
## events.csv
|
| 4 |
+
- `event_date`: observed date when extractable, otherwise a publication-date proxy.
|
| 5 |
+
- `review_status`: public rows are auto-included deterministic event rows only.
|
| 6 |
+
- `source_count`: number of supporting stories retained in the dedupe cluster.
|
| 7 |
+
|
| 8 |
+
## monitored_areas.csv
|
| 9 |
+
- Rows represent official covered-area points or centroids used for event plotting.
|
| 10 |
+
|
| 11 |
+
## event_sources.csv
|
| 12 |
+
- Lists supporting story URLs and titles retained for each public event.
|
public_copy.json
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"title": "Drone Sightings Near Covered U.S. Military and Civilian Areas",
|
| 3 |
+
"dataset_bundle_prefix": "dataset_bundle",
|
| 4 |
+
"landing_markdown": "# Drone Sightings Near Covered U.S. Military and Civilian Areas\n\nThis private preview shows reported drone sightings from news stories over official covered military and civilian areas.\n\nUse the built-in time slider and play button in the map to watch red dots appear across time.\n\nThis release tracks reported drone sightings and does not prove intent, threat, wrongdoing, or a verified security breach."
|
| 5 |
+
}
|
public_space_app.py
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
import json
|
| 4 |
+
import os
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
|
| 7 |
+
import gradio as gr
|
| 8 |
+
import pandas as pd
|
| 9 |
+
import plotly.express as px
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
def _dataset_root(public_copy_path: Path) -> Path:
|
| 13 |
+
payload = json.loads(public_copy_path.read_text(encoding="utf-8"))
|
| 14 |
+
local_root = os.environ.get("PUBLIC_RELEASE_LOCAL_ROOT")
|
| 15 |
+
if local_root:
|
| 16 |
+
return Path(local_root) / payload["dataset_bundle_prefix"]
|
| 17 |
+
return public_copy_path.parent / payload["dataset_bundle_prefix"]
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
def load_release_data(public_copy_path: Path) -> dict:
|
| 21 |
+
dataset_root = _dataset_root(public_copy_path)
|
| 22 |
+
events = pd.read_csv(dataset_root / "events.csv")
|
| 23 |
+
areas = pd.read_csv(dataset_root / "monitored_areas.csv")
|
| 24 |
+
event_sources = pd.read_csv(dataset_root / "event_sources.csv")
|
| 25 |
+
daily_rollup = pd.read_csv(dataset_root / "daily_area_rollup.csv")
|
| 26 |
+
manifest = json.loads((dataset_root / "public_release_manifest.json").read_text(encoding="utf-8"))
|
| 27 |
+
return {
|
| 28 |
+
"events": events.fillna(""),
|
| 29 |
+
"areas": areas.fillna(""),
|
| 30 |
+
"event_sources": event_sources.fillna(""),
|
| 31 |
+
"daily_rollup": daily_rollup.fillna(""),
|
| 32 |
+
"manifest": manifest,
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
def _filter_events(events: pd.DataFrame, area_type: str, civ_mil_class: str, state: str, confidence: str, review_status: str) -> pd.DataFrame:
|
| 37 |
+
filtered = events.copy()
|
| 38 |
+
if area_type != "all":
|
| 39 |
+
filtered = filtered[filtered["area_type"] == area_type]
|
| 40 |
+
if civ_mil_class != "all":
|
| 41 |
+
filtered = filtered[filtered["civ_mil_class"] == civ_mil_class]
|
| 42 |
+
if state != "all":
|
| 43 |
+
filtered = filtered[filtered["state"] == state]
|
| 44 |
+
if confidence != "all":
|
| 45 |
+
filtered = filtered[filtered["confidence_label"] == confidence]
|
| 46 |
+
if review_status != "all":
|
| 47 |
+
filtered = filtered[filtered["review_status"] == review_status]
|
| 48 |
+
return filtered
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
def _build_map(events: pd.DataFrame):
|
| 52 |
+
if events.empty:
|
| 53 |
+
return px.scatter_mapbox(pd.DataFrame({"lat": [], "lon": []}), lat="lat", lon="lon", zoom=3, height=560)
|
| 54 |
+
frame_values = sorted(str(value) for value in events["event_date"].astype(str).unique())
|
| 55 |
+
events = events.copy()
|
| 56 |
+
events["animation_frame"] = events["event_date"].astype(str)
|
| 57 |
+
fig = px.scatter_mapbox(
|
| 58 |
+
events,
|
| 59 |
+
lat="lat",
|
| 60 |
+
lon="lon",
|
| 61 |
+
color_discrete_sequence=["#d62728"],
|
| 62 |
+
hover_name="headline",
|
| 63 |
+
hover_data={
|
| 64 |
+
"area_name": True,
|
| 65 |
+
"state": True,
|
| 66 |
+
"event_date": True,
|
| 67 |
+
"source_count": True,
|
| 68 |
+
"confidence_label": True,
|
| 69 |
+
"lat": False,
|
| 70 |
+
"lon": False,
|
| 71 |
+
"event_id": True,
|
| 72 |
+
},
|
| 73 |
+
custom_data=["event_id"],
|
| 74 |
+
animation_frame="animation_frame",
|
| 75 |
+
zoom=3,
|
| 76 |
+
height=560,
|
| 77 |
+
)
|
| 78 |
+
fig.update_layout(
|
| 79 |
+
mapbox_style="open-street-map",
|
| 80 |
+
margin={"l": 0, "r": 0, "t": 40, "b": 0},
|
| 81 |
+
title="Reported drone sightings over time",
|
| 82 |
+
showlegend=False,
|
| 83 |
+
)
|
| 84 |
+
fig.update_traces(marker={"size": 12, "opacity": 0.85})
|
| 85 |
+
if frame_values:
|
| 86 |
+
fig.update_layout(
|
| 87 |
+
updatemenus=[
|
| 88 |
+
{
|
| 89 |
+
"type": "buttons",
|
| 90 |
+
"showactive": False,
|
| 91 |
+
"buttons": [
|
| 92 |
+
{"label": "Play", "method": "animate", "args": [None, {"frame": {"duration": 600, "redraw": True}, "fromcurrent": True}]},
|
| 93 |
+
{"label": "Pause", "method": "animate", "args": [[None], {"frame": {"duration": 0, "redraw": False}, "mode": "immediate"}]},
|
| 94 |
+
],
|
| 95 |
+
}
|
| 96 |
+
]
|
| 97 |
+
)
|
| 98 |
+
return fig
|
| 99 |
+
|
| 100 |
+
|
| 101 |
+
def _detail_markdown(event_sources: pd.DataFrame, events: pd.DataFrame, event_id: str) -> str:
|
| 102 |
+
if not event_id:
|
| 103 |
+
return "Select a table row or click a point to inspect supporting sources."
|
| 104 |
+
matched = events[events["event_id"] == event_id]
|
| 105 |
+
if matched.empty:
|
| 106 |
+
return "No event details available."
|
| 107 |
+
event_row = matched.iloc[0]
|
| 108 |
+
sources = event_sources[event_sources["event_id"] == event_id]
|
| 109 |
+
lines = [
|
| 110 |
+
f"### {event_row['headline']}",
|
| 111 |
+
"",
|
| 112 |
+
f"- Date: `{event_row['event_date']}` (`{event_row['date_quality']}`)",
|
| 113 |
+
f"- Area: `{event_row['area_name']}` ({event_row['area_type']}, {event_row['civ_mil_class']})",
|
| 114 |
+
f"- State: `{event_row['state']}`",
|
| 115 |
+
f"- Supporting stories: `{len(sources)}`",
|
| 116 |
+
"",
|
| 117 |
+
event_row.get("summary", ""),
|
| 118 |
+
"",
|
| 119 |
+
"#### Supporting URLs",
|
| 120 |
+
]
|
| 121 |
+
for _, source_row in sources.iterrows():
|
| 122 |
+
lines.append(f"- [{source_row['publisher']} | {source_row['title']}]({source_row['canonical_url']})")
|
| 123 |
+
return "\n".join(lines)
|
| 124 |
+
|
| 125 |
+
|
| 126 |
+
def build_app(public_copy_path: str | Path):
|
| 127 |
+
public_copy_path = Path(public_copy_path)
|
| 128 |
+
payload = json.loads(public_copy_path.read_text(encoding="utf-8"))
|
| 129 |
+
data = load_release_data(public_copy_path)
|
| 130 |
+
events = data["events"]
|
| 131 |
+
event_sources = data["event_sources"]
|
| 132 |
+
states = ["all"] + sorted(str(value) for value in events["state"].astype(str).unique() if str(value))
|
| 133 |
+
area_types = ["all"] + sorted(str(value) for value in events["area_type"].astype(str).unique() if str(value))
|
| 134 |
+
classes = ["all"] + sorted(str(value) for value in events["civ_mil_class"].astype(str).unique() if str(value))
|
| 135 |
+
confidences = ["all"] + sorted(str(value) for value in events["confidence_label"].astype(str).unique() if str(value))
|
| 136 |
+
review_statuses = ["all"] + sorted(str(value) for value in events["review_status"].astype(str).unique() if str(value))
|
| 137 |
+
|
| 138 |
+
def render(area_type: str, civ_mil_class: str, state: str, confidence: str, review_status: str):
|
| 139 |
+
filtered = _filter_events(events, area_type, civ_mil_class, state, confidence, review_status)
|
| 140 |
+
table = filtered[["event_id", "event_date", "area_name", "area_type", "state", "confidence_label", "source_count", "headline"]].head(250)
|
| 141 |
+
return _build_map(filtered), table
|
| 142 |
+
|
| 143 |
+
with gr.Blocks(title=payload["title"]) as app:
|
| 144 |
+
gr.Markdown(payload["landing_markdown"])
|
| 145 |
+
with gr.Row():
|
| 146 |
+
area_type = gr.Dropdown(choices=area_types, value="all", label="Area Type")
|
| 147 |
+
civ_mil_class = gr.Dropdown(choices=classes, value="all", label="Military / Civilian")
|
| 148 |
+
state = gr.Dropdown(choices=states, value="all", label="State")
|
| 149 |
+
confidence = gr.Dropdown(choices=confidences, value="all", label="Confidence")
|
| 150 |
+
review_status = gr.Dropdown(choices=review_statuses, value="all", label="Review Status")
|
| 151 |
+
plot = gr.Plot(label="Drone sightings over time")
|
| 152 |
+
table = gr.Dataframe(label="Filtered events", interactive=False)
|
| 153 |
+
detail = gr.Markdown("Select a table row or click a point to inspect supporting sources.")
|
| 154 |
+
|
| 155 |
+
def _table_detail(evt: gr.SelectData):
|
| 156 |
+
if not evt or evt.index is None:
|
| 157 |
+
return "Select a table row or click a point to inspect supporting sources."
|
| 158 |
+
row_index = evt.index[0] if isinstance(evt.index, (list, tuple)) else evt.index
|
| 159 |
+
filtered = _filter_events(events, area_type.value, civ_mil_class.value, state.value, confidence.value, review_status.value)
|
| 160 |
+
filtered = filtered.reset_index(drop=True)
|
| 161 |
+
if row_index >= len(filtered):
|
| 162 |
+
return "No event details available."
|
| 163 |
+
return _detail_markdown(event_sources, events, str(filtered.iloc[row_index]["event_id"]))
|
| 164 |
+
|
| 165 |
+
inputs = [area_type, civ_mil_class, state, confidence, review_status]
|
| 166 |
+
for component in inputs:
|
| 167 |
+
component.change(render, inputs=inputs, outputs=[plot, table])
|
| 168 |
+
table.select(_table_detail, outputs=detail)
|
| 169 |
+
app.load(render, inputs=inputs, outputs=[plot, table])
|
| 170 |
+
return app
|
requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
pandas>=2.2.0
|
| 2 |
+
plotly>=5.24.0
|