javaScript 【CAD转jeojson数据在canvas绘制】

javaScript 【CAD转jeojson数据在canvas绘制】

由于需求想要实现canvas绘制出跟CAD模型一样的2D平面效果

需求

1.根据CAD的模型绘制canvas
2.将CAD的模型数据导出转成 jeojson
3.将jeojson转成json可用数据
4.将数据拿到处理根据类型 绘制 ,经纬度坐标转成2D平面坐标,将坐标数据转为三维数组
5.创建canvas
创建开始设置线 beginPath()
设置线 lineTo
断开closePath()

代码

首先拿到jeojson数据 ,我的是这样的(一小部分)

 var arr = [
            {
                "type": "Feature",
                "id": "42F",
                "properties": {
                    "SubClasses": "AcDbEntity : AcDbLwPolyline",
                    "Layer": "楼栋1",
                    "Color": 256,
                    "EntityHandle": "42F"
                },
                "geometry": {
                    "type": "LineString",
                    "coordinates": [
                        [95775.469643, 39352.816374],
                        [106477.561748, 39352.816374],
                        [106477.561748, 36119.539026],
                        [118815.189952, 36119.539026],
                        [117250.764441, 31038.674907],
                        [95775.469643, 31038.674907],
                        [95775.469643, 39352.816374]
                    ]
                }
            },
            {
                "type": "Feature",
                "id": "432",
                "properties": {
                    "SubClasses": "AcDbEntity : AcDbLine",
                    "Layer": "车道",
                    "Color": 256,
                    "EntityHandle": "432"
                },
                "geometry": {
                    "type": "LineString",
                    "coordinates": [
                        [93713.272361, 39956.835177],
                        [131295.038551, 39956.835177]
                    ]
                }
            },
            {
                "type": "Feature",
                "id": "433",
                "properties": {
                    "SubClasses": "AcDbEntity : AcDbLine",
                    "Layer": "车道",
                    "Color": 256,
                    "EntityHandle": "433"
                },
                "geometry": {
                    "type": "LineString",
                    "coordinates": [
                        [94175.489033, 42657.154611],
                        [131295.038551, 42657.154611]
                    ]
                }
            },
            {
                "type": "Feature",
                "id": "436",
                "properties": {
                    "SubClasses": "AcDbEntity : AcDbLwPolyline",
                    "Layer": "车位1",
                    "Color": 256,
                    "EntityHandle": "436"
                },
                "geometry": {
                    "type": "Polygon",
                    "coordinates": [

                        [100077.639701, 43047.990248],
                        [101784.285606, 43047.990248],
                        [101784.285606, 46281.267430],
                        [100077.639701, 46281.267430],
                        [100077.639701, 43047.990248]

                    ]
                }
            },
            {
                "type": "Feature",
                "id": "437",
                "properties": {
                    "SubClasses": "AcDbEntity : AcDbLwPolyline",
                    "Layer": "车位2",
                    "Color": 256,
                    "EntityHandle": "437"
                },
                "geometry": {
                    "type": "Polygon",
                    "coordinates": [

                        [101784.285606, 43083.520776],
                        [103917.593085, 43083.520776],
                        [103917.593085, 46281.267430],
                        [101784.285606, 46281.267430],
                        [101784.285606, 43083.520776]

                    ]
                }
            },
            {
                "type": "Feature",
                "id": "43D",
                "properties": {
                    "SubClasses": "AcDbEntity : AcDbLwPolyline",
                    "Layer": "车位3",
                    "Color": 256,
                    "EntityHandle": "43D"
                },
                "geometry": {
                    "type": "Polygon",
                    "coordinates": [

                        [103917.593085, 43047.990248],
                        [105659.794089, 43047.990248],
                        [105659.794089, 46281.267430],
                        [103917.593085, 46281.267430],
                        [103917.593085, 43047.990248]

                    ]
                }
            },
            {
                "type": "Feature",
                "properties": null,
                "geometry": null
            }
        ]

因为这里的数据只用到坐标,数据坐标是世界地图坐标,要转成2D坐标 并转成三维数组

		let points = arr;
        var ArrayObj = new Array()
        for (let i = 0; i < points.length; i++) {
            if (points[i].geometry != undefined) {
                if (points[i].geometry.type == 'LineString') {
                    let p = points[i].geometry.coordinates
                    ArrayObj.push(p)

                    for (let j = 0; j < p.length; j++) {
                        // console.log(p[j])
                        amuXArr.push(p[j][0])
                        amuYArr.push(p[j][1])
                        console.log(p[j])

                    }
                }

            }
        }
        

将经纬度处理

1.拿到经纬度的最大值和最小值,
2.并处理数据转成三维数组

let xMax = Math.max(...amuXArr);
        let xMin = Math.min(...amuXArr);
        let yMax = Math.max(...amuYArr);
        let yMin = Math.min(...amuYArr);
        // 根据canvas宽高计算缩放级别
        let xScale = canvas.width / (xMax - xMin);
        let yScale = canvas.height / (yMax - yMin);
        let scale = xScale < yScale ? xScale : yScale;
        let xoffset =
            parseInt((canvas.width - (xMax - xMin) * scale) / 2)
        let yoffset =
            parseInt((canvas.height - (yMax - yMin) * scale) / 2)

创建canvas根据坐标画出图形

let canvas = document.getElementById('my-canvas')
        canvas.width = 1600
        canvas.height = 1200
        var amuXArr = []
        var amuYArr = []
        let cxt = canvas.getContext('2d')
