AntV L7深圳智慧城市

本案例使用L7库和Mapbox GL JS构建深圳智慧城市。

1. 引入 CDN 链接

<!-- 1.引入CDN链接 -->
<script src="https://unpkg.com/@antv/l7"></script>
<script src="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.js"></script>
<link
  href="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.css"
  rel="stylesheet"
/>

2. 引入组件

我们使用开源库 L7 来引入和初始化三个类:Scene、Mapbox 和 PolygonLayer。L7 库是一个用于创建地图的可控组件的库,它基于 Vue.js 和 Tuandoushi(天斗星)框架。

  1. Scene 类:这是一个用于创建地图场景的类。它提供了地图的基本设置,如视图、地图图层和样式。

  2. Mapbox 类:这是一个用于创建 Mapbox 地图的类。它提供了基于 Mapbox 的地图服务器的设置。

  3. PolygonLayer 类:这是一个用于创建多边形图层的类。它提供了绘制多边形图层的方法。

const { Scene, Mapbox, PolygonLayer } = L7;

3. 创建地图

我们创建了一个Mapbox GL JS地图实例,设置了地图的容器、默认的地图风格、中心点坐标、地图级别、默认的地图投影模式以及俯仰角。

// 3.创建地图
const map = new mapboxgl.Map({
  container: "map",
  style: "mapbox://styles/mapbox/streets-v12",
  center: [114.050008, 22.529272],
  zoom: 13,
  projection: "globe",
  pitch: 70,
});

4. 创建场景

Scene组件负责显示地图和其他图层。

const scene = new L7.Scene({
  id: "map",
  map: new Mapbox({
    mapInstance: map,
  }),
});

5. 获取数据

使用 fetch 函数从服务器获取数据:

        fetch(
          "https://gw.alipayobjects.com/os/basement_prod/972566c5-a2b9-4a7e-8da1-bae9d0eb0117.json"
        )
          .then((res) => res.json())
          .then((data) => {
            const colors = [
              "#816CAD",
              "#A67FB5",
              "#C997C7",
              "#DEB8D4",
              "#F5D4E6",
              "#FAE4F1",
              "#FFF3FC",
            ];

6. 创建面图层

我们需要创建一个新的PolygonLayer对象,然后添加数据源,接着设置形状、激活状态和颜色等属性,最后将层添加到场景中。

// 6.创建面图层
const layer = new PolygonLayer({})
  // source添加数据源
  .source(data)
  .shape("extrude")
  .active(true)
  .color("h20", colors)
  .size("h20", [100, 120, 160, 200, 260, 300]);

scene.addLayer(layer);

7. 演示效果

image-20240229114011834

8. 代码实现

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>深圳智慧城市</title>
    <!-- 1.引入CDN链接 -->
    <script src="https://unpkg.com/@antv/l7"></script>
    <script src="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.js"></script>
    <link
      href="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.css"
      rel="stylesheet"
    />
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      body {
        overflow: hidden;
      }
      #map {
        width: 100vw;
        height: 100vh;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>
    <script>
      // 2.引入组件
      const { Scene, Mapbox, PolygonLayer } = L7;
      mapboxgl.accessToken =
        "pk.eyJ1IjoiemhvbmdkaXNodW1hIiwiYSI6ImNsNXJoYXR5eTI2bGgzZW53d2didWF1c3AifQ.6vOplM2NQc_xnJW3aA5ZBA";

      // 3.创建地图
      const map = new mapboxgl.Map({
        container: "map",
        style: "mapbox://styles/mapbox/streets-v12",
        center: [114.050008, 22.529272],
        zoom: 13,
        projection: "globe",
        pitch: 70,
      });

      // 4.创建场景
      const scene = new L7.Scene({
        id: "map",
        map: new Mapbox({
          mapInstance: map,
        }),
      });

      scene.on("loaded", () => {
        // 5.获取数据
        fetch(
          "https://gw.alipayobjects.com/os/basement_prod/972566c5-a2b9-4a7e-8da1-bae9d0eb0117.json"
        )
          .then((res) => res.json())
          .then((data) => {
            const colors = [
              "#816CAD",
              "#A67FB5",
              "#C997C7",
              "#DEB8D4",
              "#F5D4E6",
              "#FAE4F1",
              "#FFF3FC",
            ];
            // 6.创建面图层
            const layer = new PolygonLayer({})
              // source添加数据源
              .source(data)
              .shape("extrude")
              .active(true)
              .color("h20", colors)
              .size("h20", [100, 120, 160, 200, 260, 300]);

            scene.addLayer(layer);
          });
      });
    </script>
  </body>
</html>
### 使用 Mapbox 和 AntV L7 进行地图可视化开发 #### 初始化项目环境 为了使用 Mapbox 和 AntV L7 开发 3D 地图应用,需先安装必要的依赖包。通过 npm 或 yarn 安装 `@antv/l7` 和 `@antv/l7-maps`。 ```bash npm install @antv/l7 @antv/l7-maps ``` #### 导入所需模块 在 JavaScript 文件中导入必需的类和方法来配置基础的地图设置: ```javascript import { Scene, PointLayer, PolygonLayer, LineLayer, Popup } from '@antv/l7'; import { Mapbox } from '@antv/l7-maps'; ``` #### 创建场景实例 创建一个新的 `Scene` 对象作为整个可视化的容器,并指定渲染目标 DOM 元素以及所使用的地图服务提供商(此处为 Mapbox)。这一步骤定义了全局的地图参数,比如中心位置、缩放级别等[^2]。 ```javascript const scene = new Scene({ id: 'container', // 渲染的目标 div ID map: new Mapbox({ style: 'mapbox://styles/mapbox/streets-v11', center: [104.189776, 37.531372], zoom: 4, pitch: 45, bearing: -20 }) }); scene.on('loaded', () => { console.log('Map loaded'); }); ``` #### 添加几何图形层 根据需求向场景添加不同类型的图层,例如点状分布的数据可以用 `PointLayer` 表达;对于区域性的统计信息,则适合采用 `PolygonLayer` 展示。下面是一个简单的例子展示了如何加载 GeoJSON 数据源并将其呈现为一个多边形图层[^3]。 ```javascript fetch('/path/to/your/data.geojson') .then(response => response.json()) .then(data => { const polygonLayer = new PolygonLayer({ source: data, color: '#f00' }); scene.addLayer(polygonLayer); }); ``` #### 增强用户体验 为了让用户能够更好地探索数据,在适当的位置可以加入交互元素如点击事件触发的信息框 (`Popup`) 显示更多详情。 ```javascript polygonLayer.on('click', (e) => { const popupContent = `<div>Feature Info:</div>`; new Popup().setLnglat(e.lngLat).setContent(popupContent).addTo(scene); }); ``` 以上就是利用 Mapbox 结合 AntV L7 构建自定义三维地理信息系统的基础流程介绍。开发者可以根据实际应用场景灵活调整各部分的具体实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值