mirror of
https://github.com/bellingcat/RS4OSINT.git
synced 2026-06-12 05:28:36 +03:00
fixed image paths
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||||
|
||||
|
||||
<title>Remote Sensing for OSINT - 10 Blast Damage Assessment</title>
|
||||
<title>Remote Sensing for OSINT - Blast Damage Assessment</title>
|
||||
<style>
|
||||
code{white-space: pre-wrap;}
|
||||
span.smallcaps{font-variant: small-caps;}
|
||||
@@ -201,20 +201,17 @@ gtag('config', 'G-RK9ZLZQ6GL', { 'anonymize_ip': true});
|
||||
<ul id="quarto-sidebar-section-1" class="collapse list-unstyled sidebar-section depth1 ">
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./index.html" class="sidebar-item-text sidebar-link">
|
||||
<span class="menu-text"><span class="chapter-number">1</span> <span class="chapter-title">Overview</span></span></a>
|
||||
<a href="./index.html" class="sidebar-item-text sidebar-link"><span class="chapter-title">Overview</span></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./A2_Remote_Sensing.html" class="sidebar-item-text sidebar-link">
|
||||
<span class="menu-text"><span class="chapter-number">2</span> <span class="chapter-title">Remote Sensing</span></span></a>
|
||||
<a href="./A2_Remote_Sensing.html" class="sidebar-item-text sidebar-link"><span class="chapter-title">Remote Sensing</span></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./A3_Data_Acquisition.html" class="sidebar-item-text sidebar-link">
|
||||
<span class="menu-text"><span class="chapter-number">3</span> <span class="chapter-title">Data Acquisition</span></span></a>
|
||||
<a href="./A3_Data_Acquisition.html" class="sidebar-item-text sidebar-link"><span class="chapter-title">Data Acquisition</span></a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -230,26 +227,22 @@ gtag('config', 'G-RK9ZLZQ6GL', { 'anonymize_ip': true});
|
||||
<ul id="quarto-sidebar-section-2" class="collapse list-unstyled sidebar-section depth1 ">
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./B1_Getting_Started.html" class="sidebar-item-text sidebar-link">
|
||||
<span class="menu-text"><span class="chapter-number">4</span> <span class="chapter-title">Getting Started</span></span></a>
|
||||
<a href="./B1_Getting_Started.html" class="sidebar-item-text sidebar-link"><span class="chapter-title">Getting Started</span></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./B2_Interpreting_Images.html" class="sidebar-item-text sidebar-link">
|
||||
<span class="menu-text"><span class="chapter-number">5</span> <span class="chapter-title">Interpreting Images</span></span></a>
|
||||
<a href="./B2_Interpreting_Images.html" class="sidebar-item-text sidebar-link"><span class="chapter-title">Interpreting Images</span></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./B3_Image_Series.html" class="sidebar-item-text sidebar-link">
|
||||
<span class="menu-text"><span class="chapter-number">6</span> <span class="chapter-title">Image Series</span></span></a>
|
||||
<a href="./B3_Image_Series.html" class="sidebar-item-text sidebar-link"><span class="chapter-title">Image Series</span></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./B4_Vectors_Tables.html" class="sidebar-item-text sidebar-link">
|
||||
<span class="menu-text"><span class="chapter-number">7</span> <span class="chapter-title">Vectors and Tables</span></span></a>
|
||||
<a href="./B4_Vectors_Tables.html" class="sidebar-item-text sidebar-link"><span class="chapter-title">Vectors and Tables</span></a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -265,32 +258,27 @@ gtag('config', 'G-RK9ZLZQ6GL', { 'anonymize_ip': true});
|
||||
<ul id="quarto-sidebar-section-3" class="collapse list-unstyled sidebar-section depth1 show">
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./C1_Lights.html" class="sidebar-item-text sidebar-link">
|
||||
<span class="menu-text"><span class="chapter-number">8</span> <span class="chapter-title">War at Night</span></span></a>
|
||||
<a href="./C1_Lights.html" class="sidebar-item-text sidebar-link"><span class="chapter-title">War at Night</span></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./C2_Refineries.html" class="sidebar-item-text sidebar-link">
|
||||
<span class="menu-text"><span class="chapter-number">9</span> <span class="chapter-title">Refinery Identification</span></span></a>
|
||||
<a href="./C2_Refineries.html" class="sidebar-item-text sidebar-link"><span class="chapter-title">Refinery Identification</span></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./C3_Blast.html" class="sidebar-item-text sidebar-link active">
|
||||
<span class="menu-text"><span class="chapter-number">10</span> <span class="chapter-title">Blast Damage Assessment</span></span></a>
|
||||
<a href="./C3_Blast.html" class="sidebar-item-text sidebar-link active"><span class="chapter-title">Blast Damage Assessment</span></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./C4_Ships.html" class="sidebar-item-text sidebar-link">
|
||||
<span class="menu-text"><span class="chapter-number">11</span> <span class="chapter-title">Ship Detection</span></span></a>
|
||||
<a href="./C4_Ships.html" class="sidebar-item-text sidebar-link"><span class="chapter-title">Ship Detection</span></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="sidebar-item">
|
||||
<div class="sidebar-item-container">
|
||||
<a href="./C5_Object_Detection.html" class="sidebar-item-text sidebar-link">
|
||||
<span class="menu-text"><span class="chapter-number">12</span> <span class="chapter-title">Object Detection</span></span></a>
|
||||
<a href="./C5_Object_Detection.html" class="sidebar-item-text sidebar-link"><span class="chapter-title">Object Detection</span></a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -305,19 +293,19 @@ gtag('config', 'G-RK9ZLZQ6GL', { 'anonymize_ip': true});
|
||||
<h2 id="toc-title">Table of contents</h2>
|
||||
|
||||
<ul>
|
||||
<li><a href="#change-detection" id="toc-change-detection" class="nav-link active" data-scroll-target="#change-detection"><span class="header-section-number">10.1</span> Change Detection</a></li>
|
||||
<li><a href="#implementing-a-t-test-in-earth-engine" id="toc-implementing-a-t-test-in-earth-engine" class="nav-link" data-scroll-target="#implementing-a-t-test-in-earth-engine"><span class="header-section-number">10.2</span> Implementing a t-test in Earth Engine</a></li>
|
||||
<li><a href="#filtering-the-sentinel-1-imagery" id="toc-filtering-the-sentinel-1-imagery" class="nav-link" data-scroll-target="#filtering-the-sentinel-1-imagery"><span class="header-section-number">10.3</span> Filtering the Sentinel-1 Imagery</a></li>
|
||||
<li><a href="#validation" id="toc-validation" class="nav-link" data-scroll-target="#validation"><span class="header-section-number">10.4</span> Validation</a></li>
|
||||
<li><a href="#conclusion" id="toc-conclusion" class="nav-link" data-scroll-target="#conclusion"><span class="header-section-number">10.5</span> Conclusion</a></li>
|
||||
<li><a href="#extension-satellite-imagery-and-its-limits" id="toc-extension-satellite-imagery-and-its-limits" class="nav-link" data-scroll-target="#extension-satellite-imagery-and-its-limits"><span class="header-section-number">10.6</span> Extension: Satellite Imagery and its Limits</a>
|
||||
<li><a href="#change-detection" id="toc-change-detection" class="nav-link active" data-scroll-target="#change-detection">Change Detection</a></li>
|
||||
<li><a href="#implementing-a-t-test-in-earth-engine" id="toc-implementing-a-t-test-in-earth-engine" class="nav-link" data-scroll-target="#implementing-a-t-test-in-earth-engine">Implementing a t-test in Earth Engine</a></li>
|
||||
<li><a href="#filtering-the-sentinel-1-imagery" id="toc-filtering-the-sentinel-1-imagery" class="nav-link" data-scroll-target="#filtering-the-sentinel-1-imagery">Filtering the Sentinel-1 Imagery</a></li>
|
||||
<li><a href="#validation" id="toc-validation" class="nav-link" data-scroll-target="#validation">Validation</a></li>
|
||||
<li><a href="#conclusion" id="toc-conclusion" class="nav-link" data-scroll-target="#conclusion">Conclusion</a></li>
|
||||
<li><a href="#extension-satellite-imagery-and-its-limits" id="toc-extension-satellite-imagery-and-its-limits" class="nav-link" data-scroll-target="#extension-satellite-imagery-and-its-limits">Extension: Satellite Imagery and its Limits</a>
|
||||
<ul class="collapse">
|
||||
<li><a href="#creating-a-3d-model-of-beirut" id="toc-creating-a-3d-model-of-beirut" class="nav-link" data-scroll-target="#creating-a-3d-model-of-beirut"><span class="header-section-number">10.6.1</span> Creating a 3D model of Beirut</a></li>
|
||||
<li><a href="#using-a-viewshed-analysis-to-assess-blast-exposure" id="toc-using-a-viewshed-analysis-to-assess-blast-exposure" class="nav-link" data-scroll-target="#using-a-viewshed-analysis-to-assess-blast-exposure"><span class="header-section-number">10.6.2</span> Using a Viewshed Analysis to Assess Blast Exposure</a></li>
|
||||
<li><a href="#accounting-for-diffraction" id="toc-accounting-for-diffraction" class="nav-link" data-scroll-target="#accounting-for-diffraction"><span class="header-section-number">10.6.3</span> Accounting for Diffraction</a></li>
|
||||
<li><a href="#modeling-the-pressure-wave" id="toc-modeling-the-pressure-wave" class="nav-link" data-scroll-target="#modeling-the-pressure-wave"><span class="header-section-number">10.6.4</span> Modeling the Pressure Wave</a></li>
|
||||
<li><a href="#assessing-damage-to-the-skyline-tower" id="toc-assessing-damage-to-the-skyline-tower" class="nav-link" data-scroll-target="#assessing-damage-to-the-skyline-tower"><span class="header-section-number">10.6.5</span> Assessing Damage to the Skyline Tower</a></li>
|
||||
<li><a href="#further-research" id="toc-further-research" class="nav-link" data-scroll-target="#further-research"><span class="header-section-number">10.6.6</span> Further Research</a></li>
|
||||
<li><a href="#creating-a-3d-model-of-beirut" id="toc-creating-a-3d-model-of-beirut" class="nav-link" data-scroll-target="#creating-a-3d-model-of-beirut">Creating a 3D model of Beirut</a></li>
|
||||
<li><a href="#using-a-viewshed-analysis-to-assess-blast-exposure" id="toc-using-a-viewshed-analysis-to-assess-blast-exposure" class="nav-link" data-scroll-target="#using-a-viewshed-analysis-to-assess-blast-exposure">Using a Viewshed Analysis to Assess Blast Exposure</a></li>
|
||||
<li><a href="#accounting-for-diffraction" id="toc-accounting-for-diffraction" class="nav-link" data-scroll-target="#accounting-for-diffraction">Accounting for Diffraction</a></li>
|
||||
<li><a href="#modeling-the-pressure-wave" id="toc-modeling-the-pressure-wave" class="nav-link" data-scroll-target="#modeling-the-pressure-wave">Modeling the Pressure Wave</a></li>
|
||||
<li><a href="#assessing-damage-to-the-skyline-tower" id="toc-assessing-damage-to-the-skyline-tower" class="nav-link" data-scroll-target="#assessing-damage-to-the-skyline-tower">Assessing Damage to the Skyline Tower</a></li>
|
||||
<li><a href="#further-research" id="toc-further-research" class="nav-link" data-scroll-target="#further-research">Further Research</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<div class="toc-actions"><div><i class="bi bi-github"></i></div><div class="action-links"><p><a href="https://github.com/oballinger/RS4OSINT/edit/main/C3_Blast.qmd" class="toc-action">Edit this page</a></p></div></div></nav>
|
||||
@@ -327,7 +315,7 @@ gtag('config', 'G-RK9ZLZQ6GL', { 'anonymize_ip': true});
|
||||
|
||||
<header id="title-block-header" class="quarto-title-block default">
|
||||
<div class="quarto-title">
|
||||
<h1 class="title"><span class="chapter-number">10</span> <span class="chapter-title">Blast Damage Assessment</span></h1>
|
||||
<h1 class="title"><span class="chapter-title">Blast Damage Assessment</span></h1>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -354,8 +342,8 @@ gtag('config', 'G-RK9ZLZQ6GL', { 'anonymize_ip': true});
|
||||
<iframe src="https://ollielballinger.users.earthengine.app/view/beirutsar" width="100%" height="700px">
|
||||
</iframe>
|
||||
</div>
|
||||
<section id="change-detection" class="level2" data-number="10.1">
|
||||
<h2 data-number="10.1" class="anchored" data-anchor-id="change-detection"><span class="header-section-number">10.1</span> Change Detection</h2>
|
||||
<section id="change-detection" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="change-detection">Change Detection</h2>
|
||||
<p>There are many ways to detect change between two images. The simplest way would be to take an image taken before an event, and subtract it from an image taken after. This is a good way to get a general sense of where change has occurred, but if you only use two images (one before an event and another after), it would be difficult to differentiate between areas that have changed as a result of the event in question, and areas that have changed for other reasons. Things in Beirut (and cities in general) are constantly changing: construction, cars/planes/ships moving, vegetation growing, etc. So we wouldn’t know if the change we’re seeing is a result of the explosion or whether that area is generally prone to change. We can overcome this by comparing a bunch of pre-event images to a bunch of post-event images. This way we can see if the change we’re seeing is consistent across all of the images. If it is, then we can be fairly confident that the change is a result of the event in question. The mean is simply the sum of all the values (<span class="math inline">\(x_i\)</span>) in a set divided by the number of values (<span class="math inline">\(n\)</span>):</p>
|
||||
<p><span class="math display">\[\large \overline{x} = \frac{1}{n} \sum_{i=1}^n x_i\]</span></p>
|
||||
<p>But if we just take the average pixel value before and subtract the average pixel value after, we’re not accounting for the <em>variability</em> of that pixel’s values. For example, if we have a pixel that has had an average value of 1 for the month before the event, and a value of 2 in the month after the event, the difference is 1. If that pixel’s value is extremely consistent (it never varies by more than 0.1), such a change would be very significant. But if that pixel’s value is very variable (it varies by 2 or even 3 on a regular basis), then the change is not significant. So we need to account for the variability of the pixel’s values using the standard deviation. It is calculated as the square root of the variance, which is the average of the squared differences from the mean:</p>
|
||||
@@ -370,8 +358,8 @@ gtag('config', 'G-RK9ZLZQ6GL', { 'anonymize_ip': true});
|
||||
</ul>
|
||||
<p>This procedure gives us a number called a t-value, which is a measure of how many standard deviations the difference between the two means is. We’re not going to get into the details here, but a rule of thumb is that if the t-value is greater than 2, then the difference between the two means is significant. If the t-value is less than 2, then the difference is not significant. We’re going to calculate the t-value for each pixel in the image to determine whether that pixel has changed significantly following the event in question. You don’t need to know the details of the t-test to understand the results (but hopefully you’ve got an intuition for what it’s doing). If you’re interested in learning more about statistical tests of this sort, I teach a course on Data Science at the University College London, and have made all of the lectures and courseware open-source. The T-test lecture is here.</p>
|
||||
</section>
|
||||
<section id="implementing-a-t-test-in-earth-engine" class="level2" data-number="10.2">
|
||||
<h2 data-number="10.2" class="anchored" data-anchor-id="implementing-a-t-test-in-earth-engine"><span class="header-section-number">10.2</span> Implementing a t-test in Earth Engine</h2>
|
||||
<section id="implementing-a-t-test-in-earth-engine" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="implementing-a-t-test-in-earth-engine">Implementing a t-test in Earth Engine</h2>
|
||||
<p>Now lets go about implementing this in Earth Engine. We’ll start by centering the map on the port of Beirut, and setting the map to satellite view, and defining an area of interest (AOI) as a 3km buffer around the port:</p>
|
||||
<div class="sourceCode" id="cb1"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="bu">Map</span><span class="op">.</span><span class="fu">setCenter</span>(<span class="fl">35.51898</span><span class="op">,</span> <span class="fl">33.90153</span><span class="op">,</span> <span class="dv">15</span>)<span class="op">;</span></span>
|
||||
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a></span>
|
||||
@@ -451,8 +439,8 @@ gtag('config', 'G-RK9ZLZQ6GL', { 'anonymize_ip': true});
|
||||
<p>First, the algorithm above returns tha <em>absolute</em> value of t (i.e. the absolute value of the difference between the two means). This is because we’re interested in whether the pixel has changed at all, not whether it’s changed in a particular direction. Second, we’ve subtracted 2 from the t-value.</p>
|
||||
<p>The t-value is a measure of how many standard deviations the difference between the two means is. Generally speaking, if the t-value is greater than 2, then the difference between the two means is considered statistically significant. 2 is a fairly arbitrary cutoff, but it’s the most commonly used one since it corresponds to the 95% confidence interval (i.e., there’s less than a 5% chance of observing a difference that big due to random chance). Now we’ve got a function that can take an image collection and return a t-value image, where a value greater than 0 corresponds to a statistically significant change between the pre-event and post-event periods.</p>
|
||||
</section>
|
||||
<section id="filtering-the-sentinel-1-imagery" class="level2" data-number="10.3">
|
||||
<h2 data-number="10.3" class="anchored" data-anchor-id="filtering-the-sentinel-1-imagery"><span class="header-section-number">10.3</span> Filtering the Sentinel-1 Imagery</h2>
|
||||
<section id="filtering-the-sentinel-1-imagery" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="filtering-the-sentinel-1-imagery">Filtering the Sentinel-1 Imagery</h2>
|
||||
<p>We can’t just blindly apply this algorithm to the entire image collection, because the image collection contains images from both ascending and descending orbits. We need to filter the image collection to the ascending and descending orbits, and then calculate the t-value for each orbit separately: this is because the satellite is viewing the scene from a completely different angle when it’s in ascending and descending orbits, which will generate a lot of noise in our data. In fact, even when the satellite is either ascending or descending, we can have multiple images of the same place taken from slightly different orbital tracks because these overlap (see <a href="./ch1#orbits">this visualization of orbits</a>). We need to filter the image collection to the relative orbit number that is most common within the image collection. For that, we define a new function called ‘filter_s1’, which takes a single argument: the path (either ‘ASCENDING’ or ‘DESCENDING’).</p>
|
||||
<div class="sourceCode" id="cb3"><pre class="sourceCode js code-with-copy"><code class="sourceCode javascript"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> <span class="fu">filter_s1</span>(path) {</span>
|
||||
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a> </span>
|
||||
@@ -513,22 +501,22 @@ gtag('config', 'G-RK9ZLZQ6GL', { 'anonymize_ip': true});
|
||||
<p>The visualization parameters correspond to the statistical significance of the change in pixel values. Using the Viridis color palette which ranges from purple to yellow, dark purple pixels indicate no significant change, and yellow pixels indicate a significant change with with 95% confidence. The brighter the yellow of a pixel, the more significant the change.</p>
|
||||
<div class="quarto-figure quarto-figure-center">
|
||||
<figure class="figure">
|
||||
<p><img src="../images/beirut/beirut_change_2020.jpg" class="img-fluid figure-img"></p>
|
||||
<p><img src="images/beirut/beirut_change_2020.jpg" class="img-fluid figure-img"></p>
|
||||
<p></p><figcaption class="figure-caption">Pixelwise T-Test, 2020</figcaption><p></p>
|
||||
</figure>
|
||||
</div>
|
||||
<p>This seems to be working quite well; but remember, ports are generally prone to change. The t-test is accounting for this by calculating each pixel’s variance over the entire time period, but it’s still possible that the change we’re seeing is due to the port rather than the explosion. To test this, we can run the same algorithm on the same area, using the same date cutoff (August 4th), but in a different year; I’ve chosen 2018. This is what’s known as a placebo test: if it’s still showing loads of statistically significant change around the cutoff, our algorithm is probably picking up on port activity rather than the explosion.</p>
|
||||
<div class="quarto-figure quarto-figure-center">
|
||||
<figure class="figure">
|
||||
<p><img src="../images/beirut/beirut_change_2018.jpg" class="img-fluid figure-img"></p>
|
||||
<p><img src="images/beirut/beirut_change_2018.jpg" class="img-fluid figure-img"></p>
|
||||
<p></p><figcaption class="figure-caption">Pixelwise T-Test, 2018</figcaption><p></p>
|
||||
</figure>
|
||||
</div>
|
||||
<p>Compared to the 2020 image, there’s a lot less yellow (significant change). That being said, there are a few yellow areas. This could be due to a number of reasons: ships coming and going, cranes moving, and containers being loaded and unloaded would all register in the change detection algorithm. There are also a number of yellow specks throughout the city, which is also to be expected since cities are also generally in a state of flux. Construction, demolition, and even the growth of vegetation can all be detected by the algorithm.</p>
|
||||
<p>However, the scale and quantity of the change is nowhere near what it was for the 2020 image. This is a good sign that the algorithm is detecting change resulting from the explosion.</p>
|
||||
</section>
|
||||
<section id="validation" class="level2" data-number="10.4">
|
||||
<h2 data-number="10.4" class="anchored" data-anchor-id="validation"><span class="header-section-number">10.4</span> Validation</h2>
|
||||
<section id="validation" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="validation">Validation</h2>
|
||||
<p>Great. We’ve developed our very own change detection algorithm in earth engine, applied it to the Beirut explosion, and it seems to be working after checking with a basic placebo test. But how do we know that it’s correctly predicting the <em>extent</em> of the damage, and not wildly over/underestimating?</p>
|
||||
<p>Given that this was a few years ago, we have the benefit of hindsight. In particular, the United Nations and the Municipality of Beirut have <a href="https://unhabitat.org/sites/default/files/2020/10/municipality_of_beirut_-_beirut_explosion_rapid_assessment_report.pdf">published a report</a> on the damage caused by the explosion. This report includes estimates of the number of buildings damaged or destroyed, as well as the number of people displaced. The report states that approximately 10,000 buildings were damaged within a 3 kilometre radius of the port. If our algorithm suggests that only 1,000 buildings were damaged, it’s undershooting. If it suggests that 100,000 buildings were damaged, it’s overshooting.</p>
|
||||
<p>Using building footprint data and the t-test image we just generated, we can createe an estimate of the number of damaged buildings according to our model. First, we want to generate a thresholded image, where pixels with a value greater than 0 are set to 1, and all other pixels are set to 0. We can then use this mask to reduce the building footprints to a single value for each building, where the value is the mean of the t-test image within the footprint. If the mean value is greater than 0, the building is damaged. If it’s less than 0, the building is not damaged.</p>
|
||||
@@ -595,21 +583,21 @@ gtag('config', 'G-RK9ZLZQ6GL', { 'anonymize_ip': true});
|
||||
<p>The result naturally resembles the underlying t-test image, with high levels of damage concentrated around the port, and progressively decreasing damage with distance:</p>
|
||||
<div class="quarto-figure quarto-figure-center">
|
||||
<figure class="figure">
|
||||
<p><img src="../images/beirut/beirut_footprints.jpg" class="img-fluid figure-img"></p>
|
||||
<p><img src="images/beirut/beirut_footprints.jpg" class="img-fluid figure-img"></p>
|
||||
<p></p><figcaption class="figure-caption">Building Footprints colored according to estimated blast damage</figcaption><p></p>
|
||||
</figure>
|
||||
</div>
|
||||
<p>To get a better sense of how these predicitions correspond to actual damage, we can zoom in and turn on the Google satellite basemap, which has imagery taken just after the explosion; you can still see capsized boats in the port. Zooming in to the epicenter, we can see several warehouses that were effectively vaporized. Our change detection algorithm picks up on a high degree of change, as indicated by the red outlines of the building footprints:</p>
|
||||
<div class="quarto-figure quarto-figure-center">
|
||||
<figure class="figure">
|
||||
<p><img src="../images/beirut/beirut_footprints_port.jpg" class="img-fluid figure-img"></p>
|
||||
<p><img src="images/beirut/beirut_footprints_port.jpg" class="img-fluid figure-img"></p>
|
||||
<p></p><figcaption class="figure-caption">Predicted damage and optical satellite imagery in the Port of Beirut, August 2020</figcaption><p></p>
|
||||
</figure>
|
||||
</div>
|
||||
<p>This is pretty low-hanging fruit. Let’s look at a different area, around 1.3km east from the epicenter with a mix of warehouses and residential buildings:</p>
|
||||
<div class="quarto-figure quarto-figure-center">
|
||||
<figure class="figure">
|
||||
<p><img src="../images/beirut/beirut_footprints_zoomed.jpg" class="img-fluid figure-img"></p>
|
||||
<p><img src="images/beirut/beirut_footprints_zoomed.jpg" class="img-fluid figure-img"></p>
|
||||
<p></p><figcaption class="figure-caption">Area east of the port: 35.533194, 33.9024</figcaption><p></p>
|
||||
</figure>
|
||||
</div>
|
||||
@@ -618,12 +606,12 @@ gtag('config', 'G-RK9ZLZQ6GL', { 'anonymize_ip': true});
|
||||
<p>In Area B, we see a medium-rise building. If you look closely at the southern edge of the building, you’ll see the siding has been completely torn off and is laying on the sidewalk. The building footprint is orange, suggesting a medium amount of change. We may be underestimating a bit here.</p>
|
||||
<p>In Area C, there are a bunch of high rise buildings clustered together. The building footprints are all blue, suggesting little to no damage. This is a bit of a surprise given how damaged areas A and B are. If you squint at the satellite image, it is indeed hard to tell if these buildings are damaged because we’re looking at them from the top down, when much of the damage (e.g., the windows being blown out) would only be visible from the side. Indeed, our own estimate of the number of damaged buildings based on the algorithm we developed is about 8% shy of the U.N.’s estimate. This may be why.</p>
|
||||
</section>
|
||||
<section id="conclusion" class="level2" data-number="10.5">
|
||||
<h2 data-number="10.5" class="anchored" data-anchor-id="conclusion"><span class="header-section-number">10.5</span> Conclusion</h2>
|
||||
<section id="conclusion" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="conclusion">Conclusion</h2>
|
||||
<p>In this practical example, we created a custom change detection algorithm that conducts a pixelwise t-test to detect change resulting from the 2020 explosion in the port of Beirut. By defining our own functions to do most of this analysis, we can apply the same workflow quite easily to a different context by simply moving the AOI and inputting the date of the shock. A placebo test showed that it’s not just detecting general change in the area, but specifically change resulting from the explosion: when we keep everything the same but change the year of the shock, we see very little significant change being detected. Finally, by joining the predicted damage map to building footprints, we come up with an estimate of 9,256 damaged buildings, which is pretty close to the U.N.’s estimate of 10,000. That concludes the portion of this case study that deals with Earth Engine, but if you’re interested in learning more about why we’re coming up a bit short on the damage estimate (and some different ways of looking at the problem), read on.</p>
|
||||
</section>
|
||||
<section id="extension-satellite-imagery-and-its-limits" class="level2" data-number="10.6">
|
||||
<h2 data-number="10.6" class="anchored" data-anchor-id="extension-satellite-imagery-and-its-limits"><span class="header-section-number">10.6</span> Extension: Satellite Imagery and its Limits</h2>
|
||||
<section id="extension-satellite-imagery-and-its-limits" class="level2">
|
||||
<h2 class="anchored" data-anchor-id="extension-satellite-imagery-and-its-limits">Extension: Satellite Imagery and its Limits</h2>
|
||||
<p>Though satellite imagery analysis is undoubtedly one of the best tools we have at our disposal to analyze this sort of phenomenon, it appears to systematically underestimate the extent of damage in Beirut. I outline an alternative approach using Open Street Map data to create a 3D model of Beirut and the explosion to analyze directional blast damage. Again, we’re now leaving Earth Engine and moving to Blender, so if you’re not interested in that feel free to skip ahead to the next case study.</p>
|
||||
<p>Below is one of the most viewed videos of the explosion:</p>
|
||||
<blockquote class="twitter-tweet blockquote">
|
||||
@@ -634,16 +622,16 @@ Stunning video shows explosions just minutes ago at Beirut port <a href="https:/
|
||||
</blockquote>
|
||||
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
|
||||
<p>Geolocating this video was pretty simple thanks to the Greek Orthodox church (highlighted in green below) and the road leading to it (highlighted in blue). The red box indicates the likely location (33.889061, 35.515909) from which the person was filming:</p>
|
||||
<p><img src="../images/beirut/IMG_2.png" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/IMG_2.png" class="img-fluid"></p>
|
||||
<p>The video shows heavy damage being sustained by areas well outside the zones classified as damaged in the maps above (both my own and NASA’s). Indeed, substantial damage was reported several kilometers away.</p>
|
||||
<p>Why are satellite images underestimating damage in Beirut? Satellite images are taken from above, and are two-dimensional. Much of the damage caused by the blast, however, was directional; the pressure wave hit the sides of buildings, as shown in this diagram from a FEMA manual:</p>
|
||||
<p><img src="../images/beirut/IMG_3.png" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/IMG_3.png" class="img-fluid"></p>
|
||||
<p>Areas close to the explosion suffered so much damage that it could be seen from above, but even if an apartment building had all of its windows blown out, this would not necessarily be visible in a top-down view. Even for radar, which does technically collect data in three dimensions, the angle problem remains; a high resolution radar might be able to tell you how tall an apartment complex is, but it won’t give you a clear image of all sides. Case in point: the NASA damage map was created using Sentinel-1 SAR data. In a nutshell, damage assessment in this case is a three-dimensional problem, and remote sensing is a two-dimensional solution.</p>
|
||||
<section id="creating-a-3d-model-of-beirut" class="level3" data-number="10.6.1">
|
||||
<h3 data-number="10.6.1" class="anchored" data-anchor-id="creating-a-3d-model-of-beirut"><span class="header-section-number">10.6.1</span> Creating a 3D model of Beirut</h3>
|
||||
<section id="creating-a-3d-model-of-beirut" class="level3">
|
||||
<h3 class="anchored" data-anchor-id="creating-a-3d-model-of-beirut">Creating a 3D model of Beirut</h3>
|
||||
<p>To create a more accurate rendering of directional blast damage, three dimensional data are required. Data from Open Street Maps (OSM) contains information on both the “footprints” (i.e., the location and shape) as well as the height of buildings, which is enough to create a three dimensional model of Beirut. 3D rendering was done in Blender using the Blender-OSM add-on to import a satellite basemap, terrain raster, and OSM data.</p>
|
||||
<p>Geolocated videos of the blast can be used to verify and adjust the model. Below is a side-by-side comparison of the twitter video and a 3D rendition of OSM data:</p>
|
||||
<p><img src="../images/beirut/IMG_4.png" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/IMG_4.png" class="img-fluid"></p>
|
||||
<p>Some slight adjustments to the raw OSM data were made to achieve the image on the right. The building footprints are generally very accurate and comprehensive in coverage, but the building height data does occasionally have to be adjusted manually. A simple and reliable way of doing this is to look at the shadows cast by the building on the satellite base map and scale accordingly. I also added a rough texture to the buildings to help differentiate them, and added the domed roof of the Greek Orthodox church for reference.</p>
|
||||
<p>For good measure, a second video is geolocated following the same procedure:</p>
|
||||
<blockquote class="twitter-tweet blockquote">
|
||||
@@ -654,32 +642,32 @@ Another view of the explosions in Beirut <a href="https://t.co/efT5VlpMkj">pic.t
|
||||
</blockquote>
|
||||
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
|
||||
<p>The second pier (highlighted in green) and the angle (in blue) serve as references:</p>
|
||||
<p><img src="../images/beirut/IMG_5.png" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/IMG_5.png" class="img-fluid"></p>
|
||||
<p>The video was taken from the rooftop of a Japanese restaurant called Clap Beirut (in red above). This is confirmed by a picture of the rooftop bar on google images, which matches the bar that can be seen at 0:02 in the twitter video. Below is a comparison of the video view and the 3D OSM model:</p>
|
||||
<p><img src="../images/beirut/IMG_6.png" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/IMG_6.png" class="img-fluid"></p>
|
||||
<p>Though somewhat grainy, the basemap on the OSM rendering shows the same parking lot in the foreground, the second pier, and the same two buildings highlighted in yellow. Having created a 3D model of Beirut using OSM data, we can now simulate how the explosion would interact with the cityscape.</p>
|
||||
</section>
|
||||
<section id="using-a-viewshed-analysis-to-assess-blast-exposure" class="level3" data-number="10.6.2">
|
||||
<h3 data-number="10.6.2" class="anchored" data-anchor-id="using-a-viewshed-analysis-to-assess-blast-exposure"><span class="header-section-number">10.6.2</span> Using a Viewshed Analysis to Assess Blast Exposure</h3>
|
||||
<section id="using-a-viewshed-analysis-to-assess-blast-exposure" class="level3">
|
||||
<h3 class="anchored" data-anchor-id="using-a-viewshed-analysis-to-assess-blast-exposure">Using a Viewshed Analysis to Assess Blast Exposure</h3>
|
||||
<p>As the pressure wave moved through the Beirut, some buildings bore the full force of the explosion, while others were partially shielded by taller structures. A viewshed analysis can be conducted to identify surfaces that were directly exposed to the explosion by creating a lighting object at ground zero; areas that are lit up experienced unobstructed exposure to the blast:</p>
|
||||
<p><img src="../images/beirut/GIF_1.gif" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/GIF_1.gif" class="img-fluid"></p>
|
||||
<p>Pressure waves, like sound, are capable of diffraction (bending around small obstructions). To roughly simulate this, the lighting object is gradually raised, allowing the light to pass “around” obstructions. Warehouses on the Eastern side of the docks, as well as the first row of apartment buildings facing the docks are immediately affected. As the lighting object rises above the warehouse, more areas suffer direct exposure.</p>
|
||||
<p>Using two lighting objects– a red one at 10 meters and a blue one at 20 meters above the warehouse at ground zero– the intensity of the blast in different areas is highlighted; red areas suffered direct exposure, blue areas suffered partially obstructed exposure, and black areas were indirectly exposed.</p>
|
||||
<p><img src="../images/beirut/IMG_7.png" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/IMG_7.png" class="img-fluid"></p>
|
||||
<p>In the immediate vicinity of the explosion the large “L” shaped building (Lebanon’s strategic grain reserve) is bright red, and was barely left standing. It absorbed a large amount of the blast, shielding areas behind it and thereby casting a long blue shadow to the West. If one refers back to the satellite damage maps above, there appears to be significantly less damage in the area just West of (“behind”) the grain silo, roughly corresponding to the blue shadow above. While these areas were still heavily damaged, they seem to have suffered less damage than areas of equal distance to the East.</p>
|
||||
</section>
|
||||
<section id="accounting-for-diffraction" class="level3" data-number="10.6.3">
|
||||
<h3 data-number="10.6.3" class="anchored" data-anchor-id="accounting-for-diffraction"><span class="header-section-number">10.6.3</span> Accounting for Diffraction</h3>
|
||||
<section id="accounting-for-diffraction" class="level3">
|
||||
<h3 class="anchored" data-anchor-id="accounting-for-diffraction">Accounting for Diffraction</h3>
|
||||
<p>The viewshed analysis tells us which sides of a building are exposed to the blast, but it’s a pretty rough approximation of the way the pressure wave would respond to obstacles in its path. As previously mentioned, pressure waves behave much like sound waves or waves in water: they bounce off of objects, move around obstructions, and gradually fade.</p>
|
||||
<p>To get a more precise idea of the way in which the blast interacted with the urban environment, we can model the blast as an actual wave using the “dynamic wave” feature in Blender. This effectively involves creating a two-dimensional plane, telling it to behave like water, and simulating an object being dropped into the water. By putting an obstruction in this plane, we can see how the wave responds to it. As an example, the grain silo has been isolated below:</p>
|
||||
<p><img src="../images/beirut/GIF_2.gif" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/GIF_2.gif" class="img-fluid"></p>
|
||||
<p>As the blast hits the side of the silo, it is reflected. Two large waves can be seen traveling to the right: the initial blast wave, and the reflection from the silo which rivals the initial wave in magnitude. To the left, the wave travels around the silo but is significantly weakened.</p>
|
||||
<p>Broadening the focus and adding the rest of the OSM data back in, we can observe how the pressure wave interacted with buildings on the waterfront:</p>
|
||||
<p><img src="../images/beirut/GIF_3.gif" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/GIF_3.gif" class="img-fluid"></p>
|
||||
<p>The warehouses on the docks were omitted to emphasize the interaction between the pressure wave and the waterfront buildings; their light metal structure and low height means they would have caused little reflection anyway. The general pattern of the dynamic wave is consistent with the viewshed, but adds a layer of detail. The blast is reflected off of the silo towards the East, leading to a double hit. Though the wave still moves around the silo to the West, the pressure is diminished. Once the wave hits the highrises, the pattern becomes noisy as the wave both presses forward into the mainland and is reflected back towards the pier.</p>
|
||||
</section>
|
||||
<section id="modeling-the-pressure-wave" class="level3" data-number="10.6.4">
|
||||
<h3 data-number="10.6.4" class="anchored" data-anchor-id="modeling-the-pressure-wave"><span class="header-section-number">10.6.4</span> Modeling the Pressure Wave</h3>
|
||||
<section id="modeling-the-pressure-wave" class="level3">
|
||||
<h3 class="anchored" data-anchor-id="modeling-the-pressure-wave">Modeling the Pressure Wave</h3>
|
||||
<p>Now that we’ve accounted for the directionality of the blast and the influence of buildings, we can model the pressure wave itself. An expanding sphere centered at ground zero is used to model the progression of the pressure wave through the city. To get a visual sense of the blast’s force, the color of the sphere will be a function of the pressure exerted by the pressure wave.</p>
|
||||
<p>The pressure exerted by the explosion in kilopascals (kPa) at various distances can be calculated using the U.S. Department of Defemse’s Blast Effects Computer, which allows users to input variables such as the TNT equivalent of the ordnance, storage method, and elevation. Though there are several estimates, the blast was likely equivalent to around 300 tons of TNT. The direct “incident pressure” of the pressure wave is shown in blue. However, pressure waves from explosions that occur on the ground are reflected upwards, amplifying the total pressure exerted by the blast. This “reflected pressure” is shown in orange:</p>
|
||||
<iframe title="Blast Overpressure and Distance " aria-label="Interactive line chart" id="datawrapper-chart-J1Pb1" src="https://datawrapper.dwcdn.net/J1Pb1/1/" scrolling="no" frameborder="0" style="width: 0; min-width: 100% !important; border: none;" height="400">
|
||||
@@ -688,26 +676,26 @@ Another view of the explosions in Beirut <a href="https://t.co/efT5VlpMkj">pic.t
|
||||
</script>
|
||||
<p>For reference, 137 kPa results in 99% fatalities, 68 kPa is enough to cause structural damage to most buildings, and 20 kPa results in serious injuries. 1-6 kPa is enough to break an average window. At 1km, the reflected pressure of the blast (18 kPa) was still enough to seriously injure. Precisely calculating the force exerted by an explosion is exceptionally complicated, however, so these numbers should be treated as rough estimates. Further analysis of the damage caused by the blast can be derived from the UN’s Explosion Consequences Analysis calculator which provides distance values for different types of damage and injuries.</p>
|
||||
<p>Linking the values in this graph to the color of the pressure wave sphere provides a visual representation of the blast’s force as it expands. An RGB color scale corresponds to the blast’s overpressure at three threshold values.</p>
|
||||
<p><img src="../images/beirut/beirut.gif" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/beirut.gif" class="img-fluid"></p>
|
||||
<p>By keeping the lighting object from the viewshed analysis and placing it within the expanding sphere of the pressure wave, we combine two key pieces of information: the pressure exerted by the blast (the color of the sphere), and the level of directional exposure (brightness).</p>
|
||||
<p>Now, referring back to the two geolocated twitter videos from earlier, we can recreate the blast in our 3D model and get some new insights. Below is a side-by-side comparison of the first video and the 3D model:</p>
|
||||
<p><img src="../images/beirut/GIF_5.gif" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/GIF_5.gif" class="img-fluid"></p>
|
||||
<p>Judging by the twitter video alone, it would be very hard to tell the fate of the person filming or the damage caused to the building that they were in. However, the 3D model shows that despite having an unobstructed view of the explosion, the incident pressure of the pressure wave had decreased significantly by the time it reached the viewing point. The blue-green color corresponds to roughly 15 kPa– enough to injure and break windows, but not enough to cause structural damage to the building.</p>
|
||||
<p>The second twitter video was taken slightly closer to ground zero, but the view was partially obstructed by the grain silo:</p>
|
||||
<p><img src="../images/beirut/GIF_6.gif" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/GIF_6.gif" class="img-fluid"></p>
|
||||
<p>Though the pressure wave probably exerted more pressure compared to the first angle, the partial obstruction of the grain silo likely tempered the force of the blast.</p>
|
||||
</section>
|
||||
<section id="assessing-damage-to-the-skyline-tower" class="level3" data-number="10.6.5">
|
||||
<h3 data-number="10.6.5" class="anchored" data-anchor-id="assessing-damage-to-the-skyline-tower"><span class="header-section-number">10.6.5</span> Assessing Damage to the Skyline Tower</h3>
|
||||
<section id="assessing-damage-to-the-skyline-tower" class="level3">
|
||||
<h3 class="anchored" data-anchor-id="assessing-damage-to-the-skyline-tower">Assessing Damage to the Skyline Tower</h3>
|
||||
<p>As a concrete example of how this approach can be used to assess damage (or predict it, if one had the foresight), let us consider the Skyline Tower, pictured below following the explosion:</p>
|
||||
<p><img src="../images/beirut/IMG_8.png" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/IMG_8.png" class="img-fluid"></p>
|
||||
<p>This partial side view shows two faces of the building, labeled “A” and “B” above. Side A was nearly perpendicular to the blast, and just 600m from ground zero. Based on the previous modeling, the pressure wave exerted roughly 40 kPa on this side of the building. The corner where sides A and B meet, highlighted in green, shows total destruction of windows, removal of most siding panels, and structural damage. The back corner, highlighted in red, shows many windows still intact, indicating that the maximum overpressure on this side of the building likely didn’t exceed 10 kPa. In other words, standing on the front balcony would likely have led to serious injury but standing on the back balcony would have been relatively safe.</p>
|
||||
<p>The animation below shows the Skyline Tower as it is hit by the pressure wave, with sides A and B labeled:</p>
|
||||
<p><img src="../images/beirut/GIF_7.gif" class="img-fluid"></p>
|
||||
<p><img src="images/beirut/GIF_7.gif" class="img-fluid"></p>
|
||||
<p>The bright green color of the pressure wave indicates a strong likelihood of structural damage. Side A can be seen taking a direct hit, while side B is angled slightly away. Despite not being directly exposed to the blast, it likely still took reflective damage from some of the neighboring buildings. Both the incident overpressure indicated by the color of the sphere, as well as the relative brightness of sides A and B both correspond closely to the observed damage taken by the Skyline Tower.</p>
|
||||
</section>
|
||||
<section id="further-research" class="level3" data-number="10.6.6">
|
||||
<h3 data-number="10.6.6" class="anchored" data-anchor-id="further-research"><span class="header-section-number">10.6.6</span> Further Research</h3>
|
||||
<section id="further-research" class="level3">
|
||||
<h3 class="anchored" data-anchor-id="further-research">Further Research</h3>
|
||||
<p>Though satellite imagery analysis is an indispensable tool in disaster response, it has limitations. Urban blast damage in particular is difficult to assess accurately because it is highly directional and much of it cannot be seen from a bird’s eye view. Using free and open source tools, an interactive 3D model of an urban explosion can be generated, allowing for a highly detailed investigation of directional blast damage. This can be achieved in three steps:</p>
|
||||
<p>First, creating a 3D model of the urban area using Blender and Open Street Maps data. Second, conducting a viewshed analysis using lighting objects to gauge levels of unobstructed exposure to the pressure wave. Third, modeling the explosion using geolocated videos of the event and ordnance calculators. For added detail, a dynamic wave analysis can be used to more precisely model how the pressure wave interacts with buildings.</p>
|
||||
<p>Once properly modeled, the explosion can be viewed from any angle in the city. The viewshed analysis can be calibrated more finely by ground-truthing various damage levels (e.g. broken windows) at different locations. In the absence of an official address registry in Beirut, OSM is already being used by the Lebanese Red Cross (donate here) to conduct neighborhood surveys assessing blast damage. As such, this type of damage analysis can quickly be integrated into relief efforts, adapted to model disasters in different cities, and can even be used to simulate the destructive potential of hypothetical explosions to promote readiness.</p>
|
||||
@@ -1068,12 +1056,12 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||
<nav class="page-navigation">
|
||||
<div class="nav-page nav-page-previous">
|
||||
<a href="./C2_Refineries.html" class="pagination-link">
|
||||
<i class="bi bi-arrow-left-short"></i> <span class="nav-page-text"><span class="chapter-number">9</span> <span class="chapter-title">Refinery Identification</span></span>
|
||||
<i class="bi bi-arrow-left-short"></i> <span class="nav-page-text"><span class="chapter-title">Refinery Identification</span></span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="nav-page nav-page-next">
|
||||
<a href="./C4_Ships.html" class="pagination-link">
|
||||
<span class="nav-page-text"><span class="chapter-number">11</span> <span class="chapter-title">Ship Detection</span></span> <i class="bi bi-arrow-right-short"></i>
|
||||
<span class="nav-page-text"><span class="chapter-title">Ship Detection</span></span> <i class="bi bi-arrow-right-short"></i>
|
||||
</a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
Reference in New Issue
Block a user