【百度地图可视化(MapVGL)】立方体3D建筑案例

参考网址: MapVGL (baidu.com)
对地理坐标进行转换的API Web服务API | 百度地图API SDK (baidu.com)

百度地图可视化3D建筑
1. 初始化页面样式和引入需要的JS库
  1. 需要设置html、body和容器的宽高为 100%
<style>
        html,
        body {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }

        #map_container {
            width: 100%;
            height: 100%;
        }

    </style>

    <!-- 百度地图基础库 -->
    <script type="text/javascript"
            src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=**********"></script>
    <!-- 公共的文件代码 里面包含 地图初始化 和 实用样式 -->
    <script src="https://mapv.baidu.com/gl/examples/static/common.js"></script>
    <!-- 使用根据城市名称获取城市的坐标 -->
    <script src="https://mapv.baidu.com/build/mapv.js"></script>
    <!--使用mapcgl的时候需要引入-->
    <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.54/dist/mapvgl.min.js"></script>

2. 初始化地图容器

  1. 初始化地图容器使用一个标签,因为这里使用 common.js对地图进行初始化,在该文件中固定了获取容器的idmap_container,所以在初始化容器时需要固定其idmap_container

  2. 当然也可以将 common.js文件下载修改后单独引入,自己定义的文件。

<div id="map_container"></div>
3. 初始化地图
 /**
   * 初始化地图
   * @returns {*}
   */
  function initMyMap() {
    let centerCity = mapv.utilCityCenter.getCenterByCityName('重庆')
    return initMap(
      {
        tilt: 60,
        heading: 0,
        zoom: 17,
        center: [centerCity.lng, centerCity.lat],
        style: purpleStyle
      }
    )
  }
4. 准备数据源
  1. 准备的数据源是获取的某处的建筑 json 数据并对其专门进行解析。

  2. 如果我们单独需要创建一个 立体多边形,可以参考官方文档中需要哪些数据,按照指定的需求根据获取到的数据进行解析。

var layer = new mapvgl.ShapeLayer({
    color: 'rgba(55, 55, 200, 1)',
    blend: 'lighter',
    style: 'normal',
    data: [{
        geometry: {
            type: 'Polygon',
          // 立体多边形需要的三个点坐标数据
            coordinates: [
                [
                    [116.392394, 39.910683],
                    [116.405976, 39.927727],
                    [116.420996, 39.910351]
                ]
            ]
        },
        properties: {
            height: 100, // 多边形高度
        }
    }]
});
/**
   * 准备需要的数据信息
   * @returns {Promise<any>}
   */
  function initData() {
    // 请求某处的城市建筑数据
    return fetch('https://www.youbaobao.xyz/datav-res/examples/chongqing.json').then(
      res => res.json()
    ).then(
      res => {
        // 数据的长度
        let len = res.length
        let data = []
        // 下面的算法是根据请求到的数据进行专门处理的算法 ,在开发中我们需要获取的数据有 一些点的坐标用于构成面 以及高度数据
        for (let i = 0; i < len; i++) {
          // 获取结果中的每一项数据
          let line = res[i]
          // 每一个多边形的面数据
          let polygon = []
          // 转换为 墨卡托数据
          let pt = [line[1] * 512, line[2] * 512]
          for (let j = 3; j < line.length; j += 2) {
            pt[0] += line[j] / 100 / 2
            pt[1] += line[j + 1] / 100 / 2
            polygon.push(
              // 这是一个三维数组
              [pt[0], pt[1]]
            )
          }

          // 将数据设置到我们的data中
          data.push(
            {
              geometry: {
                // 设置类型为多边形
                type: 'Polygon',
                coordinates: [
                  polygon
                ]
              },
              properties: {
                // 在获取到的数据中第一个数据代表的是高度
                height: line[0] / 2
              }
            }
          )
        }
        return data
      }
    )
  }
5. 绘制数据源
  /**
   * 绘制数据源
   * @param map
   * @param data
   */
  function setData(map, data) {
    // 创建一个图层管理器
    let view = new mapvgl.View({
      map
    })

    // 创建一个需要是多边形立体图层
    let shapeLayer = new mapvgl.ShapeLayer(
      {
        // 这里面有的属性在官方文档中也是没有介绍,但是可以查看一些官方案例就可以知道其他属性
        // 建筑图层的颜色
        color: 'rgba(194, 147, 75, 0.8)',
        // 重叠的时候使用什么样式
        // blend: 'lighter',
        style: 'windowAnimation', //
        opacity: 1,//多边形透明度
        riseTime: 1000,// 建筑升起动画
        enablePicked: true,// 是否可以进行拾取
        selectedIndex: -1, // 选中项
        selectedColor: '#ee1111', // 选中的颜色
        autoSelect: true, // 根据鼠标位置自动设置选中
        onClick: (e) => {
          console.log(e) // 打印的是当前选中的多边形对象
        }
      }
    )

    // 将图层添加到图层管理其中
    view.addLayer(shapeLayer)
    // 将数据和图层进行邦信
    shapeLayer.setData(data)
  }

