三维地图,智慧城市,商业智能BI,数据可视化大屏(Cesiumjs/UE)
绘图工具
三维地图:Cesiumjs
建模方式:激光点云建模、航拍倾斜摄影建模、GIS建模、BIM建模、手工建模
建模工具:C4D Blender GeoBuilding ArcGIS
Cesiumjs
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../Build/Cesium/Cesium.js"></script><link href="../Build/Cesium/Widgets/widgets.css" rel="stylesheet"/><style>html,body{margin: 0;padding: 0;}</style>
</head>
<body>
<div id="Cesium"></div>
<script>// 在 Cesium官网上 注册用户获取 tokenCesium.Ion.defaultAccessToken = '***';// 基础图层,在线方式,从 Cesium 官方下载 瓦片let baseLayer = Cesium.ImageryLayer.fromProviderAsync(Cesium.IonImageryProvider.fromAssetId(3813) // 需要在 Cesium官网 Asset Depot 添加 对应图层的 权限);// 离线方式,自行维护一个可访问的瓦片目录let baseLayer = Cesium.ImageryLayer.fromProviderAsync(Cesium.TileMapServiceImageryProvider.fromUrl(// 用模块的方式引入 Cesium 时,会有 /cesium/Assets/Textures 这个目录Cesium.buildModuleUrl('/cesium/Assets/Textures/3813')// 获取瓦片:用Chrome扩展程序 Save All Resources 保存用在线方式访问到的瓦片));baseLayer.gamma = 0; // 伽玛校正(对比度、亮度)baseLayer.hue = Cesium.Math.toRadians(0); // 色调【色相】,取值范围在 0-PI,参考色调环baseLayer.saturation = 1; // 饱和度,饱和度数值越低越(亮度高时)泛白(亮度低时)范黑baseLayer.alpha = 1; // 透明度baseLayer.brightness = 1; // 亮度// 3D地图查看器const viewer = new Cesium.Viewer('Cesium', {baseLayerPicker: false, // 底图[卫星、地形、矢量]切换按钮animation: false, // 左下角 时间播放控件timeline: false, // 下方 时间轴homeButton: false, // 右上角 主页按钮navigationHelpButton: false, // 右上角 问号按钮geocoder: false, // 右边上角 搜索框fullscreenButton: false, // 右下角 全屏按钮infoBox: false, // 点击实体时右侧出现的信息框selectionIndicator: false, // 点击地球时鼠标处出现的指示框contextOptions: {webgl: {alpha: true, // 允许透明背景}},baseLayer,});viewer.scene.globe.show = true; // 显示地球viewer.scene.skyBox.show = false; // 不显示星空viewer.scene.sun.show = false; // 不显示太阳viewer.scene.moon.show = false; // 不显示月球viewer.scene.skyAtmosphere.show = false; // 不显示大气viewer.scene.backgroundColor = Cesium.Color.TRANSPARENT; // 透明背景,需设置viewer.contextOptions.webgl.alphaCesium.GeoJsonDataSource.load("./world.json", { // 载入 GeoJson 矢量数据fill: Cesium.Color.TRANSPARENT, // 透明填充})let headingPitchRange = new Cesium.HeadingPitchRange(Cesium.Math.toRadians(50), Cesium.Math.toRadians(-90), 2000);// viewer.camera.lookAt(Cesium.Cartesian3.fromDegrees(116.39, 39.91), headingPitchRange); // 设置相机观察目标,同时设定了相机控制器的环绕点viewer.scene.camera.setView({ // 切换相机视口destination: Cesium.Cartesian3.fromDegrees(116.39, 39.91, 500000), // 相机经纬度和高度orientation: { // 相机姿态heading: Cesium.Math.toRadians(0), // 偏航角,在(相机与地心连线的法面)上的旋转,0为正北pitch: Cesium.Math.toRadians(-100), // 俯仰角,在(相机与地心连线所在的经线平面)上选择,-90朝向地心roll: 0 // 翻滚角}});let position = Cesium.Cartesian3.fromDegrees(116.39, 39.91, 400);viewer.entities.add({ // 添加实体polyline: { // 线条实体show: true,positions: Cesium.Cartesian3.fromDegreesArray([116.39, 39.91, 116.40, 39.91]),width: 5,material: new Cesium.Color(0,0,1,1)}});viewer.entities.add({ // 添加实体id: 'point',position, // 实体位置point: { // 圆点实体pixelSize: 100, // 圆点尺寸,为屏幕的像素尺寸,不随地图缩放和旋转color: new Cesium.Color(0,1,0,1) // 圆点颜色},description: '<div>html</div>' // 被点击时右侧弹窗的内容});viewer.entities.add({ // 添加实体position: Cesium.Cartesian3.fromDegrees(116.39, 39.91, 50), // 实体位置plane: { // 矩形平面实体plane: new Cesium.Plane(Cesium.Cartesian3.UNIT_Z, 0), // 朝向dimensions: new Cesium.Cartesian2(400, 300),material: Cesium.Color.RED.withAlpha(0.5), // 可以为图片outline: true,outlineColor: Cesium.Color.BLACK}});let polygon = viewer.entities.add({ // 添加实体id: 'polygon',polygon: { // 多边形实体hierarchy: Cesium.Cartesian3.fromDegreesArray([116.39, 39.91, 116.40, 39.91, 116.40, 39.90]),material: Cesium.Color.YELLOW, // 可以为图片extrudedHeight: 200 // 拉伸为三维物体}});viewer.entities.getById("polygon"); // 获取实体viewer.entities.remove(polygon); // 删除viewer.entities.add({ // 添加实体position: Cesium.Cartesian3.fromDegrees(116.39, 39.91, 150), // 实体位置label: { // 标签实体text: '标签',font: '50px Helvetica',fillColor: Cesium.Color.SKYBLUE}});viewer.entities.add({ // 添加实体position, // 实体位置orientation: Cesium.Transforms.headingPitchRollQuaternion(position, new Cesium.HeadingPitchRoll(-90, 0, 0)), // 实体姿态model: { // 3D模型实体uri: './***.glb', // 载入模型minimumPixelSize: 128, // 模型缩放时最小像素尺寸maximumScale: 1000, // 模型缩放最大比率show: true, // 是否显示}});viewer.camera.viewBoundingSphere(new Cesium.BoundingSphere(position,20),new Cesium.HeadingPitchRange(0,0,0)); // 设置相机控制器360度环绕点// viewer.trackedEntity = entity; // 相机控制器的环绕点/* Cesium 坐标系 */// WGS84弧度坐标系 new Cesium.Cartographic(经弧度, 维弧度, 高度);Cesium.Cartographic.fromDegrees(经度,维度,高度)// 笛卡尔空间直角坐标系,原点为地心 new Cesium.Cartesian3(x,y,z);Cesium.Cartesian3.fromDegrees(经度,维度,高度)// 屏幕坐标系 new Cesium.Cartesian2(x,y)/* 坐标转换 */// 弧度与角度互转:Cesium.Math.toRadians(),Cesium.Math.toDegrees()// WGS84坐标系与笛卡尔坐标系互转: Cesium.Ellipsoid.WGS84.cartographicToCartesian(wgs84);Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);Cesium.Cartographic.fromCartesian(cartesian3)// 笛卡尔坐标系与屏幕坐标系互转:viewer.scene.pickPosition(cartesian2);viewer.scene.globe.pick(viewer.camera.getPickRay(cartesian2),viewer.scene);viewer.scene.camera.pickEllipsoid(cartesian2)// Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,cartesian3);scene.cartesianToCanvasCoordinates(cartesian3)// 鼠标拾取let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction(function (action) {let pick = viewer.scene.pick(action.position);if(Cesium.defined(pick)){console.log(pick.id.id)}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
</script>
</body>
</html>
三维建筑物
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../Build/Cesium/Cesium.js"></script><link href="../Build/Cesium/Widgets/widgets.css" rel="stylesheet"/><style>html,body{margin: 0;padding: 0;}</style>
</head>
<body>
<div id="Cesium"></div>
<script>// 在 Cesium官网上 注册用户获取 tokenCesium.Ion.defaultAccessToken = '****';// 加载ArcGIS卫星地图栅格数据,比 Cesium 自带地图更加精细const viewer = new Cesium.Viewer('Cesium', {baseLayerPicker: false,imageryProvider: new Cesium.ArcGisMapServerImageryProvider({url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'}),// 地形,需要在 Cesium官网 Asset Depot 添加 Cesium World Terrain 权限;Ctrl+鼠标滑动改变相机视角可以进入地形terrainProvider: new Cesium.CesiumTerrainProvider({url: Cesium.IonResource.fromAssetId(1),requestVertexNormals: true,requestWaterMask: true, // 水面效果}),});// 添加建筑物模型,需要在 Cesium官网 Asset Depot 添加 Cesium OSM Buildings 权限const tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({url: Cesium.IonResource.fromAssetId(96188),}));// 建筑物模型样式tileset.style = new Cesium.Cesium3DTileStyle({color: "color('blue', 0.5)",show: true});/* 加载夜晚地图,需要在 Cesium官网 Asset Depot 添加 Earth at Night 权限 */// const viewer = new Cesium.Viewer('Cesium', {// baseLayerPicker: false// });// 从 My Assets 里拷贝// const layer = viewer.imageryLayers.addImageryProvider(// new Cesium.IonImageryProvider({ assetId: 3812 })// );
</script>
</body>
</html>
自转
rotate(116.39); // 北京经度function rotate(longitude) {viewer.scene.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(longitude, 20, 30000000), // 相机经纬度和高度duration: 20, // 飞行时间flyOverLongitude: longitude > 0 ? 180 : 0, // 转动时要经过的经度,从而确定转动的方向easingFunction: Cesium.EasingFunction.LINEAR_NONE, // 均匀转动complete() {rotate(longitude > 0 ? longitude - 180 : 180 + longitude); // 转到背面},});}
点位呼吸效果
viewer.entities.add({id: "NewYork",position: Cesium.Cartesian3.fromDegrees(-74.00, 40.43, 50),billboard: {image: './position.png',}});viewer.entities.add({id: 'NewYorkLabel',position: Cesium.Cartesian3.fromDegrees(-74.00, 40.43, 50),label: { // 标签text: '纽约分公司',font: '200 12px sans-serif', // font-weight font-size font-familyfillColor: Cesium.Color.fromCssColorString('#3D3D3D'), // 字体颜色showBackground: true,backgroundColor: Cesium.Color.fromCssColorString('#F0DBAF'), // 背景色,没法渐变backgroundPadding: new Cesium.Cartesian2(10, 6),pixelOffset: new Cesium.Cartesian2(0, -30) // 在position基础上的屏幕偏移}});let NewYork = viewer.entities.getById("NewYork");NewYork.billboard.scale = 1;let progress = 0; // 呼吸渐变进度let up = true; // 呼吸渐变方向breath();function breath() {requestAnimationFrame(function () {NewYork.billboard.scale = 1 + 0.1 * progress;if(up){if(progress >= 5){up = false;progress = progress - 1;}else {progress = progress + 1;}}else {if(progress <= 0){up = true;progress = progress + 1;}else {progress = progress - 1;}}setTimeout(breath, 150);});}
地点连线(OD线 Origin-Destination Line)
<img id="gif" src="" style="position: absolute" />
var gif = {name: "curve.gif", // 箭头从左侧中间点到右侧中间点width: 1920,height: 392,};
// 终点位置let toDegree = [108.947, 34.259];let toCartesian3 = Cesium.Cartesian3.fromDegrees(toDegree[0], toDegree[1]);let toCartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,toCartesian3);
// 起点位置let fromDegree = [121.506377, 31.245105];let fromCartesian3 = Cesium.Cartesian3.fromDegrees(fromDegree[0], fromDegree[1]);if (!isVisible(fromCartesian3)) {fromCartesian3 = findVisibleEdge(fromDegree);}let fromCartesian2 =Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,fromCartesian3);
// 屏幕距离let distance = Cesium.Cartesian2.distance(toCartesian2,fromCartesian2);
/* 计算连线角度,试用 Cesium.Cartesian2.angleBetween 计算角度发现不对 */let angle = 0;let deltaY = toCartesian2.y - fromCartesian2.y;if (toCartesian2.x > fromCartesian2.x) {if (deltaY > 0) {angle = Math.asin(deltaY / distance);} else {angle = -Math.asin(Math.abs(deltaY) / distance);}} else {if (deltaY > 0) {angle = Math.PI - Math.asin(deltaY / distance);} else {angle = Math.asin(Math.abs(deltaY) / distance) - Math.PI;}}let width = distance; // 图片显示宽度let height = (width / gif.width) * gif.height; // 图片显示高度$("#gif").attr("src", gif.name).css("width", width + "px").css("left",(fromCartesian2.x + toCartesian2.x) / 2 - width / 2 + "px").css("top",(fromCartesian2.y + toCartesian2.y) / 2- height / 2 + "px").css("transform", `rotate(${angle}rad)`);// 判断一个点是否可见,即是否在地球背面function isVisible(cartesian3) {return new Cesium.EllipsoidalOccluder(Cesium.Ellipsoid.WGS84, viewer.camera.position).isPointVisible(cartesian3);}// 给一个不可见的点找一个同维度的、可见的、离原点最近的点,此点在可见范围边缘上function findVisibleEdge(fromDegree) {let cartesian3From;let fromLongitude = fromDegree[0];let toLongitude = toDegree[0];let fromEast = fromLongitude - toLongitude > 0;let moveEast;if (fromEast) {moveEast = fromLongitude - toLongitude > 180;} else {moveEast = toLongitude - fromLongitude < 180;}do {if (moveEast) {fromLongitude = fromLongitude + 0.1;fromLongitude = fromLongitude < 180 ? fromLongitude : fromLongitude - 360;} else {fromLongitude = fromLongitude - 0.1;fromLongitude = fromLongitude > -180 ? fromLongitude : 360 + fromLongitude;}cartesian3From = Cesium.Cartesian3.fromDegrees(fromLongitude, fromDegree[1]);} while (!isVisible(cartesian3From));return cartesian3From;},
判断一个点是否在GeoJSON内
import chinaJson from './100000.json'; // 中国区域handler.setInputAction((action) => { let inChina = false;// 屏幕坐标,如果用了 autofit.js,要进行处理position = this.autoFitPosition(action.endPosition);// 笛卡尔坐标let cartesian3 = viewer.scene.camera.pickEllipsoid(position);if (cartesian3) {// 经纬弧度坐标let cartographic = Ellipsoid.WGS84.cartesianToCartographic(cartesian3);chinaJson.features.forEach((feature) => {feature.geometry.coordinates[0].forEach((polygon) => {// 是否在区域内if (this.isInPolygon([CesiumMath.toDegrees(cartographic.longitude), CesiumMath.toDegrees(cartographic.latitude)], polygon)) {inChina = true;}});});}
}, ScreenSpaceEventType.MOUSE_MOVE);isInPolygon(checkPoint, polygonPoints) {let counter = 0;let pointCount = polygonPoints.length;let p1 = polygonPoints[0];let i, xinters, p2;for (i = 1; i <= pointCount; i++) {p2 = polygonPoints[i % pointCount];if (checkPoint[0] > Math.min(p1[0], p2[0]) && checkPoint[0] <= Math.max(p1[0], p2[0])) {if (checkPoint[1] <= Math.max(p1[1], p2[1])) {if (p1[0] !== p2[0]) {xinters = ((checkPoint[0] - p1[0]) * (p2[1] - p1[1])) / (p2[0] - p1[0]) + p1[1];if (p1[1] === p2[1] || checkPoint[1] <= xinters) {counter++;}}}}p1 = p2;}return counter % 2 > 0;
},autoFitPosition(position) {let scale = 1;let transform = document.querySelector('body').style.transform;if (transform) {scale = transform.split('(')[1].split(')')[0];scale = parseFloat(scale);}return new Cartesian2(position.x / scale, position.y / scale);
},
UE 像素流
PixelStreamingInfrastructure
package.json
"dependencies": {"@epicgames-ps/lib-pixelstreamingfrontend-ue5.3": "^1.0.6", // 版本与UE保持一致"@epicgames-ps/lib-pixelstreamingfrontend-ui-ue5.3": "^1.0.5",},
vue
<template><div class="ue-container" ref="ueContainer"></div>
</template><script>
import { Config, PixelStreaming, Flags } from '@epicgames-ps/lib-pixelstreamingfrontend-ue5.3'
import {Application,PixelStreamingApplicationStyle,UIElementCreationMode
} from '@epicgames-ps/lib-pixelstreamingfrontend-ui-ue5.3'
import io from 'socket.io-client'let ueApplication, streamexport default {mounted() {this.createUE()},methods: {createUE() {const PixelStreamingApplicationStyles = new PixelStreamingApplicationStyle()PixelStreamingApplicationStyles.applyStyleSheet()const config = new Config({ useUrlParams: true })config.getTextSettings().at(0).value = 'ws://信令服务器地址' // 设置 SignallingServerUrlconfig.setFlagEnabled(Flags.AutoConnect, true) // 自动连接config.setFlagEnabled(Flags.AutoPlayVideo, true) // 自动播放config.setFlagEnabled(Flags.StartVideoMuted, true) // 播放时静音,上面的自动播放才能生效// config.setFlagEnabled(Flags.MouseInput, false) // 禁止鼠标操作// config.setFlagEnabled(Flags.KeyboardInput, false) // 禁止键盘操作config.setFlagEnabled(Flags.HoveringMouseMode, true) // 进入操作状态时依然显示光标stream = new PixelStreaming(config)ueApplication = new Application({stream,onColorModeChanged: (isLightMode) => PixelStreamingApplicationStyles.setColorMode(isLightMode),fullScreenControlsConfig: {isEnabled: false // 隐藏全屏按钮},settingsPanelConfig: {visibilityButtonConfig: { creationMode: UIElementCreationMode.Disable } // 隐藏设置按钮},statsPanelConfig: {visibilityButtonConfig: { creationMode: UIElementCreationMode.Disable } // 隐藏信息按钮},videoQpIndicatorConfig: {disableIndicator: { disableIndicator: true } // 隐藏信号强度图标}})this.$refs.ueContainer.appendChild(ueApplication.rootElement)stream.addResponseEventListener('handle_responses', this.handleUeResponse) // 监听UE推送的消息stream.addEventListener('videoInitialized', this.initScene) // UE初始化完成事件},sendMessage(data) {stream.emitUIInteraction(data)},handleUeResponse(msg) {console.log(msg)},async initScene() {this.sendMessage('')},forbidMouse() {// 某种情况下禁止鼠标操作,如果用 ueApplication.stream.setFlagEnabled(Flags.MouseInput, false) 会导致不能解禁document.getElementById('videoElementParent').style.pointerEvents = 'none'document.getElementById('streamingVideo').style.pointerEvents = 'none'},}
}
</script><style lang="less">
body {width: 100vw;height: 100vh;min-height: -webkit-fill-available;margin: 0;#playerUI {position: absolute;z-index: 0;video {object-fit: fill;}}
}.ue-container {position: absolute;width: 100vw;height: 100vh;overflow: hidden;
}
</style>
peer-stream
vue
<script>
import '@/utils/peer-stream.js'let ueVideo
export default {mounted() {ueVideo = document.createElement('video', { is: 'peer-stream' })ueVideo.id = 'ws://信令地址'this.$refs.container.appendChild(ueVideo)ueVideo.addEventListener('playing', this.initScene) // UE场景开始渲染ueVideo.addEventListener('message', this.handleUeResponse) // 监听UE推送的消息},methods: {sendUeMessage(data) {// 发送消息ueVideo.emitMessage(data)},}
}
</script>
<style lang="less">
body {height: 100vh;min-height: -webkit-fill-available;margin: 0;min-width: 1920px;position: relative;.video-container {video {position: absolute;z-index: 0;width: 100%;height: 100%;background-color: #0A1B2F;}}
}
</style>
相关文章:
三维地图,智慧城市,商业智能BI,数据可视化大屏(Cesiumjs/UE)
绘图工具 三维地图:Cesiumjs 建模方式:激光点云建模、航拍倾斜摄影建模、GIS建模、BIM建模、手工建模 建模工具:C4D Blender GeoBuilding ArcGIS Cesiumjs <!DOCTYPE html> <html lang"en"> <head><meta …...
通过EPEL 仓库,在 CentOS 7 上安装 OpenResty
通过EPEL 仓库,在 CentOS 7 上安装 OpenResty 通过EPEL 仓库,在 CentOS 7 上安装 OpenResty步骤 1: 安装 EPEL 仓库步骤 2: 安装 OpenResty步骤 3: 启动 OpenResty步骤 4: 设置开机自启步骤 5: 验证安装说明 通过EPEL 仓库,在 CentOS 7 上安装…...
每日一题 LCR 054. 把二叉搜索树转换为累加树
LCR 054. 把二叉搜索树转换为累加树 使用后序遍历即可 class Solution { public:TreeNode* convertBST(TreeNode* root) {int temp 0;dfs(root,temp);return root;}void dfs(TreeNode* root,int &temp){if(!root){return ;}dfs(root->right,temp);temp root->val;…...
【贪心算法】贪心算法五
贪心算法五 1.跳跃游戏 II2.跳跃游戏3.加油站3.单调递增的数字 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.跳跃游戏 II 题目链接&…...
vue2播放视频和预览文件的组件以及使用方法
##文件预览组件 按照组件 解决展示pdf的问题 npm install pdfh5 npm install canvas2.8.0 --ignore-scripts npm install --save dommatrix npm install --save web-streams-polyfill解决excel和docx预览的问题 npm install vue-office/docx vue-demi0.14.6 npm inst…...
记录一下,解决js内存溢出npm ERR! code ELIFECYCLEnpm ERR! errno 134 以及 errno 9009
项目是个老项目,依赖包也比较大,咱就按正常流程走一遍来详细解决这个问题,先看一下node版本,我用的是nvm管理的,详细可以看我的其他文章 友情提醒:如果项目比较老,包又大,又有一些需…...
【批处理脚本】更改Windows系统中的 hosts 解析文件
概述 作用 修改 Windows 系统中的 hosts 文件,可以实现 插入 或 删除 条目。该脚本允许用户以管理员权限执行,将特定的域名解析到指定的 IP 地址 应用场景 非常适用于需要频繁或批量修改 hosts 文件的场景: 屏蔽网站、域名重定向、DNS 污染防…...
AIGC 与艺术创作:变革与机遇
在当今数字化时代,人工智能生成内容(AIGC)正以惊人的速度重塑着艺术创作的格局,为艺术家们带来了令人振奋的新机遇。 一.AIGC 的崛起与艺术领域的变革 随着人工智能技术的不断进步,AIGC 逐渐在艺术领域崭露头角。它依…...
String IP和Int IP的互相转换
android中,wifiManager.connectionInfo.ipAddress 可以获取到wifi的ip地址,但这是一个int值,如何转换为常见的如192.168.1.129这种形式,以及这种形式如何转换回int值的形式。 这里ip分为4段,每一段的值都是0 ~ 255&am…...
【大数据学习 | 面经】yarn的资源申请和分配的单位-Container
在yarn中,资源的申请和分配是以container为单位进行的,而不是直接以application和task为单位。 每个提交到yarn上的应用程序(application)都有一个对应的ApplicationMaster(AM)。这个AM负责与ResourceMana…...
php基础:文件处理2
1.文件属性 当我们在程序中操作文件时,可能会使用到文件的一些常见属性,比如文件的大小、类型、修改时间、访问时间以及权限等等。PHP 中提供了非常全面的用来获取这些属性的内置函数,如下表所示。 2.目录操作 新建目录:mkdir(路…...
gradle下载慢解决方案2024 /12 /1android studio (Windows环境)
gradle下载慢解决方案2024 /12 /1 默认环境配置好了,环境配置和程序安装请出门右转 打开软件,点击右上角设置,找到如下设置页 选择本地安装并制定好你已经安装好的 gradle 应用保存即可 全局插件环境配置(新版本可以直接在设置中添加了) 找对应位置添加国内源并把前面的内置源…...
使用Java将PDF文件解析成Excel文件
安装pom依赖 <!-- 解析pdf--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> <!-- 请检查并使用最新版本 --></dependency>测试读取pdf文件…...
怎么区分直线模组中的导程和行程?
直线模组是一种直线传动装置,安装方便,精度高,其使用范围广。直线模组中的导程和行程是两个不同的概念,它们分别描述了直线模组的不同性能参数。 直线模组的行程指的是模组能够正常移动的最大距离,即滑块预期移动的有效…...
算法日记 42 day 图论
今天来看看广度优先搜索,并且写几个题。刷到这里我才想起来,当时第一次面试的时候问的就是这个题,当时大概知道一点思路,但不清楚是图论方面的,更别说写出来了。 广度优先搜索(BFS) 不同于深度…...
STM32 GPIO 8种工作模式的应用场景
目录 一、四种输入模式1、模拟输入:2、浮空输入:3、上拉输入:4、下拉输入: 二、四种输出模式1、推挽输出:2、开漏输出:3、复用推挽输出:4、复用开漏输出: 一、四种输入模式 1、模拟…...
JVM 类加载器有哪些?双亲委派机制的作用是什么?如何自定义类加载器?
类加载器分类 大家好,我是码哥,可以叫我靓仔,《Redis 高手心法》畅销书作者。 先回顾下,在 Java 中,类的初始化分为几个阶段: 加载、链接(包括验证、准备和解析)和 初始化。 而 类加载器&#x…...
揭秘:短视频矩阵源码功能开发分析!!!
一、短视频矩阵系统源码概述 短视频矩阵系统源码旨在为内容创作者及企业提供一种高效的工具,以实现对多个短视频账户的一站式管理。该系统支持同时管理、发布、监控和优化多达1000个短视频账户,显著提升了操作效率。 二、主要功能 1. 多账号管理 该系…...
leetcode - 2337. Move Pieces to Obtain a String
Description You are given two strings start and target, both of length n. Each string consists only of the characters ‘L’, ‘R’, and ‘_’ where: The characters ‘L’ and ‘R’ represent pieces, where a piece ‘L’ can move to the left only if there i…...
第九篇:k8s 通过helm发布应用
什么是helm? Helm 是 Kubernetes 的包管理器。Helm 是查找、分享和使用软件构建 Kubernetes 的最优方式。 在红帽系的Linux中我们使用yum来管理RPM包,类似的,在K8s中我们可以使用helm来管理资源对象(Deployment、Service、Ingress…...
MySQL:锁机制
锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。 在数据库中,除传统的计算资源(如 CPU、RAM、I/O 等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效…...
在lio_sam中融入GPS
文章目录 概要GPS里程计GPS因子反算后的GPS里程计概要 在LIO(激光惯性里程计)系统中,将GPS信息融合到里程计中,借助GTSAM(Georgia Tech Smoothing and Mapping)库进行因子图优化,可以有效提升全局定位精度。 GPS里程计 利用GeographicLib第三方库将经纬度投影到局部笛…...
快速构建NLP理论知识体系
NLP理论知识体系 一句话解释NLPNLP模型及原理简述1、Rag 一句话解释NLP 如果我们要实现机器翻译、情感分析、问答系统、文本摘要、聊天机器人、构造智能化的辅助文件填写模板,NLP可以通过现成的模型对输入的语音、文字、图片进行处理(分词、标词性、去停…...
长期稳定境外号码解决方案:内地用户如何打电话、接收短信和验证码
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 三大方案对比 📒📝 免费且稳定的境外号码📝 长期稳定且符合本地政策📝 适合低频使用者⚓️ 相关链接 ⚓️📖 介绍 📖 许多用户在日常生活中需要拨打境外电话、接收短信或验证码,尤其是跨境电商从业者,更是对境外号…...
SpringCloud 与 SpringBoot版本对应关系,以及maven,jdk
目录 SpringCloud 与 SpringBoot各版本的对应关系 方式一 Learn 方式二 OverView SpringBoot与JDK、maven 容器等对应关系 SpringCloud 与 SpringBoot各版本的对应关系 SpringCloudSpringBootFinchley2.0.xFinchley.SR1Spring Boot >=2.0.3.RELEASE and <=2.0.9RELEAS…...
FSMC实验
FSMC ,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接, STM32 的 FSMC 接口支持包括 SRAM 、 NAND FLASH 、 NOR FLASH 和 PSRAM 等存储器。 从上图我们可以看出, STM32 的 FSMC 将外部设…...
K8s命令大全(Complete List of K8s Commands)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...
C++学习笔记
小甲鱼学习课程 02 #include <iostream> 头文件 iostream iostream 翻译为IO流 输入输出流 using namespace std; 引入命名空间 c标准库所使用的所有标识符都是在同一个特殊的名字空间std中来定义的; 偷懒使用这句话; std::cout <…...
伺服控制电机多大功率合适?
随着现代工业自动化的发展,伺服控制电机在各个行业的应用愈加广泛。伺服电机以其精确的控制、高效的运行和高响应速度,成为许多机械设备中不可或缺的组成部分。然而,在选择伺服电机时,确定其功率大小是一个关键环节。那么…...
《OpenCV 基础全攻略:从入门到精通》
《OpenCV 基础全攻略:从入门到精通》 一、OpenCV 简介(一)特点(二)优势(三)应用场景 二、安装与配置三、OpenCV 函数详解1. 图像读取函数 cv2.imread ()2. 图像显示函数 cv2.imshow ()3. 图像保…...
spring ai如何使用function call调用第三方模型
这里写自定义目录标题 背景什么是function call怎么用function call?总结 背景 一直困惑于ai是如何使用插件或者其他一些功能的,后来发现,很多大模型都支持function call功能,如何让大模型能够联网查询呢,function ca…...
2024 数学建模国一经验分享
2024 数学建模国一经验分享 背景:武汉某211,专业:计算机科学 心血来潮,就从学习和组队两个方面指点下后来者,帮新人避坑吧 2024年我在数学建模比赛中获得了国一(教练说论文的分数是湖北省B组第一࿰…...
javaweb-Mybaits
1.Mybaits入门 (1)介绍 (2) 2.Mybaits VS JDBC 3.数据库连接池 (1)SpringBoot默认连接池为hikari,切换为Druid有两种方式 方式一:加依赖 方式二:直接修改配置文件 …...
108.【C语言】数据结构之二叉树查找值为x的节点
目录 1.题目 代码模板 2.分析 分类讨论各种情况 大概的框架 关键部分(继续递归)的详解 递归调用展开图 3.测试结果 其他写法 4.结论 5.注意事项 不推荐的写法 1.题目 查找值为x的节点并返回节点的地址 代码模板 typedef int BTDataType; typedef struct BinaryT…...
Ant-Design-Vue 全屏下拉日期框无法显示,能显示后小屏又位置错乱
问题1:在全屏后 日期选择器的下拉框无法显示。 解决:在Ant-Design-Vue的文档中,很多含下拉框的组件都有一个属性 getPopupContainer可以用来指定弹出层的挂载节点。 在该组件上加上 getPopupContainer 属性,给挂载到最外层盒子上。 <temp…...
sec啥意思
sec的基本含义是秒,是时间的基本单位之一;在数学中表示正割函数;在计算机科学中有时指安全;在法语中意为干的等。 sec的多重含义与应用 sec在数学中的定义 在数学领域,尤其是三角学中,sec代表正割函数&a…...
云计算vspere 安装过程
1 材料的准备 1 安装虚拟机 vmware workstation 2 安装esxi 主机 3 在esxi 主机上安装windows 2018 dns 服务器 4 在虚拟机上安装windows 2018 服务器 6 安装vcenter 5 登入界面测试 这里讲一下,由于部署vspere 需要在windows 2012 服务器上部…...
spring-boot打包前重新拉取maven依赖
在使用 Maven 构建 Spring Boot 项目时,如果希望在每次打包时都强制拉取依赖,可以通过以下方法实现。 方法一:在命令行强制更新依赖 在执行 mvn package 或 mvn install 等命令时,添加 -U 参数: mvn clean package -…...
华为云域名网站,域名切换到Cloudflare CDN出现访问报错:DNS 重定向次过多
网站域名切换到Cloudflare出现访问报错:重定向次过多,应该如何处理? 最近我自己已经遇到很多次这个情况了,将网站域名DNS切换到Cloudflare之后,网站会打不开,出现重定向次数过多报错。 网站域名切换到Clo…...
浔川AI翻译v5.1.0版本正式亮相!
浔川 AI 翻译 v5.1.0 版本正式亮相! 在科技浪潮汹涌澎湃的今天,浔川 AI 翻译以其卓越的技术实力和对用户需求的精准把握,自豪地向全球用户宣布:浔川 AI 翻译 v5.1.0 版本正式闪耀登场!这一全新版本在继承以往优势的基础…...
Merkle 树 应用在 代码工程
将 Merkle 树 应用在 代码工程 中,尤其是在大型项目中,可以帮助管理和验证代码的完整性、追踪代码变更、提高版本控制的效率等。通过将代码文件、类、函数等结构映射到 Merkle 树中,我们可以高效地验证代码库的任何变更,确保每个部…...
如何将表中存储的 JSON 数据转换为新表
如何将表中存储的 JSON 数据转换为新表 引言 本文介绍如何使用 PostgreSQL 的 JSON 函数,将 log_table 表中的 param_json 字段(存储为 JSON 数组)转换为一张新的表,并提取出具体的字段值。 表结构说明 假设 log_table 表的结…...
鸿蒙开发——使用ArkTs处理XML文本
1、概 述 XML(可扩展标记语言)是一种用于描述数据的标记语言,旨在提供一种通用的方式来传输和存储数据,特别是Web应用程序中经常使用的数据。XML并不预定义标记。因此,XML更加灵活,并且可以适用于广泛的应…...
借助vector实现进制转换详解
进制转换,没什么可说的,大一级别的水平,不过在某些考研题目中可能会涉及到顺序栈的实现,本贴不使用顺序栈,用STL里面的vector模拟一下:关键在于想清楚【除留取余】的逻辑,至于用什么结构存放中间…...
混合云策略在安全领域受到青睐
Genetec 发布了《2025 年物理安全状况报告》,该报告根据超过 5,600 名该领域领导者(其中包括 100 多名来自澳大利亚和新西兰的领导者)的回应,揭示了物理安全运营的趋势。 报告发现,澳大利亚和新西兰的组织采用混合云策…...
Jackson - 序列化和反序列化Java集合对象
在本文中,我将向您展示如何使用Jackson API来序列化和反序列化Java集合对象,如List、Set和Map。 我们将通过具体的示例演示如何利用ObjectMapper类的方法进行这些操作。 主要内容 添加Maven依赖项使用Jackson API进行List序列化使用Jackson API进行Se…...
No.26 笔记 | 信息收集与工具实践指南
渗透测试的第一步:信息收集背后的“侦察艺术” 在网络安全的世界里,信息就是武器。 无论是追踪隐藏的漏洞,还是找到不被注意的入口,信息收集就像一场现代化的“谍战片”。而作为渗透测试的开场白,信息收集不仅考验技…...
使用倒排索引法解决分库分表后查询问题
数据进行了分库分表后,要查询某一条数据的信息,事先是不清楚该条数据在哪台服务器上的,这时候可以使用倒排索引法,将数据的关键信息存储到Redis中,然后从Redis中获取到数据所在的服务器信息和数据ID。 Redis倒排索引示…...
Linux操作系统--文件的重定向以及文件缓冲区
目录 前言 一、文件描述符的分配规则 二、重定向 三、系统中的重定向接口 1、dup2()介绍 2、dup2()使用 1)输出重定向和追加重定向 2)输入重定向 四、文件缓冲区 1、定义 2、缓冲区刷新的条件 1)文件缓冲区存在的意义 2&…...
Linux 远程连接服务
远程连接服务器简介 什么是远程连接服务器 远程连接服务器通过文字或图形接口方式来远程登录系统,让你在远程终端前登录linux主机以取得可操 作主机接口(shell),而登录后的操作感觉就像是坐在系统前面一样。 远程连接服务器的功…...