MapV地理数据可视化_API-初始化及初步使用

目录

1.mapv初始化及使用

2.mapv的使用

2.1 添加点图层

2.2 添加点轨迹

2.3 添加热力图层

2.4 添加Three.js图层

2.5 炫光特效与发光特效


MapVGL,是一款基于WebGL的地理信息可视化库,可以用来展示大量基于3D的地理信息点线面数据。设计初衷主要是为了解决大数据量的三维地理数据展示问题及一些炫酷的三维效果。

百度地图-信息可视化平台百度地图信息可视化平台,基于百度地图jsapi与地理数据可视化工具库mapvgl,结合行业需求与热点呈现地理可视化作品。https://lbsyun.baidu.com/visualize/home

1.mapv初始化及使用

NPM:

$ npm i mapvgl

 

CDN:

npm的cdn地址

<script src="https://unpkg.com/mapvgl/dist/mapvgl.min.js"></script>

<!-- 如果使用到Three.js相关的图层需要引用 -->
<script src="https://unpkg.com/mapvgl/dist/mapvgl.threelayers.min.js"></script>

 

备用百度cdn地址

<script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.154/dist/mapvgl.min.js"></script>

<!-- 如果使用到Three.js相关的图层需要引用 -->
<script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.154/dist/mapvgl.threelayers.min.js"></script>

 Hello World:

// 1. 创建地图实例
var bmapgl = new BMapGL.Map('map_container');
var point = new BMapGL.Point(116.403748, 39.915055);
bmapgl.centerAndZoom(point, 17);

// 2. 创建MapVGL图层管理器
var view = new mapvgl.View({
    map: bmapgl
});

// 3. 创建可视化图层,并添加到图层管理器中
var layer = new mapvgl.PointLayer({
    color: 'rgba(50, 50, 200, 1)',
    blend: 'lighter',
    size: 2
});
view.addLayer(layer);

// 4. 准备好规范化坐标数据
var data = [{
    geometry: {
        type: 'Point',
        coordinates: [116.403748, 39.915055]
    }
}];

// 5. 关联图层与数据,享受震撼的可视化效果
layer.setData(data);

2.mapv的使用

可参考如下文档进行mapv的使用:

MapV开发文档https://lbsyun.baidu.com/solutions/mapvdata

2.1 添加点图层

 // 创建mapvgl图层管理器
      var view = new mapvgl.View({
        map: map,
      });

      // 创建点图层
      var pointLayer = new mapvgl.PointLayer({
        color: "rgba(55,55,255,1)",
        blend: "lighter",
        size: 40,
      });
      // 将点图层添加到图层管理器
      view.addLayer(pointLayer);

      // 设置点数据
      var data = [
        {
          geometry: {
            type: "Point",
            coordinates: [116.404 + Math.random(), 39.915 + Math.random()],
          },
        },
        {
          geometry: {
            type: "Point",
            coordinates: [116.404 + Math.random(), 39.915 + Math.random()],
          },
        },
        {
          geometry: {
            type: "Point",
            coordinates: [116.404 + Math.random(), 39.915 + Math.random()],
          },
        },
        {
          geometry: {
            type: "Point",
            coordinates: [116.404, 39.915],
          },
        },
      ];

      //将数据设置在点图层里
      pointLayer.setData(data);

实现效果:

