Measuring the Philippine Coastline.

Three fractal dimension estimators (box counting, rigid yardstick, and bending yardstick) applied to Philippine islands and lakeshores.

View Latest Findings

Theoretical Framework

From Classical Geometry to Fractional Dimensions

In Euclidean geometry, dimensions are whole numbers: a point (D = 0), a line (D = 1), a plane (D = 2), and a volume (D = 3). Cut a line into pieces 1/s as long and you get N = s1 copies. Do the same to a square and you get N = s2 copies.

In 1918, Felix Hausdorff extended dimension to non-integers. If scaling an object by 1/s gives N self-similar pieces, its Hausdorff-Besicovitch dimension satisfies N = (1/s)^D, so D = log(N) / log(1/s).

Cantor Dust

D = log(2)/log(3) ≈ 0.6309

Delete the middle third of a segment, then repeat on every piece. What remains has zero length but uncountably many points, so its dimension falls between D = 0 and D = 1.

Koch Snowflake

D = log(4)/log(3) ≈ 1.2618

Replace the middle third of each segment with two sides of an equilateral triangle (N = 4, s = 1/3). The result encloses a finite area with an infinitely long perimeter that has no tangent anywhere.

Sierpiński Gasket

D = log(3)/log(2) ≈ 1.5850

Cut the central triangle out of an equilateral triangle, then repeat on the three that remain (N = 3, s = 1/2). The limit has zero area, and its dimension falls between a line (D = 1) and a plane (D = 2).

Hilbert Curve

D = log(4)/log(2) = 2.0000

Each stage is a single path that never crosses itself. In the limit, the curve passes through every point of the unit square, so it fills the plane and has D = 2.

The Coastline Paradox in Nature

Benoit Mandelbrot (1967) observed that natural boundaries such as islands, bays, and lakes behave as statistical fractals. A smooth curve has D = 1. A real coastline does not behave that way. A shorter ruler picks up bays, coves, and points the longer one skipped, so the measured length keeps growing. Laguna de Bay's box-counting D in the database below is about 1.13. If construction such as a lakeshore road straightened its margin, D would move toward 1. Measuring D before and during construction gives a way to check for that.

Algorithm Implementation

Box counting

Box Counting: A grid of boxes of size ε covers the boundary, and we count the boxes the shoreline passes through. For a fractal, the count grows as a power of 1/ε: N(ε) ∝ ε−D. The slope of log N against log(1/ε) estimates D.

Box Counting

Lay a grid over the shoreline and count the boxes it touches. Repeat with smaller boxes. On a log-log plot of count against inverse box size, the slope is the fractal dimension.

Rigid Yardstick

A straight stick of length L walks along the shoreline from start to finish, and we count the steps. Repeat with shorter sticks. How fast the step count grows gives the dimension.

Bending Yardstick

Our experimental variant. When the straight stick would cut across the coast, it hinges once at the most protruding vertex. On random Koch curves its estimates varied 4 to 5 times less than box counting on our default scale range, but read 0.01 to 0.02 low.

Estimator Pseudocode

The code is private for now. This pseudocode shows the steps all three estimators share.

FOR each measurement scale
    measure the shoreline with box, rigid-yardstick, or bending-yardstick rules
    record the scale and resulting count
END FOR

fit the slope of log(count) against log(inverse scale)
report the slope as the estimated fractal dimension

Accuracy on Curves with Known D

We tested the estimators on curves whose true dimension is known. On Koch and quadratic Koch curves, every estimator's error shrinks as detail increases. At the finest level tested, all three are within 1.6% of the true value. Box counting reads the Koch curve 2 to 3% high at middle levels, while the walks read both curves slightly low.

Real coasts are irregular, so we also used random Koch curves: each bump points to a random side, but the true D stays at 1.2619. Over 20 such curves per level, the bending yardstick had the smallest spread:

EstimatorBias, 4,097 pointsSpread (sd), 4,097 pointsBias, 65,537 pointsSpread (sd), 65,537 points
Box Counting−0.00720.0254+0.00270.0096
Rigid Yardstick−0.02100.0125−0.02270.0047
Bending Yardstick−0.02400.0051−0.01030.0024

