- 博客(92)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 3dtiles平移旋转工具制作
平时工作中,通过cesium平台来搭建一个演示场景是很常见的事情。一般来说,演示场景不需要多完善的功能,但是需要一批三维模型搭建,如厂房、电力设备、园区等。在实际搭建过程中,就会面临一个尴尬的问题,那就是模型定位,常规操作中,我们一般用三维模型的中心点对应一个经纬度坐标,以此转换成3dtiles格式,但是给定的经纬度坐标一般是模糊的大致位置,甚至有的场景不需要准确的坐标,只需要你找个合适的场景把各个模型搭建起来,这就不得不对模型进行微调位置,以适应场景。
2025-02-24 17:53:56
1129
原创 threejs实现模型炸开全流程
由于obj模型可能是一个整体,而不是一个个单独的部件,所以再炸开的时候,是无法进行部件分解的。计算每个部件质心到炸开中心的距离,作为一个距离权重,以此保证在相似方向上的部件,离炸开中心越远,分离的距离也越远。炸开方向可以通过每个部件的质心到炸开中心形成一个方向向量,以此向量形成炸开方向。以此此操作,最终将整个模型部件进行分离,此时每个部件都有一个单独的名称。上图为单一模型,没有分解部件,因此需要先在建模软件进行部件分解。模型炸开需要考虑到一个炸开中心,以及各个部件的炸开方向。一般选取模型中心点为炸开中心。
2025-02-11 09:20:18
353
原创 大批量影像瓦片优化
在很多场景中,需要用的影像瓦片,常规的思路是将tif进行切图,做成分层的瓦片:但是,如果层级太高,产生的文件将十分庞大,据测试,某地级市18层级切片,内存占用高达200多G,在部署和传输的过程中,都很不利。
2024-08-28 13:39:58
441
原创 vite.config引入插件报错:无法找到模块“vite-plugin-optimizer”的声明文件。“d:/myProject/electron-juejin/node_modules/vite
原因:错误表明 TypeScript 无法正确解析 vite-plugin-optimizer 包的类型声明。这是由于包的 package.json 中的 exports 字段配置不当,或者类型声明文件的位置不正确。
2024-08-26 16:57:36
514
原创 Java调用GDAL实现postgresql数据生成shp和dxf
由于shp数据存储到postgresql数据库中,前端调用数据库实现数据的渲染,最近有一个新的需求,前端圈选数据,实现数据的下载,数据可以是shp、dxf、excel格式,这里主要记录在后端通过调用gdal来实现这个需求
2024-04-29 14:49:25
1205
原创 基于苹果手机采集数据实现RGBD三维重建
项目使用tsdf的方式进行三维重建,借助open3D实现可视化和模型生成,其首先根据置信度将深度图进行筛选,小于限定置信度的深度值设置为0,其次将视频处理成rgb帧,融合深度图里,借助相机内参和姿态进行三维重建。
2024-04-22 14:53:50
1715
原创 基于kml线路生成路线规划文档
在野外工程采集中,一线工作人员为了记录所在方位与坐标,一般会对相关点做标记,最终导出成一个kml格式的文件,该文件记录了一系列工程点和路线,很多工程报告需要根据这些线路来对周边环境进行描述,如高压线路的铺设,野外测绘等,比较严谨的方案是结合最新的影像地图以及其它实测数据和规划数据,由相关人员进行撰写,最近在研究自动化的过程,手里的数据比较少,因此仅仅实现一个思路。一个测量点也可以被看作一个拐点,即线路走到这里会发生改变,因此需要找到附近的地物点及方向,以便加以描述。目的是将kml读取成可以解析的坐标。
2024-03-21 14:23:49
649
原创 模型单体化的顶点精简和空洞修复
针对上述问题,考虑对边缘的格网进行切割处理,使在模型内的部分保留,不在模型内的部分舍弃,由此可以推断,这种方式格网至少会和多边形边缘产生2个交点,由于2个以上交点的情况太过复杂,这里只针对普遍的两个交点的情况进行分析。由于分割点分布在模型的边缘,因此想要构建模型的四周墙面,需要利用分割点和建筑底部点,由于底部点不清晰,因此可以借助多边形的点,由于多边形在xy平面内,将该多边形沿Z轴平移到模型最底部,即可成为模型底部的范围点。这样导致的问题就是,处于分割边缘的三角格网,可能不会包含进来;
2024-02-29 14:16:15
417
原创 基于shp数据实现obj模型的切割(模型单体化思路)
由于obj模型包含顶点和纹理,而shp数据基本处于二维平面,那么需要考虑顶点落在shp面数据xy平面内的数据,同时,一个面最少由三个顶点构成,如果一个面的部分在shp范围内,部分在范围外,则需要重新分割,生成新的顶点并构建网格。由于每个材质对应了一部分三角格网数据,格网数据对应了相应的顶点和纹理坐标数据,因此在解析数据的时候以材质进行分类,先记录每个材质的相关信息,在根据材质读取对应的顶点坐标和纹理坐标,进行裁剪和划分。通常简单的obj数据包含顶点信息,纹理信息,面信息,有的obj还包含一个mtl文件。
2024-02-19 15:40:31
1616
原创 arcEngine修改字段标注
在arcEngine中,有时候需要修改图层要素的标注值,而且每个字段值对应了要修改的内容,如字段值”1“替换成”A“,字段值”2“替换成”B“等,这就需要在替换的图层中,遍历每个要素,查到每个要素的原有标签值是多少,然后再根据标签值修改。实际上,这是在一个新的文件里建立了一个字典,字典里面编辑了原有标签和新标签的对应关系,至于为什么是要新建一个独立的文件,是因为后期好维护,要修改字典的话只需要在这个文件里进行编辑就行,不涉及其它逻辑代码,加上任意问价都可以引入调用。拿到原来标签的内容后,调用了一个。
2023-12-20 14:41:15
663
原创 指定要素高亮
arcEngine开发中,经常面临一个情况,就是查询到一个要素或指定一个要素的id,去让这个要素高亮,其实实现这个功能很简单,只不过基于arcEngine二次开发,需要熟悉它的官方文档才能找到这个方法,这里简单记录一下。
2023-12-18 09:23:23
562
原创 2.C程序和GCC编译器
退出保存之后,执行gcc hello.c 即可得到一个a.out文件,这是一个二进制可执行程序,将当前所写代码经过翻译得到计算器能够理解的代码,这个过程叫编译,过程所用到的工具叫编译器。
2023-07-24 14:25:43
190
原创 Cesium加载矢量数据探索——从geojson到矢量切片
通常来说,对于简单的shp数据,最常规的处理方式是通过geojson格式在cesium中进行加载,而cesium也为加载geojson及后续操作提供了丰富的api。
2023-02-27 23:43:25
1703
原创 说一下vue响应式原理?可不只有proxy
凭借着之前的学习积累,用自己的方式叙述一下自己所学的知识点,笔者高中讨厌写作文,硕士期间不喜写论文,水平肯定有限,能详述之前所学的知识已是不易,若能给读者带来一点启发,将倍感荣幸,同时也虚心接受大佬、同仁指点。
2022-10-28 19:32:02
410
原创 9. Vue3中如何将虚拟节点渲染成真实节点
返回一个render函数,该函数接收两个参数,分别是虚拟节点vnode,和容器container,改函数在节点更新删除都可以使用,因为都要将虚拟节点渲染成新节点,因为只需要比对传入的新的虚拟节点和原来的旧的虚拟节点,就可以判断出是更新节点还是删除节点。processElement函数中,对vnode进行判断,若为null,说明不存在旧节点,则直接根据新的vnode创建真实节点。函数接收一个dom操作对象,在函数内部会对改对象解构,获取各种dom和属性操作方法。在render函数内部,判断vnode。...
2022-08-02 11:04:39
1722
原创 7.vue3渲染模块的domAapi实现
vue3中渲染模块有两个子模块,分别是runtime-dom和runtime-core,其中,runtime-dom模块提供了常用的节点操作api和属性操作的api,而runtime-core中则包含虚拟dom的创建,diff算法等。本节来完善runtime-dom中的domapi,以便后面供runtime-core模块使用。通过vue3中的runtime-core可以实现自己的渲染逻辑。...
2022-07-17 16:27:44
505
原创 2.Vue3中数据绑定的实现
Vue3数据绑定从defineProperty改为Proxy,并且每一个功能抽离成一个模块,这里介绍源码中数据绑定的流程实现
2022-06-07 11:10:33
2741
原创 node中base64的转换规则
base64转换规则base64可以编码任何东西,其基于二进制,方便传输,我们可以尝试编译一段文字输入无敌且英俊node中汉字占3个字节,一个字节有8位,我们需要将函子转为二进制,只需要利用BUffer转为16进制再转为2进制即可可以判断,五个汉字转为二进制一共120位由于base64规定,每个字节不能超过64,我们可以推测出,一个字节8位的话有2**8 = 256,所以我们要重新分配每个字节的内容,使之不能超过64由 15*8 -> 20 * 6如: 11100111 10
2022-05-26 10:36:57
920
原创 node中events模块简单实现
node中events模块的简单实现node中events模块是一个发布订阅类events的应用简单的发布订阅 const EventEmitter = require("events") const { grep } = require("jquery") const girl = new EventEmitter() //订阅 girl.on('失恋了',function(boy){ console.log('哭',boy)
2022-05-25 11:03:47
432
原创 模拟node中require加载机制实现
node中require加载机制node中的模块加载规范为commonJS规范,规范中通过require来引入模块。require源码探究暴漏出一个text模块 let str = 'hello world' module.exports = strnode中的源码无法通过打断点进行调试,这里借助vscode,在debug模式中,新建launch.js文件,并且将"skipFiles"内容 清空,表示不跳过node核心代码,然后在require处打断点,即可进入require内部源码
2022-05-23 20:02:10
200
原创 浏览器事件环及相关习题
浏览器事件环进程与线程计算机分配任务是以进程来分配,进程中包含着线程浏览器是一个进程,而且是一个多进程模型(多进程好处就是一个进程挂掉不会影响其它进程)一个tab就是一个独立的进程浏览器默认有一个主进程,来调度其它进程(进程间的通信)插件也有独立的进程管理gpu有绘图进程浏览器的渲染进程ui 渲染线程 负责页面渲染,布局,绘制js引擎线程 执行js代码的这两种线程是互斥的,不能同时执行,原因是js引擎可能会操作dom,而渲染进程依赖domjs是单线程的,但主要指
2022-05-17 21:32:00
232
原创 异步回调目前的解决方案:从generator到async
从generator到async迭代器什么叫类数组有索引有长度能遍历 let likeArray = { 0:0, 1:1, 2:2, 3:3, length:4 } let arr = [...likeArray]//报错上述并不是类数组,因为无法进行解构,说明迭代不了数组能遍历,是因为内部有迭代的方法,通过Symblo可以给上述类型设置迭代方法,使之成为类数组 const { values } =
2022-05-16 22:17:54
337
原创 promise实现
promise的理解及实现基于回调的异步解决方案缺陷js通常采用四种异步解决方案:回调、promise、Generator、async/await回调解决方案通常异步的操作需要放入回调中进行执行,若要执行串行异步,则容易造成回调嵌套promise优势通过then来实现异步的执行,解决了回调嵌套问题(本质 依然是回调)解决异步并发问题(promise.all)使错误处理变得简单promise实现初步实现思路基本状态实现添加then显示异步操作const
2022-05-13 16:16:35
213
原创 高阶函数常见场景
高阶函数高阶函数类型一个函数返回一个函数一个函数的参数是高阶函数高阶函数作用高阶函数可以对一个函数进行扩展,使之在执行阶段能有其它业务处理形式1 function fn(){ return function(){} }形式2function(cb){ cb()}例如扩展一个函数,在其执行之前,进行其它操作function core (a,b,c){console.log(a,b,c)}Function.prototype.before
2022-05-09 15:39:33
435
原创 ESmodule规范入门
ESM基本特性自动采用严格模式,忽略“use strict" <script type="module"> console.log(this) //undefine </script>每个ESM模块都是单独的私有作用域 <script type="module"> var a = 10 </script> <script type="module"> conso
2022-04-18 12:15:58
777
原创 前端模块化的演变
模块化可以说是目前前端最重要的开发范式之一,模块化是一种思想,这种思想,在不同的前端开发阶段,其实现的方式也各不相同文件划分方式起初前端通过文件划分的方式来实现模块化,如分别定义a.js文件和b.js文件,每个文件中有相关的逻辑的变量,然后在html中统一引入这种方式有很大的缺陷首先就是全局变量的问题,引入的各个文件都将把各自的变量挂载到全局,各个文件间的变量命名也可能会有冲突,而且各个文件之间可能会有依赖关系,难以管理。命名空间方式这种方式对文件划分的方式进行了改进,针对每一个文.
2022-04-15 17:04:59
627
原创 什么是URL和URI
对于url,大家也许并不陌生,在网页请求中,经常需要填入一个url地址,用来请求其数据,那么url具体的含义是什么呢?URI说到这个问题,需要先解释一下uriuri 全称为:统一资源标识符,用来标识唯一的资源,web上几乎可用的每种资源(http文档、图像、视频片段、程序等)都需要一个个的uri进行定位标识uri一般由三部分组成:访问资源的命名机制存放资源的主机名资源自身的名称,由路径表示如:http://www.xxx.com/indexuri的标识也分为绝对和相对之分:如:.
2022-04-15 09:59:24
1488
原创 创建自己的脚手架命令工具
vue脚手架有自己的模板管理工具;vue-cli,我们也可以自己写一款自己的模板管理脚手架,通过使用自己的命令,安装相应的模板初始化项目npm初始化一个空项目创建bin/cli.js文件#! /usr/bin/env node//测试console.log('sx')创建lib/index.js文件为入口文件修改package.json{ "name": "sx", "version": "1.0.0", "description": "", "main": .
2022-03-30 10:47:41
204
原创 node中的pipe可读流
node环境中集成了对文件的读写操作,通常我们利用writeFile和readFile对文件进行读写,但是readFile是一次性对文件全部读入内存,然后写入,这样做常规上没什么问题,但是如果内容太小或者想要分段读写,就会力不从心const fs = require("fs")fs.readFile('./test1.txt',(err,obj)=>{ if(err) throw err console.log(obj.toString()) fs.w.
2022-03-24 10:30:26
708
基于shp数据实现obj模型的切割(模型单体化思路)
2024-02-19
arcengine实现地图标注渲染
2024-02-18
计算obj模型的中心点和外包范围
2024-01-29
python脚本实现shp文件转geojson文件
2024-01-29
3857投影坐标和4326地理坐标互转的python代码
2024-01-29
2021-2022年12个月全球风场数据,json格式,用于二三维风场可视化展示
2022-08-10
C#画多个圆且重叠部分着色的问题
2021-12-11
TA创建的收藏夹 TA关注的收藏夹
TA关注的人