mirror of
https://github.com/bellingcat/sar-interference-tracker.git
synced 2026-06-08 03:18:32 +03:00
dynamic url functionality inspired by @gena_d
This commit is contained in:
60
RIT.js
60
RIT.js
@@ -3,6 +3,7 @@
|
|||||||
// Most of the RFI caused by ground-based systems are military radars
|
// Most of the RFI caused by ground-based systems are military radars
|
||||||
// Investigating the spatial and temporal characteristics of the signal can yield information on the deployment of military radar systems
|
// Investigating the spatial and temporal characteristics of the signal can yield information on the deployment of military radar systems
|
||||||
|
|
||||||
|
|
||||||
// Below is an overview of the 10 sections
|
// Below is an overview of the 10 sections
|
||||||
|
|
||||||
// 1. Load Data
|
// 1. Load Data
|
||||||
@@ -44,8 +45,6 @@ var vh = sentinel1
|
|||||||
var vhA = vh.filter(ee.Filter.eq("orbitProperties_pass", "ASCENDING"));
|
var vhA = vh.filter(ee.Filter.eq("orbitProperties_pass", "ASCENDING"));
|
||||||
var vhD = vh.filter(ee.Filter.eq("orbitProperties_pass", "DESCENDING"));
|
var vhD = vh.filter(ee.Filter.eq("orbitProperties_pass", "DESCENDING"));
|
||||||
|
|
||||||
//print(ee.Date(vhD.first().get('system:time_start')))
|
|
||||||
print(vhD.filter(ee.Filter.eq("platform_number", "A")).first());
|
|
||||||
// --------------------- Step 2: Configure Map --------------------------------
|
// --------------------- Step 2: Configure Map --------------------------------
|
||||||
|
|
||||||
// Create the main map
|
// Create the main map
|
||||||
@@ -106,11 +105,12 @@ var layerProperties = {
|
|||||||
|
|
||||||
// Get keys from dictionary
|
// Get keys from dictionary
|
||||||
var selectItems = Object.keys(layerProperties);
|
var selectItems = Object.keys(layerProperties);
|
||||||
|
var defaultLayer = 1;
|
||||||
|
|
||||||
// Create dropdown menu to toggle between imagery aggregated at different timescales
|
// Create dropdown menfu to toggle between imagery aggregated at different timescales
|
||||||
var layerSelect = ui.Select({
|
var layerSelect = ui
|
||||||
|
.Select({
|
||||||
items: selectItems,
|
items: selectItems,
|
||||||
value: selectItems[1],
|
|
||||||
onChange: function (selected) {
|
onChange: function (selected) {
|
||||||
// Loop through the map layers and compare the selected element to the name
|
// Loop through the map layers and compare the selected element to the name
|
||||||
// of the layer. If they're the same, show the layer and set the
|
// of the layer. If they're the same, show the layer and set the
|
||||||
@@ -132,7 +132,8 @@ var layerSelect = ui.Select({
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
})
|
||||||
|
.setValue(selectItems[defaultLayer]);
|
||||||
|
|
||||||
// --------------------- Step 5: Create Opacity Slider --------------------------------
|
// --------------------- Step 5: Create Opacity Slider --------------------------------
|
||||||
|
|
||||||
@@ -162,7 +163,7 @@ var viewPanel = ui.Panel({
|
|||||||
|
|
||||||
// Get date range for Sentinel-1 imagery, backdate current date by one week to ensure imagery is available
|
// Get date range for Sentinel-1 imagery, backdate current date by one week to ensure imagery is available
|
||||||
var start = ee.Date(sentinel1.first().get("system:time_start"));
|
var start = ee.Date(sentinel1.first().get("system:time_start"));
|
||||||
var now = ee.Date(Date.now()).advance(-1, "week");
|
var now = ee.Date(Date.now()); //.advance(-1, "week");
|
||||||
|
|
||||||
// Format date to display it to the user
|
// Format date to display it to the user
|
||||||
var date = ui.Label(now.format("MMMM dd, YYYY").getInfo());
|
var date = ui.Label(now.format("MMMM dd, YYYY").getInfo());
|
||||||
@@ -232,16 +233,14 @@ var slide = function (range) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Create dateSlider to trigger the function Slide function
|
// Create dateSlider to trigger the function Slide function
|
||||||
var dateSlider = ui
|
var dateSlider = ui.DateSlider({
|
||||||
.DateSlider({
|
|
||||||
start: start,
|
start: start,
|
||||||
end: now,
|
end: now,
|
||||||
value: null,
|
value: null,
|
||||||
period: 1,
|
period: 1,
|
||||||
onChange: slide,
|
onChange: slide,
|
||||||
style: { height: "0px" },
|
style: { height: "0px" },
|
||||||
})
|
});
|
||||||
.setValue(now);
|
|
||||||
|
|
||||||
// --------------------- Step 7: Create RFI Chart --------------------------------
|
// --------------------- Step 7: Create RFI Chart --------------------------------
|
||||||
|
|
||||||
@@ -254,6 +253,10 @@ var latlon = ui.Label();
|
|||||||
// Generates a new time series chart of RFI for the given coordinates.
|
// Generates a new time series chart of RFI for the given coordinates.
|
||||||
var generateChart = function (coords) {
|
var generateChart = function (coords) {
|
||||||
// Update the lon/lat panel with values from the click event.
|
// Update the lon/lat panel with values from the click event.
|
||||||
|
ui.url.set("lon", coords.lon.toFixed(4));
|
||||||
|
ui.url.set("lat", coords.lat.toFixed(4));
|
||||||
|
ui.url.set("zoom", mapPanel.getZoom());
|
||||||
|
|
||||||
var latlonStr = coords.lat.toFixed(2) + ", " + coords.lon.toFixed(2);
|
var latlonStr = coords.lat.toFixed(2) + ", " + coords.lon.toFixed(2);
|
||||||
|
|
||||||
latlon.setValue("Coordinates: " + latlonStr);
|
latlon.setValue("Coordinates: " + latlonStr);
|
||||||
@@ -291,6 +294,10 @@ var generateChart = function (coords) {
|
|||||||
inspectorPanel.widgets().set(3, rfiChart);
|
inspectorPanel.widgets().set(3, rfiChart);
|
||||||
var getDate = function (callback) {
|
var getDate = function (callback) {
|
||||||
dateSlider.setValue(ee.Date(callback));
|
dateSlider.setValue(ee.Date(callback));
|
||||||
|
ui.url.set("date", ee.Date(callback).format().getInfo());
|
||||||
|
print(ee.Date(ee.Date(callback).format().getInfo()));
|
||||||
|
|
||||||
|
var now = ee.Date(callback);
|
||||||
};
|
};
|
||||||
rfiChart.onClick(getDate);
|
rfiChart.onClick(getDate);
|
||||||
};
|
};
|
||||||
@@ -458,15 +465,15 @@ var loc1_function = function () {
|
|||||||
// Dimona Radar Facility
|
// Dimona Radar Facility
|
||||||
var loc2_function = function () {
|
var loc2_function = function () {
|
||||||
var lab1 = ui.Label(
|
var lab1 = ui.Label(
|
||||||
'Located in Israel\'s Negev Desert, the Dimona Radar Facility is a "top-secret X-band radar staffed by around 120 American technicians".',
|
"Located in Israel's Negev Desert, the Dimona Radar Facility is an X-band radar operated by the U.S. Military.",
|
||||||
{},
|
{},
|
||||||
"http://content.time.com/time/world/article/0,8599,1846749,00.html"
|
"https://web.archive.org/web/20081009203106/http://afp.google.com/article/ALeqM5gJP55YHdqMPMI7rhCh3tZCGxl0Pw"
|
||||||
);
|
);
|
||||||
var lab2 = ui.Label(
|
var lab2 = ui.Label(
|
||||||
"The radar can monitor the take-off of any aircraft or missile up to 1,500 miles away, which would give Israel an extra 60-70 seconds to react if Iran fired a missile. The radar is so powerful that Israeli officials feared that RFI would impact the accuracy of anti-tank missiles being tested nearby."
|
"Though the point is centered on these large radar antennae, an X-band radar would probably not interfere with Sentinel-1's C-band instrument. The actual source of the observed RFI seems to be Israel's Negev Nuclear Research Center, \"a top-secret military site where Israel is widely believed to have developed the only nuclear arsenal in the Middle East\", located in the same valley just a few kilometers to the north. The radar was installed in 2008 to provide early warning against possible Iranian missile attacks. "
|
||||||
);
|
);
|
||||||
var lab3 = ui.Label(
|
var lab3 = ui.Label(
|
||||||
"Though the point is centered on the large X-band radar antenna, the actual source of the observed RFI seems to be Israel's Negev Nuclear Research Center, located in the same valley just a few kilometers to the north. The RFI Graph above shows consistent and strong interference since 2017."
|
"The RFI Graph above shows consistent and strong interference since 2015."
|
||||||
);
|
);
|
||||||
|
|
||||||
configureExample([lab1, lab2, lab3], 0.8);
|
configureExample([lab1, lab2, lab3], 0.8);
|
||||||
@@ -584,16 +591,32 @@ var locationPanel = ui.Panel([
|
|||||||
mapPanel.onClick(generateChart);
|
mapPanel.onClick(generateChart);
|
||||||
|
|
||||||
// Configure the map.
|
// Configure the map.
|
||||||
mapPanel.setOptions("Satellite");
|
mapPanel.setOptions("Hybrid");
|
||||||
mapPanel.style().set("cursor", "crosshair");
|
mapPanel.style().set("cursor", "crosshair");
|
||||||
|
|
||||||
// Initialize with a test point.
|
// Initialize with a test point.
|
||||||
var initialPoint = ee.Geometry.Point(49.950656, 26.605644);
|
var initialPoint = ee.Geometry.Point(49.950656, 26.605644);
|
||||||
|
|
||||||
|
var lon = ui.url.get("lon", -9999);
|
||||||
|
var lat = ui.url.get("lat", -9999);
|
||||||
|
var zoom = ui.url.get("zoom", -9999);
|
||||||
|
var urldate = ui.url.get("date", -9999);
|
||||||
|
|
||||||
|
if (lon != -9999 && lat != -9999) {
|
||||||
|
mapPanel.setCenter(lon, lat, zoom);
|
||||||
|
var now = ee.Date(urldate);
|
||||||
|
//var date= ui.Label(urldate.format("MMMM dd, YYYY").getInfo());
|
||||||
|
var initialPoint = ee.Geometry.Point(lon, lat);
|
||||||
|
} else {
|
||||||
|
// defauilt location
|
||||||
mapPanel.centerObject(initialPoint, 11);
|
mapPanel.centerObject(initialPoint, 11);
|
||||||
|
}
|
||||||
|
|
||||||
|
//mapPanel.centerObject(initialPoint, 11);
|
||||||
|
|
||||||
// Add all of the modules created above to the User Interface Panel
|
// Add all of the modules created above to the User Interface Panel
|
||||||
inspectorPanel.add(intro);
|
inspectorPanel.add(intro);
|
||||||
inspectorPanel.add(dateSlider);
|
inspectorPanel.add(dateSlider.setValue(now));
|
||||||
inspectorPanel.add(ui.Panel([latlon], ui.Panel.Layout.flow("horizontal")));
|
inspectorPanel.add(ui.Panel([latlon], ui.Panel.Layout.flow("horizontal")));
|
||||||
inspectorPanel.add(ui.Label("placeholder"));
|
inspectorPanel.add(ui.Label("placeholder"));
|
||||||
inspectorPanel.add(
|
inspectorPanel.add(
|
||||||
@@ -628,6 +651,3 @@ generateChart({
|
|||||||
|
|
||||||
// Optional: add country outlines
|
// Optional: add country outlines
|
||||||
// mapPanel.layers().set(5, country_layer)
|
// mapPanel.layers().set(5, country_layer)
|
||||||
|
|
||||||
// Add imagery aggregated by month by default.
|
|
||||||
mapPanel.layers().get(1).setShown(true);
|
|
||||||
|
|||||||
Reference in New Issue
Block a user