Preliminary. Bias is the mean error against the true D; spread is the standard deviation across 20 random curves, using the fixed 12-scale ladder. For detecting change, spread matters more than bias: a constant bias cancels when two dates are measured the same way, but spread does not. The bending yardstick's advantage is precision, not accuracy.

Computational Cost

For a shoreline of n points fitted over K = 12 scales, all three estimators should take time linear in n. The measurements agree. Each timing run is pinned to one CPU core, discards a warm-up run, and averages three wall-clock runs.

EstimatorTheoretical costWhyMeasured exponent
Box CountingO(K·(n + Σ N(s)))Every segment is traced through the grid, and each occupied cell N(s) adds work at each scale.0.995 ± 0.049
Rigid YardstickO(K·n)The walk only moves forward, so it visits each vertex once per scale.0.949 ± 0.052
Bending Yardstick≤ O(K·B·n)Stick placements split the coast into pieces, and each hinge only rescans its own stick's span. The bend budget B adds a constant factor, not a higher exponent.0.976 ± 0.032

Exponents are log-log fits of kernel time against point count on a square densified from 1,000 to 64,000 points, ± standard error. Box counting used to measure 1.43. The cause was the hash function in its cell counter: every cell in a grid row landed in the same probe chain. After the fix, a 128,000-point input runs in 30 ms instead of 408 ms, and the box counts are unchanged. On real shorelines each estimator takes a few milliseconds.

Parallel Version (MPI)

All three estimators also run under MPI. Box counting splits the grid into vertical strips that hold about the same number of segments. Each process counts only the cells in its own strip, so the strip counts add up to the serial count without exchanging cells.

A yardstick walk cannot be split, because each step starts where the last one ended. The unit of parallel work is one complete walk for one start vertex and one scale. Walking from many start points also improves the estimate. On the Koch snowflake, averaging 32 starts moves the rigid estimate from 1.2545 to 1.2613, against a true value of 1.2619.

WorkloadPointsEstimatorSpeedup on 8 processes
Koch curve, level 10, one start3,145,728Box Counting (vs. serial program)2.2 to 2.4×
Laguna de Bay ring, 64 starts69,763Rigid Yardstick4.7 to 6.7×
Laguna de Bay ring, 64 starts69,763Bending Yardstick5.2 to 6.8×

The parallel output matches the serial program exactly at every process count tested, and an automated test checks this. Walk speedups are measured against the same code on one process. Box counting gains less because the serial version is already fast and limited by memory bandwidth. These timings are preliminary: they come from one 8-core laptop (AMD Ryzen 7 5800H) that was also running other programs, and the ranges cover repeated runs, since the laptop's power settings changed timings by about 30%. We plan to repeat them on the ICS Compute Swarm.

Robustness of the Estimates

Each estimator hides choices that should not matter. A walk has a start point and a direction, a box grid has a position, and the shape has an orientation. We swept each one. None of them changes the running time, but all of them move D:

ChoiceSweepEffect on D (synthetic curves)Effect on D (real shorelines)
Walk start & direction (both yardsticks)24 starts × 2 directions; open arcs walked both waysRigid sd 0.004–0.006; bending 0.002–0.006Laguna gap ≤ 0.017; Taal up to 0.05 between directions
Grid origin (box counting)4×4 sub-cell offset latticeKoch curve sd 0.013Laguna sd ±0.022; Taal range 0.934–1.098
Rotation0° to 80°Box up to 0.035; walks up to 0.023Laguna: box 0.024, rigid 0.012, bending 0.010
Coordinate noiseRandom vertex jitter, 0.1× to 1× the mean segment lengthUsually raises D; up to +0.059 at the largest jitterLaguna, jitter of 0.25× segment length: +0.005 to +0.012
Vertex densityKeep every 8th vertexn/aLaguna: +0.002 to +0.019; bending least affected
Scaling windowFixed 12-scale ladder vs. best-fit window over ≥ 1.5 decadesMean error on held-out curves: 1.43% vs. 0.86%; worst case 3.17% vs. 4.06%Laguna D lower by up to about 0.04 with the best-fit window

