You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
duoji-frontend/src/views/3DPointCloud/pointCloud.vue

153 lines
4.8 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div
style="width: 1000px;height:800px;"
class="echar"
ref="charts"
id="main"
></div>
</template>
<script>
import * as echarts from "echarts/core";
import { DatasetComponent } from "echarts/components";
import { CanvasRenderer } from "echarts/renderers";
import { Scatter3DChart } from "echarts-gl/charts";
import { Grid3DComponent } from "echarts-gl/components";
echarts.use([
DatasetComponent,
Grid3DComponent,
Scatter3DChart,
CanvasRenderer,
]);
export default {
props: ["src"],
name: "pointCloud",
watch: {
//监听并接收父组件的visible并赋值给isShow子组件接收父组件props传过来的值时不能起一样的类名会报重复定义的错
src: function (newVal) {
console.log(newVal);
this.srcPath = newVal; //newVal即是visible
// newVal && this.showConfirm(); //newVal存在的话执行showConfirm函数
},
},
data() {
return {
dat: [],
option: {},
myChart: {},
srcPath: "",
};
},
methods: {
getData(myChart, option) {
let file_url = this.src;
console.log(file_url);
let xhr = new XMLHttpRequest();
xhr.open("get", file_url, true);
xhr.onload = function () {
if (xhr.status == 200) {
// if (callback) {
// callback();
console.log(xhr.response);
var lines = xhr.response.split("\r\n").slice(12);
console.log(lines);
// 将每行以空格作为分隔符形成二维数组
var dataArray = lines.map(function (line) {
console.log();
var arry = line.trim()
.split(" ")
.map(function (value) {
return 1 * parseFloat(value);
});
if(arry[2]>3000){
console.log(arry);
return "";
}
if(arry[1]>1000 || arry[1]<-1000){
console.log(arry);
return "";
}
if(arry[0]>1000 ||arry[0]<-500){
console.log(arry);
return "";
}
arry[2] = arry[2]-1000;
return arry;
}).filter(item => item !== "");
option.dataset.source = dataArray;
console.log(option);
myChart.setOption(option);
}
};
xhr.send();
// 读取文件内容
},
myEcharts() {
// 基于准备好的dom初始化echarts实例
var myChart = echarts.init(document.getElementById("main"));
// x 轴的最小值和最大值
let minX = Math.min(...data.map(item => item[0]));
let maxX = Math.max(...data.map(item => item[0]));
// 定义颜色渐变范围
let colorMin = '#61dfff '; // 最小值的颜色
let colorMax = '#366fff'; // 最大值的颜色
var symbolSize = 1.5;
var option = {
grid3D: {
viewControl: {
beta: -90,
alpha: 15,
distance: 75,
},
},
xAxis3D: {
min: 0,
max: 2000,
},
yAxis3D: {
min: -1000,
max: 1000,
},
zAxis3D: {
min: -1000,
max: 1000,
},
dataset: {
dimensions: ["z", "y", "x"],
source: this.dat,
},
series: [
{
itemStyle: {
color: function (params) {
// 计算当前点在 x 轴上的位置比例
let ratio = (params.data[0] - minX) / (maxX - minX);
// 根据比例计算对应的颜色
let color = echarts.color.gradient(colorMin, colorMax)(ratio);
return color;
}
},
type: "scatter3D",
symbolSize: symbolSize,
encode: {
x: "x",
y: "y",
z: "z",
},
},
],
};
this.getData(myChart, option);
},
},
mounted() {
this.myEcharts();
},
};
</script>