node解析dxf文件

1、dxf数据说明

DXF是一种开放的矢量数据格式,可以分为两类:ASCII格式和二进制格式;ASCII具有可读性好的特点,但占用的空间较大;二进制格式则占用的空间小、读取速度快。由于AutoCAD是最流行的CAD系统,DXF也被广泛使用,成为事实上的标准。绝大多数CAD系统都能读入或输出DXF文件。

2、解析库

npm install dxf-parser

3、接口

1、同步解析:parseSync

2、异步解析:parse

4、实现代码

1、读取文件并解析

javascript 复制代码
const DxfParser = require('dxf-parser');
// 读取DXF文件
const fs = require('fs');
const dxfContent = fs.readFileSync('uploads/road-all2.dxf', 'utf-8');

let parser = new DxfParser();

// 解析DXF文件
const { layers, entities } = parser.parseSync(dxfContent);

2、读取图层实体数据,比如提取道路图层的数据

javascript 复制代码
let gcd = entities.filter(item=>{
    return item.layer==="道路";
})

3、将道路数据转图层并存储到geojson

javascript 复制代码
const calculatePoint=(center, startAngle, endAngle, radius)=> {
    // 将角度转换为弧度
    const startRadians = startAngle;
    const endRadians = endAngle;
    // 计算两角度之间的差角度
    let angle = endRadians - startRadians;
    if(angle<0){
      angle += Math.PI;
    }
    //302 - 32
    // -270
    // 302-9
    let step = angle / 20 ;
    let positions = [];
    for(let i=0;i<21;i++){
      let tempAngle = angle>0?startRadians + step*i:startRadians-step*i;
      const x = center.x + radius * Math.cos(tempAngle);
      const y = center.y + radius * Math.sin(tempAngle);
      positions.push([x,y])
    }
    return positions;

  }
  let features = gcd.map(item=>{
    if(item.type==="LINE"){
      let vertices = item.vertices;
      let positions = vertices.map(vertice=>{
        return [vertice.x, vertice.y]
      })
      return {
        type: "Feature",
        geometry: {
          type: "LineString",
          coordinates: positions,
        },
        properties: {}
      }
    } else if(item.type==="ARC"){
      let {radius,startAngle,endAngle,center} = item;
      let positions = calculatePoint(center,startAngle,endAngle,radius);
      return {
        type: "Feature",
        geometry: {
          type: "LineString",
          coordinates: positions,
        },
        properties: {}
      }
    }

  })
  const gcdJSON = {
    type: "FeatureCollection",
    features: features
  };
  fs.writeFile("./data/road-line.json", JSON.stringify(gcdJSON), (err) => {
    if(err){
      console.log(err.message);
    }
    console.log('写入成功');
  })

5、显示结果

相关推荐
ℋᙚᵐⁱᒻᵉ鲸落2 小时前
移动端滑动手势冲突:overflow: auto导致外层横向滑动失效
前端·javascript·css·vue.js·html
默_笙3 小时前
🎃 前端学了 Next.js,后端该学啥?NestJS 就是 Node 版的蜜雪冰城
前端·javascript
এ慕ོ冬℘゜4 小时前
navigator 导航对象 BOM制作方法
javascript
kyriewen7 小时前
面试官让我用 AI 重构一个 8 年陈的 React 组件——他说他不看代码,只看我会不会拆
前端·javascript·面试
Jacky19998 小时前
Electron + Vue 3 桌面打字游戏实战:从 VSCode 扩展到独立应用的架构改造
javascript
柚yuzumi9 小时前
别再猜 this:先看它属于谁,再看它指向谁
前端·javascript
汉堡大王95279 小时前
面试必考:手写代码 new 做了什么?从原理到实现全解析
前端·javascript·面试
BillKu10 小时前
TypeScript中,字符串字面量联合类型(Union Type)、enum的用法说明
前端·javascript·typescript
顶级自由人12 小时前
本地正常、线上正常,为什么一个 Hook 仍会报错?
前端·javascript·程序员
lerhxx12 小时前
R3F 第一人称漫游与碰撞检测:Pointer Lock + 不穿墙的滑墙秘诀(中)
前端·javascript·three.js