如何使用BMap.Point传递变量、存储数据?

在开发中使用到了百度地图进行开发,用于展示企业位置。由于数据量庞大,如果使用marker,将会造成界面卡顿,处理慢的问题。

在查看百度地图API示例是发现了海量点这个东西,还别说对于大数量的点加载起来也很快。于是就使用海量点进行开发。

但是从demo中仅能获取到点击坐标的经度、纬度。无法再获取到其他信息,用户自定义的数据也不行。

于是从万能的网上寻求解决办法,有位朋友的解决方式是获取到经度、纬度之后,通过经度和纬度循环比对,找出自己的用户数据,也算是一种解决方案。但是这种方案的弊端非常明显,首先如果数据量巨大,循环需要花费大量的时间。其次对于位置相同的点,无法区分到底是哪条数据。

后来去官方论坛上,发现好多人也遇到了这个问题,并且暂时还没有解决方案,版主基本的回答是暂时还没有、不可以...

后来在无意的试验中找到了解决方法,废话少说,上代码!

<!DOCTYPE HTML>
<html>
<head>
  <title>加载海量点</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
  <style type="text/css">
    html,body{
        margin:0;
        width:100%;
        height:100%;
        background:
QT百度地图开发,点击公交路线、驾车路线、步行路线按钮怎么能够显示具体的路线信息? <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>地图示例</title> <style> html, body { height: 100%; margin: 0; } #container { width: 100%; height: 100%; } #routeInfo { position: absolute; top: 10px; right: 10px; background: white; padding: 10px; border-radius: 5px; box-shadow: 0 0 10px rgba(0,0,0,0.2); z-index: 1000; } </style> <script src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=fCmLBx9P4R0Kwcuv4harkGYVnn1iYrwY"></script> <script src="qrc:///qtwebchannel/qwebchannel.js"></script> </head> <body> <div id="container"></div> <div id="routeInfo"></div> <script> var map, geocoder, marker; var transit, driving, walking; var routePolylines = []; // 存储路线覆盖物,用于清除 var routeMarkers = []; // 存储起点和终点标记 function initMap() { map = new BMapGL.Map("container"); map.centerAndZoom(new BMapGL.Point(116.404, 39.915), 15); map.enableScrollWheelZoom(true); // 添加地图控件 map.addControl(new BMapGL.NavigationControl()); map.addControl(new BMapGL.ScaleControl()); // 初始化地理编码器和路线规划服务 geocoder = new BMapGL.Geocoder(); initRouteServices(); // 添加地图点击事件 map.addEventListener("click", function(e) { geocoder.getLocation(e.latlng, function(rs) { if (rs && window.qtObject) { const address = rs.address || "未知位置"; // 添加标记 addMarker(e.latlng, address); } }); }); } function initRouteServices() { // 公交路线规划 transit = new BMapGL.TransitRoute(map, { renderOptions: { map: map, panel: null }, onSearchComplete: function(results) { console.log("公交路线规划完成", results); handleRouteResult(results, 'transit'); }, onSearchError: function(error) { console.error("公交路线规划错误", error); handleRouteError(error, 'transit'); } }); // 驾车路线规划 driving = new BMapGL.DrivingRoute(map, { renderOptions: { map: map, panel: null }, onSearchComplete: function(results) { console.log("驾车路线规划完成", results); handleRouteResult(results, 'driving'); }, onSearchError: function(error) { console.error("驾车路线规划错误", error); handleRouteError(error, 'driving'); } }); // 步行路线规划 walking = new BMapGL.WalkingRoute(map, { renderOptions: { map: map, panel: null }, onSearchComplete: function(results) { console.log("步行路线规划完成", results); handleRouteResult(results, 'walking'); }, onSearchError: function(error) { console.error("步行路线规划错误", error); handleRouteError(error, 'walking'); } }); } // 统一处理路线规划结果 function handleRouteResult(results, routeType) { clearRouteOverlays(); // 清除之前的路线 try { // 检查结果是否有效 if (!results || !results.getPlan) { throw new Error("无效的路线规划结果"); } const plan = results.getPlan(0); if (!plan) { throw new Error("未找到有效路线方案"); } // 打印plan对象用于调试 console.log("路线规划详情:", plan); let info = ''; switch(routeType) { case 'transit': // 公交路线信息 const distanceTransit = getValidDistance(plan); const durationTransit = getValidDuration(plan); const transferCount = plan.getNumTransits ? plan.getNumTransits() : 0; info = `公交路线信息:\n- 距离: ${formatDistance(distanceTransit)}公里\n- 时间: ${formatDuration(durationTransit)}分钟\n- 换乘: ${transferCount}次`; // 绘制公交路线 drawTransitRoute(plan); break; case 'driving': // 驾车路线信息 const distanceDriving = getValidDistance(plan); const durationDriving = getValidDuration(plan); info = `驾车路线信息:\n- 距离: ${formatDistance(distanceDriving)}公里\n- 时间: ${formatDuration(durationDriving)}分钟`; // 绘制驾车路线 drawDrivingRoute(plan); break; case 'walking': // 步行路线信息 const distanceWalking = getValidDistance(plan); const durationWalking = getValidDuration(plan); info = `步行路线信息:\n- 距离: ${formatDistance(distanceWalking)}公里\n- 时间: ${formatDuration(durationWalking)}分钟`; // 绘制步行路线 drawWalkingRoute(plan); break; } if (window.qtObject) { console.log(info); qtObject.showRouteInfoSlot(info); } document.getElementById('routeInfo').innerHTML = info.replace(/\n/g, '<br>'); } catch (error) { console.error("处理路线结果时出错:", error); handleRouteError(error.message, routeType); } } // 获取有效距离(增强版) function getValidDistance(plan) { let distance = 0; try { // 尝试从plan直接获取距离 if (plan.getDistance && typeof plan.getDistance().value === 'number') { console.log("从plan直接获取距离:", plan.getDistance().value); distance = plan.getDistance().value / 1000; } // 尝试从route中获取距离(备用方案) else if (plan.getRoute && plan.getRoute(0) && plan.getRoute(0).getDistance) { const routeDistance = plan.getRoute(0).getDistance(); if (typeof routeDistance.value === 'number') { console.log("从route中获取距离:", routeDistance.value); distance = routeDistance.value / 1000; } } // 尝试从step中累加距离(终极方案) else if (plan.getNumRoutes && plan.getRoute(0).getNumSteps) { let totalDistance = 0; for (let i = 0; i < plan.getRoute(0).getNumSteps(); i++) { const step = plan.getRoute(0).getStep(i); if (step.getDistance && typeof step.getDistance().value === 'number') { console.log(`第 ${i} 步的距离:`, step.getDistance().value); totalDistance += step.getDistance().value; } } console.log("从step中累加的总距离:", totalDistance); distance = totalDistance / 1000; } } catch (error) { console.error("获取距离时出错:", error); } console.log("最终获取的距离:", distance); return distance; } // 获取有效时长(增强版) function getValidDuration(plan) { let duration = 0; try { // 尝试从plan直接获取时长 if (plan.getDuration && typeof plan.getDuration().value === 'number') { console.log("从plan直接获取时长:", plan.getDuration().value); duration = plan.getDuration().value / 60; // 秒转分钟 } // 尝试从route中获取时长(备用方案) else if (plan.getRoute && plan.getRoute(0) && plan.getRoute(0).getDuration) { const routeDuration = plan.getRoute(0).getDuration(); if (typeof routeDuration.value === 'number') { console.log("从route中获取时长:", routeDuration.value); duration = routeDuration.value / 60; } } // 尝试从step中累加时长(终极方案) else if (plan.getNumRoutes && plan.getRoute(0).getNumSteps) { let totalDuration = 0; for (let i = 0; i < plan.getRoute(0).getNumSteps(); i++) { const step = plan.getRoute(0).getStep(i); if (step.getDuration && typeof step.getDuration().value === 'number') { console.log(`第 ${i} 步的时长:`, step.getDuration().value); totalDuration += step.getDuration().value; } } console.log("从step中累加的总时长:", totalDuration); duration = totalDuration / 60; } } catch (error) { console.error("获取时长时出错:", error); } console.log("最终获取的时长:", duration); return duration; } // 处理路线规划错误 function handleRouteError(errorMsg, routeType) { let routeTypeText = ''; switch(routeType) { case 'transit': routeTypeText = '公交'; break; case 'driving': routeTypeText = '驾车'; break; case 'walking': routeTypeText = '步行'; break; } errorMsg = `${routeTypeText}路线规划失败: ${errorMsg}`; console.error(errorMsg); if (window.qtObject) { qtObject.showRouteErrorSlot(errorMsg); } document.getElementById('routeInfo').innerHTML = errorMsg; } // 绘制公交路线 function drawTransitRoute(plan) { try { // 获取起点和终点 const startPoint = plan.getStartPoint ? plan.getStartPoint() : null; const endPoint = plan.getEndPoint ? plan.getEndPoint() : null; if (startPoint) addMarker(startPoint, "起点"); if (endPoint) addMarker(endPoint, "终点"); if (startPoint && endPoint) { map.setViewport([startPoint, endPoint]); } // 绘制所有线路 if (plan.getNumRoutes) { for (let i = 0; i < plan.getNumRoutes(); i++) { const route = plan.getRoute(i); if (route && route.getNumSteps) { for (let j = 0; j < route.getNumSteps(); j++) { const step = route.getStep(j); if (step && step.getPath) { const path = step.getPath(); if (path && path.length > 0) { const polyline = new BMapGL.Polyline(path, { strokeColor: "#18a45b", // 绿色 strokeWeight: 5, strokeOpacity: 0.8 }); map.addOverlay(polyline); routePolylines.push(polyline); } } } } } } } catch (error) { console.error("绘制公交路线时出错:", error); handleRouteError("绘制公交路线失败: " + error.message, 'transit'); } } // 绘制驾车路线 function drawDrivingRoute(plan) { try { // 获取起点和终点 const startPoint = plan.getStartPoint ? plan.getStartPoint() : null; const endPoint = plan.getEndPoint ? plan.getEndPoint() : null; if (startPoint) addMarker(startPoint, "起点"); if (endPoint) addMarker(endPoint, "终点"); if (startPoint && endPoint) { map.setViewport([startPoint, endPoint]); } // 绘制路线 if (plan.getRoute && plan.getRoute(0) && plan.getRoute(0).getPath) { const path = plan.getRoute(0).getPath(); if (path && path.length > 0) { const polyline = new BMapGL.Polyline(path, { strokeColor: "#1a6dca", // 蓝色 strokeWeight: 5, strokeOpacity: 0.8 }); map.addOverlay(polyline); routePolylines.push(polyline); } } } catch (error) { console.error("绘制驾车路线时出错:", error); handleRouteError("绘制驾车路线失败: " + error.message, 'driving'); } } // 绘制步行路线 function drawWalkingRoute(plan) { try { // 获取起点和终点 const startPoint = plan.getStartPoint ? plan.getStartPoint() : null; const endPoint = plan.getEndPoint ? plan.getEndPoint() : null; if (startPoint) addMarker(startPoint, "起点"); if (endPoint) addMarker(endPoint, "终点"); if (startPoint && endPoint) { map.setViewport([startPoint, endPoint]); } // 绘制路线 if (plan.getRoute && plan.getRoute(0) && plan.getRoute(0).getPath) { const path = plan.getRoute(0).getPath(); if (path && path.length > 0) { const polyline = new BMapGL.Polyline(path, { strokeColor: "#e74c3c", // 红色 strokeWeight: 5, strokeOpacity: 0.8 }); map.addOverlay(polyline); routePolylines.push(polyline); } } } catch (error) { console.error("绘制步行路线时出错:", error); handleRouteError("绘制步行路线失败: " + error.message, 'walking'); } } // 添加标记点 function addMarker(point, title) { try { if (!point) return; const marker = new BMapGL.Marker(point); map.addOverlay(marker); routeMarkers.push(marker); if (title) { const label = new BMapGL.Label(title, { offset: new BMapGL.Size(20, -10) }); marker.setLabel(label); } } catch (error) { console.error("添加标记时出错:", error); } } // 清除所有路线覆盖物 function clearRouteOverlays() { try { // 清除折线 for (let polyline of routePolylines) { map.removeOverlay(polyline); } routePolylines = []; // 清除标记 for (let marker of routeMarkers) { map.removeOverlay(marker); } routeMarkers = []; // 清除信息窗口 document.getElementById('routeInfo').innerHTML = ''; } catch (error) { console.error("清除覆盖物时出错:", error); } } // 格式化距离 function formatDistance(km) { if (km <= 0) return "未知"; return km.toFixed(1); } // 格式化时间 function formatDuration(minutes) { if (minutes <= 0) return "未知"; return Math.ceil(minutes); } function geocodeAddress(address) { try { geocoder.getPoint(address, function(point) { if (point && window.qtObject) { qtObject.onLocationFound(point.lng, point.lat); addMarker(point, address); // 移动地图中心点到定位点 map.panTo(point); } else if (window.qtObject) { qtObject.onLocationNotFound(); } }); } catch (error) { console.error("地理编码时出错:", error); if (window.qtObject) { qtObject.onLocationNotFound(); } } } function routePlanning(start, end, type) { try { if (!start || !end) { if (window.qtObject) { qtObject.showRouteErrorSlot("请输入起点和终点地址"); } return; } geocoder.getPoint(start, function(startPoint) { if (!startPoint) { console.log("起点地址解析失败: ", start); if (window.qtObject) { qtObject.showRouteErrorSlot(`起点"${start}"解析失败,请检查地址是否正确`); } return; } geocoder.getPoint(end, function(endPoint) { if (!endPoint) { console.log("终点地址解析失败: ", end); if (window.qtObject) { qtObject.showRouteErrorSlot(`终点"${end}"解析失败,请检查地址是否正确`); } return; } // 清除之前的路线 clearRouteOverlays(); // 添加起点和终点标记 addMarker(startPoint, "起点"); addMarker(endPoint, "终点"); switch (type) { case 'transit': console.log("搜索公交路线:", start, "->", end); transit.search(startPoint, endPoint); break; case 'driving': console.log("搜索驾车路线:", start, "->", end); driving.search(startPoint, endPoint); break; case 'walking': console.log("搜索步行路线:", start, "->", end); walking.search(startPoint, endPoint); break; } }); }); } catch (error) { console.error("路线规划请求时出错:", error); if (window.qtObject) { qtObject.showRouteErrorSlot("路线规划请求失败: " + error.message); } } } // 初始化QWebChannel document.addEventListener("DOMContentLoaded", function() { try { initMap(); new QWebChannel(qt.webChannelTransport, function(channel) { window.qtObject = channel.objects.qtObject; console.log("Qt WebChannel 初始化成功"); }); } catch (error) { console.error("DOM加载时出错:", error); } }); </script> </body> </html> 点击公交路线、驾车路线、步行路线三个按钮后这样的显示: 公交路线信息: 距离: 未知公里 时间: 未知分钟 换乘: 0次 驾车路线信息: 距离: 未知公里 时间: 未知分钟 步行路线信息: 距离: 未知公里 时间: 未知分钟 不能够显示具体的数字距离和具体的数字时间信息 使用的是qt5.14.2版本 点击公交路线、驾车路线、步行路线按钮能够显示具体的路线信息
06-18
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值