2.2 添加点轨迹

 // 创建点图层
      let pointLayer = new mapvgl.PointTripLayer({
        color: "rgba(50, 50, 200, 1)",
        step: 0.01,
        trailLength: 20,
        startTime: 0,
        endTime: 1000,
        size: 20,
      });
      // 将点图层添加到图层管理器
      view.addLayer(pointLayer);

      // 设置点数据
      var data = [
        {
          geometry: {
            type: "Point",
            coordinates: [116.404, 39.915],
          },
          properties: {
            name: "点1",
          },
        },
        {
          geometry: {
            type: "Point",
            coordinates: [
              116.404 + Math.random() * 0.001,
              39.915 + Math.random() * 0.001,
            ],
          },
          properties: {
            name: "点2",
          },
        },
        {
          geometry: {
            type: "Point",
            coordinates: [
              116.404 + Math.random() * 0.001,
              39.915 + Math.random() * 0.001,
            ],
          },
          properties: {
            name: "点2",
          },
        },
        {
          geometry: {
            type: "Point",
            coordinates: [
              116.404 + Math.random() * 0.001,
              39.915 + Math.random() * 0.001,
            ],
          },
          properties: {
            name: "点2",
          },
        },
        {
          geometry: {
            type: "Point",
            coordinates: [
              116.404 + Math.random() * 0.001,
              39.915 + Math.random() * 0.001,
            ],
          },
          properties: {
            name: "点2",
          },
        },
      ];

      //将数据设置在点图层里
      pointLayer.setData(data);

实现效果:

2.3 添加热力图层

 // 创建图层
      let layer = new mapvgl.HeatmapLayer({
        gradient: {
          0: "rgb(50,50,255)",
          1: "rgb(255,50,50)",
        },
        max: 100,
        min: 0,
      });
      // 将点图层添加到图层管理器
      view.addLayer(layer);

      // 设置点数据
      var data = [
        {
          geometry: {
            type: "Point",
            coordinates: [116.404 + Math.random(), 39.915 + Math.random()],
          },
          properties: {
            name: "点1",
          },
        },
      ];

      for (let i = 0; i < 1000; i++) {
        data.push({
          geometry: {
            type: "Point",
            coordinates: [116.404 + Math.random(), 39.915 + Math.random()],
          },
          properties: {
            count: Math.random() * 100,
          },
        });
      }

      //将数据设置在点图层里
      layer.setData(data);

实现效果:

2.4 添加Three.js图层

使用Three.js相关功能时,除在之前引用的百度地图资源和mapv资源外,还需引入Three相关依赖:

 <!-- 如果使用到Three.js相关的图层需要引用 -->
    <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.140/dist/mapvgl.threelayers.min.js"></script>

使用Threejs

MapVGL中内置了Threejs,在引入mapvgl.threelayers之后,您不必在项目中再次引入Three.js,可以通过如下方法拿到THREE对象

var THREE = mapvgl.THREE;

例如使用mapv+Three+ThreeGLTFLoader()实现三维模型加载:

      // 创建图层
      let layer = new mapvgl.ThreeLayer();

      //   将图层添加到管理器
      view.addLayer(layer);
      //坐标转换
      var tPoint = mapvgl.MercatorProjection.convertLL2MC(point); 
      //初始化Three    
      var THREE = mapvgl.THREE;
      //加载模型
      var loader = new THREE.GLTFLoader();
      loader.load("./assets/model/rocket.glb", (gltf) => {
        console.log(gltf);
        var model = gltf.scene;
        model.position.set(tPoint.lng, tPoint.lat, 0);
        model.scale.set(10, 10, 10);
        layer.add(model);

        // 添加平行光
        var light = new THREE.DirectionalLight(0xffffff, 1);
        light.position.set(0, 0, 1);
        layer.add(light);
        var light1 = new THREE.DirectionalLight(0xffffff, 1);
        light.position.set(1, 1, 1);
        layer.add(light1);
      });

实现效果:

 2.5 炫光特效与发光特效

1.bloomEffect炫光效果

// 创建炫光处理通道
var bloomEffect = new mapvgl.BloomEffect({
    threshold: 0.2,
    blurSize: 2.0
});

// 在图层管理器View中,通过传入effects参数使用
var view = new mapvgl.View({
    effects: [bloomEffect],
    map: bmapgl
});

实现效果:

 2.BrightEffect发光特效

// 创建炫光处理通道
var bright = new mapvgl.BrightEffect({
    threshold: 0.2,
    blurSize: 2.0,
    clarity: 0.8
});

