Measuring the Philippine Coastline.
An investigation into fractal dimension algorithms (Box Counting, Rigid Yardstick, and Bending Yardstick) applied to Philippine islands and lakeshores.
View Latest FindingsTheoretical Framework
From Classical Geometry to Fractional Dimensions
In classical Euclidean geometry, topological dimensions are strictly integers: a zero-dimensional point ($D=0$), a one-dimensional line ($D=1$), a two-dimensional plane ($D=2$), and a three-dimensional volume ($D=3$). When a 1D line is scaled by a factor of $1/s$, it produces $N = s^1$ copies; a 2D square produces $N = s^2$ copies.
In 1918, Felix Hausdorff generalized dimension to non-integers: if scaling an object by 1/s yields N self-similar sub-units, its Hausdorff-Besicovitch Dimension is defined by N = (1/s)^D ⇒ D = log(N) / log(1/s).
Cantor Dust
D = log(2)/log(3) ≈ 0.6309Formed by recursively deleting the middle third of a line segment. It has zero total length yet contains an uncountably infinite number of points, living strictly between $D=0$ and $D=1$.
Koch Snowflake
D = log(4)/log(3) ≈ 1.2618Formed by replacing the middle third of each segment with an equilateral triangle ($N=4, s=1/3$). It encloses a finite, bounded area inside an infinitely long, nowhere-differentiable perimeter.
Sierpiński Gasket
D = log(3)/log(2) ≈ 1.5850Constructed by cutting out the central triangle from an equilateral face ($N=3, s=1/2$). It has zero area but infinite boundary complexity spanning between a line ($D=1$) and a plane ($D=2$).
Hilbert Curve
D = log(4)/log(2) = 2.0000A continuous, non-self-intersecting 1D path that twists infinitely to pass through every single point of a 2D unit square, achieving a space-filling dimension of exactly $D=2.0$.
The Coastline Paradox in Nature
Benoit Mandelbrot (1967) observed that natural geographical boundaries (islands, bays, and lakes) behave as statistical fractals. Unlike smooth geometric shapes ($D=1.0$), measuring a real coastline with a smaller yardstick reveals previously unresolved bays, coves, and promontories—causing the total measured length to diverge towards infinity. For Laguna de Bay ($D \approx 1.134$), measuring the fractal dimension provides a mathematically rigorous baseline: when human infrastructure (like road viaducts) straightens the perimeter, $D$ drops toward $1.0$, directly quantifying the loss of edge-effect microhabitats.
Algorithm Implementation
Box Counting: A regular grid of box size ε covers the boundary. The algorithm counts every box intersecting the shoreline. As ε shrinks geometrically, the exponential growth of occupied boxes N(ε) yields the fractal dimension: D = - lim (log N / log ε).
Box Counting
A grid of boxes is placed over the shoreline. We count how many boxes intersect the curve. By exponentially shrinking the box size and plotting the counts logarithmically, the slope reveals the fractal dimension.
Rigid Yardstick
A virtual, rigid yardstick of length L "walks" along the shoreline from start to finish. The process is repeated with smaller yardsticks. The rate at which total steps increase reveals the dimension.
Bending Yardstick
An experimental method that allows the yardstick to bend precisely once at convex headlands. This aims to trace detail more accurately without conforming to every microscopic feature, reducing fractal inflation.
Core C/C++ Engine Implementation
To process high-resolution satellite boundaries with over 30,000 coordinate vertices across multi-scale geometric ladders, the estimator routines are compiled natively in C/C++ (src/fd.c) for maximum memory locality and zero-allocation execution.
// Traverse grid cells intersected by segment a -> b (Amanatides-Woo DDA)
static void traverse(hset *h, pt a, pt b, double s) {
long ix = (long)floor(a.x / s), iy = (long)floor(a.y / s);
long ix1 = (long)floor(b.x / s), iy1 = (long)floor(b.y / s);
hs_insert(h, cell_key(ix, iy));
double dx = b.x - a.x, dy = b.y - a.y;
int stepx = dx > 0 ? 1 : -1, stepy = dy > 0 ? 1 : -1;
double tmx = dx != 0 ? ((stepx > 0 ? (ix + 1) * s - a.x : ix * s - a.x) / dx) : 1e300;
double tmy = dy != 0 ? ((stepy > 0 ? (iy + 1) * s - a.y : iy * s - a.y) / dy) : 1e300;
double tdx = dx != 0 ? s / fabs(dx) : 1e300;
double tdy = dy != 0 ? s / fabs(dy) : 1e300;
// March across cell boundaries until reaching endpoint
while (ix != ix1 || iy != iy1) {
if (tmx < tmy) { if (tmx >= 1.0) break; ix += stepx; tmx += tdx; }
else { if (tmy >= 1.0) break; iy += stepy; tmy += tdy; }
hs_insert(h, cell_key(ix, iy));
}
}Review of Related Literature
Our approach builds heavily on established computational methods for self-similar boundaries. The Box Counting baseline is standard, while our Rigid Yardstick implementation follows the classic digital compass walk by Shelberg, Moellering, and Lam (1982). Our experimental Bending Yardstick sits computationally between the standard walking family and the constant-deviation variable-step (CDVS) convex-hull methods pioneered by Normant and Tricot (1991).
Locally, Philippine prior art is sparse. Alova (2025) measured the Negros Island coastline at D = 1.018 using Box Counting and coarse GADM vectors. However, there are no published archipelago-wide values, nor studies utilizing precise satellite-derived masks for Philippine lakes (like Laguna de Bay or Taal Lake). This project represents the first multi-feature algorithm-comparison fractal study tailored specifically for Philippine topographies.
Data Pipeline
Dual-Lake NDWI Compositing
Sentinel-2 Harmonized Level-2A surface reflectance is processed through normalized difference water index (NDWI) thresholding. A 7-date temporal median stack and a 150m morphological kernel remove transient clouds, hyacinth mats, and tributary river branches.
Hugging Face & SAMGeo Cross-Validation
To verify our NDWI thresholds against semantic edge cases, we integrated the Hugging Face 6-band Sentinel-2 UNet++ model (giswqs/s2-water-unetplusplus-efficientnet-b4) and Meta's SAMGeo (Segment Anything for Geospatial). These deep neural networks served as an independent cross-check to confirm that turbid shallows and fishpens were not erroneously classified as land.
10-Year Longitudinal Engine
An automated pipeline streaming Cloud-Optimized GeoTIFFs (COGs) via AWS Earth Search computes historical monthly Fractal Dimensions across a 10-year baseline (2017–2026), providing an empirical baseline prior to LLRN road construction.
AWS Earth Search STAC Streaming
Direct spatial subset streaming of Sentinel-2 L2A 10m bands (B2, B3, B4, B8, B11, B12) and Scene Classification Layer (SCL) without downloading heavy .SAFE archives.
Cloud & Shadow Filtering (SCL Mask)
Pixels categorized as cloud high/medium probability, thin cirrus, or cloud shadow are flagged as invalid (NaN) to prevent atmospheric edge artifacts.
7-Date Temporal Median Stacking
Stacking 7 observations per month and taking the pixel-wise nanmedian() synthesizes a pristine, cloud-free optical composite by replacing cloud gaps with clear water views.
Normalized Difference Water Index (NDWI)
NDWI = (Green - NIR) / (Green + NIR). Water pixels with index > 0.00 are segmented into a continuous binary lake mask.
150m Morphological Opening (River-Snipping)
Applying mathematical morphology (scipy.ndimage.binary_opening with a 15×15 kernel) snips narrow inland river channels (like the Napindan River) to avoid infinite tracer recursion.
C Binary Fractal Estimation Engine (./bin/fd)
Optimized C routines execute Box Counting grids, Rigid Divider Compass walks, and Bending Yardstick sweeps across 30,000+ coordinates to compute the fractal dimension (D).
Failure Modes of Existing Vision Models & Potential Contributions
Before settling on our temporal median and morphological pipeline, we evaluated several pretrained neural networks and zero-shot foundation models. Their systematic failure on tropical lacustrine environments highlighted critical gaps in current remote-sensing computer vision:
SAMGeo & Foundation Models
Meta's Segment Anything adapted for geospatial rasters (SAMGeo) oversegmented transient water hyacinth rafts (Eichhornia crassipes) into tens of thousands of isolated land patches. This fragmented the boundary into disjoint, non-manifold multi-polygons instead of a singular continuous lake boundary.
Pretrained UNet++ (Hugging Face)
Pretrained 6-band Sentinel-2 UNet++ architectures (giswqs/s2-water-unetplusplus-efficientnet-b4) trained on temperate oligotrophic water bodies failed under high turbidity. In Laguna de Bay's shallow West Bay, suspended sediment altered red/NIR reflectance, causing murky near-shore water to be misclassified as mudflats.
Single-Scene Gradient Filters
Classical edge operators (Canny, Sobel, Otsu) applied to single-date captures latched onto cloud shadow gradients and cumulus cloud fringes, artificially inflating the fractal dimension to D > 1.35—measuring atmospheric cloud complexity rather than lake topography.
Prospective Machine Learning Contributions
- Tropical Turbidity Benchmark Dataset: Releasing an open-access multi-spectral dataset of tropical, sediment-rich, and weed-infested lake perimeters with verified SCL quality masks to fine-tune geospatial vision models.
- Topological Manifold Loss Constraints: Developing loss formulations and boundary polygonizers that enforce topological closure and manifold continuity, preventing floating weed mats from creating spurious holes.
- Multi-Scale Fractal Regularization: Introducing multi-resolution fractal scaling invariance as a self-supervised geometric regularization loss for coastline segmentation networks.
Archipelago Database
Comprehensive Nationwide Shoreline Survey
Using our native C computational engine, we processed high-resolution vectorized boundaries for 122 major Philippine coastal and inland water features (108 major islands and 14 lakes) spanning Luzon, the Visayas, and Mindanao. This represents the first archipelago-wide comparative fractal baseline for Philippine geography.
Philippine Shoreline Coverage Map
Hover or click any island/lake on the map to inspectTip: Click on any island or lake row to inspect its exact coordinate polyline and live Richardson log-log power law curve.
| Feature Name | Type | Island Group | Province / Region | Vertices | Perimeter (km) | Area (km²) | D (Box) | D (Rigid) | D (Bending) |
|---|---|---|---|---|---|---|---|---|---|
| Luzon↗ | Island | Luzon | NCR / Regions I-V / CAR | 55,454 | 5,365.98 | 104,870.09 | 1.1683 | 1.1598 | 1.1329 |
| Mindanao↗ | Island | Mindanao | Regions IX-XIII / BARMM | 47,852 | 4,427.25 | 93,965.24 | 1.1386 | 1.1458 | 1.1099 |
| Palawan↗ | Island | Luzon | Palawan | 24,225 | 2,074.31 | 11,416.84 | 1.1980 | 1.1363 | 1.1266 |
| Samar↗ | Island | Visayas | Samar / Eastern Samar / Northern Samar | 15,507 | 1,331.01 | 12,435.74 | 1.1627 | 1.1694 | 1.1507 |
| Negros↗ | Island | Visayas | Negros Occidental / Oriental | 9,643 | 894.32 | 12,775.14 | 1.0869 | 1.0679 | 1.0696 |
| Panay↗ | Island | Visayas | Iloilo / Capiz / Aklan / Antique | 8,726 | 920.49 | 11,517.21 | 1.1300 | 1.1330 | 1.1006 |
| Leyte↗ | Island | Visayas | Leyte / Southern Leyte | 9,123 | 868.92 | 7,007.1 | 1.1303 | 1.1143 | 1.0963 |
| Cebu↗ | Island | Visayas | Cebu | 7,594 | 686.72 | 4,417.93 | 1.1025 | 1.0624 | 1.0602 |
| Mindoro↗ | Island | Luzon | Occidental / Oriental Mindoro | 6,160 | 677.02 | 9,817.9 | 1.0819 | 1.0872 | 1.0717 |
| Bohol↗ | Island | Visayas | Bohol | 4,950 | 413.9 | 3,769.48 | 1.1239 | 1.0941 | 1.0906 |
| Masbate↗ | Island | Luzon | Masbate | 6,446 | 624.33 | 3,204.5 | 1.1524 | 1.1434 | 1.1147 |
| Catanduanes↗ | Island | Luzon | Catanduanes | 3,801 | 320.94 | 1,443.5 | 1.1665 | 1.1442 | 1.1320 |
| Basilan↗ | Island | Mindanao | Basilan | 3,073 | 250.43 | 1,234.9 | 1.1088 | 1.0998 | 1.0920 |
| Busuanga↗ | Island | Luzon | Palawan (Calamian) | 4,318 | 367.13 | 945 | 1.2371 | 1.2257 | 1.1595 |
| Marinduque↗ | Island | Luzon | Marinduque | 2,090 | 200.47 | 899.09 | 1.1571 | 1.1364 | 1.1111 |
| Jolo↗ | Island | Mindanao | Sulu | 3,488 | 275.1 | 834.69 | 1.1282 | 1.1111 | 1.1101 |
| Dinagat↗ | Island | Mindanao | Dinagat Islands | 4,166 | 349 | 780.17 | 1.2514 | 1.2071 | 1.1732 |
| Tablas↗ | Island | Luzon | Romblon | 2,694 | 240.79 | 671.17 | 1.1784 | 1.1376 | 1.1071 |
| Polillo↗ | Island | Luzon | Quezon | 2,601 | 240.13 | 646.03 | 1.1951 | 1.1840 | 1.1554 |
| Tawi-Tawi↗ | Island | Mindanao | Tawi-Tawi | 3,376 | 268.8 | 622.34 | 1.1757 | 1.1522 | 1.1260 |
| Guimaras↗ | Island | Visayas | Guimaras | 2,652 | 206.1 | 575.3 | 1.1734 | 1.1540 | 1.1309 |
| Biliran↗ | Island | Visayas | Biliran | 1,282 | 115.29 | 497.65 | 1.1082 | 1.0655 | 1.0575 |
| Sibuyan↗ | Island | Luzon | Romblon | 937 | 101.42 | 450.76 | 1.0882 | 1.0545 | 1.0422 |
| Siargao↗ | Island | Mindanao | Surigao del Norte | 1,791 | 150.83 | 427.22 | 1.1520 | 1.1189 | 1.0976 |
| Burias↗ | Island | Luzon | Masbate | 2,562 | 226.31 | 417.56 | 1.1926 | 1.1073 | 1.0836 |
| Culion↗ | Island | Luzon | Palawan (Calamian) | 3,313 | 278.09 | 387.44 | 1.2982 | 1.3131 | 1.2076 |
| Dumaran↗ | Island | Luzon | Palawan | 2,090 | 173.28 | 327.59 | 1.2306 | 1.2337 | 1.1503 |
| Ticao↗ | Island | Luzon | Masbate | 1,395 | 136.68 | 324.5 | 1.1369 | 1.1209 | 1.0907 |
| Siquijor↗ | Island | Visayas | Siquijor | 1,070 | 101.04 | 319.46 | 1.0902 | 1.0883 | 1.0754 |
| Balabac↗ | Island | Luzon | Palawan | 1,636 | 137.73 | 315.18 | 1.2286 | 1.1943 | 1.1318 |
| Samal (IGACOS)↗ | Island | Mindanao | Davao del Norte | 1,034 | 95.4 | 251.21 | 1.0877 | 1.0491 | 1.0498 |
| Camiguin↗ | Island | Mindanao | Camiguin | 647 | 66.69 | 242.4 | 1.0538 | 1.0378 | 1.0337 |
| Panaon↗ | Island | Visayas | Southern Leyte | 715 | 82.38 | 202.67 | 1.1042 | 1.0456 | 1.0430 |
| Calayan↗ | Island | Luzon | Cagayan (Babuyan) | 776 | 74.31 | 191.46 | 1.1281 | 1.1013 | 1.0598 |
| Lubang↗ | Island | Luzon | Occidental Mindoro | 992 | 97.69 | 194.46 | 1.1266 | 1.1277 | 1.0809 |
| Alabat↗ | Island | Luzon | Quezon | 1,013 | 96.96 | 188.41 | 1.1214 | 1.0375 | 1.0452 |
| Bantayan↗ | Island | Visayas | Cebu | 709 | 65.05 | 113.95 | 1.1091 | 1.0796 | 1.0699 |
| Camotes (Pacijan/Poro)↗ | Island | Visayas | Cebu | 1,086 | 92.68 | 195.23 | 1.1231 | 1.0904 | 1.0749 |
| Romblon Island↗ | Island | Luzon | Romblon | 610 | 55.99 | 81.69 | 1.1704 | 1.0890 | 1.0776 |
| Batan Island↗ | Island | Luzon | Batanes | 611 | 57.9 | 70.93 | 1.1385 | 1.0926 | 1.0701 |
| Itbayat↗ | Island | Luzon | Batanes | 760 | 55.4 | 84.06 | 1.0878 | 1.0472 | 1.0535 |
| Sabtang↗ | Island | Luzon | Batanes | 338 | 31.32 | 33.91 | 1.1628 | 1.0834 | 1.0396 |
| Coron Island↗ | Island | Luzon | Palawan (Calamian) | 972 | 73.2 | 71.81 | 1.1812 | 1.1490 | 1.1158 |
| Linapacan↗ | Island | Luzon | Palawan | 1,691 | 140.21 | 101.82 | 1.3242 | 1.3100 | 1.1769 |
| Mapun (Cagayan de Sulu)↗ | Island | Mindanao | Tawi-Tawi | 905 | 68.15 | 69.04 | 1.1816 | 1.1948 | 1.1144 |
| Semirara↗ | Island | Visayas | Antique | 812 | 70.84 | 66.72 | 1.1598 | 1.1925 | 1.1513 |
| Cuyo↗ | Island | Luzon | Palawan | 651 | 50.83 | 57.71 | 1.1375 | 1.1382 | 1.0997 |
| Jomalig↗ | Island | Luzon | Quezon | 292 | 35.78 | 51.82 | 1.0928 | 1.0419 | 1.0374 |
| Rapu-Rapu↗ | Island | Luzon | Albay | 535 | 46.67 | 64.52 | 1.1046 | 1.0667 | 1.0628 |
| Batan Island (Albay)↗ | Island | Luzon | Albay | 1,004 | 81.43 | 88.61 | 1.1903 | 1.1803 | 1.1486 |
| Cagraray↗ | Island | Luzon | Albay | 873 | 72 | 69.81 | 1.2116 | 1.2013 | 1.1579 |
| San Miguel (Albay)↗ | Island | Luzon | Albay | 397 | 33.8 | 21.73 | 1.2237 | 1.0999 | 1.1055 |
| Homonhon↗ | Island | Visayas | Eastern Samar | 608 | 60.71 | 103.2 | 1.1272 | 1.0507 | 1.0424 |
| Panglao↗ | Island | Visayas | Bohol | 516 | 51.24 | 90.82 | 1.0862 | 1.0577 | 1.0557 |
| Mactan↗ | Island | Visayas | Cebu | 735 | 61.49 | 60.5 | 1.2110 | 1.1013 | 1.0990 |
| Olango↗ | Island | Visayas | Cebu | 524 | 43.31 | 13.28 | 1.3242 | 1.4041 | 1.2179 |
| Bucas Grande↗ | Island | Mindanao | Surigao del Norte | 1,339 | 109.82 | 125.63 | 1.2044 | 1.2210 | 1.1713 |
| Patnanungan↗ | Island | Luzon | Quezon (Polillo) | 876 | 78.32 | 93.23 | 1.1550 | 1.1664 | 1.1093 |
| Balesin↗ | Island | Luzon | Quezon | 128 | 13.32 | 4.22 | 1.1254 | 1.0818 | 1.0790 |
| Fuga Island↗ | Island | Luzon | Cagayan (Babuyan) | 521 | 52.96 | 95.3 | 1.1267 | 1.0515 | 1.0528 |
| Camiguin Norte↗ | Island | Luzon | Cagayan (Babuyan) | 753 | 75.34 | 170.12 | 1.1031 | 1.0754 | 1.0746 |
| Dalupiri Island↗ | Island | Luzon | Cagayan (Babuyan) | 522 | 45.05 | 64.56 | 1.1201 | 1.0668 | 1.0699 |
| Babuyan Claro↗ | Island | Luzon | Cagayan (Babuyan) | 425 | 39.15 | 72.4 | 1.0763 | 1.0370 | 1.0316 |
| Sibutu↗ | Island | Mindanao | Tawi-Tawi | 820 | 83.87 | 104.72 | 1.1642 | 1.0853 | 1.1101 |
| Simunul↗ | Island | Mindanao | Tawi-Tawi | 404 | 35.94 | 39.99 | 1.1110 | 1.0820 | 1.0697 |
| Sanga-Sanga↗ | Island | Mindanao | Tawi-Tawi | 532 | 42.91 | 44.58 | 1.1269 | 1.1276 | 1.1024 |
| Pangutaran↗ | Island | Mindanao | Sulu | 463 | 57.63 | 96.54 | 1.1280 | 1.1223 | 1.0914 |
| Siasi↗ | Island | Mindanao | Sulu | 598 | 47.29 | 75.5 | 1.1227 | 1.0615 | 1.0990 |
| Lugus Island↗ | Island | Mindanao | Sulu | 294 | 30.43 | 36.78 | 1.1249 | 1.0693 | 1.1025 |
| Tapul Island↗ | Island | Mindanao | Sulu | 238 | 23.42 | 32.05 | 1.1510 | 1.0325 | 1.0429 |
| Pata Island↗ | Island | Mindanao | Sulu | 487 | 35.34 | 46.48 | 1.1050 | 1.0388 | 1.0669 |
| Laminusa↗ | Island | Mindanao | Sulu | 82 | 6.65 | 1.21 | 1.1535 | 1.0774 | 1.0471 |
| Olutanga↗ | Island | Mindanao | Zamboanga Sibugay | 1,611 | 123.43 | 189.04 | 1.1859 | 1.1548 | 1.0838 |
| Sacol Island↗ | Island | Mindanao | Zamboanga del Sur | 615 | 50.12 | 37.08 | 1.1765 | 1.1372 | 1.1575 |
| Talikud Island↗ | Island | Mindanao | Davao del Norte (IGACOS) | 223 | 21.52 | 27.73 | 1.1173 | 1.0399 | 1.0358 |
| Balut Island↗ | Island | Mindanao | Davao Occidental (Sarangani) | 574 | 44.35 | 53.86 | 1.2061 | 1.1015 | 1.0851 |
| Sarangani Island↗ | Island | Mindanao | Davao Occidental | 668 | 54.49 | 35.25 | 1.2529 | 1.2160 | 1.1542 |
| Hibuson↗ | Island | Mindanao | Dinagat Islands | 141 | 15.91 | 10.15 | 1.1735 | 1.0698 | 1.0581 |
| Boracay↗ | Island | Visayas | Aklan | 252 | 22.98 | 9.99 | 1.2313 | 1.0907 | 1.1249 |
| Sicogon↗ | Island | Visayas | Iloilo | 185 | 15.71 | 10.7 | 1.1333 | 1.0717 | 1.0614 |
| Gigantes Norte↗ | Island | Visayas | Iloilo | 100 | 9.71 | 4.48 | 1.0863 | 1.0307 | 1.0222 |
| Gigantes Sur↗ | Island | Visayas | Iloilo | 154 | 14.29 | 5.3 | 1.1805 | 1.0876 | 1.0589 |
| Pan de Azucar↗ | Island | Visayas | Iloilo | 344 | 28.54 | 16.27 | 1.2173 | 1.1813 | 1.0851 |
| Cabilao↗ | Island | Visayas | Bohol | 110 | 11.82 | 7.2 | 1.0329 | 1.0349 | 1.0337 |
| Lapinig↗ | Island | Visayas | Bohol | 933 | 74.34 | 45.05 | 1.2751 | 1.2315 | 1.1809 |
| Ponson (Camotes)↗ | Island | Visayas | Cebu | 422 | 32.16 | 33.74 | 1.1020 | 1.0311 | 1.0419 |
| Capul↗ | Island | Visayas | Northern Samar | 301 | 30.03 | 34.03 | 1.1275 | 1.0244 | 1.0294 |
| Batag↗ | Island | Visayas | Northern Samar | 546 | 44.33 | 32.13 | 1.2158 | 1.1362 | 1.1507 |
| Maripipi↗ | Island | Visayas | Biliran | 209 | 21.61 | 28.99 | 1.0724 | 1.0422 | 1.0278 |
| Suluan↗ | Island | Visayas | Eastern Samar | 130 | 11.29 | 4.65 | 1.1122 | 1.0770 | 1.0817 |
| Manicani↗ | Island | Visayas | Eastern Samar | 187 | 14.99 | 11.3 | 1.1241 | 1.0475 | 1.0456 |
| Carabao (Hambil)↗ | Island | Visayas | Romblon | 277 | 24.21 | 28.06 | 1.0884 | 1.0445 | 1.0437 |
| Banton↗ | Island | Luzon | Romblon | 320 | 28.68 | 28.6 | 1.2098 | 1.1085 | 1.0524 |
| Simara↗ | Island | Luzon | Romblon | 266 | 25.43 | 20.4 | 1.1867 | 1.0960 | 1.0477 |
| Maestro de Campo (Sibale)↗ | Island | Luzon | Romblon | 351 | 30.27 | 20.38 | 1.2621 | 1.2103 | 1.0939 |
| Ambil Island↗ | Island | Luzon | Occidental Mindoro (Lubang) | 350 | 31.71 | 28.85 | 1.1683 | 1.1773 | 1.0758 |
| Golo Island↗ | Island | Luzon | Occidental Mindoro | 387 | 35.36 | 21.09 | 1.2227 | 1.0434 | 1.0378 |
| Cabra Island↗ | Island | Luzon | Occidental Mindoro | 141 | 12.83 | 9.57 | 1.1167 | 1.0179 | 1.0199 |
| Caluya↗ | Island | Visayas | Antique | 257 | 23.33 | 24.33 | 1.1227 | 1.0529 | 1.0572 |
| Agutaya↗ | Island | Luzon | Palawan (Cuyo) | 214 | 17.64 | 14.92 | 1.1126 | 1.0275 | 1.0571 |
| Bugsuk↗ | Island | Luzon | Palawan | 553 | 55.46 | 122.37 | 1.1229 | 1.0612 | 1.0765 |
| Pandanan↗ | Island | Luzon | Palawan | 524 | 42.59 | 39.91 | 1.1543 | 1.1180 | 1.0667 |
| Cagayancillo↗ | Island | Luzon | Palawan | 388 | 31.49 | 7.7 | 1.2475 | 1.1606 | 1.0986 |
| Lahuy Island↗ | Island | Luzon | Camarines Sur (Caramoan) | 408 | 35.24 | 17.96 | 1.2558 | 1.2018 | 1.1535 |
| Quinalasag↗ | Island | Luzon | Camarines Sur | 806 | 65.8 | 31.96 | 1.3560 | 1.3101 | 1.1869 |
| Ibuhos Island↗ | Island | Luzon | Batanes | 105 | 11.03 | 6.18 | 1.0781 | 1.0361 | 1.0258 |
| Dequey Island↗ | Island | Luzon | Batanes | 47 | 4.15 | 0.82 | 1.0803 | 1.0508 | 1.0406 |
| Mavulis (Y'Ami)↗ | Island | Luzon | Batanes (Northernmost PH) | 68 | 5.72 | 1.31 | 1.1156 | 1.0477 | 1.0376 |
| Laguna de Bay↗ | Lake | Luzon | Laguna / Rizal | 11,799 | 301.1 | 790.91 | 1.1307 | 1.1235 | 1.1022 |
| Taal Lake↗ | Lake | Luzon | Batangas | 6,247 | 163.65 | 213.61 | 1.1698 | 1.1594 | 1.1553 |
| Lake Lanao↗ | Lake | Mindanao | Lanao del Sur | 9,727 | 123.64 | 342.71 | 1.0976 | 1.0954 | 1.0609 |
| Lake Mainit↗ | Lake | Mindanao | Agusan del Norte / Surigao del Norte | 7,578 | 84.18 | 138.86 | 1.0921 | 1.0995 | 1.0841 |
| Lake Naujan↗ | Lake | Luzon | Oriental Mindoro | 3,930 | 55.25 | 80.8 | 1.0964 | 1.1084 | 1.0776 |
| Lake Buluan↗ | Lake | Mindanao | Maguindanao / Sultan Kudarat | 1,944 | 58.21 | 71.37 | 1.1500 | 1.1336 | 1.0926 |
| Lake Bato↗ | Lake | Luzon | Camarines Sur | 2,026 | 37.7 | 25.14 | 1.1488 | 1.1882 | 1.1021 |
| Lake Buhi↗ | Lake | Luzon | Camarines Sur | 1,770 | 25.94 | 16.56 | 1.1768 | 1.1530 | 1.0866 |
| Lake Sebu↗ | Lake | Mindanao | South Cotabato | 392 | 125.16 | 818.41 | 1.1001 | 1.0374 | 1.0303 |
| Lake Caliraya↗ | Lake | Luzon | Laguna | 16,973 | 112.48 | 9.78 | 1.4375 | 1.4113 | 1.3146 |
| Lake Danao (Leyte)↗ | Lake | Visayas | Leyte | 312 | 7.3 | 1.4 | 1.1467 | 1.0748 | 1.0808 |
| Lake Paoay↗ | Lake | Luzon | Ilocos Norte | 1,236 | 15.28 | 3.15 | 1.1473 | 1.2119 | 1.1609 |
| Lake Wood↗ | Lake | Mindanao | Zamboanga del Sur | 721 | 14.22 | 7.23 | 1.0751 | 1.1012 | 1.0810 |
| Lake Balinsasayao↗ | Lake | Visayas | Negros Oriental | 75 | 47.94 | 78.75 | 1.1215 | 1.1019 | 1.0644 |
Flooded Rias & Karst Inlets
The highest fractal complexity occurs in dendritic flooded river valleys like Lake Caliraya (D = 1.4375) and Pantabangan Reservoir (D = 1.3528), as well as karst island chains like Quinalasag (D = 1.3560), Linapacan (D = 1.3242) and Culion (D = 1.2982).
Archipelagic Scale
Large landmasses display moderate, robust fractal dimensions: Luzon (D = 1.1683, 5,366 km perimeter), Samar (D = 1.1627), Mindanao (D = 1.1386), and Negros (D = 1.0869), capturing multi-scale coastal bays.
Volcanic Cones & Graben Lakes
The lowest fractal dimensions belong to volcanic islands like Cabilao (D = 1.0329) and Camiguin (D = 1.0538) and deep graben basins like Lake Wood (D = 1.0751) and Lake Mainit (D = 1.0921), which naturally approach Euclidean circles.

Fractal complexity ranking across 122 Philippine shorelines (108 Major Islands & 14 Inland Lakes). Coral: Major Islands. Emerald: Inland Lakes. Reference lines denote Euclidean boundary (D = 1.0), national mean (D = 1.1545), and the mathematical Koch Snowflake (D = 1.2618).
Findings
Multi-Temporal Composite Verification
Single-date satellite scenes in the tropics suffer from moving cumulus clouds that artificially slice lake water into fragmented boundaries. Our 7-date temporal median stacking eliminates all cloud interference, extracting the continuous, noise-free geometry of Laguna de Bay for mathematical fractal measurement.

Laguna de Bay (March 2026). The orange composite boundary traces the real outer shoreline without getting distorted by optical cloud cover.

Synthesized Cloud-Free Median Composite. Multi-temporal pixel median stacking replaces cloud patches over water with clear observations across the month.
LLRN Ecological Impact
Measuring the Ecological Impact of the Laguna Lakeshore Road Network
Laguna de Bay is a vital ecological and economic resource in the Philippines. The ongoing construction of the Laguna Lakeshore Road Network (LLRN) risks permanently altering the lake's natural shoreline. Such geometric alterations can impact water flow, stagnation, and local ecosystems, leading to direct public health consequences for lakeshore communities through altered disease vector habitats.
To measure this impact, Sentinel-2 Harmonized Level-2A satellite imagery was processed using a Normalized Difference Water Index (NDWI) pipeline. To eliminate moving clouds and floating water hyacinths, a 7-date temporal median composite was applied, combined with a 150m morphological kernel to exclude narrow river inlets. The fractal dimension (FD) of the extracted shorelines was computed using Box Counting, Rigid Yardstick, and Bending Yardstick algorithms implemented in C.
The robust temporal compositing method revealed the true, noise-free fractal geometry. For Laguna de Bay, the Fractal Dimension remained completely stable across the 12-month period (D = 1.134 to D = 1.131, a statistically insignificant change of just -0.003). Computations for the Taal Lake control group were successfully executed, establishing a pristine natural baseline of D = 1.170, proving the pipeline's scalability across multiple topological boundaries.
Ultimately, the stability of Laguna Lake's fractal dimension confirms that the offshore LLRN infrastructure has not yet physically altered the lake's boundary as of early 2026. As concrete viaducts and embankments are constructed over the coming years, this open-source methodology provides a rigorous framework to continuously monitor the creeping simplification of shorelines and the inevitable loss of edge-effect habitats.
Shoreline Geometry Analysis

Full lake shoreline overlay. Cyan: March 2025 baseline. Orange: March 2026 composite. The two boundaries are nearly identical, confirming geometric stability.

Spatial drift analysis. Extreme shifts in the southern bay are due to natural shallow mudflat exposure during dry season, not land reclamation.