地图sdk

123 阅读4分钟

地图SDK指南

一、集成地图SDK

在您的应用程序中集成地图SDK,首先需要前往官方网站下载适用于您平台的SDK。然后,按照官方文档的说明,将SDK添加到您的项目中。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        html, body {height: 100%;margin: 0;}
    </style>
    <link rel="stylesheet" href="./style.css" />
    <link href="./static/css/7.f1af6b46.chunk.css" rel="stylesheet">
    
    <script src="./3x.umd.js"></script>
    <script src="./static/js/7.d22372d5.chunk.js"></script>
    <script src="./static/js/main.c5db7777.chunk.js"></script>
    
    <div id="domElement">Loading, please wait...</div>
</head>
<body>
</body>
</html>

二、地图基础操作

2.1 初始化地图

<script>
    /**
    * 创建 map 实例
    */
    var map = new ThreeX.Map({
        // 地图容器, domElement
        el: document.body,
        // 在地图编辑器中生成,或由我司提供
        verifyUrl: 'https://www.example.com/map-verify/check/',
        id: '123'
    })
</script>

2.2 大小调整

<script>
    var map = new ThreeX.Map({
        el: document.body,
        verifyUrl: 'https://www.example.com/map-verify/check/',
        id: '123'
    })

    window.addEventListener('resize', () => {
        map.view.resize();
    })

</script>

2.3 元素拾取

<script>
    var map = new ThreeX.Map({
        el: document.body,
        verifyUrl: 'https://www.example.com/map-verify/check/',
        id: '123'
    })

    // 拾取地图中的对象
    map.on('picked', result => {
        console.log(result.node);
    })
</script>

2.4 本地加载地图

<script>
    var map = new om.Map({
        container: document.body,
        id: '123',
        verifyUrl: 'https://www.example.com/',

        // 标记为 本地加载 
        standalone: true,

        // 本地文件所在目录(相对于此 html 文件)
        // 比如:
        // ./standalone/
        //   verify.om
        //   ***.scene
        //   ...
        //   assets/
        //     images/
        //     models/
        baseUrl: './standalone/'
    })
</script>

2.5 坐标转换

map.on('click', (e) => {
  // 获取poi点数据
  const polygon = e.object?.userData?.polygonData

  if (polygon?.center) {
    // 将地图容器像素坐标转换成经纬度
    let lngLat = map.coordsToLngLat(polygon.center)
    lng.innerHTML = 'lng: ' + lngLat.lng
    lat.innerHTML = 'lat: ' + lngLat.lat

    // 将经纬度转换成容器坐标
    let coords = map.lngLatToCoord(lngLat)
    containerX.innerHTML = 'x: ' + coords.x
    containerY.innerHTML = 'y: ' + coords.y
  }
})

三、地图控件

3.1 楼层控件

<script>
  let map = new VgoMap.Map({
    el: 'mapContainer',
    id: mapId,
  })

  map.on('loaded', () => {
    let floorControl = new VgoMap.FloorControl({
      map,
      style: 'inset: 80px 20px auto auto;',
      floorButtonCount: 5, // 楼层显示按钮数量
      showAllFloorButton: true, // 是否显示多层展示按钮
    })
  })
</script>

3.2 指北针控件

<script>
  let map = new VgoMap.Map({
    el: 'mapContainer',
    id: mapId,
  })

  map.on('loaded', () => {
    let compass = new VgoMap.Compass({
      map,
      style: 'inset: 20px  auto  auto 20px;',
    })

    console.log(compass, 'compass')
  })
</script>

3.3 其他控件

缩放控件、视图控件、搜索框、提示框

四、视图控制

4.1 2D/3D转换

var status = status == '3D' ? '2D' : '3D'

// 切换3D/2D
map.setViewMode(status)

4.2 视图缩放

// 获取当前视图zoom
map.view.getZoom()
// 设置当前视图zoom
map.view.setZoom(zoom)

// 设置地图的最小比例尺级别
map.view.minZoomLevel = val;
// 设置地图的最大比例尺级别
map.view.maxZoomLevel = val;
// 同时设置最小与最大比例尺级别
map.view.setZoomLevelRange(17, 21);

4.3 视图角度

// viewAngle 和 polarAngle 的参数是一样的
// {angle: 角度值, duration: 300, callback: }
var data = {
    angle: 45,
    polar: 60,
    randomViewAngle: () => {
        // 随机角度
        var angle = Math.random() * 360;
        var duration = Math.random() * 2000;

        map.view.viewAngle = {
            angle: angle,
            duration: duration,
            callback: () => {
                console.log('水平角度转动完成!', 'angle: ' + angle + ' duration: ' + duration);
            }
        }

    },

    randomPolarAngle: () => {
        var angle = Math.random() * 60;
        var duration = Math.random() * 2000;

        map.view.polarAngle = {
            angle: angle,
            duration: duration,
            callback: () => {
                console.log('倾斜角度转动完成!', 'angle: ' + angle + ' duration: ' + duration);
            }
        }
    }
}