What this means: the absolute D of a real shoreline depends on these choices at the 0.01 to 0.04 level. Comparisons between dates or sites are valid only when one set of choices is applied to every input. The rotation sweep also exposed a bug in our scale ladder. It was sized by the bounding-box diagonal, which changes as a shape turns. Sizing it by the true diameter cuts the rigid walk's rotation spread on Laguna from 0.012 to 0; that fix is opt-in for now. On random fractal curves no window rule won everywhere, so we report both. The bending yardstick's bend budget saturates by K = 8 bends per stick, and headline tables use K = 1.

Review of Related Literature

Box counting is the standard baseline. Our rigid yardstick follows the digital compass walk of Shelberg, Moellering, and Lam (1982). Our experimental bending yardstick sits between that walking family and the constant-deviation variable-step (CDVS) convex-hull methods of Normant and Tricot (1991).

Philippine prior art is thin. Alova (2025) measured the Negros Island coastline at D = 1.018 by box counting on a GADM-derived coastline image. We found no published archipelago-wide values and no studies of Philippine lakes such as Laguna de Bay or Taal Lake from satellite-derived masks. To our knowledge, this is the first fractal study of Philippine shorelines that covers many features and compares algorithms.

Data Pipeline

Spectral Processing

NDWI Compositing for Two Lakes

We classify water in Sentinel-2 Harmonized Level-2A surface reflectance with the normalized difference water index (NDWI). Matched March composites and a 150 m morphological opening reduce passing clouds, hyacinth mats, and river branches.

Model Check

Hugging Face Cross-Check

We scored five pretrained Hugging Face segmentation models against our NDWI rule on one March 2025 scene of the LLRN shoreline. The 6-band Sentinel-2 UNet++ (giswqs/s2-water-unetplusplus-efficientnet-b4) agreed with the rule at IoU 0.98 and rejected clouds that NDWI marks as water.

Automation

Monthly Series, 2017–2026

A pipeline streams Cloud-Optimized GeoTIFFs (COGs) from AWS Earth Search and computes FD for every usable month. The Laguna de Bay series has 112 monthly shorelines, which gives a baseline from before LLRN construction.

01

AWS Earth Search STAC Streaming

Streams only the lake's window of the Sentinel-2 L2A bands (B2, B3, B4, B8, B11, B12) and the Scene Classification Layer (SCL), without downloading full .SAFE archives.

02

Cloud & Shadow Filtering (SCL Mask)

Pixels the SCL marks as medium- or high-probability cloud, thin cirrus, or cloud shadow are set to invalid (NaN), so cloud edges are not traced as shoreline.

03

Matched-Date Temporal Median Stacking

Both lakes use the same seven March dates each year. We keep each pixel's clear-view count. Pixels never clear in a period stay nodata instead of becoming land.

04

Normalized Difference Water Index (NDWI)

NDWI = (Green − NIR) / (Green + NIR). Pixels with NDWI > 0.00 count as water and form a binary lake mask.

05

150 m Morphological Opening (River Snipping)

A 15×15 morphological opening cuts narrow river channels, such as the Napindan River, off the lake before the boundary is traced.

06

Fractal Estimation in C

C programs run box counting, rigid walks, and bending walks on the traced boundary, which has tens of thousands of vertices. They run serially or under MPI.

Where Pretrained Vision Models Fell Short

Before settling on temporal compositing and morphology, we tried pretrained segmentation models and classical edge filters on our imagery. The 6-band UNet++ above matched our rule. The others failed in ways that point to gaps in current remote-sensing models:

Over-Segmentation

SAMGeo

SAMGeo, Meta's Segment Anything adapted for geospatial rasters, split floating water hyacinth rafts (Eichhornia crassipes) into tens of thousands of separate land patches. The result was many disjoint polygons instead of one closed lake boundary.

Domain Shift

RGB-Only Models

