gcp-gpu-tpu-map / index.html
fredmo's picture
Update index.html
6acf70c verified
raw
history blame
25.9 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GCP Datacenter Accelerator Map</title>
<script src="https://cesium.com/downloads/cesiumjs/releases/1.117/Build/Cesium/Cesium.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.117/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
<style>
html, body, #cesiumContainer {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
font-family: sans-serif;
}
#controls {
position: absolute;
top: 10px;
left: 10px;
background: rgba(40, 40, 40, 0.8);
padding: 10px;
border-radius: 5px;
color: white;
z-index: 1;
}
#controls label {
margin-right: 5px;
}
#infoBox {
position: absolute;
bottom: 10px;
left: 10px;
background: rgba(40, 40, 40, 0.8);
padding: 10px;
border-radius: 5px;
color: white;
z-index: 1;
max-width: 300px;
display: none; /* Hidden by default */
}
#infoBox h3 {
margin-top: 0;
}
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<div id="controls">
<label for="acceleratorFilter">Filter by Accelerator:</label>
<select id="acceleratorFilter">
<option value="all">All Accelerators</option>
</select>
</div>
<div id="infoBox">
<h3>Location Details</h3>
<p id="locationName"></p>
<p><strong>Region ID(s):</strong> <span id="regionId"></span></p>
<p><strong>Zone(s):</strong> <span id="zoneId"></span></p>
<p><strong>Available Accelerators here:</strong></p>
<ul id="acceleratorList"></ul>
</div>
<script>
// --- Data Preparation ---
// Approximate coordinates (Latitude, Longitude)
const locations = {
"Council Bluffs, Iowa, USA": { lat: 41.2619, lon: -95.8608, accelerators: {} },
"Eemshaven, Netherlands": { lat: 53.442, lon: 6.83, accelerators: {} },
"Changhua County, Taiwan": { lat: 24.0706, lon: 120.5417, accelerators: {} },
"Columbus, Ohio, USA": { lat: 39.9612, lon: -82.9988, accelerators: {} },
"Dallas, Texas, USA": { lat: 32.7767, lon: -96.7970, accelerators: {} },
"The Dalles, Oregon, USA": { lat: 45.5946, lon: -121.1787, accelerators: {} },
"Las Vegas, Nevada, USA": { lat: 36.1699, lon: -115.1398, accelerators: {} },
"St. Ghislain, Belgium": { lat: 50.446, lon: 3.82, accelerators: {} },
"Jurong West, Singapore": { lat: 1.3398, lon: 103.7053, accelerators: {} },
"Moncks Corner, South Carolina, USA": { lat: 33.1913, lon: -80.0195, accelerators: {} },
"Ashburn, Virginia, USA": { lat: 39.0438, lon: -77.4874, accelerators: {} },
"Tokyo, Japan": { lat: 35.6895, lon: 139.6917, accelerators: {} },
"Sydney, Australia": { lat: -33.8688, lon: 151.2093, accelerators: {} },
"Toronto, Ontario, Canada": { lat: 43.6532, lon: -79.3832, accelerators: {} },
"Seoul, South Korea": { lat: 37.5665, lon: 126.9780, accelerators: {} },
"Mumbai, India": { lat: 19.0760, lon: 72.8777, accelerators: {} },
"London, UK": { lat: 51.5074, lon: -0.1278, accelerators: {} },
"Frankfurt, Germany": { lat: 50.1109, lon: 8.6821, accelerators: {} },
"Salt Lake City, Utah, USA": { lat: 40.7608, lon: -111.8910, accelerators: {} },
"Hong Kong": { lat: 22.3193, lon: 114.1694, accelerators: {} },
"Jakarta, Indonesia": { lat: -6.2088, lon: 106.8456, accelerators: {} },
"Warsaw, Poland": { lat: 52.2297, lon: 21.0122, accelerators: {} },
"Tel Aviv, Israel": { lat: 32.0853, lon: 34.7818, accelerators: {} },
"Osasco, São Paulo, Brazil": { lat: -23.5325, lon: -46.7917, accelerators: {} },
"Montréal, Québec, Canada": { lat: 45.5017, lon: -73.5673, accelerators: {} },
"Los Angeles, California, USA": { lat: 34.0522, lon: -118.2437, accelerators: {} },
"Zurich, Switzerland": { lat: 47.3769, lon: 8.5417, accelerators: {} },
"Dammam, Saudi Arabia": { lat: 26.4207, lon: 50.0888, accelerators: {} }
};
const datacenterData = [
// TPU v2
{ accelerator: "TPU v2", region: "us-central1", zones: "b, c, f", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "TPU v2", region: "europe-west4", zones: "a", location: "Eemshaven, Netherlands" },
{ accelerator: "TPU v2", region: "asia-east1", zones: "c", location: "Changhua County, Taiwan" },
// TPU v3 (many are repeated in source, assuming unique locations for now)
{ accelerator: "TPU v3", region: "us-central1", zones: "a, b, f", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "TPU v3", region: "europe-west4", zones: "a", location: "Eemshaven, Netherlands" },
// TPU v4
{ accelerator: "TPU v4", region: "us-central2", zones: "b", location: "Council Bluffs, Iowa, USA" }, // Note: Original data has "(?)"
// TPU v5e
{ accelerator: "TPU v5e", region: "us-central1", zones: "a", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "TPU v5e", region: "us-east5", zones: "a, b, c", location: "Columbus, Ohio, USA" },
{ accelerator: "TPU v5e", region: "us-south1", zones: "a", location: "Dallas, Texas, USA" },
{ accelerator: "TPU v5e", region: "us-west1", zones: "c", location: "The Dalles, Oregon, USA" },
{ accelerator: "TPU v5e", region: "us-west4", zones: "a", location: "Las Vegas, Nevada, USA" },
{ accelerator: "TPU v5e", region: "europe-west1", zones: "b", location: "St. Ghislain, Belgium" },
{ accelerator: "TPU v5e", region: "asia-southeast1", zones: "b", location: "Jurong West, Singapore" },
// TPU v5p
{ accelerator: "TPU v5p", region: "us-east5", zones: "a", location: "Columbus, Ohio, USA" },
{ accelerator: "TPU v5p", region: "europe-west4", zones: "b", location: "Eemshaven, Netherlands" },
// TPU v6e (Data seems to have a typo for H100 A3 Mega, correcting as TPU v6e based on position)
{ accelerator: "TPU v6e", region: "us-east1", zones: "d", location: "Moncks Corner, South Carolina, USA" },
{ accelerator: "TPU v6e", region: "us-east5", zones: "b", location: "Columbus, Ohio, USA" },
{ accelerator: "TPU v6e", region: "europe-west4", zones: "a", location: "Eemshaven, Netherlands" },
{ accelerator: "TPU v6e", region: "asia-northeast1", zones: "b", location: "Tokyo, Japan" },
// H100 A3 Mega
{ accelerator: "H100 A3 Mega", region: "us-central1", zones: "a, b*, c", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "H100 A3 Mega", region: "us-east4", zones: "a, b, c", location: "Ashburn, Virginia, USA" },
{ accelerator: "H100 A3 Mega", region: "us-west1", zones: "a, b", location: "The Dalles, Oregon, USA" },
{ accelerator: "H100 A3 Mega", region: "us-west4", zones: "a", location: "Las Vegas, Nevada, USA" },
{ accelerator: "H100 A3 Mega", region: "asia-northeast1", zones: "b", location: "Tokyo, Japan" },
{ accelerator: "H100 A3 Mega", region: "asia-southeast1", zones: "b, c", location: "Jurong West, Singapore" },
{ accelerator: "H100 A3 Mega", region: "australia-southeast1", zones: "c*", location: "Sydney, Australia" },
{ accelerator: "H100 A3 Mega", region: "europe-west1", zones: "b*, c*", location: "St. Ghislain, Belgium" },
{ accelerator: "H100 A3 Mega", region: "europe-west4", zones: "b, c", location: "Eemshaven, Netherlands" },
// H100 A3 High
{ accelerator: "H100 A3 High", region: "us-central1", zones: "a, c", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "H100 A3 High", region: "us-east4", zones: "a, b", location: "Ashburn, Virginia, USA" },
{ accelerator: "H100 A3 High", region: "us-east5", zones: "a", location: "Columbus, Ohio, USA" },
{ accelerator: "H100 A3 High", region: "us-west1", zones: "a, b", location: "The Dalles, Oregon, USA" },
{ accelerator: "H100 A3 High", region: "us-west4", zones: "a", location: "Las Vegas, Nevada, USA" },
{ accelerator: "H100 A3 High", region: "asia-northeast1", zones: "b", location: "Tokyo, Japan" },
{ accelerator: "H100 A3 High", region: "asia-southeast1", zones: "b, c", location: "Jurong West, Singapore" },
{ accelerator: "H100 A3 High", region: "europe-west1", zones: "b*", location: "St. Ghislain, Belgium" },
// H100 A3 Edge
{ accelerator: "H100 A3 Edge", region: "northamerica-northeast2", zones: "c", location: "Toronto, Ontario, Canada" },
{ accelerator: "H100 A3 Edge", region: "asia-northeast1", zones: "b", location: "Tokyo, Japan" },
{ accelerator: "H100 A3 Edge", region: "asia-northeast3", zones: "a, c", location: "Seoul, South Korea" },
{ accelerator: "H100 A3 Edge", region: "asia-south1", zones: "c", location: "Mumbai, India" },
{ accelerator: "H100 A3 Edge", region: "europe-west2", zones: "b", location: "London, UK" },
{ accelerator: "H100 A3 Edge", region: "europe-west3", zones: "a", location: "Frankfurt, Germany" },
// A100 A2 Ultra
{ accelerator: "A100 A2 Ultra", region: "us-central1", zones: "a, c", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "A100 A2 Ultra", region: "us-east4", zones: "c", location: "Ashburn, Virginia, USA" },
{ accelerator: "A100 A2 Ultra", region: "us-east5", zones: "b", location: "Columbus, Ohio, USA" },
{ accelerator: "A100 A2 Ultra", region: "asia-southeast1", zones: "c", location: "Jurong West, Singapore" },
{ accelerator: "A100 A2 Ultra", region: "europe-west4", zones: "a, b, c", location: "Eemshaven, Netherlands" },
// A100 40GB A2 Standard
{ accelerator: "A100 40GB A2 Standard", region: "us-central1", zones: "a*, b*, c*, f*", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "A100 40GB A2 Standard", region: "us-east1", zones: "b", location: "Moncks Corner, South Carolina, USA" },
{ accelerator: "A100 40GB A2 Standard", region: "us-west1", zones: "b", location: "The Dalles, Oregon, USA" },
{ accelerator: "A100 40GB A2 Standard", region: "us-west3", zones: "b", location: "Salt Lake City, Utah, USA" },
{ accelerator: "A100 40GB A2 Standard", region: "us-west4", zones: "b", location: "Las Vegas, Nevada, USA" },
{ accelerator: "A100 40GB A2 Standard", region: "asia-northeast1", zones: "a, c", location: "Tokyo, Japan" },
{ accelerator: "A100 40GB A2 Standard", region: "asia-northeast3", zones: "a, b", location: "Seoul, South Korea" },
{ accelerator: "A100 40GB A2 Standard", region: "asia-southeast1", zones: "b, c*", location: "Jurong West, Singapore" },
{ accelerator: "A100 40GB A2 Standard", region: "me-west1", zones: "a, c", location: "Tel Aviv, Israel" },
{ accelerator: "A100 40GB A2 Standard", region: "europe-west4", zones: "a*, b*", location: "Eemshaven, Netherlands" },
// G2 (L4)
{ accelerator: "G2 (L4)", region: "us-central1", zones: "a, b, c", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "G2 (L4)", region: "us-east1", zones: "b, c, d", location: "Moncks Corner, South Carolina, USA" },
{ accelerator: "G2 (L4)", region: "us-east4", zones: "a", location: "Ashburn, Virginia, USA" },
{ accelerator: "G2 (L4)", region: "us-west1", zones: "a, b, c", location: "The Dalles, Oregon, USA" },
{ accelerator: "G2 (L4)", region: "us-west4", zones: "a, c", location: "Las Vegas, Nevada, USA" },
{ accelerator: "G2 (L4)", region: "northamerica-northeast2", zones: "a", location: "Toronto, Ontario, Canada" },
{ accelerator: "G2 (L4)", region: "asia-east1", zones: "a, b, c", location: "Changhua County, Taiwan" },
{ accelerator: "G2 (L4)", region: "asia-northeast1", zones: "a, b, c", location: "Tokyo, Japan" },
{ accelerator: "G2 (L4)", region: "asia-northeast3", zones: "a, b", location: "Seoul, South Korea" },
{ accelerator: "G2 (L4)", region: "asia-south1", zones: "a, b, c", location: "Mumbai, India" },
{ accelerator: "G2 (L4)", region: "asia-southeast1", zones: "a, b, c", location: "Jurong West, Singapore" },
{ accelerator: "G2 (L4)", region: "australia-southeast1", zones: "a", location: "Sydney, Australia" },
{ accelerator: "G2 (L4)", region: "europe-west1", zones: "b, c", location: "St. Ghislain, Belgium" },
{ accelerator: "G2 (L4)", region: "europe-west2", zones: "a, b", location: "London, UK" },
{ accelerator: "G2 (L4)", region: "europe-west3", zones: "a, b", location: "Frankfurt, Germany" },
{ accelerator: "G2 (L4)", region: "europe-west4", zones: "a, b, c", location: "Eemshaven, Netherlands" },
{ accelerator: "G2 (L4)", region: "europe-west6", zones: "b, c", location: "Zurich, Switzerland" },
{ accelerator: "G2 (L4)", region: "me-central2", zones: "a", location: "Dammam, Saudi Arabia" },
// N1+T4
{ accelerator: "N1+T4", region: "us-central1", zones: "a, b, f", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "N1+T4", region: "us-east1", zones: "c, d", location: "Moncks Corner, South Carolina, USA" },
{ accelerator: "N1+T4", region: "us-east4", zones: "a, b", location: "Ashburn, Virginia, USA" },
{ accelerator: "N1+T4", region: "us-west1", zones: "a, b", location: "The Dalles, Oregon, USA" },
{ accelerator: "N1+T4", region: "us-west3", zones: "b", location: "Salt Lake City, Utah, USA" },
{ accelerator: "N1+T4", region: "us-west4", zones: "a, b", location: "Las Vegas, Nevada, USA" },
{ accelerator: "N1+T4", region: "northamerica-northeast1", zones: "c", location: "Montréal, Québec, Canada" },
{ accelerator: "N1+T4", region: "asia-east1", zones: "a, c", location: "Changhua County, Taiwan" },
{ accelerator: "N1+T4", region: "asia-east2", zones: "a, c", location: "Hong Kong" },
{ accelerator: "N1+T4", region: "asia-northeast1", zones: "a, c", location: "Tokyo, Japan" },
{ accelerator: "N1+T4", region: "asia-northeast3", zones: "b, c", location: "Seoul, South Korea" },
{ accelerator: "N1+T4", region: "asia-south1", zones: "a, b", location: "Mumbai, India" },
{ accelerator: "N1+T4", region: "asia-southeast1", zones: "a, b, c", location: "Jurong West, Singapore" },
{ accelerator: "N1+T4", region: "asia-southeast2", zones: "a", location: "Jakarta, Indonesia" },
{ accelerator: "N1+T4", region: "australia-southeast1", zones: "a, c", location: "Sydney, Australia" },
{ accelerator: "N1+T4", region: "europe-central2", zones: "b, c", location: "Warsaw, Poland" },
{ accelerator: "N1+T4", region: "europe-west1", zones: "b, c, d", location: "St. Ghislain, Belgium" },
{ accelerator: "N1+T4", region: "europe-west2", zones: "a, b", location: "London, UK" },
{ accelerator: "N1+T4", region: "europe-west3", zones: "b", location: "Frankfurt, Germany" },
{ accelerator: "N1+T4", region: "europe-west4", zones: "a, b, c", location: "Eemshaven, Netherlands" },
{ accelerator: "N1+T4", region: "me-west1", zones: "b, c", location: "Tel Aviv, Israel" },
{ accelerator: "N1+T4", region: "southamerica-east1", zones: "a, c", location: "Osasco, São Paulo, Brazil" },
// N1+V100
{ accelerator: "N1+V100", region: "us-central1", zones: "a, b, c, f", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "N1+V100", region: "us-east1", zones: "c", location: "Moncks Corner, South Carolina, USA" },
{ accelerator: "N1+V100", region: "us-west1", zones: "a, b", location: "The Dalles, Oregon, USA" },
{ accelerator: "N1+V100", region: "asia-east1", zones: "c", location: "Changhua County, Taiwan" },
{ accelerator: "N1+V100", region: "europe-west4", zones: "a, b, c", location: "Eemshaven, Netherlands" },
// N1+P100
{ accelerator: "N1+P100", region: "us-central1", zones: "c, f", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "N1+P100", region: "us-east1", zones: "b, c", location: "Moncks Corner, South Carolina, USA" },
{ accelerator: "N1+P100", region: "us-west1", zones: "a, b", location: "The Dalles, Oregon, USA" },
{ accelerator: "N1+P100", region: "asia-east1", zones: "a, c", location: "Changhua County, Taiwan" },
{ accelerator: "N1+P100", region: "australia-southeast1", zones: "c", location: "Sydney, Australia" },
{ accelerator: "N1+P100", region: "europe-west1", zones: "b, d", location: "St. Ghislain, Belgium" },
{ accelerator: "N1+P100", region: "europe-west4", zones: "a", location: "Eemshaven, Netherlands" },
// N1+P4
{ accelerator: "N1+P4", region: "us-central1", zones: "a, c", location: "Council Bluffs, Iowa, USA" },
{ accelerator: "N1+P4", region: "us-east4", zones: "a, b, c", location: "Ashburn, Virginia, USA" },
{ accelerator: "N1+P4", region: "northamerica-northeast1", zones: "a, b, c", location: "Montréal, Québec, Canada" },
{ accelerator: "N1+P4", region: "us-west2", zones: "b, c", location: "Los Angeles, California, USA" }, // Assumed LA based on region
{ accelerator: "N1+P4", region: "asia-southeast1", zones: "b, c", location: "Jurong West, Singapore" },
{ accelerator: "N1+P4", region: "australia-southeast1", zones: "a, b", location: "Sydney, Australia" },
{ accelerator: "N1+P4", region: "europe-west4", zones: "b, c", location: "Eemshaven, Netherlands" },
];
// Group accelerators by physical location for easier display and entity creation
const groupedLocations = {};
datacenterData.forEach(item => {
if (!locations[item.location]) {
console.warn(`Location data for "${item.location}" not found. Skipping.`);
return;
}
if (!groupedLocations[item.location]) {
groupedLocations[item.location] = {
lat: locations[item.location].lat,
lon: locations[item.location].lon,
name: item.location,
accelerators: [],
regions: new Set(), // To store unique region IDs for this location
zones: new Set() // To store unique zones for this location
};
}
// Add accelerator if not already listed for this location
if (!groupedLocations[item.location].accelerators.some(acc => acc.type === item.accelerator)) {
groupedLocations[item.location].accelerators.push({
type: item.accelerator,
region: item.region,
zones: item.zones
});
}
// Consolidate region and zone info at the location level
// This part is tricky because region/zones can be specific to an accelerator
// For simplicity, we'll list all associated, but for precise info, click is needed
groupedLocations[item.location].regions.add(item.region);
item.zones.split(',').map(z => z.trim()).forEach(z => groupedLocations[item.location].zones.add(z));
});
// Cesium.Ion.defaultAccessToken = 'YOUR_CESIUM_ION_ACCESS_TOKEN'; // Only if using Cesium Ion assets
const viewer = new Cesium.Viewer('cesiumContainer', {
terrainProvider: Cesium.createWorldTerrain(), // Optional: adds terrain
// imageryProvider: new Cesium.OpenStreetMapImageryProvider({ // Optional: different base map
// url : 'https://a.tile.openstreetmap.org/'
// }),
animation: false,
timeline: false,
geocoder: false,
homeButton: false,
sceneModePicker: false,
baseLayerPicker: false,
navigationHelpButton: false,
fullscreenButton: false,
});
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(-95, 38, 15000000), // Fly to a general view of the US
duration: 3
});
const acceleratorFilter = document.getElementById('acceleratorFilter');
const infoBox = document.getElementById('infoBox');
const locationNameEl = document.getElementById('locationName');
const regionIdEl = document.getElementById('regionId');
const zoneIdEl = document.getElementById('zoneId');
const acceleratorListEl = document.getElementById('acceleratorList');
const uniqueAccelerators = new Set();
datacenterData.forEach(dc => uniqueAccelerators.add(dc.accelerator));
uniqueAccelerators.forEach(acc => {
const option = document.createElement('option');
option.value = acc;
option.textContent = acc;
acceleratorFilter.appendChild(option);
});
const locationEntities = [];
Object.values(groupedLocations).forEach(locData => {
if (locData.lat === undefined || locData.lon === undefined) {
console.warn(`Missing coordinates for ${locData.name}`);
return;
}
const entity = viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(locData.lon, locData.lat),
point: {
pixelSize: 10,
color: Cesium.Color.DODGERBLUE,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2
},
label: {
text: locData.name,
font: '12pt monospace',
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 2,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
pixelOffset: new Cesium.Cartesian2(0, -12)
},
properties: { // Custom properties
name: locData.name,
accelerators: locData.accelerators, // Array of {type, region, zones}
all_regions_at_location: Array.from(locData.regions).join(', '),
all_zones_at_location: Array.from(locData.zones).join(', ')
}
});
locationEntities.push(entity);
});
acceleratorFilter.addEventListener('change', (event) => {
const selectedAccelerator = event.target.value;
infoBox.style.display = 'none'; // Hide info box on filter change
locationEntities.forEach(entity => {
if (selectedAccelerator === 'all') {
entity.show = true;
} else {
// Check if any of the accelerators at this location match the filter
const hasAccelerator = entity.properties.accelerators.getValue().some(acc => acc.type === selectedAccelerator);
entity.show = hasAccelerator;
}
});
});
// Handle clicks on entities
viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
const pickedObject = viewer.scene.pick(movement.position);
infoBox.style.display = 'none'; // Hide by default
if (Cesium.defined(pickedObject) && Cesium.defined(pickedObject.id) && Cesium.defined(pickedObject.id.properties)) {
const properties = pickedObject.id.properties;
const locationName = properties.name.getValue();
const acceleratorsAtLocation = properties.accelerators.getValue(); // This is an array of {type, region, zones}
locationNameEl.textContent = locationName;
// Collect all regions and zones for *this specific picked location*
const regionsForDisplay = new Set();
const zonesForDisplay = new Set();
acceleratorListEl.innerHTML = ''; // Clear previous list
acceleratorsAtLocation.forEach(acc => {
regionsForDisplay.add(acc.region);
acc.zones.split(',').map(z => z.trim()).forEach(zone => zonesForDisplay.add(zone));
const listItem = document.createElement('li');
listItem.textContent = `${acc.type} (Region: ${acc.region}, Zones: ${acc.zones})`;
acceleratorListEl.appendChild(listItem);
});
regionIdEl.textContent = Array.from(regionsForDisplay).join(', ') || 'N/A';
zoneIdEl.textContent = Array.from(zonesForDisplay).sort().join(', ') || 'N/A';
infoBox.style.display = 'block';
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
</script>
</body>
</html>