4.4 视图移动

// 将视图中心移动到这个元素的位置
// 简单模式: 直接传入位置 
// @param {Vector3 | float[]} position Vector3(x, y, z) 或 [x, y, z]
// map.view.moveTo(position);

// 参数模式: 除 veiwCenter 为必填参数外,其它参数都为可选参数
map.view.moveTo({
    // 视图中心 *必填项*, Vector3(x, y, z) 或 [x, y, z]
    viewCenter: position,

    // 动画时长 毫秒
    duration: 600 + Math.random() * 1000,

    // 视图平面角度
    viewAngle: Math.random() * 90 - 60,

    // 视图倾斜角度
    polarAngle: Math.random() * 20 + 40,

    // 比例尺 或 zoomLevel (比例尺级别)
    zoom: 300 + Math.random() * 500, 

    // 缓动曲线方程, 如: backOut, cubicInOut. 默认为 linear
    easing: data.easing + 'Out',

    // 动画完成后的回调方法
    callback: () => {
            console.log('moveTo complete');
    }
})

4.5 视图状态

// 获取视图状态
map.view.getViewState();

// 设置视图状态
map.view.setViewStatus({
    dragEnable: false, // 地图是否可通过鼠标拖拽平移,默认为true
    keyboardEnable: false, //地图是否可通过键盘控制,默认为true
    doubleClickZoom: false, // 地图是否可通过双击鼠标放大地图,默认为true
    zoomEnable: false, //地图是否可缩放,默认值为true
    rotateEnable: false, // 地图是否可旋转,3D视图默认为true,2D视图默认false
    
    // 可以设置 2d/3d 模式
    viewMode: '3d',
    // 比例尺
    zoom: 391.23,
    // 也可以使用比例尺级别
    // 如果两个设置比例尺有更高的优先级
    // zoomLevel: 20,
    // 视图的水平角度
    viewAngle: -2.89,
    // 视图的倾斜角度
    polarAngle: 53.64,
    // 视图的中心位置
    viewCenter: [61.47,13.54,-9.09],
}, ()=>{
    // 动画完成后调用
    console.log(''视图状态设置完成!'')
})

五、POI标注

// marker 数据
var markerData = {
    // marker的类型,poi, label, imageLeft, imageRight,
    // imageBottom, imageTop, border, borderText, borderHalf
    type: 'borderHalf',			
    position: [0, 0, 40],  	// 位置, 相对于父级,(场景,建筑,楼层),默认为[0, 0, 0]
    anchor: 'bottom',   	// 轴心位置, 默认为 bottom, 还可以为 leftTop, right, center, imageCenter(图标中心)
    autoHide: true, 		// 在遮挡时,是否自动隐藏
    priority: 0, 		// 显示优化级, 值越大优先级越高
    content: {
        image: {			// 图片,在类型中不需要图片时,会自动忽略,如: label
            url: './images/ooomap.png',   // 图像的url,或在 ooomap 服务器上的 imageID
            width: 40,			  // 图片的宽度,默认 20
            height: 40			  // 图片的高度,默认 20
        },
        texts: [			// 文字,支持多行
            // 设置了此行文字的大小size
            {text: 'ooomap-园图', size: 30}, 	

            // 使用默认文字设置,只需要传入文字内容即可
            '园圈 3D 场景地图',

            // 文字的全部参数,align: left|center|right
            {text: '室内外一体化', size: 16, color: '#ff0000', align: 'right', strokeColor: '#ffff00'}
        ],
    }
}

// 使用 SpriteMarkerNode 类创建 marker 对象
var marker = new map.SpriteMarkerNode(map, markerData);

map.on('click', (e) => {
  marker && map.removeAllCustomMarker()
  // 获取poi点数据
  const polygon = e.object?.userData?.polygonData

  console.log(polygon, 'polygon')
  if (polygon) {
    card.style.display = 'block'
    card.innerHTML = `名称: ${polygon.name || '未命名'},id: ${polygon.id}`
  } else {
    card.style.display = 'none'
  }
})

六、搜索查询

// 按ID查询
let poi = map.getPolygonDataById(val)

// 按名称查询
let list = map.getAreaByName(val)

七、室内外一体化

移动地图并缩放,将自动切换室内外模式

八、事件响应

8.1 地图加载完成

8.2 地图更新

8.3 鼠标点击

8.4 鼠标移动

8.5 鼠标长按

8.6 视图变化

8.7 视图移动

8.8 视图缩放

8.9 建筑切换

8.10 楼层切换

九、地图覆盖物

9.1 图片覆盖物

9.2 文本覆盖物

9.3 DOM覆盖物

十、地图导航

10.1 路线规划

10.2 开始导航