// 在图层管理器View中,通过传入effects参数使用
var view = new mapvgl.View({
    effects: [bright],
    map: bmapgl
});

实现效果:

 

### 集成MapV库到Cesium 为了在 Cesium 中集成并使用 MapV 库进行可视化开发,开发者可以遵循特定的方法来确保两个库之间的兼容性和功能性。以下是具体方法: #### 准备工作 首先,在项目中引入必要的依赖项。这通常意味着要通过 npm 或者直接下载的方式将 Cesium 和 MapV 添加至前端工程环境中。 对于 Cesium 而言,可以通过官方文档指导完成安装配置[^1]。而对于 MapV,则可以从其 GitHub 页面找到最新的版本,并按照说明加入 HTML 文件头部或者利用包管理工具如 yarn/npm 安装[^3]。 #### 数据准备与处理 MapV 主要是用来展示大数据量的地图热力图、轨迹动画等功能。因此,在实际操作前需准备好相应的地理坐标数据集以及样式定义规则。这些数据可能来自于服务器端API请求返回的结果或者是本地静态文件加载得到的数据集合。 #### 创建地图容器 创建一个 DOM 元素作为承载整个场景的基础画布,设置合适的宽高比例以便于后续渲染效果调整。此部分代码如下所示: ```html <div id="cesiumContainer"></div> <script src="./path/to/cesium/Cesium.js"></script> <link href="./path/to/cesium/Widgets/widgets.css" rel="stylesheet"> ``` #### 初始化 Cesium 场景 初始化 Cesium Viewer 实例对象,指定之前创建好的 div ID 以及其他选项参数(比如是否开启地形服务等)。这段逻辑应该放在页面完全载入之后执行。 ```javascript const viewer = new Cesium.Viewer('cesiumContainer', { terrainProvider : Cesium.createWorldTerrain() }); ``` #### 加载矢量瓦片层或其他底图源 根据需求决定采用何种方式获取背景影像或矢量切片作为底层显示素材。这里可以选择调用在线 API 接口或是离线部署的服务地址。 ```javascript viewer.imageryLayers.addImageryProvider( new Cesium.UrlTemplateImageryProvider({ url : 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}@2x.png', subdomains : ['a','b','c'] })); ``` #### 使用 MapV 绘制图形覆盖物 当一切准备工作就绪后就可以着手构建基于 MapV 的视觉化表达形式了。下面给出一段简单的例子用于演示如何绘制热点区域分布情况。 ```javascript import * as mapv from 'mapv'; // 假设已有一个包含经纬度坐标的数组 pointsData let dataset = new mapv.DataSet(pointsData); let heatmapLayer = new mapv.Layer({ zIndex: 1, draw: function (renderData, projection) { let canvas = this.getCanvas(); context.clearRect(0, 0, canvas.width, canvas.height); renderData.forEach(function(data){ var pixel = projection.latlngToPixel([data.geometry.coordinates[1], data.geometry.coordinates[0]], zoomLevel); // Draw heatmaps using the given coordinates and other properties. ... }); } }); heatmapLayer.setDataSet(dataset); viewer.scene.primitives.add(new Cesium.Primitive({ geometryInstances: [], appearance: new Cesium.EllipsoidSurfaceAppearance(), asynchronous: false })); function updateHeatmap() { const cameraPosition = viewer.camera.positionCartographic; const currentZoomLevel = Math.log(viewer.camera.frustum.near / viewer.camera.frustum.far) / Math.LN2; heatmapLayer.draw(currentZoomLevel); } updateHeatmap(); viewer.scene.postRender.addEventListener(updateHeatmap); ``` 上述过程展示了怎样把来自 MapV 的自定义图层嵌入到由 Cesium 构建的世界视窗之中。值得注意的是,由于两者的工作机制存在差异,所以在融合过程中可能会遇到一些挑战,例如投影转换问题、性能瓶颈等等。针对这些问题则需要进一步深入研究两者的特性来进行针对性解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HM-hhxx!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值