|
|
|
@ -6,6 +6,11 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 |
|
|
|
//#endregion
|
|
|
|
//#region js/earth.js
|
|
|
|
(function() { |
|
|
|
const getUiLang = window.getUiLang || (() => (location.pathname.split("/")[1] === "en" ? "en" : "zh")); |
|
|
|
const t = window.t || ((k) => k); |
|
|
|
function markerName(data) { |
|
|
|
return getUiLang() === "en" ? (data.nameEn || data.nameZh) : (data.nameZh || data.nameEn); |
|
|
|
} |
|
|
|
const canvas = document.getElementById("earth-canvas"); |
|
|
|
if (!canvas || !window.THREE) return; |
|
|
|
const container = canvas.parentElement; |
|
|
|
@ -56,207 +61,248 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 |
|
|
|
scene.add(earth); |
|
|
|
const markersData = [ |
|
|
|
{ |
|
|
|
name: "上海", |
|
|
|
nameZh: "上海", |
|
|
|
nameEn: "Shanghai", |
|
|
|
lat: 31.2304, |
|
|
|
lon: 121.4737 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "东京", |
|
|
|
nameZh: "东京", |
|
|
|
nameEn: "Tokyo", |
|
|
|
lat: 35.6762, |
|
|
|
lon: 139.6503 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "伊斯坦布尔", |
|
|
|
nameZh: "伊斯坦布尔", |
|
|
|
nameEn: "Istanbul", |
|
|
|
lat: 41.0082, |
|
|
|
lon: 28.9784 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "伦敦", |
|
|
|
nameZh: "伦敦", |
|
|
|
nameEn: "London", |
|
|
|
lat: 51.5074, |
|
|
|
lon: -.1278 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "加尔各答", |
|
|
|
nameZh: "加尔各答", |
|
|
|
nameEn: "Kolkata", |
|
|
|
lat: 22.5726, |
|
|
|
lon: 88.3639 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "北京", |
|
|
|
nameZh: "北京", |
|
|
|
nameEn: "Beijing", |
|
|
|
lat: 39.9042, |
|
|
|
lon: 116.4074 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "华沙", |
|
|
|
nameZh: "华沙", |
|
|
|
nameEn: "Warsaw", |
|
|
|
lat: 52.2297, |
|
|
|
lon: 21.0122 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "南京", |
|
|
|
nameZh: "南京", |
|
|
|
nameEn: "Nanjing", |
|
|
|
lat: 32.0603, |
|
|
|
lon: 118.7969 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "吉隆坡", |
|
|
|
nameZh: "吉隆坡", |
|
|
|
nameEn: "Kuala Lumpur", |
|
|
|
lat: 3.139, |
|
|
|
lon: 101.6869 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "圣保罗", |
|
|
|
nameZh: "圣保罗", |
|
|
|
nameEn: "São Paulo", |
|
|
|
lat: -23.5505, |
|
|
|
lon: -46.6333 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "圣安东尼奥", |
|
|
|
nameZh: "圣安东尼奥", |
|
|
|
nameEn: "San Antonio", |
|
|
|
lat: 29.4241, |
|
|
|
lon: -98.4936 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "墨西哥城", |
|
|
|
nameZh: "墨西哥城", |
|
|
|
nameEn: "Mexico City", |
|
|
|
lat: 19.4326, |
|
|
|
lon: -99.1332 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "多伦多", |
|
|
|
nameZh: "多伦多", |
|
|
|
nameEn: "Toronto", |
|
|
|
lat: 43.6532, |
|
|
|
lon: -79.3832 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "奥克兰", |
|
|
|
nameZh: "奥克兰", |
|
|
|
nameEn: "Auckland", |
|
|
|
lat: -36.8485, |
|
|
|
lon: 174.7633 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "孟买", |
|
|
|
nameZh: "孟买", |
|
|
|
nameEn: "Mumbai", |
|
|
|
lat: 19.076, |
|
|
|
lon: 72.8777 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "安地比斯", |
|
|
|
nameZh: "安地比斯", |
|
|
|
nameEn: "Antibes", |
|
|
|
lat: 43.5804, |
|
|
|
lon: 7.1251 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "山景城", |
|
|
|
nameZh: "山景城", |
|
|
|
nameEn: "Mountain View", |
|
|
|
lat: 37.3861, |
|
|
|
lon: -122.0839 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "巴黎", |
|
|
|
nameZh: "巴黎", |
|
|
|
nameEn: "Paris", |
|
|
|
lat: 48.8566, |
|
|
|
lon: 2.3522 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "布宜诺斯艾利斯", |
|
|
|
nameZh: "布宜诺斯艾利斯", |
|
|
|
nameEn: "Buenos Aires", |
|
|
|
lat: -34.6037, |
|
|
|
lon: -58.3816 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "开普敦", |
|
|
|
nameZh: "开普敦", |
|
|
|
nameEn: "Cape Town", |
|
|
|
lat: -33.9249, |
|
|
|
lon: 18.4241 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "悉尼", |
|
|
|
nameZh: "悉尼", |
|
|
|
nameEn: "Sydney", |
|
|
|
lat: -33.8688, |
|
|
|
lon: 151.2093 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "新加坡", |
|
|
|
nameZh: "新加坡", |
|
|
|
nameEn: "Singapore", |
|
|
|
lat: 1.3521, |
|
|
|
lon: 103.8198 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "新德里", |
|
|
|
nameZh: "新德里", |
|
|
|
nameEn: "New Delhi", |
|
|
|
lat: 28.6139, |
|
|
|
lon: 77.209 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "曼谷", |
|
|
|
nameZh: "曼谷", |
|
|
|
nameEn: "Bangkok", |
|
|
|
lat: 13.7563, |
|
|
|
lon: 100.5018 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "法兰克福", |
|
|
|
nameZh: "法兰克福", |
|
|
|
nameEn: "Frankfurt", |
|
|
|
lat: 50.1109, |
|
|
|
lon: 8.6821 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "波哥大", |
|
|
|
nameZh: "波哥大", |
|
|
|
nameEn: "Bogotá", |
|
|
|
lat: 4.711, |
|
|
|
lon: -74.0721 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "深圳", |
|
|
|
nameZh: "深圳", |
|
|
|
nameEn: "Shenzhen", |
|
|
|
lat: 22.5431, |
|
|
|
lon: 114.0579 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "牛津", |
|
|
|
nameZh: "牛津", |
|
|
|
nameEn: "Oxford", |
|
|
|
lat: 51.752, |
|
|
|
lon: -1.2577 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "特拉维夫", |
|
|
|
nameZh: "特拉维夫", |
|
|
|
nameEn: "Tel Aviv", |
|
|
|
lat: 32.0853, |
|
|
|
lon: 34.7818 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "科伦坡", |
|
|
|
nameZh: "科伦坡", |
|
|
|
nameEn: "Colombo", |
|
|
|
lat: 6.9271, |
|
|
|
lon: 79.8612 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "米兰", |
|
|
|
nameZh: "米兰", |
|
|
|
nameEn: "Milan", |
|
|
|
lat: 45.4642, |
|
|
|
lon: 9.19 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "纽约", |
|
|
|
nameZh: "纽约", |
|
|
|
nameEn: "New York", |
|
|
|
lat: 40.7128, |
|
|
|
lon: -74.006 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "莫斯科", |
|
|
|
nameZh: "莫斯科", |
|
|
|
nameEn: "Moscow", |
|
|
|
lat: 55.7558, |
|
|
|
lon: 37.6173 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "达卡", |
|
|
|
nameZh: "达卡", |
|
|
|
nameEn: "Dhaka", |
|
|
|
lat: 23.8103, |
|
|
|
lon: 90.4125 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "迪拜", |
|
|
|
nameZh: "迪拜", |
|
|
|
nameEn: "Dubai", |
|
|
|
lat: 25.2048, |
|
|
|
lon: 55.2708 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "邦加罗尔", |
|
|
|
nameZh: "邦加罗尔", |
|
|
|
nameEn: "Bengaluru", |
|
|
|
lat: 12.9716, |
|
|
|
lon: 77.5946 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "金奈", |
|
|
|
nameZh: "金奈", |
|
|
|
nameEn: "Chennai", |
|
|
|
lat: 13.0827, |
|
|
|
lon: 80.2707 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "雅加达", |
|
|
|
nameZh: "雅加达", |
|
|
|
nameEn: "Jakarta", |
|
|
|
lat: -6.2088, |
|
|
|
lon: 106.8456 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "首尔", |
|
|
|
nameZh: "首尔", |
|
|
|
nameEn: "Seoul", |
|
|
|
lat: 37.5665, |
|
|
|
lon: 126.978 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "香港", |
|
|
|
nameZh: "香港", |
|
|
|
nameEn: "Hong Kong", |
|
|
|
lat: 22.3193, |
|
|
|
lon: 114.1694 |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "全球总部福州", |
|
|
|
nameZh: "全球总部福州", |
|
|
|
nameEn: "Global HQ Fuzhou", |
|
|
|
lat: 26.0745, |
|
|
|
lon: 119.2965 |
|
|
|
} |
|
|
|
@ -295,7 +341,7 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 |
|
|
|
markersData.forEach((data) => { |
|
|
|
const position = latLonToVector3(data.lat, data.lon, .5); |
|
|
|
let marker; |
|
|
|
if (data.name === "全球总部福州") { |
|
|
|
if (data.nameZh === "全球总部福州") { |
|
|
|
marker = new THREE.Mesh(fuzhouMarkerGeometry, fuzhouMarkerMaterial); |
|
|
|
fuzhouMarkerMesh = marker; |
|
|
|
} else marker = new THREE.Mesh(defaultMarkerGeometry, defaultMarkerMaterial); |
|
|
|
@ -303,7 +349,7 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 |
|
|
|
const normal = position.clone().normalize(); |
|
|
|
marker.position.add(normal.multiplyScalar(.01)); |
|
|
|
marker.renderOrder = 1; |
|
|
|
marker.userData = { name: data.name }; |
|
|
|
marker.userData = { name: markerName(data), nameZh: data.nameZh }; |
|
|
|
earth.add(marker); |
|
|
|
markerMeshes.push(marker); |
|
|
|
}); |
|
|
|
@ -325,7 +371,7 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 |
|
|
|
tooltip.classList.add("tooltip-arrow"); |
|
|
|
container.appendChild(tooltip); |
|
|
|
const fuzhouTooltip = tooltip.cloneNode(true); |
|
|
|
fuzhouTooltip.innerHTML = "全球总部<br>福州"; |
|
|
|
fuzhouTooltip.innerHTML = t("earth.hq_fuzhou_html"); |
|
|
|
container.appendChild(fuzhouTooltip); |
|
|
|
const raycaster = new THREE.Raycaster(); |
|
|
|
const mouse = new THREE.Vector2(); |
|
|
|
@ -338,7 +384,7 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 |
|
|
|
if (intersects.length > 0) { |
|
|
|
const object = intersects[0].object; |
|
|
|
const name = object.userData.name; |
|
|
|
if (name !== "全球总部福州") { |
|
|
|
if (object.userData.nameZh !== "全球总部福州") { |
|
|
|
tooltip.textContent = name; |
|
|
|
tooltip.style.display = "block"; |
|
|
|
const vector = object.position.clone(); |
|
|
|
|