百度地图的基础和自定义动画的实践

百度地图API

引用以及初始化

百度在线地图用于生成在线的地图,可以完成地图绘制、基本标记点、

引用过后window上面会有一个全局的 BMapGl 的对象,这是地图上标记点覆盖物的基础

于common.js 引入,initMap方法,本质上是对new BMapGL.Map(‘container’)的一种扩展

const map = initMap({
  tilt: 45, // 旋转角度
  heading: 30, // 倾斜角度
  center: [118.823692, 32.035499], // 中心坐标点
  zoom: 18, // 缩放层级
})

通用外链 https://mapv.baidu.com/gl/examples/static/common.js

设置地图类型
map.setMapType(BMAP_EARTH_MAP); 
  1. 标准地图:BMAP_NORMAL_MAP
  2. 地球模式:BMAP_EARTH_MAP
  3. 普通卫星地图:BMAP_SATELLITE_MAP
  • 通过样式ID调用个性化地图样式,样式id在百度地图后台设置

    map.setMapStyleV2({
      styleId: 你的样式id,
    })
    
生成并初始化view
const view = new View({
  map: map,
})

生成渲染点

const point = new BMapGL.Point(118.818203, 32.036984)
// 根据经纬度生成一个 { lng, lat } 的点对象
自定义渲染
const imgUrl = 'img/icon.svg'
// 生成图片
const icon = new BMapGL.Icon(imgUrl, new BMapGL.Size(100, 100))
// 自定义标记点
const marker = new BMapGL.Marker(this.point, {
  size: 100,
  icon
})
map.addOverlay(marker)

这样就添加了一个自定义的标记点了

其他

通过百度API可以实现基础的点线面, 具体实现参考文档,如果想要实现复杂的图层,则要借助于百度地图gl模块

地图gl模块

下载引用引用

npm install mapvgl

index.js 这样引用

import { View, HeatmapLayer, HeatGridLayer } from 'mapvgl'

曲线生成器

  • 贝塞尔曲线坐标集,生成飞线数据

    const curve = new mapvgl.BezierCurve({
        start: [12946640.989, 4846560.296],
        end: [12946348.509, 4846401.146]
    });
    curve.getPoints() // 生成两点坐标集
    
  • Od曲线生成器

    const curve = new mapvgl.OdCurve({
      points: [
        [116.392394, 39.910683],
        [111.432322, 40.222315]
      ]
    })
    curve.getPoints() // 生成两点坐标集
    

飞线

import { FlyLineLayer } from 'mapvgl/dist/mapvgl.threelayers.min'

const flyLineLayer = new FlyLineLayer({
  style: 'chaos', // 动画方式  chaos 不均匀   
  step: 0.2, //步长
  color: 'rgba(33, 242, 214, 0.3)',
  textureColor: '#ff0000',
  textureWidth: 30,
  textureLength: 60,
})

雷达

import { FanLayer } from 'mapvgl/dist/mapvgl.threelayers.min'

const layer = new FanLayer({
    color: 'rgba(50, 50, 200, 1)',
    radius: 100,
    data: [{
        geometry: {
            type: 'Point',
            coordinates: [116.392394, 39.910683]
        }
    }]
});

无人机移动动画

使用自定义点渲染出无人机

const imgUrl = 'img/uav.png' // 无人机图片
const point = new BMapGL.Point(118.818203, 32.036984) // 无人机坐标
// 生成图片
const icon = new BMapGL.Icon(imgUrl, new BMapGL.Size(100, 100))
// 自定义标记点
const marker = new BMapGL.Marker(point, {
  size: 100,
  icon
})
map.addOverlay(marker)

无人机移动

我们想实现这样一个功能,就是通过传入无人机的名称、目标坐标、路径类型、移动时长,然后执行移动的程序

百度API有一个轨迹动画功能,交互也比较好,可惜的是,轨迹动画不能自定义点,生成的轨迹也只能是黑色,所以并没有使用轨迹动画,所以我们换了一种思路,使用requestAnimationFrame方法,根据屏幕刷新的帧数,一般为 60Hz,也就是说屏幕一秒钟刷新 60 次,于是我们每次就在屏幕刷新时候,更新无人机的位置,这样就形成了无人机的移动动画

根据时长生成帧数
const ftp = 60
const FTP_NUM = 0.5
const frames = Math.floor(time / 1000 * ftp * FTP_NUM)

以上代码中,time为传入时间,ftp为屏幕刷新频率,FTP_NUM为内存参数,因为要有复杂的动画处理,刷新频率的回调requestAnimationFrameftp会比实际的小一点,由此添加了这么一个参数

生成移动路径坐标集

前面我们已经算出了动画帧数,就可以凭此生成移动路径的坐标集
移动路径定义为三种,直线、曲线1、曲线2

  • 直线
    • 直线生成直接根据前后坐标,分成frames份,从而得出坐标集
  • 曲线
    • 以Od曲线为例

      const curve = new mapvgl.OdCurve({
        points: [
          [116.392394, 39.910683],
          [111.432322, 40.222315]
        ]
      })
      const coors = curve.getPoints(frames) // 生成两点坐标集
      
移动动画

得到移动路径坐标集之后,无人机就可以移动了

function animateMarker(num) {
  // 更新 marker 的位置
  if (num > frames) {
    return
  }
  // 继续下一帧动画
  requestAnimationFrame(() => this.animateMarker(++num))
  const current = coors[num]
  // marker 移动到当前坐标点
  marker.setPosition(current)
}