6. 案例完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>replay-dataV-MapVGL-Shape</title>

    <style>
        html,
        body {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }

        #map_container {
            width: 100%;
            height: 100%;
        }

    </style>

    <!-- 百度地图基础库 -->
    <script type="text/javascript"
            src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=*****"></script>
    <!-- 公共的文件代码 里面包含 地图初始化 和 实用样式 -->
    <script src="https://mapv.baidu.com/gl/examples/static/common.js"></script>
    <!-- 使用根据城市名称获取城市的坐标 -->
    <script src="https://mapv.baidu.com/build/mapv.js"></script>
    <!--使用mapcgl的时候需要引入-->
    <script src="https://code.bdstatic.com/npm/mapvgl@1.0.0-beta.54/dist/mapvgl.min.js"></script>
</head>
<body>

<div id="map_container"></div>

<!-- 复盘立方体 3D建筑 -->
<script>

  let map = initMyMap()
  // initData函数返回的是一个Promise对象需要进行处理
  initData().then(
    data => {
      setData(map, data)
    }
  )

  /**
   * 初始化地图
   * @returns {*}
   */
  function initMyMap() {
    let centerCity = mapv.utilCityCenter.getCenterByCityName('重庆')
    return initMap(
      {
        tilt: 60,
        heading: 0,
        zoom: 17,
        center: [centerCity.lng, centerCity.lat],
        style: purpleStyle
      }
    )
  }


  /**
   * 准备需要的数据信息
   * @returns {Promise<any>}
   */
  function initData() {
    // 请求某处的城市建筑数据
    return fetch('https://www.youbaobao.xyz/datav-res/examples/chongqing.json').then(
      res => res.json()
    ).then(
      res => {
        // 数据的长度
        let len = res.length
        let data = []
        // 下面的算法是根据请求到的数据进行专门处理的算法 ,在开发中我们需要获取的数据有 一些点的坐标用于构成面 以及高度数据
        for (let i = 0; i < len; i++) {
          // 获取结果中的每一项数据
          let line = res[i]
          // 每一个多边形的面数据
          let polygon = []
          // 转换为 墨卡托数据
          let pt = [line[1] * 512, line[2] * 512]
          for (let j = 3; j < line.length; j += 2) {
            pt[0] += line[j] / 100 / 2
            pt[1] += line[j + 1] / 100 / 2
            polygon.push(
              // 这是一个三维数组
              [pt[0], pt[1]]
            )
          }

          // 将数据设置到我们的data中
          data.push(
            {
              geometry: {
                // 设置类型为多边形
                type: 'Polygon',
                coordinates: [
                  polygon
                ]
              },
              properties: {
                // 在获取到的数据中第一个数据代表的是高度
                height: line[0] / 2
              }
            }
          )
        }
        return data
      }
    )
  }

  /**
   * 绘制数据源
   * @param map
   * @param data
   */
  function setData(map, data) {
    // 创建一个图层管理器
    let view = new mapvgl.View({
      map
    })

    // 创建一个需要是多边形立体图层
    let shapeLayer = new mapvgl.ShapeLayer(
      {
        // 这里面有的属性在官方文档中也是没有介绍,但是可以查看一些官方案例就可以知道其他属性
        // 建筑图层的颜色
        color: 'rgba(194, 147, 75, 0.8)',
        // 重叠的时候使用什么样式
        // blend: 'lighter',
        style: 'windowAnimation', //
        opacity: 1,//多边形透明度
        riseTime: 1000,// 建筑升起动画
        enablePicked: true,// 是否可以进行拾取
        selectedIndex: -1, // 选中项
        selectedColor: '#ee1111', // 选中的颜色
        autoSelect: true, // 根据鼠标位置自动设置选中
        onClick: (e) => {
          console.log(e) // 打印的是当前选中的多边形对象
        }
      }
    )

    // 将图层添加到图层管理其中
    view.addLayer(shapeLayer)
    // 将数据和图层进行邦信
    shapeLayer.setData(data)
  }

</script>

</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容