for (var i = 0; i < ArrayObj.length; i++) {
            //开始设置线样式
            cxt.beginPath();
            cxt.strokeStyle = "red";
            // cxt.fillStyle = "#ccc";
            for (var j = 0; j < ArrayObj[i].length; j++) {
                //线的坐标连接
                cxt.lineTo(
                    ((ArrayObj[i][j][0] - xMin) * scale + xoffset),
                    ((yMax - ArrayObj[i][j][1]) * scale + yoffset));
            }
            cxt.closePath();
            cxt.stroke();
        }

效果图在这里插入图片描述
完整代码

<canvas id="my-canvas"></canvas>

let canvas = document.getElementById('my-canvas')
        canvas.width = 1600
        canvas.height = 1200
        var amuXArr = []
        var amuYArr = []
        let cxt = canvas.getContext('2d')

        // // 取得各个经纬度坐标数据并绘制
        let points = arr;
        var ArrayObj = new Array()
        for (let i = 0; i < points.length; i++) {
            if (points[i].geometry != undefined) {
                if (points[i].geometry.type == 'LineString') {
                    let p = points[i].geometry.coordinates
                    ArrayObj.push(p)

                    for (let j = 0; j < p.length; j++) {
                        // console.log(p[j])
                        amuXArr.push(p[j][0])
                        amuYArr.push(p[j][1])
                        console.log(p[j])

                    }
                }

            }
        }
        console.log(ArrayObj, '///')
        // // 现在可以将x,y坐标转换为2D的XY坐标
        let xMax = Math.max(...amuXArr);
        let xMin = Math.min(...amuXArr);
        let yMax = Math.max(...amuYArr);
        let yMin = Math.min(...amuYArr);
        // 根据canvas宽高计算缩放级别
        let xScale = canvas.width / (xMax - xMin);
        let yScale = canvas.height / (yMax - yMin);
        let scale = xScale < yScale ? xScale : yScale;
        let xoffset =
            parseInt((canvas.width - (xMax - xMin) * scale) / 2)
        let yoffset =
            parseInt((canvas.height - (yMax - yMin) * scale) / 2)
        //循环
        for (var i = 0; i < ArrayObj.length; i++) {
            //开始设置线样式
            cxt.beginPath();
            cxt.strokeStyle = "red";
            // cxt.fillStyle = "#ccc";
            for (var j = 0; j < ArrayObj[i].length; j++) {
                //线的坐标连接
                cxt.lineTo(
                    ((ArrayObj[i][j][0] - xMin) * scale + xoffset),
                    ((yMax - ArrayObj[i][j][1]) * scale + yoffset));
            }
            cxt.closePath();
            cxt.stroke();
        }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript中使用Canvas绘制YUV420图像是一个相对复杂的任务,因为Canvas默认使用RGB颜色模式而不是YUV。你需要进行一些额外的步骤来将YUV420数据换为RGB,并将其绘制Canvas上。 下面是一个基本的示例代码,用于展示如何使用Canvas绘制YUV420图像: ```html <!DOCTYPE html> <html> <head> <title>Canvas YUV420</title> </head> <body> <canvas id="myCanvas" width="400" height="300"></canvas> <script> // 获取Canvas元素 var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); // 获取YUV420图像的Y、U、V分量数据(假设已经获取到了) // 假设Y分量数据为yData,U分量数据为uData,V分量数据为vData // 创建一个ImageData对象用于存储RGB数据 var imageData = ctx.createImageData(canvas.width, canvas.height); var data = imageData.data; // YUV420RGB函数 function yuv420ToRgb(y, u, v) { var r, g, b; // YUV到RGB换公式 r = y + 1.402 * (v - 128); g = y - 0.344136 * (u - 128) - 0.714136 * (v - 128); b = y + 1.772 * (u - 128); // 将RGB值限制在0到255之间 r = Math.max(0, Math.min(255, r)); g = Math.max(0, Math.min(255, g)); b = Math.max(0, Math.min(255, b)); return [r, g, b]; } // 遍历每个像素 for (var i = 0; i < canvas.width * canvas.height; i++) { var y = yData[i]; var u = uData[Math.floor(i / 4)]; var v = vData[Math.floor(i / 4)]; // 换YUV到RGB var rgb = yuv420ToRgb(y, u, v); // 填充RGB值到ImageData var dataIndex = i * 4; data[dataIndex] = rgb[0]; // 红色通道 data[dataIndex + 1] = rgb[1]; // 绿色通道 data[dataIndex + 2] = rgb[2]; // 蓝色通道 data[dataIndex + 3] = 255; // 不透明度 } // 将ImageData对象绘制Canvas上 ctx.putImageData(imageData, 0, 0); </script> </body> </html> ``` 在上面的示例中,我们假设已经获取到了YUV420图像的Y、U、V分量数据,并创建了一个ImageData对象来存储RGB数据。然后,我们使用一个yuv420ToRgb函数将YUV数据换为RGB,并将换后的RGB值填充到ImageData对象中。最后,我们使用putImageData方法将ImageData对象绘制Canvas上。 请注意,上述示例是一个简化的版本,并未考虑YUV420图像的具体格式和数据排列。在实际应用中,你可能需要根据实际情况进行适当的解析和处理。此外,由于JavaScript是单线程的,处理大量像素数据可能会导致性能问题,你可能需要考虑使用Web Worker或其他优化技术来提高性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值