鸿蒙OSUniApp 实现的地图定位与导航功能#三方框架 #Uniapp
UniApp 实现的地图定位与导航功能
随着移动互联网的发展,地图定位与导航功能已成为众多应用的标配。本文将详细介绍如何在 UniApp 框架下实现地图定位与导航功能,并探讨如何适配鸿蒙系统,助力开发者打造更加流畅的地图体验。
前言
最近在做一个外勤签到应用,需要实现地图定位、标记和导航功能。由于产品需要覆盖安卓、iOS、鸿蒙等多个平台,我们选择了UniApp作为开发框架。其中对鸿蒙系统的适配是一个新挑战,经过一番摸索,总结出了一套可行的实现方案,今天就把这个过程分享给大家。
技术选型
在实现地图功能前,需要先明确技术选型:
- 地图服务商:高德地图、百度地图、腾讯地图
- UniApp地图组件:map组件 + plus.maps模块
- 鸿蒙系统适配:HarmonyOS地图服务
经过评估,我选择了高德地图作为底层服务,主要考虑因素有:
- 高德地图在国内覆盖面广,数据相对精准
- 接口丰富,满足定位、标记、路线规划等需求
- 与鸿蒙系统兼容性较好,HMS Core中的地图服务与高德地图接口相似
- uniapp对高德地图支持较好
环境准备
在正式开发前,我们需要完成以下准备工作:
- 创建UniApp项目
- 申请高德地图开发者账号并创建应用,获取Key
- 配置SDK权限
高德地图Key申请
- 注册高德开发者账号:https://lbs.amap.com/
- 创建应用,分别为Android和iOS平台申请Key
- 鸿蒙系统可以使用Android的Key,或者单独申请HMS Core地图服务的Key
项目配置
在manifest.json
中配置相关权限和Key:
{"app-plus": {"modules": {"Maps": {}},"distribute": {"android": {"permissions": ["<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>","<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>","<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>","<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>","<uses-permission android:name=\"android.permission.INTERNET\"/>","<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>","<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>"],"abiFilters": ["armeabi-v7a", "arm64-v8a"]},"ios": {"UIBackgroundModes": ["location"],"urlSchemePrefix": "amap","maps": {"amap": {"appkey": "你的iOS平台高德Key"}}},"sdkConfigs": {"maps": {"amap": {"appkey_android": "你的安卓平台高德Key","appkey_ios": "你的iOS平台高德Key"}}}}}
}
对于鸿蒙系统,还需要额外添加HMS Core相关配置:
{"app-plus": {"distribute": {"android": {"pushconfig": {"hms": {"appid": "你的HMS Core AppID","appkey": "你的HMS Core AppKey","clientid": "你的HMS Core ClientID","clientsecret": "你的HMS Core ClientSecret"}}}}}
}
基础地图功能实现
首先,我们来实现基础的地图展示和定位功能。创建一个map.vue
文件:
<template><view class="map-container"><mapid="myMap"ref="myMap"class="map":latitude="latitude":longitude="longitude":markers="markers":polyline="polyline":show-location="true":enable-3D="true":enable-traffic="enableTraffic":enable-rotate="true":enable-poi="true":scale="16"@tap="onMapTap"@markertap="onMarkerTap"></map><view class="controls"><view class="control-item" @tap="getCurrentLocation"><text class="iconfont icon-location"></text></view><view class="control-item" @tap="toggleTraffic"><text class="iconfont" :class="enableTraffic ? 'icon-traffic-on' : 'icon-traffic-off'"></text></view></view></view>
</template><script>
export default {data() {return {// 地图中心点latitude: 39.908823,longitude: 116.397470,// 标记点markers: [],// 路线polyline: [],// 是否显示路况enableTraffic: false,// 当前系统systemInfo: {},// 是否为鸿蒙系统isHarmonyOS: false};},onLoad() {// 获取系统信息this.getSystemInfo();// 初始化地图this.initMap();},methods: {// 获取系统信息getSystemInfo() {uni.getSystemInfo({success: (res) => {this.systemInfo = res;// 检测是否为鸿蒙系统this.isHarmonyOS = this.checkHarmonyOS(res);console.log('当前系统:', this.isHarmonyOS ? 'HarmonyOS' : res.platform);}});},// 检测是否为鸿蒙系统checkHarmonyOS(info) {// 鸿蒙系统检测,目前可通过brand和model判断const brand = (info.brand || '').toLowerCase();const model = (info.model || '').toLowerCase();const system = (info.system || '').toLowerCase();// 华为设备且系统为鸿蒙return (brand.indexOf('huawei') !== -1 || brand.indexOf('honor') !== -1) && (system.indexOf('harmony') !== -1 || system.indexOf('harmonyos') !== -1);},// 初始化地图async initMap() {// 请求定位权限await this.requestLocationPermission();// 获取当前位置this.getCurrentLocation();},// 请求定位权限requestLocationPermission() {return new Promise((resolve, reject) => {uni.authorize({scope: 'scope.userLocation',success: () => {console.log('定位权限请求成功');resolve();},fail: (err) => {console.error('定位权限请求失败', err);uni.showModal({title: '提示',content: '需要获取您的位置信息,请允许',success: (res) => {if (res.confirm) {uni.openSetting();}}});reject(err);}});});},// 获取当前位置getCurrentLocation() {uni.showLoading({ title: '定位中...' });uni.getLocation({type: 'gcj02',accuracy: 'high',success: (res) => {console.log('当前位置:', res);this.latitude = res.latitude;this.longitude = res.longitude;// 添加当前位置标记this.addMarker({id: 0,latitude: res.latitude,longitude: res.longitude,title: '当前位置',iconPath: '/static/images/location.png',width: 40,height: 40});uni.hideLoading();},fail: (err) => {console.error('获取位置失败', err);uni.hideLoading();uni.showToast({title: '定位失败,请检查定位权限',icon: 'none'});}});},// 添加标记点addMarker(marker) {const index = this.markers.findIndex(item => item.id === marker.id);if (index !== -1) {this.markers.splice(index, 1, marker);} else {this.markers.push(marker);}},// 地图点击事件onMapTap(e) {console.log('点击地图位置:', e);// 添加标记点this.addMarker({id: this.markers.length + 1,latitude: e.detail.latitude,longitude: e.detail.longitude,title: `标记 ${this.markers.length + 1}`,iconPath: '/static/images/marker.png',width: 30,height: 30});},// 标记点点击事件onMarkerTap(e) {const markerId = e.detail.markerId;const marker = this.markers.find(item => item.id === markerId);if (!marker) return;uni.showActionSheet({itemList: ['查看详情', '导航到这里'],success: (res) => {if (res.tapIndex === 0) {// 查看详情uni.showModal({title: marker.title,content: `位置:${marker.latitude}, ${marker.longitude}`,showCancel: false});} else if (res.tapIndex === 1) {// 导航this.openMapNavigation(marker);}}});},// 切换路况toggleTraffic() {this.enableTraffic = !this.enableTraffic;}}
};
</script><style lang="scss">
.map-container {position: relative;width: 100%;height: 100vh;.map {width: 100%;height: 100%;}.controls {position: absolute;right: 20rpx;bottom: 100rpx;display: flex;flex-direction: column;.control-item {width: 80rpx;height: 80rpx;background-color: #fff;border-radius: 50%;display: flex;align-items: center;justify-content: center;margin-bottom: 20rpx;box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.2);.iconfont {font-size: 40rpx;color: #3a86ff;}}}
}
</style>
导航功能实现
现在我们来实现导航功能,在 UniApp 中可以通过调用系统地图APP或者使用高德/百度地图SDK实现导航。下面我们添加导航相关方法:
// 添加到methods中
// 打开地图导航
openMapNavigation(destination) {// 目标位置const destinationLatitude = destination.latitude;const destinationLongitude = destination.longitude;const destinationName = destination.title || '目的地';// 鸿蒙系统处理if (this.isHarmonyOS) {this.openHarmonyMapNavigation(destinationLatitude, destinationLongitude, destinationName);return;}// 不同平台的处理方式// #ifdef APP-PLUSthis.openNativeMapApp(destinationLatitude, destinationLongitude, destinationName);// #endif// #ifdef H5this.openWebMapNavigation(destinationLatitude, destinationLongitude, destinationName);// #endif// #ifdef MP// 小程序平台使用map组件的openMapApp方法uni.openLocation({latitude: destinationLatitude,longitude: destinationLongitude,name: destinationName,scale: 18});// #endif
},// 打开原生地图应用(App端)
openNativeMapApp(latitude, longitude, name) {// 检测手机上已安装的地图应用plus.maps.getInstalledMaps((maps) => {console.log('安装的地图应用:', maps);if (maps.length === 0) {uni.showToast({title: '本机未安装地图应用',icon: 'none'});return;}// 优先使用高德地图const amap = maps.find(map => map.id === 'amap');if (amap) {plus.maps.openMap({latitude: latitude,longitude: longitude,name: name,scale: 16,mapType: plus.maps.MapType.NAVIGATION,dst: {latitude: latitude, longitude: longitude,name: name},coordType: 'gcj02',provider: 'amap'});} else {// 使用第一个可用的地图应用plus.maps.openMap({latitude: latitude,longitude: longitude,name: name,scale: 16,dst: {latitude: latitude, longitude: longitude,name: name}});}});
},// 打开Web地图导航(H5端)
openWebMapNavigation(latitude, longitude, name) {// 检测设备类型const isIOS = /iphone|ipad|ipod/i.test(navigator.userAgent);// 高德地图URLconst amapUrl = `https://uri.amap.com/navigation?to=${longitude},${latitude},${encodeURIComponent(name)}&mode=car&callnative=1`;// 百度地图URLconst bdMapUrl = `https://api.map.baidu.com/direction?destination=latlng:${latitude},${longitude}|name:${encodeURIComponent(name)}&mode=driving&origin=我的位置&coord_type=gcj02&output=html&src=webapp.baidu.openAPIdemo`;// 优先使用高德地图window.location.href = amapUrl;// 如果5秒后还在当前页面,说明没有安装高德地图APP,尝试使用百度地图setTimeout(() => {if (document.hidden || document.webkitHidden) return;window.location.href = bdMapUrl;}, 5000);
},// 鸿蒙系统地图导航处理
openHarmonyMapNavigation(latitude, longitude, name) {// #ifdef APP-PLUS// 尝试使用HMS Core地图服务// 注意:需要先集成HMS Core SDKif (plus.hms && plus.hms.map) {plus.hms.map.openMap({latitude: latitude,longitude: longitude,name: name,navigationMode: 'driving' // driving, riding, walking});return;}// 降级处理:如果HMS Core不可用,尝试使用高德地图this.openNativeMapApp(latitude, longitude, name);// #endif
}
路线规划功能
接下来,我们增加路线规划功能,实现从当前位置到目标位置的路线绘制:
// 添加到methods中
// 规划路线
planRoute(startPoint, endPoint) {uni.showLoading({ title: '规划路线中...' });// 鸿蒙系统处理if (this.isHarmonyOS) {this.planRouteForHarmonyOS(startPoint, endPoint);return;}// 调用高德地图API规划路线uni.request({url: 'https://restapi.amap.com/v3/direction/driving',data: {key: this.amapKey, // 高德地图Web服务API的Keyorigin: `${startPoint.longitude},${startPoint.latitude}`,destination: `${endPoint.longitude},${endPoint.latitude}`,extensions: 'all'},success: (res) => {uni.hideLoading();if (res.data && res.data.status === '1' && res.data.route && res.data.route.paths && res.data.route.paths.length > 0) {const path = res.data.route.paths[0];const steps = path.steps;// 解析路线坐标点let points = [];steps.forEach(step => {const stepPoints = step.polyline.split(';');stepPoints.forEach(point => {const [lng, lat] = point.split(',');points.push({longitude: parseFloat(lng),latitude: parseFloat(lat)});});});// 绘制路线this.drawRoute(points, path.distance);} else {uni.showToast({title: '路线规划失败',icon: 'none'});}},fail: (err) => {console.error('请求路线规划API失败', err);uni.hideLoading();uni.showToast({title: '路线规划失败',icon: 'none'});}});
},// 绘制路线
drawRoute(points, distance) {// 清除现有路线this.polyline = [];// 添加新路线this.polyline.push({points: points,color: '#3a86ff',width: 6,arrowLine: true,dottedLine: false});// 设置地图可视区域,以包含路线起点和终点// 获取 map 组件的实例const mapContext = uni.createMapContext('myMap', this);// 设置地图视野范围mapContext.includePoints({points: [points[0], points[points.length - 1]],padding: [80, 80, 80, 80]});// 显示路线信息uni.showModal({title: '路线信息',content: `总距离: ${(distance / 1000).toFixed(2)} 公里`,showCancel: false});
},// 鸿蒙系统路线规划
planRouteForHarmonyOS(startPoint, endPoint) {// #ifdef APP-PLUS// 如果HMS Core可用,使用HMS Core地图服务规划路线if (plus.hms && plus.hms.map && plus.hms.map.routePlan) {plus.hms.map.routePlan({start: {latitude: startPoint.latitude,longitude: startPoint.longitude},end: {latitude: endPoint.latitude,longitude: endPoint.longitude},mode: 'driving', // driving, riding, walkingsuccess: (result) => {uni.hideLoading();// 解析HMS Core返回的路线数据,格式可能与高德略有不同const points = result.paths[0].points.map(point => ({longitude: point.longitude,latitude: point.latitude}));this.drawRoute(points, result.paths[0].distance);},fail: (err) => {console.error('HMS Core路线规划失败', err);uni.hideLoading();// 降级处理:使用高德地图APIthis.planRoute(startPoint, endPoint);}});return;}// HMS Core不可用,降级处理this.planRoute(startPoint, endPoint);// #endif
}
为了完整实现路线规划功能,我们还需要在界面上添加一个规划路线的按钮。在template部分添加以下内容:
<!-- 在controls里添加规划路线按钮 -->
<view class="control-item" @tap="showRoutePlanDialog"><text class="iconfont icon-route"></text>
</view><!-- 添加路线规划对话框 -->
<uni-popup ref="routePlanPopup" type="bottom"><view class="route-plan-dialog"><view class="dialog-title">路线规划</view><view class="dialog-content"><view class="input-item"><view class="label">起点</view><view class="input"><input type="text" v-model="startPoint.name" placeholder="当前位置" disabled /></view></view><view class="input-item"><view class="label">终点</view><view class="input"><input type="text" v-model="endPoint.name" placeholder="请选择终点" @tap="selectEndPoint" /></view></view></view><view class="dialog-footer"><button class="cancel-btn" @tap="closeRoutePlanDialog">取消</button><button class="confirm-btn" @tap="confirmRoutePlan" :disabled="!endPoint.name">开始规划</button></view></view>
</uni-popup>
同时,我们需要在data中添加相关数据:
data() {return {// ... 现有数据// 起点和终点startPoint: {latitude: 0,longitude: 0,name: '当前位置'},endPoint: {latitude: 0,longitude: 0,name: ''}};
},
然后添加相关方法:
// 显示路线规划对话框
showRoutePlanDialog() {// 设置起点为当前位置this.startPoint = {latitude: this.latitude,longitude: this.longitude,name: '当前位置'};// 清空终点this.endPoint = {latitude: 0,longitude: 0,name: ''};// 显示对话框this.$refs.routePlanPopup.open();
},// 关闭路线规划对话框
closeRoutePlanDialog() {this.$refs.routePlanPopup.close();
},// 选择终点
selectEndPoint() {// 提示用户点击地图选择终点uni.showToast({title: '请点击地图选择终点',icon: 'none'});// 关闭对话框this.closeRoutePlanDialog();// 设置地图状态为选择终点this.mapState = 'selectEndPoint';
},// 确认路线规划
confirmRoutePlan() {if (!this.endPoint.name) {uni.showToast({title: '请先选择终点',icon: 'none'});return;}// 关闭对话框this.closeRoutePlanDialog();// 规划路线this.planRoute(this.startPoint, this.endPoint);
}
同时,我们需要修改onMapTap
方法,以支持选择终点:
// 地图点击事件
onMapTap(e) {console.log('点击地图位置:', e);const { latitude, longitude } = e.detail;// 如果当前状态是选择终点if (this.mapState === 'selectEndPoint') {// 设置终点this.endPoint = {latitude,longitude,name: '选定位置'};// 添加终点标记this.addMarker({id: 'endPoint',latitude,longitude,title: '终点',iconPath: '/static/images/end.png',width: 30,height: 30});// 重置地图状态this.mapState = '';// 显示路线规划对话框this.showRoutePlanDialog();return;}// 正常添加标记点this.addMarker({id: this.markers.length + 1,latitude,longitude,title: `标记 ${this.markers.length + 1}`,iconPath: '/static/images/marker.png',width: 30,height: 30});
}
鸿蒙系统适配
鸿蒙系统(HarmonyOS)作为国产操作系统,已在越来越多的华为设备上使用。虽然目前鸿蒙系统对安卓应用有较好的兼容性,但仍有一些特殊之处需要注意。
1. 系统检测
鸿蒙系统检测是适配的第一步,我们已在代码中实现:
// 检测是否为鸿蒙系统
checkHarmonyOS(info) {// 鸿蒙系统检测,目前可通过brand和model判断const brand = (info.brand || '').toLowerCase();const model = (info.model || '').toLowerCase();const system = (info.system || '').toLowerCase();// 华为设备且系统为鸿蒙return (brand.indexOf('huawei') !== -1 || brand.indexOf('honor') !== -1) && (system.indexOf('harmony') !== -1 || system.indexOf('harmonyos') !== -1);
}
2. HMS Core集成
鸿蒙系统使用HMS Core(Huawei Mobile Services)替代GMS(Google Mobile Services),因此需要集成HMS Core SDK。以下是基本步骤:
- 注册华为开发者账号,创建应用并获取AppID等信息
- 下载并集成HMS Core SDK
- 在manifest.json中配置相关信息
3. 地图服务适配
鸿蒙系统提供了内置的地图服务,但也可以使用高德地图等第三方服务。对于完全的鸿蒙适配,建议两种方式都支持:
// 鸿蒙系统地图导航处理
openHarmonyMapNavigation(latitude, longitude, name) {// #ifdef APP-PLUS// 尝试使用HMS Core地图服务if (plus.hms && plus.hms.map) {plus.hms.map.openMap({latitude: latitude,longitude: longitude,name: name,navigationMode: 'driving'});return;}// 降级处理:如果HMS Core不可用,尝试使用高德地图this.openNativeMapApp(latitude, longitude, name);// #endif
}
4. 权限处理
鸿蒙系统的权限管理与安卓类似,但可能会有一些差异。对于地图定位功能,需要特别注意位置权限的申请:
// 请求定位权限
requestLocationPermission() {return new Promise((resolve, reject) => {uni.authorize({scope: 'scope.userLocation',success: () => {console.log('定位权限请求成功');resolve();},fail: (err) => {console.error('定位权限请求失败', err);// 对于鸿蒙系统,可能需要特殊处理if (this.isHarmonyOS) {uni.showModal({title: '定位权限申请',content: '地图功能需要获取您的位置信息,请在弹出的对话框中点击"允许"',success: (res) => {if (res.confirm) {// 鸿蒙系统的设置页面可能与安卓有所不同if (plus.os.name.toLowerCase() === 'android') {plus.runtime.openURL('hap://app/com.huawei.systemmanager/settingApp');} else {uni.openSetting();}}}});} else {uni.showModal({title: '提示',content: '需要获取您的位置信息,请允许',success: (res) => {if (res.confirm) {uni.openSetting();}}});}reject(err);}});});
}
常见问题与解决方案
在实际开发过程中,可能会遇到以下问题:
1. 定位不准确
问题描述:有时地图定位不准确,或者无法获取位置。
解决方案:
- 确保申请了高精度定位权限
- 使用gcj02坐标系统(高德地图使用的坐标系)
- 使用多种定位方式(GPS、网络、基站)结合
- 在鸿蒙系统上,确保已正确配置HMS Core定位服务
// 获取高精度位置
uni.getLocation({type: 'gcj02',altitude: true, // 获取海拔信息accuracy: 'high', // 高精度定位geocode: true, // 获取地址信息success: (res) => {console.log('高精度定位结果:', res);// 处理位置信息},fail: (err) => {// 降级处理:尝试使用低精度定位uni.getLocation({type: 'gcj02',success: (lowRes) => {console.log('低精度定位结果:', lowRes);// 处理位置信息},fail: (lowErr) => {console.error('定位失败', lowErr);}});}
});
2. 鸿蒙系统下地图显示异常
问题描述:在某些鸿蒙系统设备上,地图显示异常或功能不完整。
解决方案:
- 确认已在manifest.json中配置了正确的HMS Core服务
- 对地图组件应用特定的样式修复
- 使用原生插件进行深度兼容
/* 鸿蒙系统地图样式修复 */
.harmony-map-fix {/* 可能需要特定设备的样式修复 */transform: translateZ(0);-webkit-transform: translateZ(0);
}
3. 导航无法打开地图应用
问题描述:点击导航按钮无法打开地图应用。
解决方案:
- 检查URL Scheme配置是否正确
- 提供多个地图应用的支持(高德、百度、腾讯等)
- 针对鸿蒙系统,优先使用HMS Core的地图服务
// 多地图应用支持
openMapNavigation(destination) {const { latitude, longitude, name } = destination;// 检测平台if (this.isHarmonyOS) {// 鸿蒙系统处理this.openHarmonyMapNavigation(latitude, longitude, name);return;}// 获取已安装的地图应用plus.maps.getInstalledMaps((maps) => {if (maps.length === 0) {// 没有安装地图应用,提供网页版导航window.location.href = `https://uri.amap.com/navigation?to=${longitude},${latitude},${encodeURIComponent(name)}&mode=car`;return;}// 展示可用的地图应用列表const mapList = maps.map(map => map.name);uni.showActionSheet({itemList: mapList,success: (res) => {const selectedMap = maps[res.tapIndex];// 打开选择的地图应用plus.maps.openMap({latitude: latitude,longitude: longitude,name: name,scale: 16,provider: selectedMap.id});}});});
}
总结
通过本文,我们详细介绍了如何在UniApp框架下实现地图定位与导航功能,并针对鸿蒙系统进行了适配。主要内容包括:
- 基础地图组件:使用UniApp的map组件实现地图展示与交互
- 定位功能:获取用户当前位置并显示在地图上
- 标记功能:在地图上添加与管理标记点
- 导航功能:调用系统地图应用进行导航
- 路线规划:使用API规划路线并在地图上绘制
- 鸿蒙适配:针对鸿蒙系统的特殊处理
在实际开发中,还可以根据具体需求进一步扩展功能,例如:
- 添加地点搜索功能
- 实现自定义地图样式
- 增加位置共享功能
- 支持离线地图
希望本文对你在UniApp项目中实现地图功能有所帮助,特别是在需要兼容鸿蒙系统的场景下。
相关文章:
鸿蒙OSUniApp 实现的地图定位与导航功能#三方框架 #Uniapp
UniApp 实现的地图定位与导航功能 随着移动互联网的发展,地图定位与导航功能已成为众多应用的标配。本文将详细介绍如何在 UniApp 框架下实现地图定位与导航功能,并探讨如何适配鸿蒙系统,助力开发者打造更加流畅的地图体验。 前言 最近在做一…...

【AI论文】对抗性后期训练快速文本到音频生成
摘要:文本到音频系统虽然性能不断提高,但在推理时速度很慢,因此对于许多创意应用来说,它们的延迟是不切实际的。 我们提出了对抗相对对比(ARC)后训练,这是第一个不基于蒸馏的扩散/流模型的对抗加…...
Android 中 显示 PDF 文件内容(AndroidPdfViewer 库)
PDFView 是一个用于在 Android 应用中显示 PDF 文档的库。它提供了丰富的功能和灵活的配置选项,使得开发者能够轻松地在应用中嵌入 PDF 阅读器。 一、 添加依赖 在模块的 build.gradle 文件中添加以下依赖: // pdfimplementation("com.github.bar…...
Linux 软件包|服务管理
rpm 指令备注rpm -qa查看已安装软件,可以结合grep过滤查找rpm -e firefox卸载firefoxrpm -ivh firefox-115.12.0-1.el7.centos.i686.rpm安装gcc(只能离线安装) yum 能够从指定的服务器自动下载 RPM 包并且安装 指令备注yum list列出所有可…...

测试工程师如何学会Kubernetes(k8s)容器知识
Kubernetes(K8s)作为云原生时代的关键技术之一,对于运维工程师、开发工程师以及测试工程师来说,都是一门需要掌握的重要技术。作为一名软件测试工程师,学习Kubernetes是一个有助于提升自动化测试、容器化测试以及云原生应用测试能力的重要过程…...

遥感图像露天矿区检测数据集VOC+YOLO格式1542张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1542 标注数量(xml文件个数):1542 标注数量(txt文件个数):1542 …...

每日Prompt:迷你 3D 建筑
提示词 3D Q版迷你风格,一个充满奇趣的迷你星巴克咖啡馆,外观就像一个巨大的外带咖啡杯,还有盖子和吸管。建筑共两层,大大的玻璃窗清晰地展示出内部温馨而精致的设计:木质的家具、温暖的灯光以及忙碌的咖啡师们。街道…...
解决 Sarspace 处理陆探一号辐射定标地理编码出现条纹问题:DEM 下载篇
在使用 Sarspace 处理陆探一号辐射定标地理编码时,结果出现条纹现象,经排查确定是 DEM(数字高程模型)下载存在问题。以下为利用自动下载功能解决该问题的过程。 问题排查 陆探一号数据处理中,条纹现象的出现往往与多种…...

el-breadcrumb 面包屑第一项后面怎么写没有分隔符
<el-breadcrumb separator"/"><el-breadcrumb-item>当前位置:</el-breadcrumb-item><el-breadcrumb-item :to"{ path: / }">首页</el-breadcrumb-item><el-breadcrumb-item><a href"/">活…...
Free2AI解锁教育新可能:LLM+RAG 技术驱动智能学习的关键路径
一、引言 在科技飞速发展的当下,人工智能技术正深刻地改变着各个领域,教育领域也不例外。大型语言模型(LLM)和检索增强生成(RAG)技术的兴起,为教育与智能学习带来了前所未有的机遇。LLM 凭借其强大的语言理解和生成能力,能够与用户进行自然流畅的对话,仿佛一位知识…...

MYSQL 高可用
目录 一 什么是MYSQL高可用 1.1 什么是MySQL高可用 1.2方案组成 1.3 优势 2.1 案例环境 二 案例实施 1.安装mysql数据库 (1 基础环境 (2二进制安装进行bash (3 设置配置文件 MYSQL 的配置文件跟上面编译安装的配置文件类似 (4. 配…...

【GaussDB迁移攻略】DRS支持CDC,解决大规模数据迁移挑战
目录 1 背景介绍 2 CDC的实现原理 3 DRS的CDC实现方式 4 DRS的CDC使用介绍 5 总结 1 背景介绍 随着国内各大行业数字化转型的加速,客户的数据同步需求越来越复杂。特别是当需要将一个源数据库的数据同时迁移到不同的目标库场景时,华为云通常会创建…...

HoloTime:从一张图片生成可交互的4D虚拟世界——突破静态生成模型,重构VR/AR内容生产范式
引言:静态生成模型的局限与HoloTime的突破 在空间智能与虚拟内容生成领域,传统生成模型(如扩散模型)面临两大瓶颈: 静态输出:仅能生成固定视角的3D场景或局部物体动画。沉浸感缺失:无法构建用户可“走进去”的动态4D空间(时间+空间)。HoloTime 通过“图像→全景视频→…...
【Python CGI编程】
Python CGI(通用网关接口)编程是早期Web开发中实现动态网页的技术方案。以下是系统化指南,包含核心概念、实现步骤及安全实践: 一、CGI 基础概念 1. 工作原理 浏览器请求 → Web服务器(如Apache) → 执行…...
JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换
关键点 JavaScript 可以轻松实现时间格式(HH:mm:ss 或 HH:mm)与十进制小时(如 17.5)的相互转换。两个函数分别处理时间字符串到十进制小时,以及十进制小时到时间字符串的转换,支持灵活的输入和输出格式。这…...

【深度学习】#11 优化算法
主要参考学习资料: 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 目录 深度学习中的优化挑战局部极小值鞍点梯度消失 凸性凸集凸函数 梯度下降一维梯度下降学习率局部极小值 多元梯度下降 随机梯度下降随机梯度更新动态学习率…...
《数字藏品APP开发:解锁高效用户身份认证与KYC流程》
开发一款数字藏品APP,要面对诸多复杂且关键的环节,其中,实现高效的用户身份认证与KYC(了解你的客户)流程,无疑是重中之重。这不仅关乎用户资产安全与平台合规运营,更是构建用户信任、保障平台可…...
ros2中自定义的package查不到?
在ros2中自定义的package功能包,使用命令:ros2 pkg list无法查找到自己的功能包? 首先,利用ros2 pkg create命令创建好功能包之后要利用colcon build命令进行编译,编译成功之后,在当前路径需要运行命令&am…...

根据台账批量制作个人表
1. 前期材料准备 1)要有 人员总的信息台账 2)要有 个人明白卡模板 2. 开始操作 1)打开 人员总的信息台账,选择所需要的数据模块; 2)点击插入,选择数据透视表,按流程操作&…...

LocaleContextResolver实现多语言切换-笔记
1. LocaleContextResolver功能简介 org.springframework.web.servlet.LocaleContextResolver是 Spring MVC 中用于解析和管理用户 Locale(语言环境) 的核心接口。 //LocaleContextResolver 接口定义 public interface LocaleContextResolver extends L…...
Android从单体架构迁移到模块化架构。你会如何设计模块划分策略?如何处理模块间的通信和依赖关系
从单体架构迁移到模块化架构。可能有些小伙伴已经深陷单体架构的泥潭,代码耦合得跟一团麻线似的,改个小功能都能牵一发而动全身;也可能有些团队在协作时,经常因为代码冲突或者职责不清搞得焦头烂额。相信我,这些问题我都经历过,真的能把人逼疯!所以,咱得找个更好的方式…...

Zephyr OS Nordic芯片的Flash 操作
目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 Flash操作库函数 2.1 nRF52832的Flash 2.2 Nordic 特有的 Flash 操作 2.2.1 nrfx_nvmc_bytes_write 函数 2.2.2 nrfx_nvmc_page_erase函数 2.2.3 nrfx_nvmc_write_done_check 函数 3 操作Flash的接口函数…...

uv python 卸载
又是查了半天 官网wiki没有 网上一堆傻子胡说 uv提示也不对 AI还在这尼玛胡编乱造 开始 我原来装了这几个环境 uv python list 现在python3.7.7不需要了,卸载,直接 uv python uninstall 3.7.7 去找你自己要卸载的版本号,不需要整个包名复制…...
MCP本地高效与云端实时:stdio 与 HTTP+SSE 传输机制深度对比
概览 模型上下文协议(MCP)定义了客户端与服务器之间通信的统一标准,所有消息均采用 JSON-RPC 2.0 格式进行封装,并在此基础上支持两种传输机制:stdio(标准输入/输出) 与 HTTPSSE(Se…...

浮点数截断法:四舍五入的精确模拟
理论解释: 1. 目标 假设 a 3.14159,我们想四舍五入到 小数点后两位(即 3.14 或 3.15)。 2. 步骤拆解 (1) a * 100 把 a 放大 100 倍,让小数点后两位变成整数部分: 3.14159 * 100 314.159 (2) 0.5 关…...

技术文章:解决汇川MD500系列变频器干扰问题——GRJ9000S EMC滤波器的应用
1. 引言 汇川MD500系列变频器(Variable Frequency Drive, VFD)以其高性能、宽功率范围(0.4kW-500kW)和灵活的控制方式,广泛应用于工业自动化领域,如风机、水泵、传送带和压缩机等。然而,MD500系…...

大模型数据分析破局之路20250512
大模型数据分析破局之路 本文面向 AI 初学者、数据分析从业者与企业技术负责人,围绕大模型如何为数据分析带来范式转变展开,从传统数据分析困境谈起,延伸到 LLM MCP 的协同突破,最终落脚在企业实践建议。 🌍 开篇导语…...

基于javaweb的SSM驾校管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

Java内存泄露生产环境排查过程,通透了
昨天线上环境崩了 java堆内存溢出。。。 报错:java.lang.OutOfMemoryError: Java heap space 下面我将我排查问题的思路和过程记录了下来 1. 场景 客户端跟Java服务端通过websocket连接建立长链接并发送语音数据(text格式)Java服务端跟听…...

NHANES指标推荐:MDS
文章题目:The association between magnesium depletion score (MDS) and overactive bladder (OAB) among the U.S. population DOI:10.1186/s41043-025-00846-x 中文标题:美国人群镁耗竭评分 (MDS) 与膀胱过度活动症…...