Models that see only red, green, and blue did worse on Laguna's sediment-laden water. A generic water model labeled too much as water (precision 0.68). A zero-shot ADE20K model missed more than half the lake (recall 0.45). The 6-band model also reads the SWIR bands, which separate cloud from turbid water.

Atmospheric Artifacts

Single-Scene Edge Filters

Classical edge and threshold methods (Canny, Sobel, Otsu) on single-date scenes locked onto cloud shadows and the fringes of cumulus clouds. That pushed D above 1.35, so the estimate measured cloud complexity rather than the lake.

Possible Machine Learning Contributions

  • Tropical turbidity benchmark: an open multispectral dataset of turbid, weed-covered tropical lake shorelines with checked SCL cloud masks, for fine-tuning geospatial models.
  • Closed-boundary constraints: loss terms and polygonizers that keep a lake boundary as one closed loop, so floating weed mats do not create false holes.
  • Fractal regularization: using consistent fractal scaling across resolutions as a self-supervised loss for coastline segmentation.

Archipelago Database

Nationwide Shoreline Survey

We ran the three C estimators on vector boundaries of 122 Philippine features (108 islands and 14 lakes) across Luzon, the Visayas, and Mindanao. To our knowledge, no archipelago-wide set of fractal dimensions existed before.

These values are preliminary. They use the fixed 12-scale ladder, and the sources differ in vertex density. Absolute D can shift by 0.01 to 0.04 with the window rule, so compare features with each other rather than with outside studies.

122
Features
108
Islands
14
Lakes
1.1545
Mean D (box)
1.0329 – 1.4375
Range of D (box)

Philippine Shoreline Coverage Map

Hover over a dot for its D; click or tap it for details
National coastline covered26,085 km / 35,299 km (73.9%)
Land area covered292,223 km² / 302,344 km² (96.7%)
Feature
D = 0.0000

Click a row to see the feature's simplified outline and its box-counting log-log plot.