marker - 前文中生成的无人机自定义渲染点
frames - 帧数 coors - 移动路径坐标集

移动时飞线和雷达处理

无人机通讯使用的飞线特效,无人机的雷达使用的是雷达特效,我们的移动动画是自己写的,由此在移动过程中,务必要考虑目标无人机的雷达和飞线的移动。

  • 封装雷达移动函数在无人机坐标改变时候调用

    function setFanLayer(coor) {
      const fanData = {
        geometry: {
          type: 'Point',
          coordinates: coor,
        },
        properties: {
          count: 100,
        }
      }
      fanLayer.setData([fanData])
    }
    
  • 飞线处理同理

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 以下是一个简单的示例,展示如何加载并使用自定义GeoJSON文件来在百度地图上绘制多边形: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>百度地图加载使用自定义GeoJSON示例</title> <style type="text/css"> #map { height: 500px; width: 100%; } </style> </head> <body> <div id="map"></div> <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=您的密钥"></script> <script type="text/javascript" src="http://api.map.baidu.com/library/GeoJSON/1.2/src/GeoJSON.min.js"></script> <script type="text/javascript"> var map = new BMap.Map("map"); map.centerAndZoom(new BMap.Point(116.404, 39.915), 14); // 加载GeoJSON文件 var geojson = new BMapGL.GeoJSON(); geojson.load("/path/to/your/geojson/file.json"); // 监听加载完成事件 geojson.addEventListener("load", function() { // 获取所有feature var features = geojson.getFeatures(); // 遍历feature并添加到地图上 for (var i = 0; i < features.length; i++) { var feature = features[i]; var polygon = new BMap.Polygon(feature.geometry.coordinates, {strokeWeight: 2, strokeColor: "#ff0000", fillColor: "#ff0000", fillOpacity: 0.5}); map.addOverlay(polygon); } }); </script> </body> </html> ``` 在上面的示例中,我们加载了一个GeoJSON文件,然后添加了其中的多边形到百度地图上。你需要将代码中的密钥替换为你自己的百度地图密钥,并将`/path/to/your/geojson/file.json`替换为你自己的GeoJSON文件路径。 ### 回答2: 百度地图加载使用自定义geojson示例的过程如下: 首先,将geojson文件准备好,并确保其符合geojson的格式要求。可以使用文本编辑器创建一个.geojson文件,在该文件中添加地理数据。比如,我们可以创建一个用于展示某个城市的坐标点的地图。 接下来,在代码中引入百度地图的API,可以在<head>标签中添加如下代码: ```html <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你的百度地图API密钥"></script> ``` 其中,`ak=你的百度地图API密钥`需要替换成你在百度地图开发者平台注册应用时获取到的API密钥。 然后,创建一个地图实例。可以在<script>标签中加入如下代码: ```html <script type="text/javascript"> // 创建地图实例 var map = new BMap.Map("mapContainer"); // 设置地图中心点 var point = new BMap.Point(经度, 纬度); map.centerAndZoom(point, 缩放级别); map.enableScrollWheelZoom(); // 加载geojson文件 map.data.loadGeoJson("path/to/your/geojson/file.geojson"); </script> ``` 在上面的代码中,需要将`经度`、`纬度`、`缩放级别`和`path/to/your/geojson/file.geojson`替换成你实际的地理位置信息和geojson文件的路径。 最后,在HTML文件中添加一个容器来显示地图: ```html <div id="mapContainer" style="width: 100%; height: 500px;"></div> ``` 在上述代码中,`width`和`height`可以根据需要进行调整。 运行代码之后,你就可以在浏览器中看到百度地图加载了你自定义的geojson文件,并展示了地理数据。 ### 回答3: 百度地图的加载和使用可以通过自定义GeoJSON示例来实现。GeoJSON是一种地理数据格式,可以包含地理要素(如点、线、面)的几何信息和属性数据。 要加载并使用自定义GeoJSON示例,首先需要获取GeoJSON示例文件。可以通过文件上传或者网络请求等方式获取。 接下来,可以使用百度地图的API提供的方法来加载GeoJSON示例。首先,需要创建一个地图实例,使用百度地图的`new BMap.Map()`方法来实现。然后,可以使用`map.addOverlay()`方法将GeoJSON示例添加到地图中。 代码示例: ``` // 创建地图实例 var map = new BMap.Map("mapContainer"); // 加载GeoJSON示例 var jsonUrl = "http://example.com/your_geojson_file.geojson"; // GeoJSON示例文件的URL $.getJSON(jsonUrl, function(data) { // 创建GeoJSON图层 var geoJsonLayer = new BMapGL.GeoJSONLayer(data); // 添加GeoJSON图层到地图中 map.addOverlay(geoJsonLayer); }); ``` 在上述代码中,`mapContainer`是用来展示地图的HTML元素的id,可以根据实际情况修改。`jsonUrl`是GeoJSON示例文件的URL,可以将其替换为实际的文件URL。 加载自定义GeoJSON示例后,可以通过地图的交互操作实现地图的缩放、平移等功能。也可以通过GeoJSON的属性数据来实现一些与地图相关的功能,如点击地图要素显示相关信息等。 总之,通过使用百度地图的API和自定义的GeoJSON示例,可以实现地图的加载和展示,为用户提供更丰富的地图信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值