@johnmorrisdotca/kyogijo-stadiums 0.45.3 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/NOTICE.md +9 -2
- package/dist/areas.d.ts +4 -0
- package/dist/areas.js +33 -1
- package/dist/cityctx.belmont-park.data.d.ts +3 -0
- package/dist/cityctx.belmont-park.data.js +1802 -0
- package/dist/cityctx.data.d.ts +10 -1
- package/dist/cityctx.data.js +11 -2
- package/dist/cityctx.js +19 -1
- package/dist/cityctx.meadowlands.data.d.ts +3 -0
- package/dist/cityctx.meadowlands.data.js +820 -0
- package/dist/cityctx.montreal-city.data.d.ts +3 -0
- package/dist/cityctx.montreal-city.data.js +2899 -0
- package/dist/cityctx.montreal-downtown.data.d.ts +3 -0
- package/dist/cityctx.montreal-downtown.data.js +3004 -0
- package/dist/cityctx.montreal-olympic.data.d.ts +3 -0
- package/dist/cityctx.montreal-olympic.data.js +2562 -0
- package/dist/cityctx.nyc-bronx.data.d.ts +3 -0
- package/dist/cityctx.nyc-bronx.data.js +1671 -0
- package/dist/cityctx.nyc-brooklyn.data.d.ts +3 -0
- package/dist/cityctx.nyc-brooklyn.data.js +3485 -0
- package/dist/cityctx.nyc-flushing.data.d.ts +3 -0
- package/dist/cityctx.nyc-flushing.data.js +865 -0
- package/dist/cityctx.nyc-midtown.data.d.ts +3 -0
- package/dist/cityctx.nyc-midtown.data.js +2438 -0
- package/dist/crowd.d.ts +22 -2
- package/dist/district.js +1 -1
- package/dist/draw.js +2 -2
- package/dist/flythrough.dom.d.ts +2 -0
- package/dist/flythrough.dom.js +2 -2
- package/dist/stadiums.d.ts +35 -4
- package/dist/stadiums.data.js +60 -0
- package/dist/stadiums.js +31 -5
- package/dist/stadiums.osm.data.js +224 -2
- package/dist/strings.core.d.ts +1 -0
- package/dist/strings.en.js +1 -1
- package/dist/strings.ja.js +1 -1
- package/dist/turn.kit.d.ts +14 -1
- package/dist/turn.kit.js +19 -0
- package/dist/turn.style.js +16 -3
- package/dist/venue.js +3 -1
- package/dist/venue.real.d.ts +45 -1
- package/dist/venue.real.js +225 -15
- package/dist/venues/american-airlines-center.data.js +1 -1
- package/dist/venues.d.ts +2 -2
- package/dist/venues.data.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/dist/crowd.d.ts
CHANGED
|
@@ -118,11 +118,11 @@ export interface RealShell {
|
|
|
118
118
|
/** The way north points on the page, in degrees clockwise from the top; absent where the rink's real orientation is not known. */
|
|
119
119
|
north?: number;
|
|
120
120
|
/**
|
|
121
|
-
* `fixed` is a lid; `saddle` a roof that rises at the two ends and falls at the two sides; `cable` a cable-supported roof with an opening over the surface, which a retractable fabric closes (BC Place's);
|
|
121
|
+
* `fixed` is a lid; `saddle` a roof that rises at the two ends and falls at the two sides; `barrel` a barrel vault, a round arch along the surface that stands highest over its middle line and falls to the walls at the two sides; `cable` a cable-supported roof with an opening over the surface, which a retractable fabric closes (BC Place's);
|
|
122
122
|
* `canopy` roofs over some of the stands and leaves the field open (Lumen Field's, `canopies`); `panels` a retractable roof of sections over a ballpark's field and stands, far above its walls (T-Mobile Park's, `panels`);
|
|
123
123
|
* `dome` an air-supported roof, a membrane that rises from the rim of the walls to a crown over the middle of the field (Tokyo Dome's, `dome`); `open` no roof: the walls only (Koshien Stadium's).
|
|
124
124
|
*/
|
|
125
|
-
roof: "fixed" | "saddle" | "cable" | "canopy" | "panels" | "dome" | "open";
|
|
125
|
+
roof: "fixed" | "saddle" | "barrel" | "cable" | "canopy" | "panels" | "dome" | "open";
|
|
126
126
|
/** The height of the walls, in feet, where it is not the roof's rim (a ballpark's walls stand far below its roof). */
|
|
127
127
|
wall?: number;
|
|
128
128
|
/** A `canopy` roof's pieces: the outline of each in the drawing's frame, the height of its low edge (over the field's side) and how far it rises to its high edge (over the back of the stands), in feet. */
|
|
@@ -130,6 +130,7 @@ export interface RealShell {
|
|
|
130
130
|
ring: Pt[];
|
|
131
131
|
low: number;
|
|
132
132
|
rise: number;
|
|
133
|
+
shape?: string;
|
|
133
134
|
}[];
|
|
134
135
|
/** A `panels` roof: the outline it covers when closed, its bottom and its top above the field in feet (rim and crown), and where its sections rest when it is open. */
|
|
135
136
|
panels?: {
|
|
@@ -144,6 +145,8 @@ export interface RealShell {
|
|
|
144
145
|
low: number;
|
|
145
146
|
crown: number;
|
|
146
147
|
};
|
|
148
|
+
/** Draw the walls as brick (a ballpark's facade, T-Mobile Park's: from the brief; a plain drawing choice, a wall in a brick tone, no courses). */
|
|
149
|
+
brick?: boolean;
|
|
147
150
|
/** Draw the walls as ivy-covered (a plain drawing choice: the wall in green). */
|
|
148
151
|
ivy?: boolean;
|
|
149
152
|
/** A `cable` roof: how far its crown (the edge of the opening) stands over its rim, in feet, and the opening, a polygon in the drawing's frame over the surface. */
|
|
@@ -160,8 +163,25 @@ export interface RealShell {
|
|
|
160
163
|
count: number;
|
|
161
164
|
height: number;
|
|
162
165
|
};
|
|
166
|
+
/**
|
|
167
|
+
* A tower that leans over the building (the Olympic Stadium's Montreal Tower): the middle of its base and of its top in the drawing's frame, the height of its top above the surface in feet, and the width of its shaft at the
|
|
168
|
+
* base and at the top in feet (a plain tapering square shaft: its width is ours).
|
|
169
|
+
*/
|
|
170
|
+
tower?: {
|
|
171
|
+
base: Pt;
|
|
172
|
+
top: Pt;
|
|
173
|
+
height: number;
|
|
174
|
+
angle: number;
|
|
175
|
+
width: [number, number];
|
|
176
|
+
};
|
|
163
177
|
/** The height of the roof's lowest edge above the surface, in feet. */
|
|
164
178
|
edge: number;
|
|
179
|
+
/** Towers that stand apart from the bowl (Lumen Field's, at the open end), each a box on its outline in the drawing's frame, `height` feet high; `face` is the unit direction its scoreboard looks, towards the field. */
|
|
180
|
+
towers?: {
|
|
181
|
+
ring: Pt[];
|
|
182
|
+
height: number;
|
|
183
|
+
face: Pt;
|
|
184
|
+
}[];
|
|
165
185
|
}
|
|
166
186
|
/** The stands of a real venue, worked out from its building (`venueBowl`): what `layoutOf` takes in place of a sport's usual tiers. */
|
|
167
187
|
export interface RealBowl {
|
package/dist/district.js
CHANGED
|
@@ -47,7 +47,7 @@ const stadiumMember = (stadium, config, language) => {
|
|
|
47
47
|
heading: stadiumFrameHeading(stadium),
|
|
48
48
|
basis: stadium.osm.axis.basis,
|
|
49
49
|
seats: stadiumSeats(stadium, config),
|
|
50
|
-
options: park ? { sport: "mlb", park: stadium.id, crowd: { real: true }, language } : { sport: config, stadium: stadium.id, crowd: { real: true }, language },
|
|
50
|
+
options: park ? { sport: "mlb", park: stadium.id, crowd: { real: true }, language } : { sport: config, stadium: stadium.id, ...(config === "nba" ? { arena: stadium.id } : {}), crowd: { real: true }, language },
|
|
51
51
|
};
|
|
52
52
|
};
|
|
53
53
|
/** Every key a district can be asked for: the arenas of `VENUES` and the stadiums of `STADIUMS`. */
|
package/dist/draw.js
CHANGED
|
@@ -789,8 +789,8 @@ export function describe(o) {
|
|
|
789
789
|
const venue = sport === "nhl" && league === undefined && realCrowd?.real === true ? venueById(o.arena) : undefined;
|
|
790
790
|
const realLine = venue === undefined || arenaName === undefined ? "" : `${gap}${fill(words.said.real, { arena: arenaName, seats: String(venue.seats.hockey), tiers: String(venue.tiers.count) })}${gap}${words.said[venue.osm.axis.basis === "mapped" ? "realMapped" : venue.osm.axis.basis === "building" ? "realBuilding" : "realNone"]}`;
|
|
791
791
|
const real = realStadiumOf(o, sport, realCrowd?.real === true);
|
|
792
|
-
const stadiumKey = (basis, kind) => basis === "opening" ? "stadiumOpening" : basis === "pitch" ? (kind === "park" ? "stadiumPitchPark" : "stadiumPitch") : basis === "infield" ? "stadiumInfield" : basis === "building" ? (kind === "hall" ? "stadiumRingBuilding" : "stadiumBuilding") : kind === "park" ? "stadiumNonePark" : "stadiumNone";
|
|
793
|
-
const stadiumLine = real === undefined ? "" : `${gap}${fill(real.config === "mlb" ? words.said.stadiumPark : stadiumKind(real.stadium) === "hall" ? words.said.stadiumHall : words.said.stadium, { stadium: stadiumNames(real.stadium)[language], seats: String(stadiumSeats(real.stadium, real.config)), tiers: String(real.stadium.tiers.count) })}${gap}${words.said[stadiumKey(real.stadium.osm.axis.basis, stadiumKind(real.stadium))]}`;
|
|
792
|
+
const stadiumKey = (basis, kind, config) => basis === "opening" ? "stadiumOpening" : basis === "pitch" ? (kind === "park" ? "stadiumPitchPark" : "stadiumPitch") : basis === "infield" ? "stadiumInfield" : basis === "building" ? (kind === "hall" ? (config === "nba" ? "stadiumCourtBuilding" : "stadiumRingBuilding") : "stadiumBuilding") : kind === "park" ? "stadiumNonePark" : "stadiumNone";
|
|
793
|
+
const stadiumLine = real === undefined ? "" : `${gap}${fill(real.config === "mlb" ? words.said.stadiumPark : stadiumKind(real.stadium) === "hall" ? words.said.stadiumHall : words.said.stadium, { stadium: stadiumNames(real.stadium)[language], seats: String(stadiumSeats(real.stadium, real.config)), tiers: String(real.stadium.tiers.count) })}${gap}${words.said[stadiumKey(real.stadium.osm.axis.basis, stadiumKind(real.stadium), real.config)]}`;
|
|
794
794
|
const parkLine = (parkName === undefined ? `${groundLine}${halfLine}${arenaLine}${realLine}${stadiumLine}` : `${gap}${fill(words.said.park, { park: parkName })}${officially(parkOfficial)}${ballpark === undefined ? "" : ballparkSentences(ballpark).map((line) => `${gap}${line}`).join("")}${stadiumLine}`) + (special === undefined ? "" : `${gap}${special.text}`);
|
|
795
795
|
// A drawing of a past season says which: the markings are those of that season.
|
|
796
796
|
const dated = typeof o.year === "number" && Number.isFinite(o.year);
|
package/dist/flythrough.dom.d.ts
CHANGED
|
@@ -38,6 +38,8 @@ export interface FlythroughOptions<M extends {
|
|
|
38
38
|
language?: Language;
|
|
39
39
|
/** `light` or `dark`; the device's setting decides when it is left out. */
|
|
40
40
|
theme?: "light" | "dark";
|
|
41
|
+
/** Whether the building has its roof (true when left out): the roof is there over the arena and lifts away as the camera comes into the bowl. `false` keeps the roof off for the whole flight, the walls still standing, so that the bowl is seen from the first stage of the arena. */
|
|
42
|
+
roof?: boolean;
|
|
41
43
|
}
|
|
42
44
|
/** How it behaves. */
|
|
43
45
|
export interface FlythroughSettings {
|
package/dist/flythrough.dom.js
CHANGED
|
@@ -93,7 +93,7 @@ export function mountFlythrough(host, options, settings = {}) {
|
|
|
93
93
|
const drawing = { sport: "nhl", arena: venue.id, crowd: { real: true }, language, ...(options.theme === undefined ? {} : { theme: options.theme }) };
|
|
94
94
|
let turn;
|
|
95
95
|
// The settings object is kept: the view reads its `lens` at every paint, and the path shortens the lens as the camera comes into the bowl.
|
|
96
|
-
const turnSettings = { preset: "overhead", controls: false, venue: { roof: true }, motion: "none", id: `${id}-turn`, lens: LENS };
|
|
96
|
+
const turnSettings = { preset: "overhead", controls: false, venue: { roof: options.roof !== false, walls: true }, motion: "none", id: `${id}-turn`, lens: LENS };
|
|
97
97
|
if (stageList.some((one) => one === "arena" || one === "bowl" || one === "rink" || one === "game"))
|
|
98
98
|
turn = mountKyogijoTurn(turnHost, drawing, turnSettings);
|
|
99
99
|
// ---- The game: a plane that lies on the floor of the 3D arena, with the play's dots drawn on it by the replay's own layers. It takes the floor's own transform after every paint, and stands in the same layer of the stack
|
|
@@ -228,7 +228,7 @@ export function mountFlythrough(host, options, settings = {}) {
|
|
|
228
228
|
if (live3d && turn !== undefined) {
|
|
229
229
|
put("3d", turnHost, "opacity", num(cam.arena, 3));
|
|
230
230
|
put("3d", turnHost, "--kf-roof", num(cam.roof, 3));
|
|
231
|
-
put("3d", turnHost, "@data-roof", cam.roof > 0.004 ? "1" : "0");
|
|
231
|
+
put("3d", turnHost, "@data-roof", options.roof !== false && cam.roof > 0.004 ? "1" : "0");
|
|
232
232
|
const view = `${num(cam.yaw, 3)}|${num(cam.pitch, 3)}|${num(cam.logZoom, 4)}|${num(cam.logLens, 4)}`;
|
|
233
233
|
if (written["3d:view"] !== view) {
|
|
234
234
|
written["3d:view"] = view;
|
package/dist/stadiums.d.ts
CHANGED
|
@@ -5,8 +5,8 @@ import { VENUE_ATTRIBUTION } from "./venues.ts";
|
|
|
5
5
|
export { VENUE_ATTRIBUTION };
|
|
6
6
|
/** How a fact is known: `documented` is what a source cited with it says; `plausible` is ours, for a bowl no source describes. */
|
|
7
7
|
export type StadiumBasis = "documented" | "plausible";
|
|
8
|
-
/** The configurations of a stadium: the field the seats are counted for. `cfl` and `nfl` are the football fields of the two leagues, `soccer` a soccer pitch, `mlb` a baseball field, `boxing` a boxing ring in a hall. */
|
|
9
|
-
export type StadiumConfigId = "cfl" | "nfl" | "soccer" | "mlb" | "boxing";
|
|
8
|
+
/** The configurations of a stadium: the field the seats are counted for. `cfl` and `nfl` are the football fields of the two leagues, `soccer` a soccer pitch, `mlb` a baseball field, `boxing` a boxing ring in a hall, `nba` a basketball court in a hall (an arena that stages basketball, Barclays Center). */
|
|
9
|
+
export type StadiumConfigId = "cfl" | "nfl" | "soccer" | "mlb" | "boxing" | "nba";
|
|
10
10
|
/** What a stadium is: a `stadium` has a football field and a soccer pitch lying along its length, a `park` is a baseball park, whose frame is home plate's, a `hall` is a hall with a ring in the middle and the seats round it. */
|
|
11
11
|
export type StadiumKind = "stadium" | "park" | "hall";
|
|
12
12
|
/**
|
|
@@ -60,6 +60,7 @@ export interface RealStadiumData {
|
|
|
60
60
|
looks?: {
|
|
61
61
|
ivyWalls?: string;
|
|
62
62
|
dirtInfield?: string;
|
|
63
|
+
brickWalls?: string;
|
|
63
64
|
};
|
|
64
65
|
configs: Partial<Record<StadiumConfigId, StadiumConfigData>>;
|
|
65
66
|
/** The seats of the whole bowl where it holds more than a configuration's (Lumen Field's soccer seats are fewer: the upper sections are closed): the bowl is fitted to these and a configuration opens its seats from the lowest bowl up. */
|
|
@@ -80,6 +81,14 @@ export interface RealStadiumData {
|
|
|
80
81
|
};
|
|
81
82
|
read: string;
|
|
82
83
|
};
|
|
84
|
+
/** A tower that leans over the stadium (the Olympic Stadium's Montreal Tower): its height and its inclination, as the article gives them. The tower's footprint is `StadiumOsm.tower`. */
|
|
85
|
+
tower?: {
|
|
86
|
+
height: number;
|
|
87
|
+
unit: "m";
|
|
88
|
+
angle: number;
|
|
89
|
+
basis: StadiumBasis;
|
|
90
|
+
read: string;
|
|
91
|
+
};
|
|
83
92
|
/** The building's lower band, a podium under the concourse levels: its height in feet and how it is known (ours where the sources do not say). */
|
|
84
93
|
facade?: {
|
|
85
94
|
podium: number;
|
|
@@ -87,6 +96,15 @@ export interface RealStadiumData {
|
|
|
87
96
|
basis: StadiumBasis;
|
|
88
97
|
read: string;
|
|
89
98
|
};
|
|
99
|
+
/** A tower standing apart from the bowl, `endTower` (Lumen Field's, at the open north end): the storeys the article gives, and ours (`plausible`) the height in metres, the footprint in metres, and how far it stands along the field's axis from the middle of the pitch, in metres (positive towards the heading of the axis). */
|
|
100
|
+
endTower?: {
|
|
101
|
+
storeys: number;
|
|
102
|
+
height: number;
|
|
103
|
+
size: [number, number];
|
|
104
|
+
along: number;
|
|
105
|
+
basis: StadiumBasis;
|
|
106
|
+
read: string;
|
|
107
|
+
};
|
|
90
108
|
roof: {
|
|
91
109
|
kind: StadiumRoof;
|
|
92
110
|
basis: StadiumBasis;
|
|
@@ -137,9 +155,22 @@ export interface StadiumOsm {
|
|
|
137
155
|
canopies?: {
|
|
138
156
|
source: string;
|
|
139
157
|
height: number;
|
|
140
|
-
rise: number;
|
|
158
|
+
rise: number; /** OpenStreetMap's `roof:shape` where the roof has one (`round` for Lumen Field's two). */
|
|
159
|
+
shape?: string;
|
|
141
160
|
ring: [number, number][];
|
|
142
161
|
}[];
|
|
162
|
+
/**
|
|
163
|
+
* The tower OpenStreetMap maps beside the building, where the stadium has one (`RealStadiumData.tower`): its footprint (the tower's shaft seen from above, with its base) as `[longitude, latitude]`, the height OpenStreetMap
|
|
164
|
+
* maps for it in metres, and the two ends of its axis worked out from them: the base, the footprint's point farthest from the middle of the building, and the top, 165 m up, which lies over the building (the shaft leans over
|
|
165
|
+
* it at the inclination the article gives, so its top is that many metres from the base, towards the middle of the building).
|
|
166
|
+
*/
|
|
167
|
+
tower?: {
|
|
168
|
+
source: string;
|
|
169
|
+
height: number;
|
|
170
|
+
ring: [number, number][];
|
|
171
|
+
base: [number, number];
|
|
172
|
+
top: [number, number];
|
|
173
|
+
};
|
|
143
174
|
/** The building's outline as `[longitude, latitude]`, not repeating its first point. */
|
|
144
175
|
ring: [number, number][];
|
|
145
176
|
/**
|
|
@@ -191,7 +222,7 @@ export declare function stadiumNames(stadium: RealStadium): {
|
|
|
191
222
|
export declare const stadiumFrameHeading: (stadium: RealStadium) => number;
|
|
192
223
|
/** How the field lies in a stadium's building (see `StadiumOsm.axis`). */
|
|
193
224
|
export declare const stadiumOrientation: (stadium: RealStadium) => StadiumOrientation;
|
|
194
|
-
/** The configuration a sport is: `cfl`, `nfl`, `soccer`, `mlb` or `
|
|
225
|
+
/** The configuration a sport is: `cfl`, `nfl`, `soccer`, `mlb`, `boxing` or `nba`, or `undefined` for a sport a stadium has no configuration for. */
|
|
195
226
|
export declare const stadiumConfigOf: (sport: string | undefined) => StadiumConfigId | undefined;
|
|
196
227
|
/** The seats of a stadium for a configuration (0 for one it has none of). */
|
|
197
228
|
export declare const stadiumSeats: (stadium: RealStadium, config: StadiumConfigId) => number;
|
package/dist/stadiums.data.js
CHANGED
|
@@ -22,6 +22,7 @@ export const STADIUM_DATA = [
|
|
|
22
22
|
"wikidataSeats": [67000, 72000],
|
|
23
23
|
"tiers": { "count": 3, "basis": "documented", "read": "the article names the lower concourse levels, the club and suite levels and the Summit levels above them" },
|
|
24
24
|
"roof": { "kind": "canopy", "basis": "documented", "cover": 0.7, "read": "the article: a roof of 200,000 square feet that covers 70 percent of the seats and leaves the field open, spanning 720 feet between concrete pylons at the north and south ends" },
|
|
25
|
+
"endTower": { "storeys": 13, "height": 46, "size": [12, 12], "along": 85, "basis": "plausible", "read": "the article: a 13-story tower at the north end, with a vertical scoreboard and the Hawks' Nest bleachers at its base; the storeys are the article's, and the height (46 metres, a storey of 3.5 metres), the footprint (12 by 12 metres), the place (85 metres north of the pitch's middle, on its axis, where the end is open) and the scoreboard's size on its face are ours (no source gives them)" },
|
|
25
26
|
},
|
|
26
27
|
{
|
|
27
28
|
"id": "t-mobile-park",
|
|
@@ -29,6 +30,7 @@ export const STADIUM_DATA = [
|
|
|
29
30
|
"wikidata": "Q1193117",
|
|
30
31
|
"park": "t-mobile-park",
|
|
31
32
|
"en": { "title": "T-Mobile Park", "revision": 1379419810 },
|
|
33
|
+
"looks": { "brickWalls": "the brief (John's, 2026-10-22): the ballpark's facade is brick; the English article does not say so, so it is drawn as a wall in a brick tone, nothing more (no courses, no arches)" },
|
|
32
34
|
"configs": { "mlb": { "sport": "mlb", "seats": 47368, "source": "wikipedia", "read": "the infobox's capacity for baseball, 47,368" } },
|
|
33
35
|
"wikidataSeats": [47476],
|
|
34
36
|
"tiers": { "count": 4, "basis": "documented", "tierSeats": { "lower": 20521, "upper": 22075, "bleachers": 3666 }, "read": "the article's levels: the Main Level of 20,521 seats (most of the lower bowl), the Club Level of 4,123, the Suite Level of 2,050 and the View Level of 15,902, and two bleacher sections of 3,666" },
|
|
@@ -72,4 +74,62 @@ export const STADIUM_DATA = [
|
|
|
72
74
|
"tiers": { "count": 1, "basis": "documented", "read": "the Japanese article: the stands are on one level, the largest of a one-level stand in Japan, the infield stand's 50 rows 14.3 metres high" },
|
|
73
75
|
"roof": { "kind": "open", "basis": "documented", "read": "the English article: the outfield is natural grass and open to the air, no roof over the grounds; the Ginsan roof over the grandstand behind home plate is not drawn" },
|
|
74
76
|
},
|
|
77
|
+
{
|
|
78
|
+
"id": "yankee-stadium",
|
|
79
|
+
"kind": "park",
|
|
80
|
+
"wikidata": "Q753529",
|
|
81
|
+
"park": "yankee-stadium",
|
|
82
|
+
"en": { "title": "Yankee Stadium", "revision": 1382714435 },
|
|
83
|
+
"configs": { "mlb": { "sport": "mlb", "seats": 46537, "source": "wikipedia", "read": "the infobox's capacity for baseball, 46,537 (2020 on; earlier seasons 47,309 to 50,291), the article's own figure for seats, with standing room 52,325; Wikidata's capacity (49,642) is the figure of 2014" } },
|
|
84
|
+
"wikidataSeats": [49642],
|
|
85
|
+
"tiers": { "count": 2, "basis": "documented", "read": "the article: the Field Level and Main Level are the lower bowl, with the suites on the H&R Block Level, and the Upper Level and Grandstand Level the upper bowl; bleacher seats beyond the outfield fences" },
|
|
86
|
+
"roof": { "kind": "open", "basis": "plausible", "read": "the article speaks of a roof only as the support of the top deck's cantilevers and its lighting, with a frieze along the upper deck; nothing says that anything covers the field or the lower bowl, so the drawing is open to the air and leaves the upper deck's roof out" },
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "citi-field",
|
|
90
|
+
"kind": "park",
|
|
91
|
+
"wikidata": "Q1072882",
|
|
92
|
+
"park": "citi-field",
|
|
93
|
+
"en": { "title": "Citi Field", "revision": 1381363029 },
|
|
94
|
+
"configs": { "mlb": { "sport": "mlb", "seats": 41922, "source": "wikipedia", "read": "the infobox's capacity for baseball, 41,922 (2012 on; 41,800 in 2009 to 2011), which Wikidata's capacity (P1083) also gives" } },
|
|
95
|
+
"wikidataSeats": [41922],
|
|
96
|
+
"tiers": { "count": 3, "basis": "plausible", "read": "the article names the Field, the Excelsior and the Promenade levels and says restaurants and clubs are on every level; three bowls are drawn from those names (ours: it does not count them)" },
|
|
97
|
+
"roof": { "kind": "open", "basis": "documented", "read": "the article: the preliminary model of 1998 had a retractable roof and a movable grass field; the ballpark as built has no roof, and the drawing is open to the air" },
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "metlife-stadium",
|
|
101
|
+
"kind": "stadium",
|
|
102
|
+
"wikidata": "Q10862290",
|
|
103
|
+
"ground": "metlife-stadium",
|
|
104
|
+
"gridiron": "nfl",
|
|
105
|
+
"en": { "title": "MetLife Stadium", "revision": 1381185974 },
|
|
106
|
+
"configs": { "nfl": { "sport": "nfl", "seats": 82500, "source": "wikipedia", "read": "the infobox's capacity, 82,500, for both the Giants' and the Jets' games, which Wikidata's capacity (P1083) also gives" }, "soccer": { "sport": "soccer", "seats": 80663, "source": "wikipedia", "read": "the infobox's capacity for the 2026 world cup of soccer, 80,663, 1,837 fewer than its first (the renovation of the lower bowl that widened the field for the tournament)" } },
|
|
107
|
+
"bowlSeats": 82500,
|
|
108
|
+
"wikidataSeats": [82500],
|
|
109
|
+
"tiers": { "count": 3, "basis": "documented", "lowerSeats": 33346, "read": "the article's table of the seating bowl: a lower bowl of 33,346 seats, a mid-bowl of 21,323 and an upper bowl of 27,897" },
|
|
110
|
+
"roof": { "kind": "open", "basis": "documented", "read": "the article: MetLife Stadium does not have a roof, as proposals to include one failed over a dispute for funding" },
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "olympic-stadium-montreal",
|
|
114
|
+
"kind": "park",
|
|
115
|
+
"wikidata": "Q285467",
|
|
116
|
+
"park": "olympic-stadium-montreal",
|
|
117
|
+
"en": { "title": "Olympic Stadium (Montreal)", "revision": 1382141337 },
|
|
118
|
+
"configs": { "mlb": { "sport": "mlb", "seats": 49757, "source": "wikipedia", "read": "the infobox's capacity for baseball, 49,757 (1992 on, after 12,000 seats were taken out and home plate moved closer to the stands in the renovations of 1991); Wikidata's capacity (45,757) is kept beside it" } },
|
|
119
|
+
"wikidataSeats": [45757],
|
|
120
|
+
"tiers": { "count": 2, "basis": "plausible", "read": "no source read says how many seating levels there are: a lower and an upper bowl are drawn, the usual for a stadium of 50,000 seats (ours)" },
|
|
121
|
+
"roof": { "kind": "fixed", "basis": "documented", "read": "the article: the Kevlar roof, which could retract, was removed in May 1998 and a $26 million non-retractable opaque blue roof was installed later that year; a doughnut-shaped permanent ring is the roof's permanent component" },
|
|
122
|
+
"tower": { "height": 165, "unit": "m", "angle": 45, "basis": "documented", "read": "the article: the Montreal Tower, 165 m high, the tallest inclined structure in the world, inclined at 45 degrees and built into the north base of the stadium, from which the cables of the roof were hung; OpenStreetMap maps the building's outline and the same 165 m height, the observatory at its top (a viewpoint) and, as the part of the funicular line that rides on the tower (tagged above ground, its tunnel below), the line of the shaft from its foot to its top: that is 158 m across for 165 m of height, the article's 45 degrees. The slight curve of the shaft and its widths are ours." },
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"id": "barclays-center",
|
|
126
|
+
"kind": "hall",
|
|
127
|
+
"wikidata": "Q807966",
|
|
128
|
+
"names": { "en": "Barclays Center", "ja": "バークレイズ・センター" },
|
|
129
|
+
"en": { "title": "Barclays Center", "revision": 1380399342 },
|
|
130
|
+
"configs": { "nba": { "sport": "nba", "seats": 17732, "source": "wikipedia", "read": "the infobox's capacity for basketball, 17,732, which Wikidata's capacity (P1083) also gives (hockey 15,795, which the NHL's Islanders used until 2020)" } },
|
|
131
|
+
"wikidataSeats": [17732],
|
|
132
|
+
"tiers": { "count": 2, "basis": "plausible", "read": "no source read says how many seating levels there are: a lower and an upper bowl are drawn, the usual for an arena of 17,700 seats (ours)" },
|
|
133
|
+
"roof": { "kind": "fixed", "basis": "documented", "read": "the article speaks of the arena's green roof (an ironworker was killed installing it in 2015) and of a weathering-steel latticework in three articulated bands; the roof is fixed" },
|
|
134
|
+
},
|
|
75
135
|
];
|
package/dist/stadiums.js
CHANGED
|
@@ -55,8 +55,8 @@ const lonLat = (ring) => ring.map(([lon, lat]) => [lon, lat]);
|
|
|
55
55
|
export const stadiumFrameHeading = (stadium) => (stadiumKind(stadium) === "park" ? (stadium.osm.axis.heading + 90) % 360 : stadium.osm.axis.heading);
|
|
56
56
|
/** How the field lies in a stadium's building (see `StadiumOsm.axis`). */
|
|
57
57
|
export const stadiumOrientation = (stadium) => ({ heading: stadium.osm.axis.heading, basis: stadium.osm.axis.basis, north: round(northOn(stadiumFrameHeading(stadium))) });
|
|
58
|
-
/** The configuration a sport is: `cfl`, `nfl`, `soccer`, `mlb` or `
|
|
59
|
-
export const stadiumConfigOf = (sport) => (sport === "cfl" || sport === "nfl" || sport === "soccer" || sport === "mlb" || sport === "boxing" ? sport : undefined);
|
|
58
|
+
/** The configuration a sport is: `cfl`, `nfl`, `soccer`, `mlb`, `boxing` or `nba`, or `undefined` for a sport a stadium has no configuration for. */
|
|
59
|
+
export const stadiumConfigOf = (sport) => (sport === "cfl" || sport === "nfl" || sport === "soccer" || sport === "mlb" || sport === "boxing" || sport === "nba" ? sport : undefined);
|
|
60
60
|
/** The seats of a stadium for a configuration (0 for one it has none of). */
|
|
61
61
|
export const stadiumSeats = (stadium, config) => stadium.configs[config]?.seats ?? 0;
|
|
62
62
|
/**
|
|
@@ -168,6 +168,17 @@ export function planStadium(stadium, config, box) {
|
|
|
168
168
|
mine.set(key, made);
|
|
169
169
|
return made;
|
|
170
170
|
}
|
|
171
|
+
/** A tower of a stadium, in the drawing's frame: its outline (a rectangle with its sides along the field's axes), its height in feet and the direction its scoreboard looks, along an axis, towards the middle of the field. */
|
|
172
|
+
function endTowerOf(tower, heading, middle, place, at) {
|
|
173
|
+
const [dx, dy] = turnedTo(heading, [Math.sin((heading * Math.PI) / 180), Math.cos((heading * Math.PI) / 180)]);
|
|
174
|
+
const c = [middle[0] + dx * tower.along, middle[1] + dy * tower.along];
|
|
175
|
+
const [hw, hh] = [tower.size[0] / 2, tower.size[1] / 2];
|
|
176
|
+
const ring = place([[c[0] - hw, c[1] - hh], [c[0] + hw, c[1] - hh], [c[0] + hw, c[1] + hh], [c[0] - hw, c[1] + hh]]);
|
|
177
|
+
const [mx, my] = [(ring[0][0] + ring[2][0]) / 2, (ring[0][1] + ring[2][1]) / 2];
|
|
178
|
+
const [fx, fy] = [at[0] - mx, at[1] - my];
|
|
179
|
+
const face = Math.abs(fx) >= Math.abs(fy) ? [Math.sign(fx), 0] : [0, Math.sign(fy)];
|
|
180
|
+
return { ring, height: round(tower.height * FEET_PER_METRE), face };
|
|
181
|
+
}
|
|
171
182
|
function plan(stadium, config, rink) {
|
|
172
183
|
const orientation = stadiumOrientation(stadium);
|
|
173
184
|
const origin = middleOf(lonLat(stadium.osm.ring));
|
|
@@ -292,9 +303,11 @@ function plan(stadium, config, rink) {
|
|
|
292
303
|
const mapped = roof?.height === undefined ? 0 : round((roof.height - (roof.rise ?? 0)) * FEET_PER_METRE);
|
|
293
304
|
const edge = stadium.roof.kind === "canopy" ? round(top + CANOPY_CLEARANCE) : Math.max(mapped, top + STADIUM_CLEARANCE);
|
|
294
305
|
const cable = stadium.roof.kind === "cable" && opening !== undefined && rise > 0;
|
|
295
|
-
const canopies = stadium.roof.kind === "canopy" && stadium.osm.canopies !== undefined ? stadium.osm.canopies.map((c) => ({ ring: place(turned(c.ring)), low: round((c.height - c.rise) * FEET_PER_METRE), rise: round(c.rise * FEET_PER_METRE) })) : undefined;
|
|
306
|
+
const canopies = stadium.roof.kind === "canopy" && stadium.osm.canopies !== undefined ? stadium.osm.canopies.map((c) => ({ ring: place(turned(c.ring)), low: round((c.height - c.rise) * FEET_PER_METRE), rise: round(c.rise * FEET_PER_METRE), ...(c.shape === undefined ? {} : { shape: c.shape }) })) : undefined;
|
|
296
307
|
const north = orientation.basis === "none" ? undefined : orientation.north;
|
|
297
308
|
const room = north === undefined ? 0 : NORTH_ROOM;
|
|
309
|
+
// A tower apart from the bowl: a box `along` metres from the middle of the pitch on its axis, its scoreboard on the face that looks at the field.
|
|
310
|
+
const towers = stadium.endTower === undefined ? undefined : [endTowerOf(stadium.endTower, orientation.heading, middle, place, at)];
|
|
298
311
|
const bowl = {
|
|
299
312
|
rings: closing.rings,
|
|
300
313
|
...(closing.sectors.length === 0 ? {} : { closedSectors: closing.sectors }),
|
|
@@ -304,12 +317,13 @@ function plan(stadium, config, rink) {
|
|
|
304
317
|
footprint,
|
|
305
318
|
hall: { ...outer, x0: outer.x0 - HALL, y0: outer.y0 - HALL, x1: outer.x1 + HALL, y1: outer.y1 + HALL, r: outer.r + HALL },
|
|
306
319
|
...(north === undefined ? {} : { north }),
|
|
307
|
-
roof: cable ? "cable" : canopies === undefined ? "fixed" : "canopy",
|
|
320
|
+
roof: cable ? "cable" : canopies === undefined ? (stadium.roof.kind === "open" ? "open" : "fixed") : "canopy",
|
|
308
321
|
edge,
|
|
309
322
|
...(cable ? { crown: { rise, opening } } : {}),
|
|
310
323
|
...(stadium.facade === undefined ? {} : { podium: stadium.facade.podium }),
|
|
311
324
|
...(cable && stadium.roof.masts !== undefined ? { masts: { count: stadium.roof.masts.count, height: round(stadium.roof.masts.height * FEET_PER_METRE) } } : {}),
|
|
312
325
|
...(canopies === undefined ? {} : { canopies }),
|
|
326
|
+
...(towers === undefined ? {} : { towers }),
|
|
313
327
|
},
|
|
314
328
|
};
|
|
315
329
|
return { stadium, config, orientation, box: rink, footprint, opening, bowl, seats: rings.map((ring) => ({ tier: ring.tier, seats: ring.seats })), total, open, seatArea, fit: tight ? "tight" : "fits" };
|
|
@@ -325,6 +339,9 @@ const PARK_PLANS = new WeakMap();
|
|
|
325
339
|
const PARK_COVER = 0.92;
|
|
326
340
|
/** How far an open-air ballpark's walls stand over its top row, in feet (ours). */
|
|
327
341
|
const OPEN_WALL_OVER = 6;
|
|
342
|
+
/** How far a fixed roof's crown stands over its rim, in feet, and the width of a leaning tower's shaft at its base and at its top, in feet (ours: the sources give a roof's kind and a tower's height, not these). */
|
|
343
|
+
const FIXED_CROWN = 30;
|
|
344
|
+
const TOWER_WIDTH = [240, 64];
|
|
328
345
|
const PARK_PARKED = 0.3;
|
|
329
346
|
/**
|
|
330
347
|
* The plan of a ballpark from what its stands are laid from (`input`: the park's fence, the backstop and the crowd): the usual stands with each band as deep as its seats need, the building's outline turned so that home
|
|
@@ -392,7 +409,7 @@ function park(stadium, input) {
|
|
|
392
409
|
const room = north === undefined ? 0 : NORTH_ROOM;
|
|
393
410
|
const hall = { kind: "rrect", x0: fb.x0 - 30, y0: fb.y0 - 30, x1: fb.x1 + 30, y1: fb.y1 + 30, r: 0 };
|
|
394
411
|
const top = Math.max(...stands.rings.map((r) => r.height[1]));
|
|
395
|
-
const ivy = stadium.looks?.ivyWalls === undefined ? {} : { ivy: true };
|
|
412
|
+
const ivy = stadium.looks?.ivyWalls === undefined ? (stadium.looks?.brickWalls === undefined ? {} : { brick: true }) : { ivy: true };
|
|
396
413
|
let shell;
|
|
397
414
|
if (stadium.roof.kind === "dome") {
|
|
398
415
|
// An air-supported roof: the membrane over the outline OpenStreetMap maps for it, standing at the height of its rim (the building's height less the roof's own rise) and rising to the building's height.
|
|
@@ -403,6 +420,15 @@ function park(stadium, input) {
|
|
|
403
420
|
const low = round((mapped.height - mapped.rise) * FEET_PER_METRE);
|
|
404
421
|
shell = { footprint, hall, ...(north === undefined ? {} : { north }), roof: "dome", edge: low, wall: low, dome: { rim, low, crown: round(mapped.height * FEET_PER_METRE) }, ...ivy };
|
|
405
422
|
}
|
|
423
|
+
else if (stadium.roof.kind === "fixed") {
|
|
424
|
+
// A fixed roof over the whole bowl (the Olympic Stadium's): a low lens over the outline, from the walls (a little over the top row) to a crown a little higher over the middle (ours: the sources say the roof is fixed, not what shape it has),
|
|
425
|
+
// and the tower that leans over it where OpenStreetMap maps one.
|
|
426
|
+
const low = round(Math.max(top + STADIUM_CLEARANCE, (stadium.osm.height ?? 0) * FEET_PER_METRE));
|
|
427
|
+
const rim = footprint.map((p) => [c[0] + (p[0] - c[0]) * 0.98, c[1] + (p[1] - c[1]) * 0.98]);
|
|
428
|
+
const mapped = stadium.osm.tower;
|
|
429
|
+
const tower = mapped === undefined || stadium.tower === undefined ? undefined : { base: frameOf(metresFrom(origin, [mapped.base])[0]), top: frameOf(metresFrom(origin, [mapped.top])[0]), height: round(stadium.tower.height * FEET_PER_METRE), angle: stadium.tower.angle, width: [TOWER_WIDTH[0], TOWER_WIDTH[1]] };
|
|
430
|
+
shell = { footprint, hall, ...(north === undefined ? {} : { north }), roof: "dome", edge: low, wall: low, dome: { rim, low, crown: low + FIXED_CROWN }, ...(tower === undefined ? {} : { tower }), ...ivy };
|
|
431
|
+
}
|
|
406
432
|
else if (stadium.roof.kind === "open") {
|
|
407
433
|
// No roof: the walls stand a little over the top row.
|
|
408
434
|
const wall = round(Math.max(top + OPEN_WALL_OVER, (stadium.osm.height ?? 0) * FEET_PER_METRE));
|
|
@@ -64,7 +64,7 @@ export const STADIUM_OSM = {
|
|
|
64
64
|
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
65
65
|
"axis": { "heading": 0, "basis": "pitch", "strength": 1.32, "elongation": 2.16, "centre": [-122.33163, 47.595154] },
|
|
66
66
|
"canopies": [
|
|
67
|
-
{ "source": "way/458208106", "height": 36, "rise": 10, "ring": [
|
|
67
|
+
{ "source": "way/458208106", "height": 36, "rise": 10, "shape": "round", "ring": [
|
|
68
68
|
[-122.332395, 47.596154],
|
|
69
69
|
[-122.33234, 47.595145],
|
|
70
70
|
[-122.332404, 47.594143],
|
|
@@ -79,7 +79,7 @@ export const STADIUM_OSM = {
|
|
|
79
79
|
[-122.332747, 47.596004],
|
|
80
80
|
[-122.332452, 47.596154],
|
|
81
81
|
] },
|
|
82
|
-
{ "source": "way/458208107", "height": 36, "rise": 10, "ring": [
|
|
82
|
+
{ "source": "way/458208107", "height": 36, "rise": 10, "shape": "round", "ring": [
|
|
83
83
|
[-122.330897, 47.596155],
|
|
84
84
|
[-122.330837, 47.596159],
|
|
85
85
|
[-122.33062, 47.596055],
|
|
@@ -321,4 +321,226 @@ export const STADIUM_OSM = {
|
|
|
321
321
|
[135.362615, 34.721654],
|
|
322
322
|
],
|
|
323
323
|
},
|
|
324
|
+
"yankee-stadium": {
|
|
325
|
+
"source": "way/24801630",
|
|
326
|
+
"read": "2026-10-30",
|
|
327
|
+
"base": "2026-10-30T13:35:12Z",
|
|
328
|
+
"licence": "ODbL-1.0",
|
|
329
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
330
|
+
"axis": { "heading": 75.6, "basis": "infield", "strength": 1.55, "elongation": 1, "centre": [-73.926956, 40.829481] },
|
|
331
|
+
"ring": [
|
|
332
|
+
[-73.92491, 40.829852],
|
|
333
|
+
[-73.925748, 40.828426],
|
|
334
|
+
[-73.92608, 40.828413],
|
|
335
|
+
[-73.926087, 40.828377],
|
|
336
|
+
[-73.92634, 40.828396],
|
|
337
|
+
[-73.926334, 40.828431],
|
|
338
|
+
[-73.926483, 40.828456],
|
|
339
|
+
[-73.926774, 40.828533],
|
|
340
|
+
[-73.927616, 40.828858],
|
|
341
|
+
[-73.927745, 40.828938],
|
|
342
|
+
[-73.92784, 40.829022],
|
|
343
|
+
[-73.927956, 40.82918],
|
|
344
|
+
[-73.92801, 40.82917],
|
|
345
|
+
[-73.928085, 40.829392],
|
|
346
|
+
[-73.928007, 40.829408],
|
|
347
|
+
[-73.927987, 40.829546],
|
|
348
|
+
[-73.927915, 40.829702],
|
|
349
|
+
[-73.927827, 40.829809],
|
|
350
|
+
[-73.927064, 40.830581],
|
|
351
|
+
[-73.926877, 40.830729],
|
|
352
|
+
[-73.926897, 40.830771],
|
|
353
|
+
[-73.926662, 40.830846],
|
|
354
|
+
[-73.926645, 40.830811],
|
|
355
|
+
[-73.926492, 40.830855],
|
|
356
|
+
[-73.92521, 40.830436],
|
|
357
|
+
[-73.925315, 40.830258],
|
|
358
|
+
[-73.925019, 40.830158],
|
|
359
|
+
[-73.925072, 40.830068],
|
|
360
|
+
[-73.924989, 40.829882],
|
|
361
|
+
],
|
|
362
|
+
},
|
|
363
|
+
"citi-field": {
|
|
364
|
+
"source": "way/604023701",
|
|
365
|
+
"read": "2026-10-30",
|
|
366
|
+
"base": "2026-10-30T13:37:18Z",
|
|
367
|
+
"licence": "ODbL-1.0",
|
|
368
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
369
|
+
"axis": { "heading": 14.5, "basis": "pitch", "strength": 1.62, "elongation": 1, "centre": [-73.846066, 40.756568], "rms": 2 },
|
|
370
|
+
"ring": [
|
|
371
|
+
[-73.847301, 40.757646],
|
|
372
|
+
[-73.847451, 40.757602],
|
|
373
|
+
[-73.847141, 40.756912],
|
|
374
|
+
[-73.846557, 40.755747],
|
|
375
|
+
[-73.846467, 40.755652],
|
|
376
|
+
[-73.846341, 40.7556],
|
|
377
|
+
[-73.846205, 40.755601],
|
|
378
|
+
[-73.846086, 40.755642],
|
|
379
|
+
[-73.845426, 40.756108],
|
|
380
|
+
[-73.844367, 40.756811],
|
|
381
|
+
[-73.844391, 40.756866],
|
|
382
|
+
[-73.84427, 40.756903],
|
|
383
|
+
[-73.845078, 40.75848],
|
|
384
|
+
[-73.845755, 40.75828],
|
|
385
|
+
[-73.845791, 40.75835],
|
|
386
|
+
[-73.846028, 40.75828],
|
|
387
|
+
[-73.845967, 40.758161],
|
|
388
|
+
[-73.846003, 40.75815],
|
|
389
|
+
[-73.845985, 40.758112],
|
|
390
|
+
[-73.845871, 40.758149],
|
|
391
|
+
[-73.845808, 40.758019],
|
|
392
|
+
[-73.845954, 40.757976],
|
|
393
|
+
[-73.845968, 40.758],
|
|
394
|
+
[-73.846844, 40.757742],
|
|
395
|
+
[-73.846832, 40.757718],
|
|
396
|
+
[-73.846907, 40.757698],
|
|
397
|
+
[-73.846952, 40.757638],
|
|
398
|
+
[-73.847248, 40.757551],
|
|
399
|
+
],
|
|
400
|
+
},
|
|
401
|
+
"metlife-stadium": {
|
|
402
|
+
"source": "way/24221553",
|
|
403
|
+
"read": "2026-10-30",
|
|
404
|
+
"base": "2026-10-30T13:38:20Z",
|
|
405
|
+
"licence": "ODbL-1.0",
|
|
406
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
407
|
+
"axis": { "heading": 166.5, "basis": "pitch", "strength": 1.49, "elongation": 2.28, "centre": [-74.074362, 40.813528] },
|
|
408
|
+
"ring": [
|
|
409
|
+
[-74.07351, 40.812427],
|
|
410
|
+
[-74.073348, 40.812509],
|
|
411
|
+
[-74.073194, 40.812606],
|
|
412
|
+
[-74.072934, 40.812831],
|
|
413
|
+
[-74.072934, 40.813349],
|
|
414
|
+
[-74.073019, 40.813751],
|
|
415
|
+
[-74.073174, 40.81413],
|
|
416
|
+
[-74.073354, 40.814425],
|
|
417
|
+
[-74.073488, 40.814591],
|
|
418
|
+
[-74.073684, 40.81468],
|
|
419
|
+
[-74.074066, 40.814777],
|
|
420
|
+
[-74.074538, 40.814785],
|
|
421
|
+
[-74.074716, 40.81476],
|
|
422
|
+
[-74.074918, 40.814724],
|
|
423
|
+
[-74.075248, 40.814591],
|
|
424
|
+
[-74.075439, 40.814483],
|
|
425
|
+
[-74.075757, 40.814231],
|
|
426
|
+
[-74.07577, 40.813932],
|
|
427
|
+
[-74.075757, 40.81366],
|
|
428
|
+
[-74.07566, 40.813245],
|
|
429
|
+
[-74.075542, 40.812967],
|
|
430
|
+
[-74.075364, 40.812648],
|
|
431
|
+
[-74.075241, 40.812468],
|
|
432
|
+
[-74.075089, 40.812383],
|
|
433
|
+
[-74.074872, 40.812318],
|
|
434
|
+
[-74.074662, 40.81228],
|
|
435
|
+
[-74.07442, 40.812259],
|
|
436
|
+
[-74.074199, 40.812263],
|
|
437
|
+
[-74.073841, 40.812316],
|
|
438
|
+
],
|
|
439
|
+
},
|
|
440
|
+
"olympic-stadium-montreal": {
|
|
441
|
+
"source": "way/108505523",
|
|
442
|
+
"read": "2026-10-30",
|
|
443
|
+
"base": "2026-10-30T15:34:06Z",
|
|
444
|
+
"licence": "ODbL-1.0",
|
|
445
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
446
|
+
"axis": { "heading": 345, "basis": "none", "strength": 1.21, "elongation": 1.28, "centre": [-73.551436, 45.557263] },
|
|
447
|
+
"tower": { "source": "way/20213158", "height": 165, "base": [-73.552212, 45.55979], "top": [-73.551804, 45.558392], "ring": [
|
|
448
|
+
[-73.551265, 45.559204],
|
|
449
|
+
[-73.55152, 45.559114],
|
|
450
|
+
[-73.551691, 45.559005],
|
|
451
|
+
[-73.55175, 45.558922],
|
|
452
|
+
[-73.551766, 45.55881],
|
|
453
|
+
[-73.551734, 45.558708],
|
|
454
|
+
[-73.551504, 45.558389],
|
|
455
|
+
[-73.552109, 45.558304],
|
|
456
|
+
[-73.552061, 45.558686],
|
|
457
|
+
[-73.55222, 45.558867],
|
|
458
|
+
[-73.552319, 45.558915],
|
|
459
|
+
[-73.552475, 45.558952],
|
|
460
|
+
[-73.552742, 45.558955],
|
|
461
|
+
[-73.553377, 45.55936],
|
|
462
|
+
[-73.552867, 45.559859],
|
|
463
|
+
[-73.552577, 45.5601],
|
|
464
|
+
[-73.552513, 45.560205],
|
|
465
|
+
[-73.552526, 45.560719],
|
|
466
|
+
[-73.55241, 45.560733],
|
|
467
|
+
[-73.552169, 45.560258],
|
|
468
|
+
[-73.55149, 45.559995],
|
|
469
|
+
[-73.551023, 45.559768],
|
|
470
|
+
[-73.550902, 45.559761],
|
|
471
|
+
[-73.550874, 45.559733],
|
|
472
|
+
[-73.550876, 45.559692],
|
|
473
|
+
[-73.550947, 45.559659],
|
|
474
|
+
[-73.551005, 45.559593],
|
|
475
|
+
] },
|
|
476
|
+
"ring": [
|
|
477
|
+
[-73.551265, 45.559204],
|
|
478
|
+
[-73.552742, 45.558955],
|
|
479
|
+
[-73.55299, 45.558745],
|
|
480
|
+
[-73.553114, 45.558575],
|
|
481
|
+
[-73.553219, 45.558392],
|
|
482
|
+
[-73.553285, 45.558195],
|
|
483
|
+
[-73.553324, 45.557998],
|
|
484
|
+
[-73.553324, 45.557775],
|
|
485
|
+
[-73.553298, 45.557579],
|
|
486
|
+
[-73.553101, 45.557179],
|
|
487
|
+
[-73.552947, 45.556985],
|
|
488
|
+
[-73.552754, 45.556812],
|
|
489
|
+
[-73.552531, 45.556674],
|
|
490
|
+
[-73.552275, 45.55655],
|
|
491
|
+
[-73.552, 45.556465],
|
|
492
|
+
[-73.551712, 45.556425],
|
|
493
|
+
[-73.551417, 45.556425],
|
|
494
|
+
[-73.551109, 45.556465],
|
|
495
|
+
[-73.550833, 45.556543],
|
|
496
|
+
[-73.550598, 45.556674],
|
|
497
|
+
[-73.550394, 45.556832],
|
|
498
|
+
[-73.550224, 45.556996],
|
|
499
|
+
[-73.550093, 45.557205],
|
|
500
|
+
[-73.550008, 45.557402],
|
|
501
|
+
[-73.549962, 45.557605],
|
|
502
|
+
[-73.549968, 45.557821],
|
|
503
|
+
[-73.550008, 45.558031],
|
|
504
|
+
[-73.550071, 45.558229],
|
|
505
|
+
[-73.550165, 45.558424],
|
|
506
|
+
[-73.550309, 45.558601],
|
|
507
|
+
[-73.550473, 45.558772],
|
|
508
|
+
[-73.550663, 45.558916],
|
|
509
|
+
[-73.550892, 45.559053],
|
|
510
|
+
],
|
|
511
|
+
},
|
|
512
|
+
"barclays-center": {
|
|
513
|
+
"source": "relation/8610205",
|
|
514
|
+
"read": "2026-10-30",
|
|
515
|
+
"base": "2026-10-30T13:40:21Z",
|
|
516
|
+
"licence": "ODbL-1.0",
|
|
517
|
+
"attribution": "(c) OpenStreetMap contributors, ODbL 1.0, openstreetmap.org/copyright",
|
|
518
|
+
"height": 35,
|
|
519
|
+
"axis": { "heading": 6, "basis": "building", "strength": 1.4, "elongation": 1.04, "centre": [-73.975174, 40.682609] },
|
|
520
|
+
"ring": [
|
|
521
|
+
[-73.976494, 40.683074],
|
|
522
|
+
[-73.976469, 40.68312],
|
|
523
|
+
[-73.97631, 40.68325],
|
|
524
|
+
[-73.97614, 40.683352],
|
|
525
|
+
[-73.976088, 40.683369],
|
|
526
|
+
[-73.976009, 40.683369],
|
|
527
|
+
[-73.974471, 40.683053],
|
|
528
|
+
[-73.974483, 40.683021],
|
|
529
|
+
[-73.974429, 40.682951],
|
|
530
|
+
[-73.974384, 40.682818],
|
|
531
|
+
[-73.974366, 40.682659],
|
|
532
|
+
[-73.974401, 40.682458],
|
|
533
|
+
[-73.974199, 40.682416],
|
|
534
|
+
[-73.974272, 40.682217],
|
|
535
|
+
[-73.974501, 40.682265],
|
|
536
|
+
[-73.974543, 40.68221],
|
|
537
|
+
[-73.974679, 40.681821],
|
|
538
|
+
[-73.974854, 40.681857],
|
|
539
|
+
[-73.97489, 40.681755],
|
|
540
|
+
[-73.975043, 40.681787],
|
|
541
|
+
[-73.974982, 40.681954],
|
|
542
|
+
[-73.975847, 40.682136],
|
|
543
|
+
[-73.976487, 40.683028],
|
|
544
|
+
],
|
|
545
|
+
},
|
|
324
546
|
};
|
package/dist/strings.core.d.ts
CHANGED
|
@@ -522,6 +522,7 @@ export interface KyogijoWords {
|
|
|
522
522
|
stadiumInfield: string;
|
|
523
523
|
stadiumHall: string;
|
|
524
524
|
stadiumRingBuilding: string;
|
|
525
|
+
stadiumCourtBuilding: string;
|
|
525
526
|
stadiumPitchPark: string;
|
|
526
527
|
stadiumNonePark: string;
|
|
527
528
|
/** A district: a plan of {count} real venues at their real positions, {mode}; and what `mode` says for the two kinds of plan, and the word before the credit. */
|