Feature NameTypeIsland GroupProvince / RegionVerticesPerimeter (km)Area (km²)D (Box)D (Rigid)D (Bending)
Luzon↗IslandLuzonNCR / Regions I-V / CAR55,4545,365.98104,870.091.16831.15981.1329
Mindanao↗IslandMindanaoRegions IX-XIII / BARMM47,8524,427.2593,965.241.13861.14581.1099
Palawan↗IslandLuzonPalawan24,2252,074.3111,416.841.19801.13631.1266
Samar↗IslandVisayasSamar / Eastern Samar / Northern Samar15,5071,331.0112,435.741.16271.16941.1507
Negros↗IslandVisayasNegros Occidental / Oriental9,643894.3212,775.141.08691.06791.0696
Panay↗IslandVisayasIloilo / Capiz / Aklan / Antique8,726920.4911,517.211.13001.13301.1006
Leyte↗IslandVisayasLeyte / Southern Leyte9,123868.927,007.11.13031.11431.0963
Cebu↗IslandVisayasCebu7,594686.724,417.931.10251.06241.0602
Mindoro↗IslandLuzonOccidental / Oriental Mindoro6,160677.029,817.91.08191.08721.0717
Bohol↗IslandVisayasBohol4,950413.93,769.481.12391.09411.0906
Masbate↗IslandLuzonMasbate6,446624.333,204.51.15241.14341.1147
Catanduanes↗IslandLuzonCatanduanes3,801320.941,443.51.16651.14421.1320
Basilan↗IslandMindanaoBasilan3,073250.431,234.91.10881.09981.0920
Busuanga↗IslandLuzonPalawan (Calamian)4,318367.139451.23711.22571.1595
Marinduque↗IslandLuzonMarinduque2,090200.47899.091.15711.13641.1111
Jolo↗IslandMindanaoSulu3,488275.1834.691.12821.11111.1101
Dinagat↗IslandMindanaoDinagat Islands4,166349780.171.25141.20711.1732
Tablas↗IslandLuzonRomblon2,694240.79671.171.17841.13761.1071
Polillo↗IslandLuzonQuezon2,601240.13646.031.19511.18401.1554
Tawi-Tawi↗IslandMindanaoTawi-Tawi3,376268.8622.341.17571.15221.1260
Guimaras↗IslandVisayasGuimaras2,652206.1575.31.17341.15401.1309
Biliran↗IslandVisayasBiliran1,282115.29497.651.10821.06551.0575
Sibuyan↗IslandLuzonRomblon937101.42450.761.08821.05451.0422
Siargao↗IslandMindanaoSurigao del Norte1,791150.83427.221.15201.11891.0976
Burias↗IslandLuzonMasbate2,562226.31417.561.19261.10731.0836
Culion↗IslandLuzonPalawan (Calamian)3,313278.09387.441.29821.31311.2076
Dumaran↗IslandLuzonPalawan2,090173.28327.591.23061.23371.1503
Ticao↗IslandLuzonMasbate1,395136.68324.51.13691.12091.0907
Siquijor↗IslandVisayasSiquijor1,070101.04319.461.09021.08831.0754
Balabac↗IslandLuzonPalawan1,636137.73315.181.22861.19431.1318
Samal (IGACOS)↗IslandMindanaoDavao del Norte1,03495.4251.211.08771.04911.0498
Camiguin↗IslandMindanaoCamiguin64766.69242.41.05381.03781.0337
Panaon↗IslandVisayasSouthern Leyte71582.38202.671.10421.04561.0430
Calayan↗IslandLuzonCagayan (Babuyan)77674.31191.461.12811.10131.0598
Lubang↗IslandLuzonOccidental Mindoro99297.69194.461.12661.12771.0809
Alabat↗IslandLuzonQuezon1,01396.96188.411.12141.03751.0452
Bantayan↗IslandVisayasCebu70965.05113.951.10911.07961.0699
Camotes (Pacijan/Poro)↗IslandVisayasCebu1,08692.68195.231.12311.09041.0749
Romblon Island↗IslandLuzonRomblon61055.9981.691.17041.08901.0776
Batan Island↗IslandLuzonBatanes61157.970.931.13851.09261.0701
Itbayat↗IslandLuzonBatanes76055.484.061.08781.04721.0535
Sabtang↗IslandLuzonBatanes33831.3233.911.16281.08341.0396
Coron Island↗IslandLuzonPalawan (Calamian)97273.271.811.18121.14901.1158
Linapacan↗IslandLuzonPalawan1,691140.21101.821.32421.31001.1769
Mapun (Cagayan de Sulu)↗IslandMindanaoTawi-Tawi90568.1569.041.18161.19481.1144
Semirara↗IslandVisayasAntique81270.8466.721.15981.19251.1513
Cuyo↗IslandLuzonPalawan65150.8357.711.13751.13821.0997
Jomalig↗IslandLuzonQuezon29235.7851.821.09281.04191.0374
Rapu-Rapu↗IslandLuzonAlbay53546.6764.521.10461.06671.0628
Batan Island (Albay)↗IslandLuzonAlbay1,00481.4388.611.19031.18031.1486
Cagraray↗IslandLuzonAlbay8737269.811.21161.20131.1579
San Miguel (Albay)↗IslandLuzonAlbay39733.821.731.22371.09991.1055
Homonhon↗IslandVisayasEastern Samar60860.71103.21.12721.05071.0424
Panglao↗IslandVisayasBohol51651.2490.821.08621.05771.0557
Mactan↗IslandVisayasCebu73561.4960.51.21101.10131.0990
Olango↗IslandVisayasCebu52443.3113.281.32421.40411.2179
Bucas Grande↗IslandMindanaoSurigao del Norte1,339109.82125.631.20441.22101.1713
Patnanungan↗IslandLuzonQuezon (Polillo)87678.3293.231.15501.16641.1093
Balesin↗IslandLuzonQuezon12813.324.221.12541.08181.0790
Fuga Island↗IslandLuzonCagayan (Babuyan)52152.9695.31.12671.05151.0528
Camiguin Norte↗IslandLuzonCagayan (Babuyan)75375.34170.121.10311.07541.0746
Dalupiri Island↗IslandLuzonCagayan (Babuyan)52245.0564.561.12011.06681.0699
Babuyan Claro↗IslandLuzonCagayan (Babuyan)42539.1572.41.07631.03701.0316
Sibutu↗IslandMindanaoTawi-Tawi82083.87104.721.16421.08531.1101
Simunul↗IslandMindanaoTawi-Tawi40435.9439.991.11101.08201.0697
Sanga-Sanga↗IslandMindanaoTawi-Tawi53242.9144.581.12691.12761.1024
Pangutaran↗IslandMindanaoSulu46357.6396.541.12801.12231.0914
Siasi↗IslandMindanaoSulu59847.2975.51.12271.06151.0990
Lugus Island↗IslandMindanaoSulu29430.4336.781.12491.06931.1025
Tapul Island↗IslandMindanaoSulu23823.4232.051.15101.03251.0429
Pata Island↗IslandMindanaoSulu48735.3446.481.10501.03881.0669
Laminusa↗IslandMindanaoSulu826.651.211.15351.07741.0471
Olutanga↗IslandMindanaoZamboanga Sibugay1,611123.43189.041.18591.15481.0838
Sacol Island↗IslandMindanaoZamboanga del Sur61550.1237.081.17651.13721.1575
Talikud Island↗IslandMindanaoDavao del Norte (IGACOS)22321.5227.731.11731.03991.0358
Balut Island↗IslandMindanaoDavao Occidental (Sarangani)57444.3553.861.20611.10151.0851
Sarangani Island↗IslandMindanaoDavao Occidental66854.4935.251.25291.21601.1542
Hibuson↗IslandMindanaoDinagat Islands14115.9110.151.17351.06981.0581
Boracay↗IslandVisayasAklan25222.989.991.23131.09071.1249
Sicogon↗IslandVisayasIloilo18515.7110.71.13331.07171.0614
Gigantes Norte↗IslandVisayasIloilo1009.714.481.08631.03071.0222
Gigantes Sur↗IslandVisayasIloilo15414.295.31.18051.08761.0589
Pan de Azucar↗IslandVisayasIloilo34428.5416.271.21731.18131.0851
Cabilao↗IslandVisayasBohol11011.827.21.03291.03491.0337
Lapinig↗IslandVisayasBohol93374.3445.051.27511.23151.1809
Ponson (Camotes)↗IslandVisayasCebu42232.1633.741.10201.03111.0419
Capul↗IslandVisayasNorthern Samar30130.0334.031.12751.02441.0294
Batag↗IslandVisayasNorthern Samar54644.3332.131.21581.13621.1507
Maripipi↗IslandVisayasBiliran20921.6128.991.07241.04221.0278
Suluan↗IslandVisayasEastern Samar13011.294.651.11221.07701.0817
Manicani↗IslandVisayasEastern Samar18714.9911.31.12411.04751.0456
Carabao (Hambil)↗IslandVisayasRomblon27724.2128.061.08841.04451.0437
Banton↗IslandLuzonRomblon32028.6828.61.20981.10851.0524
Simara↗IslandLuzonRomblon26625.4320.41.18671.09601.0477
Maestro de Campo (Sibale)↗IslandLuzonRomblon35130.2720.381.26211.21031.0939
Ambil Island↗IslandLuzonOccidental Mindoro (Lubang)35031.7128.851.16831.17731.0758
Golo Island↗IslandLuzonOccidental Mindoro38735.3621.091.22271.04341.0378
Cabra Island↗IslandLuzonOccidental Mindoro14112.839.571.11671.01791.0199
Caluya↗IslandVisayasAntique25723.3324.331.12271.05291.0572
Agutaya↗IslandLuzonPalawan (Cuyo)21417.6414.921.11261.02751.0571
Bugsuk↗IslandLuzonPalawan55355.46122.371.12291.06121.0765
Pandanan↗IslandLuzonPalawan52442.5939.911.15431.11801.0667
Cagayancillo↗IslandLuzonPalawan38831.497.71.24751.16061.0986
Lahuy Island↗IslandLuzonCamarines Sur (Caramoan)40835.2417.961.25581.20181.1535
Quinalasag↗IslandLuzonCamarines Sur80665.831.961.35601.31011.1869
Ibuhos Island↗IslandLuzonBatanes10511.036.181.07811.03611.0258
Dequey Island↗IslandLuzonBatanes474.150.821.08031.05081.0406
Mavulis (Y'Ami)↗IslandLuzonBatanes (Northernmost PH)685.721.311.11561.04771.0376
Laguna de Bay↗LakeLuzonLaguna / Rizal11,799301.1790.911.13071.12351.1022
Taal Lake↗LakeLuzonBatangas6,247163.65213.611.16981.15941.1553
Lake Lanao↗LakeMindanaoLanao del Sur9,727123.64342.711.09761.09541.0609
Lake Mainit↗LakeMindanaoAgusan del Norte / Surigao del Norte7,57884.18138.861.09211.09951.0841
Lake Naujan↗LakeLuzonOriental Mindoro3,93055.2580.81.09641.10841.0776
Lake Buluan↗LakeMindanaoMaguindanao / Sultan Kudarat1,94458.2171.371.15001.13361.0926
Lake Bato↗LakeLuzonCamarines Sur2,02637.725.141.14881.18821.1021
Lake Buhi↗LakeLuzonCamarines Sur1,77025.9416.561.17681.15301.0866
Lake Sebu↗LakeMindanaoSouth Cotabato392125.16818.411.10011.03741.0303
Lake Caliraya↗LakeLuzonLaguna16,973112.489.781.43751.41131.3146
Lake Danao (Leyte)↗LakeVisayasLeyte3127.31.41.14671.07481.0808
Lake Paoay↗LakeLuzonIlocos Norte1,23615.283.151.14731.21191.1609
Lake Wood↗LakeMindanaoZamboanga del Sur72114.227.231.07511.10121.0810
Lake Balinsasayao↗LakeVisayasNegros Oriental7547.9478.751.12151.10191.0644
Most complex (D > 1.25)

Flooded Valleys & Inlet-Rich Islands

The highest values belong to Lake Caliraya (D = 1.4375), a reservoir that flooded a branching river valley, and to islands with many inlets: Quinalasag (D = 1.3560), Linapacan (D = 1.3242), and Culion (D = 1.2982).

Largest islands

The Main Islands

The largest islands sit in the middle of the range. Luzon has D = 1.1683 over a 5,366 km perimeter. Samar (D = 1.1627), Mindanao (D = 1.1386), and Negros (D = 1.0869) follow. Their bays span many scales.

Smoothest (D < 1.10)

Compact Islands & Lakes

The lowest values belong to compact islands such as Cabilao (D = 1.0329) and Camiguin (D = 1.0538). Lakes such as Lake Wood (D = 1.0751) and Lake Mainit (D = 1.0921) are also low. Their outlines are close to smooth curves.

Bar chart ranking the box-counting fractal dimension of 122 Philippine shorelines

Box-counting D for 122 Philippine shorelines (108 islands and 14 lakes). Orange: islands. Green: lakes. Reference lines mark a smooth curve (D = 1.0), the national mean (D = 1.1545), and the Koch snowflake (D = 1.2618).

Findings

Multi-Temporal Composite Verification

In the tropics, a single-date scene often has cumulus clouds that break up the extracted water boundary. Compositing matched dates reduces this. Pixels that were never clear stay marked as unknown, and we report them as a limitation.

Laguna de Bay in March 2026 Sentinel-2 imagery with the traced shoreline overlaid

Laguna de Bay, March 2026 (Sentinel-2B), with the traced boundary overlaid. The boundary follows the urban West Bay at left, where LLRN Phase I runs along the shore. It wraps around forested Talim Island in the center and continues into the eastern bay. The straight feature crossing the lower-left shore is the Napindan Channel crossing; the 150 m rule removes the narrow channel. Faint grids in the West Bay are fishpens, which read as water. Leftover clouds at upper right are excluded, not traced.

March 2026 median composite of Laguna de Bay with never-clear pixels shown in black

March 2026 median composite of seven observations. Black holes are pixels that were never cloud-free during the month, mostly over the eastern ridges and a persistent cloud cluster east of Talim Island. They count as unknown, not land. Sediment plumes show along the shallow western shore. Each pixel is the median of up to seven views. A single passing cloud or floating mat of vegetation does not reach the measured boundary.

LLRN Shoreline Monitoring

Has the Laguna Lakeshore Road Network Changed the Shoreline?

The Laguna Lakeshore Road Network (LLRN) may change the lake margin. Shoreline geometry alone cannot show hydrologic, ecological, or public-health effects.

We used Sentinel-2 imagery from seven March dates per year. Both Laguna and Taal went through NDWI, cloud masking, temporal median compositing, and the same 150 m morphology rule. Never-clear pixels stay nodata. FD is computed in open mode, only on shoreline arcs that were clear in both periods and match within 150 m. We also walked each arc in both directions.

On the 38.3 km common-clear Laguna March arc, the changes were +0.0003 for box, +0.0016 for rigid, and +0.0011 for bending. A January–March window was also near zero. Walking a Laguna arc in reverse moves D by up to 0.017, more than these changes. None of the Laguna changes kept its sign across the window and grid choices we tried.

On the LLRN Phase I corridor, the January–March walks rose by about 0.005. To see whether that is unusual, we built a monthly FD series for the corridor itself (2017–2026, 62 usable months). Corridor D varies by about 0.02 from month to month, four times that rise. Every 2026 month through July falls inside the range of the same calendar month in 2017–2025.

Taal Lake, measured on the same dates as a reference, is less stable. Its March arcs are only about 8 km long. The rigid decrease of −0.0268 becomes +0.0005 when the arc is walked the other way, so we do not read it as a decrease. Over January–March, Taal dropped slightly (−0.006 to −0.010) under every choice. Dates can differ for reasons unrelated to construction, such as water level and season.

Preliminary conclusion: no LLRN-associated change in shoreline FD is detectable at Sentinel-2 resolution through July 2026. These measurements form a baseline for later construction. A disease analysis would also need population-normalized incidence and a direct hydrologic measure.

Mosquito-Borne Disease Data Readiness

This table shows which public records exist, not disease rates. It explains why we cannot yet estimate a shoreline–disease correlation without claiming more precision than the records allow.

DiseasePublic record foundSpatial match to shoreline FDCurrent inference
Dengue● Partial Laguna municipality counts (2012–2021); Batangas barangay records released for 2023–2026; a public weekly province-level series for Laguna (2016–2021).Not yet matched to lake segments, population, or dates.Most promising; needs a compiled, population-normalized time series.
Malaria● Aggregate FHSIS historical reporting, not a shoreline-scale series.Insufficient.Do not test or claim an association.
Chikungunya● No usable local series FHSIS does not collect it.Unavailable.Do not test or claim an association.
Japanese encephalitis● No usable local series FHSIS does not collect it.Unavailable.Do not test or claim an association.
Zika● No locality time series locatedUnavailable.Do not test or claim an association.

Sources: DOH eFOI Laguna dengue municipality request; DOH eFOI Batangas dengue release; and DOH eFOI FHSIS vector-disease response. A valid test still requires case counts, population denominators, time lags, and a direct water-stagnation measure.

Shoreline Geometry Analysis

Common-clear shoreline arcs for Laguna de Bay and Taal Lake, 2025 and 2026

Open shoreline arcs kept at least 100 m from unknown pixels in both periods. Blue: 2025. Orange: 2026. March and January–March windows are reported separately. The robustness sweeps (24 start points, both walking directions, 16 grid placements) show how much of each change the measuring method alone can produce.

Laguna de Bay shoreline next to LLRN Phase I, 2025 and 2026 January–March

The full LLRN Phase I-adjacent corridor was clear in both January–March composites. Its walks rose by about 0.005 under every window and direction; box counting was less consistent. That rise is a quarter of the corridor's normal month-to-month variation, so we claim no construction signal.