Three.js 3D 地图可视化 | 三维可视化 / AI 提示词

Three.js 3D 地图可视化 | 三维可视化 / AI 提示词

📋 AI 提示词

prompt 复制代码
使用 Three.js 加载 GeoJSON 地图数据,通过坐标转换和 ExtrudeGeometry 创建 3D 地图效果,实现地理数据的 3D 可视化。

🖼️ 效果预览


🎮 案例演示

立即体验


效果拆解

效果 实现方式
GeoJSON加载 使用fetch API加载地图数据
坐标转换 将经纬度转换为平面坐标
形状创建 使用Shape和Path创建地图轮廓
挤压几何体 使用ExtrudeGeometry创建3D厚度
随机颜色 为每个区域分配随机颜色
中心定位 计算并设置地图中心点

核心技术点

1. GeoJSON加载和处理

javascript 复制代码
const geoJson = await fetch(
  FILE_HOST + '/files/json/guangdong.json'
).then((res) => res.json());

geoJson.features.forEach((i) => {
  if (i.geometry.type === "MultiPolygon")
    i.geometry.coordinates.forEach((j) =>
      j.forEach((z) => createShapeWithCoord(z, group, i))
    );
  else if (i.geometry.type === "Polygon")
    i.geometry.coordinates.forEach((j) =>
      createShapeWithCoord(j, group, i)
    );
});

translationOriginForGroup(group);
scene.add(group);

2. 坐标转换

javascript 复制代码
function coordToVector2(coord, slace = 10000) {
  const [lng, lat] = coord;

  const x = (lng * 20037508.34) / 180;

  let y =
    Math.log(Math.tan(((90 + lat) * Math.PI) / 360)) / (Math.PI / 180);

  y = (y * 20037508.34) / 180;

  return new THREE.Vector2(x / slace, y / slace);
}

3. 形状创建

javascript 复制代码
function createShapeWithCoord(coordinates, group, info = null) {
  const curvePoints = coordinates.map((k) => coordToVector2(k));

  const path = new THREE.Path(curvePoints);

  const shape = new THREE.Shape();

  shape.path = path;

  shape.curves.push(path);

  const parameters = {
    bevelEnabled: false,
    bevelThickness: 0,
    bevelSize: 0,
    bevelOffset: 0,
    depth: 2,
    bevelEnabled: false,
  };

  const geometry = new THREE.ExtrudeGeometry(shape, parameters);

  const material = new THREE.MeshBasicMaterial({
    color: 0xffffff * Math.random(),
    transparent: true,
  });

  const mesh = new THREE.Mesh(geometry, material);

  const boundingBox = new THREE.Box3().setFromObject(mesh);

  boundingBox.getCenter(mesh.position);

  mesh.geometry.center();

  mesh.info = info;

  group.attach(mesh);
}

4. 中心点设置

javascript 复制代码
function translationOriginForGroup(group) {
  const boundingBox = new THREE.Box3().setFromObject(group);

  boundingBox.getCenter(group.position);

  group.traverse((c) => {
    c.isMesh && c.position.sub(group.position);

    c.initTranslate = c.position.clone();
  });

  group.position.set(0, 0, 0);
}

调试技巧

  1. 坐标缩放:调整slace参数控制地图缩放比例
  2. 挤压深度:修改depth参数改变3D厚度
  3. 颜色设置:调整颜色生成算法获得更好的视觉效果
  4. 中心定位:检查translationOriginForGroup函数确保地图居中
  5. 坐标转换:验证坐标转换公式的准确性

扩展思路

  1. 交互效果:添加鼠标悬停高亮显示
  2. 数据标注:在地图上添加数据标签
  3. 高度映射:根据数据值调整区域高度
  4. 动画效果:实现地图的飞入或旋转动画
  5. 多层级:支持加载不同层级的地图数据
  6. 样式定制:支持自定义区域样式和边框
相关推荐
2501_928996226 分钟前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
东风破_7 分钟前
从跨域到 WebSocket:前端跨域方案、SSE 与双向实时通信详解
前端·后端
原则猫16 分钟前
TS 类型工具
前端
敢敢のwings17 分钟前
ACT-2 深度解析:家用机器人如何把“会做”推进到“可靠地做”
人工智能·机器人
DM今天肝到几点?22 分钟前
AI 安全进入「攻防同频」:Gemini 3.8 Flash Cyber 上线、Astra 触及关键级、HiddenLayer 融资 1 亿美元
网络·人工智能·深度学习·安全·语言模型·开源·知识图谱
智购科技自动贩卖机1 小时前
自动售货机嵌入式状态机设计实战:从45个事件源到层次型状态机的工程重构
大数据·人工智能·stm32·物联网·重构·硬件架构
乐迪信息1 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
excel1 小时前
Nuxt + Twin CSS 中宽度超过屏幕时底部出现空白的原因与解决方案
前端·javascript
markvivv1 小时前
读《OpenViking:上下文数据库架构介绍》有感
人工智能·上下文工程
Raas1001 小时前
MAI Gateway(魔芋企业级AI网关)对比分析:AI网关和API网关区别?企业级能力差距一览
大数据·人工智能·数据挖掘·mai gateway·企业级产品