feat: the state becomes California, and the port fills with ships
**Stage 1 of one California.** The owner's complaint had two halves and this is
the first: the state board was a CROPPED SLAB. `california.ts` stopped at 38.05 N,
so the board disagreed with its own minimap about the shape of California in a
single frame, and Bug Fire's 93,733 acres burned off-frame while the panel said
all clear. Bounds now run 32.50-42.05 N / -124.50 to -114.0 W — Cape Mendocino,
the ruled Oregon parallel, the 120th-meridian corner into the Nevada diagonal.
**And it got cheaper.** 391,169 triangles to 375,351, while gaining the North
Coast, the Sacramento Valley, the Klamath knot, the Cascade arc, Shasta at 4,320 m
and Lassen at 3,190 m. Extending the bounds alone would have doubled the lattice
to 168,813 points and blown the mobile cap; coarsening cellLat 0.022 -> 0.0312 and
cellLng 0.027 -> 0.0383 holds it at ~83,800. The cell as a FRACTION of the board
moves 0.0030 -> 0.0033 — unchanged in frame — because the camera retreats to frame
whatever it is given. That argument was already written in the pack's own comment.
The second half — three boards becoming one world you zoom through — is NOT here.
Merging at Bay density would be 34.04M triangles, 13x the highest budget, and
merging at SoCal density would downgrade San Francisco from 40 m lots to 164 m.
Both delete the board every marketing still is shot from. `sf.ts` and `socal.ts`
are untouched by design.
**Aerial perspective, which the state board could not have had before.** The old
fog started at 1.15 board spans = 944 km, on a board whose longest diagonal is
820 km — so no pixel could ever be fogged. Fog now responds to camera altitude,
clamped to the authored pair as a ceiling.
`Atmosphere.aerial(env, view)` is a second pure method returning `{ near, far }`
and **deliberately no colour**. That is structural, not stylistic: it is why a
future camera-dependent term cannot reach `environmentKey()`'s colour fingerprint
and start rebuilding the PMREM cubemap on every camera step. Coarsening the
fingerprint instead would have hidden one instance and armed the mechanism. A
mutation-tested seam guard fails if anyone merges the two paths back together.
**The port.** Terminal Island rendered as a bare tan polygon with generic white
blocks while the chapter text called it the busiest port complex in the
hemisphere. Now six container yards drawn as canvas atlases, 56 gantry cranes at
varied boom angles, the 13 km San Pedro breakwater, the dredged channel. Five
buckets merging ACROSS ports the way airports.ts merges across fields, so a
second complex costs no extra draws: +11 draws and +4,377 triangles for all of it.
At vertical exaggeration 3.4 a 130 m gantry is 1.132 units tall against a 400 m
ship's 1.024 long — the crane is the taller object, and it is what makes a port
read as a port from altitude.
**Ships, and the wake carries the information.** Moored hulls have no foam,
verified at three terminals; a tug under way in the Main Channel trails a clean
Kelvin V. One hull geometry, one InstancedMesh, orientation from the BERTH rather
than the wire. The AIS gate strips sog 102.3, heading 511 and cog 360 — all mean
"not available" — with an explicit test that cog 358.7 SURVIVES, because a naive
range check on cog eats real headings near north.
"Empty or full" is not in AIS position reports and is not invented per ship. The
honest answer is at port level and is a better story: 348,691 of 460,467 boxes
left Los Angeles empty in July 2026, corroborated by FBX01 $7,491 inbound against
FBX02 $347 outbound.
**Radar and birds ship dark, and say why.** California is 0.47% wet and migration
is nocturnal and seasonal, so both layers have nothing to say on most days. The
panel reads "No radar feed is configured, so this board draws no weather. That is
a fact about this box, not about the sky."
Also recorded, and it matters beyond this commit: **the GPU on amd-server never
leaves 500 MHz of a possible 2725**, traced across 80 seconds of sustained load.
`bay-area/desktop` is fragment-bound at that clock and sits on the vsync deadline,
so a trivial change in fragment work flips it between 16.8 and 33.3 with geometry
identical to the digit. Every frame-time number measured on this box is a floor.
Two investigations reached two different wrong conclusions from single-run
comparisons before this was traced. Geometry is the gate; frame time is advisory.
No cap was raised.
Tests 1,340 -> 1,540, server 280 -> 295.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+550
-86
@@ -82,14 +82,15 @@ export const CALIFORNIA_I_5 = routePath("la-sf-i-5");
|
||||
/**
|
||||
* Longitude's foreshortening at this board's centre latitude.
|
||||
*
|
||||
* `World` computes exactly this from `city.center.lat` and uses it inside
|
||||
* `World` computes exactly this from `city.center.lat` — 37.3 now that the
|
||||
* board is the whole state — and uses it inside
|
||||
* `elevationAt`, so any spacing measured here has to be measured the same way
|
||||
* or a chain running east-west comes out with its peaks 22% further apart than
|
||||
* one running north-south. Repeated rather than imported because `cities` must
|
||||
* not import `engine` — see ARCHITECTURE.md §2 — and kept next to the one
|
||||
* function that needs it.
|
||||
*/
|
||||
const LNG_SQUASH = Math.cos((35.3 * Math.PI) / 180);
|
||||
const LNG_SQUASH = Math.cos((37.3 * Math.PI) / 180);
|
||||
|
||||
/**
|
||||
* A range as a chain of peaks along a line, at the spacing that makes a chain
|
||||
@@ -176,20 +177,85 @@ function ridge(
|
||||
* Winding stays consistent — land is always on the left — which is what
|
||||
* `ShapeGeometry` needs to triangulate the shore plate.
|
||||
*
|
||||
* **Three of the four sides are the state's own edges, not the board's.** The
|
||||
* Pacific is a coast, the south is the Mexican border and the east is the
|
||||
* Colorado River and the Nevada line. Only the top of the board is a crop, and
|
||||
* its closure runs along 38.13–38.20 N — a sixth of a degree past
|
||||
* `bounds.maxLat`, far enough out that `coastalFalloff` (which ramps relief to
|
||||
* zero within `coastFalloff` of *any* polygon edge) never sees it and never
|
||||
* flattens the Sierra against the top of the frame. The Mexican border is the
|
||||
* one deliberate exception: it sits *two hundredths* below `bounds.minLat`, so
|
||||
* that the state's edge and the board's crop are the same line and there is no
|
||||
* strip of sea along the bottom of the frame. See the note there.
|
||||
* **All four sides are now the state's own edges, and none of them is a crop.**
|
||||
* The Pacific is a coast, the south is the Mexican border, the east is the
|
||||
* Colorado River and the Nevada line, and the north is the 42nd parallel. That
|
||||
* last one is what this trace was extended for and it is the whole of the
|
||||
* owner's first complaint: the board used to close along 38.13 N with a ruled
|
||||
* segment, so it drew the southern two thirds of California while the minimap
|
||||
* beside it drew the whole state, and the two disagreed about the shape of the
|
||||
* place in a single frame. A ruled line across the top of a silhouette is not a
|
||||
* subtle defect — it is the one edge of the state everybody can name after the
|
||||
* coast.
|
||||
*
|
||||
* The three artificial closures follow one rule, which is that they sit just
|
||||
* *outside* `bounds` so that the land covers the outermost row or column of the
|
||||
* lattice and no strip of sea is left along the edge of the frame. The Mexican
|
||||
* border is two hundredths below `bounds.minLat`; the Oregon line is two
|
||||
* hundredths above `bounds.maxLat`. Neither is a crop and neither leaves a
|
||||
* moat. (`coastalFalloff` ramps relief to zero within `coastFalloff` of any
|
||||
* polygon edge, so the bottom and top rows of ground are flattened — which is
|
||||
* what a state edge should look like, and is what the Nevada line has always
|
||||
* looked like.)
|
||||
*/
|
||||
export const CORRIDOR_LAND: LatLng[] = [
|
||||
// North closure, just off the top of the board.
|
||||
[38.13, -123.05],
|
||||
// ---- The Oregon line, where it meets the sea ---------------------------
|
||||
//
|
||||
// 42.07 N and not 42.05, and the two hundredths are the same trick the
|
||||
// Mexican border plays at the other end of the state: the closure sits just
|
||||
// *outside* `bounds.maxLat`, so the land covers the top row of the lattice
|
||||
// and no strip of sea is left along the top of the frame pretending to be
|
||||
// Oregon. The real parallel is 42.00, which is 7.8 km south of this and 4
|
||||
// units on a 554-unit board — a rounding error at 1,919 m to the unit, and
|
||||
// the honest direction to round in, because the alternative is a visible
|
||||
// moat between California and a state that is not on this board.
|
||||
[42.07, -124.23],
|
||||
|
||||
// ---- The North Coast, Oregon to Point Reyes ----------------------------
|
||||
//
|
||||
// Two hundred and fifty kilometres of coast that used to be open ocean, and
|
||||
// the reason the board disagreed with its own minimap about the shape of
|
||||
// California. The three things worth getting right are all in the first
|
||||
// eighty kilometres of it.
|
||||
//
|
||||
// **Cape Mendocino is the westernmost ground in the state**, at -124.41, and
|
||||
// it is the corner that makes the northern silhouette read as California
|
||||
// rather than as a coastline in general — the coast runs almost due south
|
||||
// from the Oregon line, turns hard west at Trinidad, and then bends back
|
||||
// south-east for four hundred kilometres to the Golden Gate. Miss the cape
|
||||
// and the whole North Coast is a straight line.
|
||||
//
|
||||
// **Humboldt Bay is not traced**, for the reason San Diego Bay is not: it is
|
||||
// thirty-five kilometres long and two wide, which is a scratch a pixel across
|
||||
// here, and every extra inlet is a self-intersection waiting to happen. The
|
||||
// spit stands in for both shores.
|
||||
//
|
||||
// **The Lost Coast is drawn as a coast and not as a bay.** Between Punta
|
||||
// Gorda and Shelter Cove the King Range rises 1,246 m out of the surf in five
|
||||
// kilometres; there is no road along it in life and there is no indentation
|
||||
// in it here.
|
||||
[41.99, -124.21], // Smith River
|
||||
[41.87, -124.2],
|
||||
[41.76, -124.21], // Point St George and Crescent City
|
||||
[41.55, -124.08], // the mouth of the Klamath
|
||||
[41.3, -124.1],
|
||||
[41.05, -124.15], // Trinidad Head
|
||||
[40.87, -124.18],
|
||||
[40.77, -124.24], // the Humboldt spit, off Eureka
|
||||
[40.62, -124.35], // False Cape
|
||||
[40.44, -124.41], // Cape Mendocino — the westernmost ground in California
|
||||
[40.28, -124.36], // Punta Gorda
|
||||
[40.1, -124.13], // Shelter Cove, the foot of the King Range
|
||||
[39.9, -123.95],
|
||||
[39.72, -123.83], // Cape Vizcaino
|
||||
[39.5, -123.79], // Fort Bragg
|
||||
[39.3, -123.8], // Mendocino
|
||||
[39.1, -123.72],
|
||||
[38.95, -123.73], // Point Arena
|
||||
[38.75, -123.53],
|
||||
[38.55, -123.32], // Fort Ross
|
||||
[38.35, -123.07], // Bodega Head
|
||||
[38.2, -122.99],
|
||||
|
||||
// ---- Pacific coast, north to south -------------------------------------
|
||||
[38.05, -122.98],
|
||||
@@ -360,22 +426,50 @@ export const CORRIDOR_LAND: LatLng[] = [
|
||||
[34.88, -114.63],
|
||||
[35.0, -114.63], // the Arizona / Nevada / California tri-point
|
||||
|
||||
// ---- The Nevada line, and the north closure ------------------------------
|
||||
// ---- The Nevada line, both halves of it ---------------------------------
|
||||
//
|
||||
// One ruled segment from the tri-point to the corner at Lake Tahoe — 39.0 N,
|
||||
// -120.0 — of which this board draws the part below its own top edge. The
|
||||
// gradient is -1.342° of longitude per degree of latitude, which is worth
|
||||
// writing down because it is what sites the two peaks in the White Mountains:
|
||||
// the line is at -118.17 where White Mountain Peak stands and the peak is
|
||||
// nine hundredths of a degree inside it, so both of those are placed against
|
||||
// the line rather than against a round number. Anything east of it is Nevada,
|
||||
// and Nevada is not on this board.
|
||||
// The oblique first: one ruled segment from the tri-point to the corner at
|
||||
// Lake Tahoe — 39.0 N, -120.0 — at a gradient of -1.342° of longitude per
|
||||
// degree of latitude. That number is worth writing down because it is what
|
||||
// sites the two peaks in the White Mountains: the line is at -118.17 where
|
||||
// White Mountain Peak stands and the peak is nine hundredths of a degree
|
||||
// inside it, so both are placed against the line rather than against a round
|
||||
// number.
|
||||
//
|
||||
// Extended to 38.2 N, a sixth of a degree past `bounds.maxLat`, for the same
|
||||
// reason every closure sits outside the bounds: `coastalFalloff` ramps relief
|
||||
// to zero within `coastFalloff` of *any* polygon edge, and the board's crop
|
||||
// must not flatten the Sierra against the top of the frame.
|
||||
[38.2, -118.93],
|
||||
// It used to stop at 38.2, a sixth of a degree past the old crop. It now runs
|
||||
// to the corner and then turns, because the corner is the point: above 39.0
|
||||
// the boundary is the **120th meridian**, dead straight for three degrees of
|
||||
// latitude, and the right angle where the oblique meets it is the second most
|
||||
// recognisable thing about this state's outline after Point Conception. A
|
||||
// board that stopped before the corner had the diagonal and not the notch.
|
||||
[35.5, -115.3],
|
||||
[36.0, -115.97],
|
||||
[36.5, -116.64],
|
||||
[37.0, -117.31],
|
||||
[37.5, -117.98],
|
||||
[38.0, -118.65],
|
||||
[38.5, -119.32],
|
||||
[39.0, -120.0], // the corner, in Lake Tahoe
|
||||
|
||||
// ---- Up the 120th meridian ----------------------------------------------
|
||||
[39.5, -120.0],
|
||||
[40.0, -120.0],
|
||||
[40.5, -120.0],
|
||||
[41.0, -120.0],
|
||||
[41.5, -120.0],
|
||||
[42.07, -120.0], // the north-east corner
|
||||
|
||||
// ---- West along the Oregon line ------------------------------------------
|
||||
//
|
||||
// The 42nd parallel, ruled in life as well as here — it was drawn by treaty in
|
||||
// 1819 and has not moved since. Carried as six vertices rather than one
|
||||
// segment so that `coastalFalloff`'s edge search has something to find at a
|
||||
// sensible spacing along four hundred kilometres of straight boundary.
|
||||
[42.07, -120.8],
|
||||
[42.07, -121.6],
|
||||
[42.07, -122.4],
|
||||
[42.07, -123.2],
|
||||
[42.07, -123.8],
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -449,6 +543,115 @@ const HILLS: Hill[] = [
|
||||
{ name: "Vaca Mountains", lat: 38.04, lng: -122.06, elevation: 700, radius: 0.14 },
|
||||
{ name: "Berkeley Hills", lat: 37.87, lng: -122.19, elevation: 450, radius: 0.09 },
|
||||
|
||||
/**
|
||||
* ---- The northern Coast Ranges ----
|
||||
*
|
||||
* Bolinas Ridge to the Oregon line: the Mayacamas behind the Napa Valley, the
|
||||
* Mendocino Range behind Fort Bragg, the Yolla Bolly at the Klamath's shoulder
|
||||
* and — the one that matters — the King Range.
|
||||
*
|
||||
* The King Range is 1,246 m and it stands **five kilometres from the surf**,
|
||||
* which is why eighty kilometres of California shoreline has no road along it
|
||||
* and is called the Lost Coast. A 0.1 radius is what keeps it that steep here:
|
||||
* anything wider puts a shelf between the summit and the water and the whole
|
||||
* point of the landform is that there is not one. `coastFalloff` still flattens
|
||||
* the last 0.025° of it, which is about two units, and that is a beach at this
|
||||
* scale rather than a plain.
|
||||
*/
|
||||
...ridge("Sonoma Mountains", [38.25, -122.55], [38.55, -122.85], 800, 0.12),
|
||||
...ridge("Mayacamas Mountains", [38.5, -122.6], [39.0, -122.95], 1_300, 0.14),
|
||||
{ name: "Mount St Helena", lat: 38.67, lng: -122.63, elevation: 1_320, radius: 0.1 },
|
||||
...ridge("Mendocino Range", [39.05, -123.3], [39.95, -123.55], 1_200, 0.16),
|
||||
...ridge("Snow Mountain", [39.1, -122.75], [39.7, -122.9], 1_800, 0.15),
|
||||
...ridge("Yolla Bolly Mountains", [39.85, -122.85], [40.45, -123.15], 2_300, 0.18),
|
||||
...ridge("King Range", [39.98, -124.02], [40.32, -124.18], 1_250, 0.1),
|
||||
...ridge("North Coast Front", [40.55, -123.85], [41.55, -123.85], 1_200, 0.16),
|
||||
{ name: "Round Valley Rim", lat: 39.78, lng: -123.32, elevation: 900, radius: 0.12 },
|
||||
|
||||
/**
|
||||
* ---- The Klamath Mountains ----
|
||||
*
|
||||
* The most confusing terrain in the state and the reason the north-west corner
|
||||
* cannot be drawn as a chain: the Klamaths do not run north-south the way
|
||||
* everything else in California does. They are a knot — the Trinity Alps, the
|
||||
* Salmons, the Marbles and the Siskiyous crossing each other at every angle —
|
||||
* and four chains laid at four different bearings is the cheapest honest way
|
||||
* to say so with the tools this pack has. A single north-south ridge here
|
||||
* would make the corner read as more Coast Range, which is exactly what it is
|
||||
* not.
|
||||
*
|
||||
* The Trinity Alps at 2,700 m are the high ground; the Siskiyous carry the
|
||||
* Oregon line itself, which is why that chain runs east-west along 41.8.
|
||||
*/
|
||||
...ridge("Trinity Alps", [40.72, -123.15], [41.15, -122.7], 2_700, 0.16),
|
||||
...ridge("Salmon Mountains", [40.95, -123.45], [41.4, -123.05], 2_200, 0.15),
|
||||
...ridge("Marble Mountains", [41.35, -123.4], [41.72, -123.05], 2_300, 0.14),
|
||||
...ridge("Siskiyou Mountains", [41.8, -123.75], [41.95, -122.65], 2_000, 0.14),
|
||||
...ridge("Scott Bar Mountains", [41.55, -122.95], [41.85, -122.65], 1_700, 0.13),
|
||||
...ridge("South Fork Mountain", [40.2, -123.45], [40.75, -123.5], 1_700, 0.14),
|
||||
{ name: "Mount Eddy", lat: 41.32, lng: -122.48, elevation: 2_750, radius: 0.12 },
|
||||
|
||||
/**
|
||||
* ---- The southern Cascades ----
|
||||
*
|
||||
* **Shasta and Lassen are the two objects that make the north read as the
|
||||
* north**, and they are the only free-standing stratovolcanoes on this board.
|
||||
* Everything else in California is a range; these are cones, and a cone
|
||||
* standing alone on a plateau is a silhouette nothing else here produces.
|
||||
*
|
||||
* Shasta is 4,322 m and rises about 3,000 m from the ground around it in
|
||||
* seventeen kilometres, so the radius is 0.24 — deliberately tighter than the
|
||||
* Sierra crest's 0.30 on a peak a fifth taller again, because the whole
|
||||
* character of the mountain is that it is steep and by itself. Shastina is its
|
||||
* satellite cone on the west shoulder and costs one record; without it the
|
||||
* summit is a perfect circle, which no volcano is.
|
||||
*
|
||||
* Lassen is 3,187 m, the southern end of the Cascade arc, and the last
|
||||
* mountain in the contiguous United States to erupt before St Helens. It sits
|
||||
* a hundred kilometres south of Shasta with the Hat Creek country between
|
||||
* them, and the gap is as much the picture as the peaks are.
|
||||
*/
|
||||
{ name: "Mount Shasta", lat: 41.409, lng: -122.194, elevation: 4_320, radius: 0.24 },
|
||||
{ name: "Shastina", lat: 41.409, lng: -122.27, elevation: 3_700, radius: 0.09 },
|
||||
{ name: "Lassen Peak", lat: 40.488, lng: -121.505, elevation: 3_190, radius: 0.17 },
|
||||
{ name: "Brokeoff Mountain", lat: 40.43, lng: -121.58, elevation: 2_800, radius: 0.1 },
|
||||
...ridge("Cascade Front", [40.25, -121.62], [41.05, -121.95], 2_000, 0.18),
|
||||
...ridge("Trinity Divide", [40.9, -122.42], [41.25, -122.4], 2_100, 0.14),
|
||||
{ name: "Medicine Lake Highland", lat: 41.58, lng: -121.55, elevation: 2_350, radius: 0.24 },
|
||||
|
||||
/**
|
||||
* ---- The northern Sierra, and the Warners ----
|
||||
*
|
||||
* The crest above carries the range from Piute Peak to Sonora Pass. North of
|
||||
* that it keeps going for another three degrees of latitude and it does one
|
||||
* thing the southern half never does: it **dies out**. Sonora is 3,150 m,
|
||||
* Donner is 2,600, Grizzly Ridge is 2,100, and by Lassen there is no Sierra
|
||||
* left at all — the arc hands over to the Cascades. That taper is drawn here
|
||||
* rather than stopped abruptly, because a 3,000 m wall ending in mid-air at
|
||||
* 39 N was what the old crop actually looked like.
|
||||
*
|
||||
* The Warner Mountains are the odd one out and are worth their eight records:
|
||||
* they are a Basin-and-Range block stranded in the far north-east corner, a
|
||||
* hundred kilometres east of the Cascades with nothing but plateau between,
|
||||
* and they are the only relief in the top right of the frame.
|
||||
*/
|
||||
//
|
||||
// Written as chains and not as a row of peaks, and that is not a style
|
||||
// choice — it is the mistake this board has now made twice. The crest above
|
||||
// is thirteen hand-placed bells at 0.25° on a 0.28-0.30 radius, which is 0.89
|
||||
// radii apart and is a ridge. The first draft of the northern half was six
|
||||
// bells at 0.35° on a 0.24-0.26 radius: 1.4 radii apart, which is a row of
|
||||
// separate domes, and a photograph of it looked exactly like the bubble wrap
|
||||
// the desert shipped as once before. `ridge` computes the 0.9 spacing rather
|
||||
// than trusting anybody to type it.
|
||||
...ridge("Ebbetts Crest", [38.2, -119.7], [38.72, -120.05], 3_000, 0.26),
|
||||
...ridge("Carson Range", [38.72, -119.98], [39.15, -120.05], 3_000, 0.24),
|
||||
...ridge("Donner Crest", [39.15, -120.2], [39.55, -120.45], 2_600, 0.22),
|
||||
...ridge("Sierra Buttes", [39.5, -120.55], [39.95, -120.8], 2_500, 0.2),
|
||||
...ridge("Grizzly Ridge", [39.9, -120.85], [40.35, -121.0], 2_100, 0.2),
|
||||
...ridge("Diamond Mountains", [40.1, -120.5], [40.5, -120.35], 1_900, 0.16),
|
||||
...ridge("Warner Mountains", [41.0, -120.2], [41.9, -120.3], 2_600, 0.13),
|
||||
|
||||
// ---- Sierra Nevada: the crest ------------------------------------------
|
||||
// Thirteen peaks at ~0.25° spacing on a ~0.29° radius. This is the board's
|
||||
// one genuinely big landform and the reason the exaggeration is 13.
|
||||
@@ -478,6 +681,9 @@ const HILLS: Hill[] = [
|
||||
{ name: "Mother Lode", lat: 37.35, lng: -119.65, elevation: 1_000, radius: 0.3 },
|
||||
{ name: "Tuolumne Foothills", lat: 37.65, lng: -119.9, elevation: 950, radius: 0.32 },
|
||||
{ name: "Stanislaus Foothills", lat: 37.95, lng: -120.2, elevation: 900, radius: 0.32 },
|
||||
// The northern half of the ramp, as one chain rather than six bells, for the
|
||||
// spacing reason the crest above gives.
|
||||
...ridge("Mother Lode North", [38.2, -120.35], [40.3, -121.85], 850, 0.3),
|
||||
|
||||
// ---- White and Inyo Mountains, the far wall of the Owens Valley ---------
|
||||
{ name: "Inyo Mountains", lat: 36.45, lng: -117.85, elevation: 2_500, radius: 0.2 },
|
||||
@@ -717,6 +923,50 @@ const HILLS: Hill[] = [
|
||||
{ name: "Oxnard Plain", lat: 34.22, lng: -119.12, elevation: 18, radius: 0.22 },
|
||||
{ name: "Antelope Valley floor", lat: 34.75, lng: -118.2, elevation: 700, radius: 0.42 },
|
||||
|
||||
/*
|
||||
* The northern floors, and the one that carries a third of the new board.
|
||||
*
|
||||
* **The Sacramento Valley is the same object as the San Joaquin and has to
|
||||
* overlap it**, for the reason the dry floors below give at length: a radial
|
||||
* bell falls to zero with zero gradient at its own edge, two floors that
|
||||
* merely touch leave a seam at exactly 0 m between them, and 0 m is the beach
|
||||
* colour. A pale sand stripe drawn across the middle of the Central Valley at
|
||||
* the latitude of Stockton is the exact failure this avoids. The San Joaquin
|
||||
* floor is centred at 36.6 on a radius of 1.7, so it reaches 38.3; this one
|
||||
* is centred at 39.4 on 1.3 and reaches 38.1, which puts two tenths of a
|
||||
* degree of overlap under the join.
|
||||
*
|
||||
* The plateau floors are the opposite case and are meant to be high. The
|
||||
* Modoc Plateau really does sit at 1,400 m, the Klamath Basin at 1,260 and
|
||||
* Surprise Valley at 1,500, so they come out as `upland` rock rather than as
|
||||
* `flats` gold — which is right: the top right of this board is high desert,
|
||||
* not farmland, and it is the same country as the Great Basin over the line.
|
||||
*/
|
||||
// A chain along the valley's own axis rather than one bell, because the
|
||||
// Sacramento Valley is 250 km long and 80 km wide and a single radial bell
|
||||
// that covers its length is a 290 km circle — which is what the first draft
|
||||
// drew, and it came out as a smooth gold bowl swallowing the Coast Ranges on
|
||||
// one side and the Sierra foothills on the other. The San Joaquin gets away
|
||||
// with one bell because it really is nearly as wide as it is long.
|
||||
...ridge("Sacramento Valley floor", [38.5, -121.6], [40.35, -122.2], 34, 0.62),
|
||||
// 631 m of andesite standing alone in the middle of a dead-flat valley — the
|
||||
// smallest mountain range in the world by the sign at the county line, and
|
||||
// one of the very few things on this board that is legible *because* nothing
|
||||
// else is near it. A 0.08 radius is nine kilometres, which is what it is.
|
||||
{ name: "Sutter Buttes", lat: 39.21, lng: -121.82, elevation: 631, radius: 0.08 },
|
||||
// One wide bell and not a chain, which is the opposite call from the
|
||||
// Sacramento Valley two lines up and is the same reasoning applied to a
|
||||
// different shape. The Modoc is a *plateau*: 20,000 km² of basalt at a fairly
|
||||
// even 1,400 m, as round as it is long. Drawn as a chain of 0.42 bells it came
|
||||
// out as three separate domes in a photograph — the bubble-wrap failure again,
|
||||
// and this time in a place that has no ranges in it at all. The Mojave floor
|
||||
// takes the same treatment at 1.1 for the same reason.
|
||||
{ name: "Modoc Plateau floor", lat: 41.32, lng: -120.95, elevation: 1_400, radius: 0.78 },
|
||||
{ name: "Surprise Valley floor", lat: 41.4, lng: -120.06, elevation: 1_500, radius: 0.16 },
|
||||
{ name: "Honey Lake floor", lat: 40.3, lng: -120.4, elevation: 1_220, radius: 0.42 },
|
||||
{ name: "Shasta Valley floor", lat: 41.65, lng: -122.5, elevation: 800, radius: 0.24 },
|
||||
{ name: "Scott Valley floor", lat: 41.5, lng: -122.9, elevation: 850, radius: 0.14 },
|
||||
|
||||
/*
|
||||
* The dry floors, east of the Transverse Ranges.
|
||||
*
|
||||
@@ -817,6 +1067,138 @@ const RANGES: LatLng[][] = [
|
||||
[37.95, -122.82],
|
||||
[38.05, -122.9],
|
||||
],
|
||||
/*
|
||||
* The North Coast forest, Sonoma to the Oregon line.
|
||||
*
|
||||
* The largest single wildland envelope on the board and the one that changes
|
||||
* the frame most, because the ground it covers used to be ocean. North of the
|
||||
* Bay this coast is continuous forest for four hundred kilometres — redwood on
|
||||
* the seaward slope, Douglas fir behind it — and it is genuinely darker and
|
||||
* greener than anything else in California. Get it wrong and the top left of
|
||||
* the board is gold grassland running to the Oregon line, which is a picture
|
||||
* of a state four hundred kilometres inland from this one.
|
||||
*
|
||||
* Its western edge follows the coast at about a tenth of a degree inland
|
||||
* rather than sitting on it, so `coastFalloff`'s flattened rim stays outside
|
||||
* the park and the shore reads as a shore. Its eastern edge is the inner Coast
|
||||
* Range crest, which is where the fog stops reaching and the country turns to
|
||||
* oak and grass — a real line, and the one the eye reads as the edge of the
|
||||
* north coast.
|
||||
*/
|
||||
[
|
||||
[38.3, -122.95],
|
||||
[38.7, -123.15],
|
||||
[39.1, -123.35],
|
||||
[39.5, -123.4],
|
||||
[39.9, -123.5],
|
||||
[40.3, -123.6],
|
||||
[40.7, -123.7],
|
||||
[41.1, -123.75],
|
||||
[41.5, -123.85],
|
||||
[41.9, -123.9],
|
||||
[41.95, -124.15],
|
||||
[41.5, -124.1],
|
||||
[41.0, -124.05],
|
||||
[40.6, -124.2],
|
||||
[40.3, -124.3],
|
||||
[40.0, -124.05],
|
||||
[39.6, -123.72],
|
||||
[39.2, -123.66],
|
||||
[38.8, -123.42],
|
||||
[38.4, -123.1],
|
||||
],
|
||||
/*
|
||||
* The Klamath and the Trinity Alps: the interior knot.
|
||||
*
|
||||
* Drawn separately from the coast belt above rather than merged with it,
|
||||
* because the ground between them is the Trinity River country and is not the
|
||||
* same landscape — and because one envelope covering both would swallow the
|
||||
* Shasta and Scott valleys, which are farmed, pale and the only two flat
|
||||
* things in the north-west corner. Two greens with a gold gap in them is the
|
||||
* shape of that corner.
|
||||
*/
|
||||
[
|
||||
[40.2, -123.4],
|
||||
[40.6, -123.3],
|
||||
[41.0, -123.1],
|
||||
[41.4, -123.0],
|
||||
[41.8, -122.9],
|
||||
[41.95, -123.2],
|
||||
[41.6, -123.5],
|
||||
[41.2, -123.6],
|
||||
[40.8, -123.5],
|
||||
[40.4, -123.55],
|
||||
],
|
||||
/*
|
||||
* The Cascade belt: Shasta, Lassen, and the conifer between them.
|
||||
*
|
||||
* The envelope stops short of Shasta's summit cone on purpose, the same way
|
||||
* the Sierra one stops half a degree west of the crest. Above about 2,700 m
|
||||
* the mountain is scree, glacier and old snow, and leaving it out of the park
|
||||
* is the only way this two-colour ramp can draw a tree line — the cone comes
|
||||
* out `alpine` grey standing on a green skirt, which is what it looks like
|
||||
* from a hundred kilometres away on any clear day in the valley.
|
||||
*/
|
||||
[
|
||||
[40.2, -121.9],
|
||||
[40.6, -121.75],
|
||||
[41.0, -121.85],
|
||||
[41.18, -121.95],
|
||||
[41.2, -122.3],
|
||||
[41.05, -122.45],
|
||||
[40.6, -122.25],
|
||||
[40.25, -122.2],
|
||||
],
|
||||
/*
|
||||
* The Shasta-Trinity forest north and west of the mountain — and the gap
|
||||
* between this polygon and the one above it is the point of both.
|
||||
*
|
||||
* `groundColor` answers `inPark` **first**, so a park polygon paints its
|
||||
* ground green at any altitude and the `alpine` stop is unreachable inside
|
||||
* one. That is correct almost everywhere and catastrophic on a stratovolcano:
|
||||
* the first draft ran one envelope over the whole Cascade belt and Mount
|
||||
* Shasta rendered as a 4,320 m cone of pine, which is the single most
|
||||
* recognisable landform in northern California drawn wrong.
|
||||
*
|
||||
* So the two belts stop either side of 41.2–41.55 and the mountain sits in the
|
||||
* gap, painted by the height ramp as the rock and old snow it is. The gap is
|
||||
* also honest on its own terms: the Shasta Valley immediately west of the cone
|
||||
* is open grassland at 800 m with no trees on it at all, which is why the
|
||||
* mountain reads as free-standing from the interstate.
|
||||
*/
|
||||
[
|
||||
[41.55, -122.05],
|
||||
[41.9, -122.15],
|
||||
[41.95, -122.55],
|
||||
[41.6, -122.7],
|
||||
[41.35, -122.6],
|
||||
[41.4, -122.25],
|
||||
],
|
||||
/*
|
||||
* The northern Sierra forest belt, carrying the range on from Sonora Pass.
|
||||
*
|
||||
* Same two edges as its southern half and for the same two reasons: the
|
||||
* western one sits a little up the range front because the foothills really
|
||||
* are gold grassland and the conifers really do start around 600 m, and the
|
||||
* eastern one stops short of the crest so the granite above the tree line is
|
||||
* left as rock. It narrows as it goes north because the range does.
|
||||
*/
|
||||
[
|
||||
[38.05, -119.84],
|
||||
[38.35, -120.0],
|
||||
[38.7, -120.25],
|
||||
[39.05, -120.5],
|
||||
[39.4, -120.75],
|
||||
[39.75, -121.0],
|
||||
[40.05, -121.25],
|
||||
[40.2, -121.5],
|
||||
[39.9, -121.4],
|
||||
[39.55, -121.25],
|
||||
[39.2, -121.05],
|
||||
[38.85, -120.8],
|
||||
[38.5, -120.55],
|
||||
[38.15, -120.35],
|
||||
],
|
||||
// Inner Coast Range: the Temblor and the Diablo.
|
||||
[
|
||||
[35.05, -119.715],
|
||||
@@ -1309,74 +1691,119 @@ export const CALIFORNIA_CITY: City = {
|
||||
id: "california",
|
||||
name: "California",
|
||||
/**
|
||||
* The middle of the board, not the middle of the corridor.
|
||||
* The middle of the board, not the middle of the corridor and not the middle
|
||||
* of the state's population.
|
||||
*
|
||||
* Scene space is centred here, and the board reaches from -123.05 to -114.0
|
||||
* now that the state's own eastern edge is on it. Left at the corridor's
|
||||
* midpoint the origin sat 1.6° — seventy-five scene units — west of the
|
||||
* middle of the bounds, which puts the satellite dome and the shadow box off
|
||||
* to one side of the thing they are meant to cover.
|
||||
* Scene space is centred here, and everything sized off the origin — the
|
||||
* satellite dome, the shadow box, the star field — is centred with it, so a
|
||||
* centre off to one side makes those covers too small on the far side by
|
||||
* exactly the offset. The board now runs 32.50 to 42.05 and -124.50 to
|
||||
* -114.0, whose midpoint is 37.275, -119.25. Rounded to 37.3, which is also
|
||||
* the latitude `LNG_SQUASH` above is taken at; the two have to agree or a
|
||||
* chain running east-west comes out with its peaks in the wrong places.
|
||||
*
|
||||
* It moved two degrees north with the bounds and that is the whole reason it
|
||||
* is written down: 35.3 was the middle of a board that stopped at 38.05, and
|
||||
* left where it was it would now sit ninety scene units south of the middle
|
||||
* of the frame.
|
||||
*/
|
||||
center: { lat: 35.3, lng: -118.55 },
|
||||
center: { lat: 37.3, lng: -119.25 },
|
||||
|
||||
/**
|
||||
* The board is the southern two thirds of California, and it stops where the
|
||||
* state stops on three sides out of four.
|
||||
* The board is California. All of it, and it stops where the state stops on
|
||||
* every side.
|
||||
*
|
||||
* It used to stop at -117.55, which is a line through Temecula chosen for no
|
||||
* reason except that the corridor did not need anything east of it. Half the
|
||||
* Mojave, the whole Colorado Desert, the Salton basin, Death Valley and every
|
||||
* one of the Peninsular Ranges were off the board, and — worse for the first
|
||||
* frame anybody sees — the land ended in a ruled north-south line with open
|
||||
* ocean beyond it. `maxLng` is now past Parker, so the eastern edge is the
|
||||
* Colorado River and the Nevada line, which is a silhouette rather than a
|
||||
* crop. `minLat` is the Mexican border for the same reason.
|
||||
* The last version of this comment argued that `maxLat` could stay a crop —
|
||||
* "a crop along the top of the frame, far from the camera and half in the
|
||||
* fog, is the cheap direction to be wrong in". That was wrong for a reason
|
||||
* the argument could not see from inside itself: the minimap draws the whole
|
||||
* state from the same pack and the board drew two thirds of it, so the frame
|
||||
* contained a picture of California and a picture of a piece of California at
|
||||
* the same time, and the eye goes straight to the disagreement. There is no
|
||||
* cheap direction to be wrong about a silhouette this well known.
|
||||
*
|
||||
* `maxLat` is still a crop, and stays one: north of 38.05 is the Sacramento
|
||||
* Valley and the Klamaths, which are another two hundred kilometres of board
|
||||
* for a corridor that ends at San Francisco. A crop along the top of the
|
||||
* frame, far from the camera and half in the fog, is the cheap direction to
|
||||
* be wrong in; a crop down the side of the frame at the closest point to the
|
||||
* camera was the expensive one.
|
||||
* 32.50 to 42.05 N and -124.50 to -114.0 W: the Mexican border, the Oregon
|
||||
* line, Cape Mendocino with eight kilometres of ocean west of it, and the
|
||||
* Colorado past Parker. Nothing here is chosen for the corridor's
|
||||
* convenience.
|
||||
*
|
||||
* **The price was paid in the cell, not in the bounds, and that is the whole
|
||||
* arithmetic of this change.** Extending north and west at the old 0.022 by
|
||||
* 0.027 spacing takes the lattice from 84,924 points to 168,813 — 2.02x — and
|
||||
* the terrain with it, against a mobile budget with 70,000 triangles spare.
|
||||
* Coarsening the cell by 1.42x in each axis puts it back. What matters on
|
||||
* screen is not the cell in metres but the cell as a *fraction of the board*,
|
||||
* because the camera retreats to frame whatever it is given; see `cellLat`.
|
||||
*/
|
||||
bounds: { minLat: 32.55, maxLat: 38.05, minLng: -123.05, maxLng: -114.0 },
|
||||
bounds: { minLat: 32.5, maxLat: 42.05, minLng: -124.5, maxLng: -114.0 },
|
||||
latScale: 58,
|
||||
|
||||
/**
|
||||
* 13, against 2.25. See the header table: this is the number that decides
|
||||
* whether the state has mountains on it, and 2.25 put the Sierra 1.6 units
|
||||
* off a board 284 units tall.
|
||||
* 15, against 13, against the 2.25 this board shipped with. See the header
|
||||
* table: this is the number that decides whether the state has mountains on
|
||||
* it, and 2.25 put the Sierra 1.6 units off a board 284 units tall.
|
||||
*
|
||||
* It is shared with buildings, which is the reason it is not higher still. At
|
||||
* 13 a 250 m downtown tower is 1.7 units — about a third of the height of the
|
||||
* Santa Monica Mountains behind it, which is roughly the relationship a
|
||||
* photograph would show. Push the exaggeration to 20 to get an even more
|
||||
* dramatic Sierra and downtown Los Angeles becomes a bed of nails.
|
||||
* The two points went on when the board became the whole state, and they are
|
||||
* not a taste change — they are what keeps the relief where it already was
|
||||
* once the camera stood further back. Relief in the frame is `peak units over
|
||||
* board span`, because `scene.ts` retreats the camera to frame the span:
|
||||
*
|
||||
* | board | exaggeration | peak | span | relief |
|
||||
* | --- | --- | --- | --- | --- |
|
||||
* | the southern two thirds | 13 | 35.7 u | 428 u | 8.3% |
|
||||
* | the whole state, at 13 | 13 | 35.7 u | 554 u | 6.4% |
|
||||
* | the whole state, at 15 | 15 | 41.2 u | 554 u | 7.4% |
|
||||
* | Southern California | 3.4 | 29.4 u | 393 u | 7.5% |
|
||||
* | the Bay Area | 3.6 | 48.7 u | 1,003 u | 4.9% |
|
||||
*
|
||||
* So 15 puts this board on Southern California's number exactly, which is the
|
||||
* calibration that matters — the two are meant to read as the same landscape
|
||||
* at two zooms.
|
||||
*
|
||||
* **The bed-of-nails objection does not survive the arithmetic here**, and the
|
||||
* old comment's warning about pushing to 20 is still correct for the board it
|
||||
* was written about. A 250 m downtown tower goes from 1.69 units to 1.95, on a
|
||||
* board whose span went from 428 to 554 — so as a fraction of the frame it is
|
||||
* 0.0035 where it was 0.0040. The towers are *smaller* in this frame than they
|
||||
* were in the last one, not larger, and the mountains merely caught up.
|
||||
*/
|
||||
verticalExaggeration: 13,
|
||||
verticalExaggeration: 15,
|
||||
|
||||
/**
|
||||
* About 2.4 km, coarsened by a tenth when the board grew east.
|
||||
* About 3.5 km, coarsened by 1.42x when the board became the whole state.
|
||||
*
|
||||
* The instinct when a board looks flat is that the lattice is too fine. It was
|
||||
* not: the Sierra is 80 km wide, which is 33 cells at this spacing, and
|
||||
* This is the same trade the board made once before when it grew east, made
|
||||
* again and larger, and it is worth restating rather than referring to,
|
||||
* because it is the only reason the extension fits.
|
||||
*
|
||||
* The instinct when a board looks flat is that the lattice is too fine. It is
|
||||
* not: the Sierra is 80 km wide, which is 23 cells even at this spacing, and
|
||||
* Southern California renders the San Gabriels — the range that board is
|
||||
* famous for — across 37 coarse cells. Halving the cell here would have
|
||||
* quadrupled the terrain and bought nothing the eye can find, because the
|
||||
* missing structure was vertical, not horizontal.
|
||||
* famous for — across 37 coarse cells. The structure a state board is missing
|
||||
* is vertical, never horizontal.
|
||||
*
|
||||
* The tenth is the price of the eastern half of the state, and it is a price
|
||||
* paid in a currency nobody can see. Extending `bounds` to the Colorado grew
|
||||
* the land under the lattice by 60%, which at the old spacing put the terrain
|
||||
* at 130,622 triangles against 81,546 — half the board's whole spare budget on
|
||||
* one mesh. What matters on screen is not the cell in metres but the cell as a
|
||||
* fraction of the board, because the camera retreats to frame whatever it is
|
||||
* given: 0.022° is 1.27 units on a board now 428 across, where 0.02° was 1.16
|
||||
* units on a board 284 across. The cell is 27% bigger on the ground and 27%
|
||||
* *smaller* in the frame, and the terrain costs 105,762 triangles instead.
|
||||
* **The cell as a fraction of the board is what the eye sees, and it did not
|
||||
* move.** The camera retreats to frame whatever it is given, so the number
|
||||
* that matters is cell over span, not cell in metres:
|
||||
*
|
||||
* | board | cell | span | fraction |
|
||||
* | --- | --- | --- | --- |
|
||||
* | corridor, before the east | 0.020° | 284 u | 0.0041 |
|
||||
* | southern two thirds | 0.022° | 428 u | 0.0030 |
|
||||
* | the whole state | 0.0312° | 554 u | 0.0033 |
|
||||
*
|
||||
* So the ground cell went from 2,449 m to 3,473 m — 42% coarser on the earth
|
||||
* — and *finer* in the frame than the board two revisions ago. The lattice
|
||||
* holds at 85,008 points against 84,924, and the terrain triangle count with
|
||||
* it.
|
||||
*
|
||||
* `cellLng` is 0.0383 rather than 0.0312 for the same reason it was 0.027
|
||||
* rather than 0.022: a degree of longitude at this latitude is `cos(37.3)` of
|
||||
* a degree of latitude, so an equal-area cell has to be 1/0.795 as wide as it
|
||||
* is tall. Both were multiplied by the same 1.42.
|
||||
*/
|
||||
cellLat: 0.022,
|
||||
cellLng: 0.027,
|
||||
cellLat: 0.0312,
|
||||
cellLng: 0.0383,
|
||||
|
||||
/**
|
||||
* ~2.8 km, or a little over one cell.
|
||||
@@ -1422,15 +1849,28 @@ export const CALIFORNIA_CITY: City = {
|
||||
number: "01",
|
||||
description: "Los Angeles and San Francisco joined as one living route board.",
|
||||
/*
|
||||
* Framed on the middle of the bounds, not on the middle of the corridor,
|
||||
* and pulled back with the board: `scene.ts` sizes the fog, the far plane
|
||||
* and the orbit limits from `boardSpan`, but the opening pose is authored
|
||||
* here and does not scale itself. The board went from 284 units across to
|
||||
* 428 when the state's own eastern edge arrived, and the old 370/320
|
||||
* stand-off framed the Central Valley with San Diego and the Mojave off
|
||||
* the side of the screen.
|
||||
* Framed on the middle of the bounds, and pulled back with the board:
|
||||
* `scene.ts` sizes the fog, the far plane and the orbit limits from
|
||||
* `boardSpan`, but the opening pose is authored here and does not scale
|
||||
* itself. This is the third time it has had to move — 284 units across,
|
||||
* then 428 when the state's own eastern edge arrived, now 554 with the
|
||||
* north on — and each time the failure of not moving it was the same one:
|
||||
* a shot that framed the Central Valley with a third of the state off the
|
||||
* side of the screen.
|
||||
*
|
||||
* 612/528 holds the *angle* the board is seen from — 40.8° above the
|
||||
* horizontal, the same as every version of this pose — and changes only
|
||||
* the stand-off, which is 1.39 board spans against the old 1.26. The
|
||||
* extra tenth is the board's aspect and not its size: at 428 x 319 it was
|
||||
* a landscape rectangle that filled a 16:10 frame, and at 554 x 484 it is
|
||||
* nearly square and arrives as a diamond, which needs more room in the
|
||||
* axis it is turned into. Shot at 580 the Mexican border sat seventy
|
||||
* pixels off the bottom edge.
|
||||
*
|
||||
* `chapterFraming` then widens it further on a narrow window, which is a
|
||||
* different correction for a different reason and composes with this one.
|
||||
*/
|
||||
focus: { lat: 35.15, lng: -118.35, distance: 408, height: 352, rotation: 0.5 },
|
||||
focus: { lat: 37.15, lng: -119.35, distance: 612, height: 528, rotation: 0.42 },
|
||||
},
|
||||
{
|
||||
id: "la-sf-us-101",
|
||||
@@ -1464,6 +1904,30 @@ export const CALIFORNIA_CITY: City = {
|
||||
description: "The northern door into the detailed Bay Area board and Lumbridge HQ.",
|
||||
focus: { lat: 37.7749, lng: -122.4194, distance: 38, height: 26, rotation: 0.8 },
|
||||
},
|
||||
/**
|
||||
* The sixth chapter, and the reason it exists is that the tour used to end
|
||||
* where the board used to end.
|
||||
*
|
||||
* Two hundred kilometres of state came onto this board and the chapter list
|
||||
* had no way to look at any of it: every authored pose sat below 38 N, so a
|
||||
* visitor who never dragged the camera would never see the Klamaths, the
|
||||
* Cascades or four hundred kilometres of North Coast. A board with land on
|
||||
* it that the tour cannot reach is a board that is half decoration.
|
||||
*
|
||||
* Sited between Shasta and Lassen rather than on either, because the gap is
|
||||
* as much of the picture as the peaks are — a hundred kilometres of Hat
|
||||
* Creek country with a 4,320 m cone at one end and a 3,190 m one at the
|
||||
* other, and nothing else in California looks like that.
|
||||
*/
|
||||
{
|
||||
id: "shasta-cascades",
|
||||
label: "Shasta & the north",
|
||||
shortLabel: "North",
|
||||
number: "06",
|
||||
description:
|
||||
"Two volcanoes, the Klamath knot and four hundred kilometres of coast that used to be ocean.",
|
||||
focus: { lat: 40.6, lng: -122.4, distance: 212, height: 152, rotation: 0.5 },
|
||||
},
|
||||
],
|
||||
|
||||
/**
|
||||
|
||||
+486
-11
@@ -39,6 +39,7 @@ import type {
|
||||
Hill,
|
||||
Landmark,
|
||||
LatLng,
|
||||
Port,
|
||||
} from "../engine/types.ts";
|
||||
|
||||
// ---- Coastlines -----------------------------------------------------------
|
||||
@@ -176,16 +177,89 @@ export const SOUTHLAND: LatLng[] = [
|
||||
|
||||
/**
|
||||
* Terminal Island: dredge spoil, container cranes and a federal prison, sitting
|
||||
* between San Pedro and Long Beach. It is here because the harbour reads as a
|
||||
* harbour only if there is something in it for the two bridges to land on.
|
||||
* between San Pedro and Long Beach.
|
||||
*
|
||||
* ### Why this outline is thirty-one points and not six
|
||||
*
|
||||
* It used to be six, and its own comment said what those six were for: "the
|
||||
* harbour reads as a harbour only if there is something in it for the two
|
||||
* bridges to land on." A hexagon is enough to land a bridge on and it is not
|
||||
* enough to be a port, because **the recognisable thing about this island is not
|
||||
* its outline, it is the comb cut into it** — the West Basin and the East Basin
|
||||
* opening north off the Cerritos Channel, Fish Harbor opening south, the Pier
|
||||
* 400 fill hung off a causeway in the south-east, and a quay along the wall of
|
||||
* every one of them. With six points there is nowhere for a quay to be that is
|
||||
* both on land and on the water, which is the one thing a quay has to be.
|
||||
*
|
||||
* Traced by hand, like every other coordinate in this file, and per
|
||||
* ARCHITECTURE §3.2 that means it is eyeball-accurate original expression rather
|
||||
* than a copy of anybody's dataset. `ports.sqlite` cannot help: its seven rows
|
||||
* all sit on an exact arc-minute grid, up to 1.3 km — 3.3 scene units here —
|
||||
* from the water they claim to be on. See `engine/ports.ts`.
|
||||
*
|
||||
* ### What the shape has to satisfy
|
||||
*
|
||||
* - **The two bridges still land on it.** The Vincent Thomas's east abutment
|
||||
* `[33.7535, -118.258]` and the Long Beach Gateway's west abutment
|
||||
* `[33.752, -118.232]` are both inside this ring, and both of their mainland
|
||||
* ends are still outside it. `socalPorts.test.ts` asserts all four.
|
||||
* - **It does not touch the mainland.** The narrowest water left between the two
|
||||
* is 425 m of Main Channel at the Vincent Thomas and about 500 m of Back
|
||||
* Channel off Pier T, which is what those channels really are.
|
||||
* - **Every authored quay vertex lies inside it.** That is the assertion that
|
||||
* stops a quay floating on open water or being buried in the fill behind it,
|
||||
* and it is why the basins are cut 900-1,000 m deep rather than token
|
||||
* notches: a quay wall wants a kilometre of straight water frontage.
|
||||
*
|
||||
* Five and a half kilometres east to west, six north to south, which at 391 m to
|
||||
* the scene unit is about 14 by 15 units on a 393-unit board.
|
||||
*/
|
||||
export const TERMINAL_ISLAND: LatLng[] = [
|
||||
[33.769, -118.264],
|
||||
[33.77, -118.242],
|
||||
[33.76, -118.227],
|
||||
[33.742, -118.228],
|
||||
[33.735, -118.258],
|
||||
[33.746, -118.268],
|
||||
// The north shore, along the Cerritos (Back) Channel, west to east, with the
|
||||
// two basins cut southward into it.
|
||||
[33.7672, -118.2665], // the north-west corner, at the mouth of the West Basin
|
||||
[33.759, -118.2618], // the West Basin, west wall
|
||||
[33.7602, -118.2555], // the head of the West Basin
|
||||
[33.769, -118.2582], // back out to the Cerritos Channel
|
||||
[33.7688, -118.247], // the Badger Avenue rail bridge
|
||||
[33.758, -118.2452], // the East Basin, west wall
|
||||
[33.7588, -118.2382], // the head of the East Basin
|
||||
[33.7672, -118.2378], // back out
|
||||
[33.7635, -118.2295], // under the Long Beach International Gateway
|
||||
[33.7595, -118.221], // Pier T, north-west
|
||||
[33.7548, -118.2125], // Pier T, north-east, at the Middle Harbor slip
|
||||
|
||||
// The east end, on Queensway Bay.
|
||||
[33.747, -118.2105],
|
||||
[33.743, -118.216],
|
||||
|
||||
// The south shore, east to west, on the outer harbour.
|
||||
[33.7405, -118.2245],
|
||||
[33.7398, -118.233],
|
||||
|
||||
// The causeway down to the Pier 400 fill, and the fill itself. The neck is
|
||||
// 556 m across, which is a road, two rail tracks and their shoulders.
|
||||
[33.7345, -118.2352], // the causeway, east side
|
||||
[33.729, -118.2372],
|
||||
[33.7285, -118.23], // Pier 400, north-east
|
||||
[33.7155, -118.233], // Pier 400, south-east
|
||||
[33.715, -118.2495], // Pier 400, south-west
|
||||
[33.729, -118.252], // Pier 400, north-west
|
||||
[33.7288, -118.2432],
|
||||
[33.7343, -118.2412], // the causeway, west side
|
||||
[33.738, -118.244],
|
||||
|
||||
// Fish Harbor, cut in from the south. The cannery basin, and the one part of
|
||||
// this island that predates the container.
|
||||
[33.7378, -118.256],
|
||||
[33.735, -118.2572],
|
||||
[33.7352, -118.264],
|
||||
[33.7398, -118.2652],
|
||||
[33.742, -118.2698], // the south-west corner, at Reservation Point
|
||||
|
||||
// The west shore, up the Main Channel.
|
||||
[33.7505, -118.2708], // under the Vincent Thomas
|
||||
[33.759, -118.2692],
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -1687,6 +1761,385 @@ export const LONG_BEACH_GATEWAY: Bridge = {
|
||||
|
||||
export const BRIDGES = [VINCENT_THOMAS, LONG_BEACH_GATEWAY];
|
||||
|
||||
// ---- Ports ----------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* San Pedro Bay: Los Angeles and Long Beach, one basin, two ports.
|
||||
*
|
||||
* Together they are the busiest container complex in the western hemisphere, and
|
||||
* until this block existed the Harbour chapter said so over a picture of nothing
|
||||
* at all. `engine/ports.ts` draws all of it in four draw calls; this is the data
|
||||
* it draws.
|
||||
*
|
||||
* ### Everything below is hand-traced, and the store cannot help
|
||||
*
|
||||
* ARCHITECTURE §3.2 applies here exactly as it does to the coastline. Beyond
|
||||
* that, the upstream `ports` table is unusable for placement even if the licence
|
||||
* allowed it: all seven of its rows sit on an exact arc-minute grid — `lat*60`
|
||||
* and `lon*60` are whole integers for every one — and one arc-minute at this
|
||||
* latitude is 1,852 m of latitude and 1,540 m of longitude, so a quay placed
|
||||
* from those columns lands as much as 3.3 scene units from the water. Its
|
||||
* `channel_depth_ft` is worse: a binned WPI code that reports Los Angeles as
|
||||
* fourteen feet deep against a real dredged channel near fifty-three.
|
||||
* `socalPorts.test.ts` asserts that neither anchor below is on an arc-minute.
|
||||
*
|
||||
* The one column of that table which *is* load-bearing is `harbor_type`: USLAX
|
||||
* and USLGB are both `CB`, coastal breakwater, and they share the federal
|
||||
* breakwater declared on `LOS_ANGELES` below. Oakland is `CN`, coastal natural,
|
||||
* and when the Bay board gets this kit it must not be given one.
|
||||
*
|
||||
* ### The empty boxes are the story, and they are a fact about a port
|
||||
*
|
||||
* The owner asked whether the ships are empty or full. They cannot be: there is
|
||||
* no draught column in the vessel store, the AIS static message that would carry
|
||||
* one is absent for most hulls most of the time, and a per-hull laden state
|
||||
* would be an invention. The same question answered at the level where the data
|
||||
* is real is far better anyway — in July 2026, **348,691 of the 460,467
|
||||
* containers that left Los Angeles left empty**, which is 75.7 per cent, and a
|
||||
* second collector explains it from the other side: a box costs $7,491 to bring
|
||||
* east across the Pacific and $347 to send back. Nobody pays to repatriate an
|
||||
* empty, so three quarters of them go home with nothing in them.
|
||||
*
|
||||
* That number is drawn, not just written: `Yard.emptyShare` is the proportion of
|
||||
* stacks the yard atlas paints in the empty palette. **It is the empty share of
|
||||
* the month's outbound boxes, not a census of what is standing in the yard
|
||||
* today** — nobody counts that — and it is applied here because the export
|
||||
* stacks are the large majority of what an American west-coast yard holds.
|
||||
*
|
||||
* ### Why Long Beach carries no `throughput` record
|
||||
*
|
||||
* Its export split is known and is nearly identical to LA's: 341,806 empty
|
||||
* against 104,843 loaded, 76.5 per cent. Its *import* halves were never read.
|
||||
* `PortThroughput` requires all four counts, and a record with two real numbers
|
||||
* and two plausible ones is precisely the failure the fire layer nearly shipped,
|
||||
* so Long Beach gets no record rather than half of one. Its yards still carry
|
||||
* the 0.765 that is measured.
|
||||
*/
|
||||
|
||||
/**
|
||||
* The federal breakwater — three arms, two gates, 13.06 km of rubble.
|
||||
*
|
||||
* San Pedro (3.46 km) from the shore below Cabrillo out to the Angels Gate
|
||||
* light; the Middle Breakwater (5.61 km); and the Long Beach arm (3.99 km)
|
||||
* running east toward Alamitos Bay. The 589 m gap between the first two is
|
||||
* Angels Gate, the main entrance, and the 703 m between the second and third is
|
||||
* Queens Gate.
|
||||
*
|
||||
* This is the object that makes the whole board's south-west corner read as a
|
||||
* harbour rather than a bay: 13.06 km is 33.4 scene units on a 393-unit board,
|
||||
* about nine per cent of its width, and it is the only part of this port that is
|
||||
* legible from the whole-board pose. It is drawn wider than life — see
|
||||
* `BREAKWATER_BASE_M` and its floor in `engine/ports.ts` — for the reason the
|
||||
* LA River polygon is drawn four times its true width a few hundred lines above:
|
||||
* a feature narrower than a lattice cell does not render as a thin line, it
|
||||
* renders as a dotted one.
|
||||
*/
|
||||
const SAN_PEDRO_BREAKWATER: LatLng[][] = [
|
||||
[
|
||||
[33.7065, -118.2885], // rooted off Cabrillo Beach
|
||||
[33.7048, -118.274],
|
||||
[33.707, -118.262],
|
||||
[33.7083, -118.2517], // the Angels Gate light
|
||||
],
|
||||
[
|
||||
[33.7095, -118.2455], // the Middle Breakwater, west end
|
||||
[33.712, -118.227],
|
||||
[33.7145, -118.206],
|
||||
[33.7165, -118.1855], // Queens Gate, west side
|
||||
],
|
||||
[
|
||||
[33.7175, -118.178], // the Long Beach arm, west end
|
||||
[33.719, -118.156],
|
||||
[33.72, -118.135],
|
||||
],
|
||||
];
|
||||
|
||||
/**
|
||||
* The Port of Los Angeles.
|
||||
*
|
||||
* Four container terminals on the west and south of Terminal Island, forty
|
||||
* gantries between them, and the Main Channel running up from Angels Gate past
|
||||
* the Vincent Thomas to the turning basin at Wilmington.
|
||||
*
|
||||
* The crane bearings are the whole of the recognition and they are all
|
||||
* different: Pier 400 leans west over the outer harbour, Pier 300 south, the
|
||||
* East Basin west into its slip and the West Basin east into its own. A port
|
||||
* where every boom points the same way reads as a fence.
|
||||
*/
|
||||
export const LOS_ANGELES: Port = {
|
||||
id: "USLAX",
|
||||
name: "Port of Los Angeles",
|
||||
// The middle of Terminal Island, hand-placed. Deliberately not
|
||||
// `ports.sqlite`'s 33.75 / -118.25, which is an arc-minute rounding.
|
||||
lat: 33.7508,
|
||||
lng: -118.2604,
|
||||
harborType: "CB",
|
||||
breakwater: SAN_PEDRO_BREAKWATER,
|
||||
channel: [
|
||||
[33.698, -118.247], // the approach, outside the breakwater
|
||||
[33.709, -118.2486], // through Angels Gate
|
||||
[33.72, -118.258],
|
||||
[33.732, -118.267],
|
||||
[33.743, -118.2731],
|
||||
[33.751, -118.2732], // under the Vincent Thomas
|
||||
[33.762, -118.2711],
|
||||
[33.7688, -118.269], // the turning basin at the head
|
||||
],
|
||||
/**
|
||||
* Quay polygons, **water edge first**.
|
||||
*
|
||||
* That ordering is a contract with `engine/ports.ts`, which takes the first
|
||||
* two vertices as the wall and drops the skirt and the revetment toe from
|
||||
* them. A polygon traced the other way round hangs its wall off the back of
|
||||
* the terminal, where nothing can see it and the water edge is a bare cut.
|
||||
*/
|
||||
quays: [
|
||||
{
|
||||
id: "pier-400",
|
||||
deckHeight: 4,
|
||||
polygon: [
|
||||
[33.7284, -118.2516],
|
||||
[33.7157, -118.2493],
|
||||
[33.7158, -118.2481],
|
||||
[33.7286, -118.2503],
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "pier-300",
|
||||
deckHeight: 4,
|
||||
polygon: [
|
||||
[33.7382, -118.2448],
|
||||
[33.738, -118.2552],
|
||||
[33.7391, -118.2553],
|
||||
[33.7393, -118.2448],
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "east-basin",
|
||||
deckHeight: 4,
|
||||
polygon: [
|
||||
[33.7594, -118.2379],
|
||||
[33.7666, -118.2376],
|
||||
[33.7665, -118.2363],
|
||||
[33.7594, -118.2366],
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "west-basin",
|
||||
deckHeight: 4,
|
||||
polygon: [
|
||||
[33.7603, -118.2629],
|
||||
[33.7655, -118.2658],
|
||||
[33.7651, -118.267],
|
||||
[33.7598, -118.264],
|
||||
],
|
||||
},
|
||||
],
|
||||
/**
|
||||
* Berths, for the vessel layer that will lie hulls along them.
|
||||
*
|
||||
* `bearing` is the bow of a ship alongside, and it is authored here rather
|
||||
* than read off the wire because the wire cannot answer it: of 150 vessels in
|
||||
* the store sitting under half a knot, only 75 report a usable heading and 21
|
||||
* report neither heading nor course. A berth has one answer and it never
|
||||
* changes.
|
||||
*/
|
||||
berths: [
|
||||
{ id: "lax-401", lat: 33.7268, lng: -118.2518, bearing: 171.6, maxLength: 400, quayId: "pier-400" },
|
||||
{ id: "lax-402", lat: 33.7236, lng: -118.2512, bearing: 171.6, maxLength: 400, quayId: "pier-400" },
|
||||
{ id: "lax-403", lat: 33.7204, lng: -118.2507, bearing: 171.6, maxLength: 400, quayId: "pier-400" },
|
||||
{ id: "lax-404", lat: 33.7172, lng: -118.2501, bearing: 171.6, maxLength: 400, quayId: "pier-400" },
|
||||
{ id: "lax-306", lat: 33.7378, lng: -118.2474, bearing: 268.9, maxLength: 366, quayId: "pier-300" },
|
||||
{ id: "lax-305", lat: 33.7377, lng: -118.2526, bearing: 268.9, maxLength: 366, quayId: "pier-300" },
|
||||
{ id: "lax-226", lat: 33.7612, lng: -118.2383, bearing: 2.3, maxLength: 335, quayId: "east-basin" },
|
||||
{ id: "lax-232", lat: 33.7648, lng: -118.2381, bearing: 2.3, maxLength: 335, quayId: "east-basin" },
|
||||
{ id: "lax-136", lat: 33.7618, lng: -118.2632, bearing: 334.9, maxLength: 366, quayId: "west-basin" },
|
||||
{ id: "lax-142", lat: 33.7644, lng: -118.2646, bearing: 334.9, maxLength: 366, quayId: "west-basin" },
|
||||
],
|
||||
/**
|
||||
* Crane rows. Forty gantries in four records.
|
||||
*
|
||||
* `height` is rail to the top of the portal beam; the raised boom tip stands
|
||||
* about half as high again, which at this board's 3.4x exaggeration is 1.13
|
||||
* scene units — taller than a 400 m ship is long. `idleFraction` is taken from
|
||||
* the far end of each rail by `craneStations`, so a partly-worked berth looks
|
||||
* like a block of booms down over a ship and the rest stood off, which is what
|
||||
* one looks like.
|
||||
*/
|
||||
cranes: [
|
||||
{
|
||||
id: "pier-400",
|
||||
from: [33.7284, -118.2514],
|
||||
to: [33.7157, -118.2492],
|
||||
count: 18,
|
||||
bearing: 261.6,
|
||||
height: 82,
|
||||
outreach: 72,
|
||||
idleFraction: 0.17,
|
||||
},
|
||||
{
|
||||
id: "pier-300",
|
||||
from: [33.7384, -118.2448],
|
||||
to: [33.7382, -118.2553],
|
||||
count: 8,
|
||||
bearing: 178.9,
|
||||
height: 78,
|
||||
outreach: 68,
|
||||
idleFraction: 0.38,
|
||||
},
|
||||
{
|
||||
id: "east-basin",
|
||||
from: [33.7594, -118.2377],
|
||||
to: [33.7666, -118.2374],
|
||||
count: 6,
|
||||
bearing: 272.3,
|
||||
height: 74,
|
||||
outreach: 61,
|
||||
idleFraction: 0.5,
|
||||
},
|
||||
{
|
||||
id: "west-basin",
|
||||
from: [33.7602, -118.263],
|
||||
to: [33.7655, -118.266],
|
||||
count: 8,
|
||||
bearing: 64.9,
|
||||
height: 78,
|
||||
outreach: 68,
|
||||
idleFraction: 0.25,
|
||||
},
|
||||
],
|
||||
/**
|
||||
* The yards. `emptyShare` is 0.757 on every one of them — 348,691 of 460,467
|
||||
* — and it is the number the atlas paints, not a number in a caption.
|
||||
*/
|
||||
yards: [
|
||||
{ id: "pier-400", lat: 33.7223, lng: -118.2433, length: 1420, width: 1130, bearing: 172, emptyShare: 0.757 },
|
||||
{ id: "pier-300", lat: 33.7412, lng: -118.252, length: 1210, width: 600, bearing: 90, emptyShare: 0.757 },
|
||||
{ id: "east-basin", lat: 33.761, lng: -118.2351, length: 820, width: 480, bearing: 2, emptyShare: 0.757 },
|
||||
{ id: "west-basin", lat: 33.753, lng: -118.2649, length: 1260, width: 570, bearing: 350, emptyShare: 0.757 },
|
||||
/**
|
||||
* The on-dock rail yard in the middle of the island, and **the one rectangle
|
||||
* here with no `emptyShare` on it**.
|
||||
*
|
||||
* Nobody publishes what is standing in it. `emptyShare` absent is what the
|
||||
* type means by unknown, and `yardAtlas` draws an unknown yard in one flat
|
||||
* colour rather than in a plausible-looking mix — so the board carries a
|
||||
* visible difference between a number that was measured and a number that
|
||||
* was not, which is the whole discipline this product is trying to keep.
|
||||
*/
|
||||
{ id: "rail-yard", lat: 33.7498, lng: -118.2502, length: 1150, width: 470, bearing: 350 },
|
||||
],
|
||||
/** July 2026. `asOf` is the month these counts describe and is never "now". */
|
||||
throughput: {
|
||||
asOf: "2026-07",
|
||||
loadedExport: 111_776,
|
||||
emptyExport: 348_691,
|
||||
loadedImport: 499_552,
|
||||
emptyImport: 446,
|
||||
},
|
||||
/**
|
||||
* The explanation, from a different collector entirely.
|
||||
*
|
||||
* No timestamp, deliberately: the store's `observed_at` is our own read clock,
|
||||
* Freightos publishes none, and a card that renders it as "as of" is lying
|
||||
* about a precision nobody has.
|
||||
*/
|
||||
rates: [
|
||||
{ id: "FBX01", lane: "China / East Asia to North America West Coast", usdPerFeu: 7_491 },
|
||||
{ id: "FBX02", lane: "North America West Coast to China / East Asia", usdPerFeu: 347 },
|
||||
],
|
||||
};
|
||||
|
||||
/**
|
||||
* The Port of Long Beach — Pier T, on the east end of Terminal Island.
|
||||
*
|
||||
* The former Naval Station, and the half of the island that is in a different
|
||||
* city. It is here as much for what it proves as for what it shows: it shares
|
||||
* every mesh with Los Angeles, so the second port on this board costs no extra
|
||||
* draw call at all. See `createPorts`.
|
||||
*
|
||||
* No `breakwater` of its own — the arms on `LOS_ANGELES` are one federal
|
||||
* structure across the whole bay and drawing them twice would double the
|
||||
* geometry for an identical picture. No `throughput`, for the reason given at
|
||||
* the head of this block.
|
||||
*/
|
||||
export const LONG_BEACH: Port = {
|
||||
id: "USLGB",
|
||||
name: "Port of Long Beach",
|
||||
lat: 33.7529,
|
||||
lng: -118.2181,
|
||||
harborType: "CB",
|
||||
channel: [
|
||||
[33.7235, -118.1885], // in through Queens Gate
|
||||
[33.736, -118.1955],
|
||||
[33.746, -118.203],
|
||||
[33.753, -118.206],
|
||||
[33.758, -118.214],
|
||||
[33.7637, -118.223], // under the Long Beach International Gateway
|
||||
[33.7709, -118.233], // and away west up the Back Channel
|
||||
],
|
||||
quays: [
|
||||
{
|
||||
id: "pier-t",
|
||||
deckHeight: 4,
|
||||
polygon: [
|
||||
[33.759, -118.2205],
|
||||
[33.755, -118.2133],
|
||||
[33.7541, -118.214],
|
||||
[33.7581, -118.2212],
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "pier-t-east",
|
||||
deckHeight: 4,
|
||||
polygon: [
|
||||
[33.7541, -118.2126],
|
||||
[33.7476, -118.2109],
|
||||
[33.7473, -118.2122],
|
||||
[33.7539, -118.2139],
|
||||
],
|
||||
},
|
||||
],
|
||||
berths: [
|
||||
{ id: "lgb-t132", lat: 33.7586, lng: -118.219, bearing: 123.6, maxLength: 400, quayId: "pier-t" },
|
||||
{ id: "lgb-t136", lat: 33.7573, lng: -118.2166, bearing: 123.6, maxLength: 400, quayId: "pier-t" },
|
||||
{ id: "lgb-t140", lat: 33.756, lng: -118.2142, bearing: 123.6, maxLength: 400, quayId: "pier-t" },
|
||||
{ id: "lgb-s101", lat: 33.7526, lng: -118.2117, bearing: 168, maxLength: 335, quayId: "pier-t-east" },
|
||||
{ id: "lgb-s105", lat: 33.7493, lng: -118.2109, bearing: 168, maxLength: 335, quayId: "pier-t-east" },
|
||||
],
|
||||
cranes: [
|
||||
{
|
||||
id: "pier-t",
|
||||
from: [33.7588, -118.2206],
|
||||
to: [33.7548, -118.2134],
|
||||
count: 10,
|
||||
bearing: 33.6,
|
||||
height: 84,
|
||||
outreach: 74,
|
||||
idleFraction: 0.2,
|
||||
},
|
||||
{
|
||||
id: "pier-t-east",
|
||||
from: [33.7541, -118.2128],
|
||||
to: [33.7475, -118.2111],
|
||||
count: 6,
|
||||
bearing: 78,
|
||||
height: 76,
|
||||
outreach: 64,
|
||||
// The quiet frontage. Five of six booms up is what an east-facing berth
|
||||
// with nothing alongside looks like, and it is the cheapest way this board
|
||||
// has of saying that a port is not uniformly busy.
|
||||
idleFraction: 0.83,
|
||||
},
|
||||
],
|
||||
yards: [
|
||||
{ id: "pier-t", lat: 33.753, lng: -118.2214, length: 1210, width: 710, bearing: 124, emptyShare: 0.765 },
|
||||
{ id: "pier-t-east", lat: 33.7484, lng: -118.2132, length: 480, width: 240, bearing: 168, emptyShare: 0.765 },
|
||||
],
|
||||
};
|
||||
|
||||
export const PORTS = [LOS_ANGELES, LONG_BEACH];
|
||||
|
||||
// ---- Airports -------------------------------------------------------------
|
||||
|
||||
/**
|
||||
@@ -3129,11 +3582,21 @@ export const DISTRICTS: District[] = [
|
||||
},
|
||||
{
|
||||
id: "san-pedro",
|
||||
// The eastern edge is the Main Channel, and it is drawn that way on purpose.
|
||||
// This polygon used to be a plain quad reaching to -118.235, which put the
|
||||
// whole of Terminal Island inside it — so the busiest container terminal in
|
||||
// the hemisphere came out as three dozen generic industrial blocks,
|
||||
// indistinguishable from the housing across the water. `engine/ports.ts`
|
||||
// draws what is actually there. Vertices 3 and 4 run the boundary down the
|
||||
// middle of the channel: San Pedro's own waterfront at about -118.2755 stays
|
||||
// inside it, Terminal Island's west shore at -118.2708 stays outside.
|
||||
name: "San Pedro & Wilmington",
|
||||
polygon: [
|
||||
[33.795, -118.305],
|
||||
[33.79, -118.235],
|
||||
[33.708, -118.246],
|
||||
[33.7745, -118.238],
|
||||
[33.7745, -118.272],
|
||||
[33.708, -118.276],
|
||||
[33.713, -118.31],
|
||||
],
|
||||
minHeight: 11,
|
||||
@@ -3169,6 +3632,11 @@ export const DISTRICTS: District[] = [
|
||||
// any case. Vertices 2-9 walk down the corridor, round the field, and back
|
||||
// up it.
|
||||
name: "Long Beach",
|
||||
// The last vertex moved north from 33.758 to 33.7695 for the reason the San
|
||||
// Pedro polygon's east edge moved: at -118.238 the old south edge sat at
|
||||
// 33.7579, which is below Terminal Island's East Basin and put lots on the
|
||||
// Everport quay. Everything between the old line and the new one is water —
|
||||
// the Long Beach shoreline there is at 33.766 — so nothing real was lost.
|
||||
polygon: [
|
||||
[33.868, -118.23],
|
||||
[33.8653, -118.166],
|
||||
@@ -3181,7 +3649,7 @@ export const DISTRICTS: District[] = [
|
||||
[33.865, -118.161],
|
||||
[33.862, -118.09],
|
||||
[33.752, -118.102],
|
||||
[33.758, -118.24],
|
||||
[33.7695, -118.24],
|
||||
],
|
||||
minHeight: 12,
|
||||
maxHeight: 124,
|
||||
@@ -3570,7 +4038,7 @@ export const CHAPTERS: City["chapters"] = [
|
||||
rotation: -0.9,
|
||||
},
|
||||
description:
|
||||
"San Pedro, Terminal Island and Long Beach around one basin, with the peninsula rising behind them. The busiest port complex in the hemisphere, and the only two bridges on this map that cross water.",
|
||||
"Three of every four boxes that left Los Angeles in July 2026 left empty \u2014 348,691 of 460,467 \u2014 because a container is worth $7,491 coming east across the Pacific and $347 going back. The pale stacks in these yards are that number. San Pedro, Terminal Island and Long Beach around one basin, behind thirteen kilometres of federal breakwater.",
|
||||
},
|
||||
{
|
||||
id: "orange-county",
|
||||
@@ -3676,6 +4144,13 @@ export const SOCAL_CITY: City = {
|
||||
* floats a dark stripe over every runway the kit lays flush.
|
||||
*/
|
||||
airports: AIRPORTS,
|
||||
|
||||
/**
|
||||
* San Pedro Bay, drawn by `engine/ports.ts`. Two ports, one federal
|
||||
* breakwater, fifty-six gantries and six container yards — in four draw calls,
|
||||
* because every bucket merges across both ports.
|
||||
*/
|
||||
ports: PORTS,
|
||||
landmarks: LANDMARKS,
|
||||
bridges: BRIDGES,
|
||||
roads: ROADS,
|
||||
|
||||
Reference in New Issue
Block a user