一、引言
在无人机测绘领域,点云数据的规模日益庞大,传统的Excel已无法应对大规模数据的处理需求。为了提高数据处理效率,这款专业软件用于处理无人机测绘中生成的点云数据中坐标提取转换,并将其转换为南方CASS软件可识别的dat格式,从而实现高效的后续展点操作。
二、背景与需求
随着无人机测绘技术的广泛应用,生成的点云数据量动辄达到百万行甚至千万行级别。办公软件Excel只能处理有限的数据量,导致大量数据无法直接打开或处理。这不仅限制了工作效率,还可能导致数据丢失或处理错误。针对这一问题,想写一个专门解决百万级点云数据的提取与转换软件。
三、软件亮点
1. **高效处理百万级数据**
软件通过数据读取和处理算法,能够轻松处理百万行级别的点云数据文件(如cloud.txt)。相比传统Excel工具,其处理速度更快,内存占用更低,确保大数据量下仍能流畅运行。
2. **精准坐标提取**
软件内置强大的文本解析引擎,可以自动从cloud.txt文件中提取关键坐标信息(X、Y、Z坐标值),并进行必要的格式校验和数据清洗,确保输出数据的准确性和一致性。
3. **兼容南方CASS格式**
CDNS的核心功能之一是将提取后的坐标数据转换为南方CASS软件支持的dat格式。该格式包含点号、X坐标、Y坐标、Z坐标以及点属性,完美适配CASS的展点功能,方便用户快速导入并进行地形图绘制。
4. **用户友好界面与批处理能力**
提供简洁直观的操作界面,即使是非技术人员也能快速上手。大大提升工作效率,适用于项目化、规模化测绘任务。
四、软件使用流程
步骤一:导入原始点云文件
用户只需点击“打开”按钮,选择需要处理的cloud.txt文件,软件即可自动加载并预览前几行数据内容。

步骤二:配置坐标字段
根据实际数据格式,在字段映射界面中指定X、Y、Z坐标的列位置,并设置是否跳过表头、忽略空行等选项。选择列中需要保留的数据。
步骤三:数据清洗与校验
软件会自动检测异常数据(如非数值型内容、超出范围的坐标值等),并提示用户是否过滤或修正。
步骤四:保存为CASS dat格式
完成配置后,点击“导出”按钮,选择保存路径及文件名,即可生成符合南方CASS标准的dat文件。
步骤五:导入南方CASS进行展点
将生成的dat文件导入南方CASS软件,即可一键展点,快速生成地形图。
步骤六:软件还支持.dat格式与.xyz格式的互转

五、适用场景
- **无人机航测项目**:处理航拍生成的海量点云数据,快速提取坐标并导入CASS进行绘图。
## 六、结语
软件作为一款专为测绘行业设计的专业数据处理工具,凭借其对百万级数据的处理能力和与南方CASS的高度兼容性,已经成为无人机测绘工作中不可或缺的一部分。无论是提升工作效率,还是保障数据质量,展现出了卓越的性能。未来,我们也将持续优化算法、增强功能,致力于为测绘工作者提供更加智能、高效的解决方案。

部分代码可以见下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 上上签浅修
{
public partial class Form1 : Form
{
#region 分页功能变量
private const int PageSize = 100;
private int _currentPage = 0;
private long _totalRows = 0;
private string _currentFilePath = "";
private bool _isBinaryMode = false;
private DataTable dataTable = new DataTable();
private Dictionary<int, CheckBox> columnCheckBoxes = new Dictionary<int, CheckBox>();
private Point dragStartPoint;
private CheckBox draggedCheckBox;
#endregion
#region XYZ-DAT功能变量
private string currentXYZFilePath = "";
private string currentXYZFileType = "";
private bool isXYZProcessing = false;
#endregion
public Form1()
{
InitializeComponent();
InitializeComponents();
}
#region 初始化方法
private void InitializeComponents()
{
// 初始化分页功能
ConfigureDataGridView();
HookPagingEvents();
GenerateColumnCheckBoxes();
// 初始化XYZ-DAT功能
InitializeXYZControls();
HookXYZEvents();
}
private void ConfigureDataGridView()
{
dataGridView1.AutoGenerateColumns = true;
dataGridView1.AllowUserToOrderColumns = false;
dataGridView1.DefaultCellStyle.Font = new Font("Microsoft YaHei", 9);
dataGridView1.RowHeadersVisible = false;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
}
private void InitializeXYZControls()
{
btnConvertDatToXyz.Enabled = false;
btnConvertXyzToDat.Enabled = false;
btnSaveFile.Enabled = false;
progressBarXYZ.Visible = false;
lblStatusXYZ.Text = "就绪";
txtInput.ReadOnly = true;
txtOutput.ReadOnly = true;
}
#endregion
#region 分页功能实现
private void HookPagingEvents()
{
btnOpen.Click += BtnOpen_Click;
btnSave.Click += BtnSave_Click;
btnPrevPage.Click += BtnPrevPage_Click;
btnNextPage.Click += BtnNextPage_Click;
flowPanelColumns.DragDrop += FlowPanelColumns_DragDrop;
flowPanelColumns.DragEnter += FlowPanelColumns_DragEnter;
}
private async void BtnOpen_Click(object sender, EventArgs e)
{
using (var ofd = new OpenFileDialog())
{
ofd.Filter = "文本文件|*.txt|二进制文件|*.bin|所有文件|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
Cursor = Cursors.WaitCursor;
btnOpen.Enabled = false;
_currentFilePath = ofd.FileName;
_isBinaryMode = Path.GetExtension(_currentFilePath).Equals(".bin", StringComparison.OrdinalIgnoreCase);
if (_isBinaryMode)
{
await LoadBinaryFileAsync();
}
else
{
await LoadTextFileAsync();
}
Text = $"数据查看器 - {Path.GetFileName(_currentFilePath)}";
UpdatePagerStatus();
}
catch (Exception ex)
{
MessageBox.Show($"加载失败: {ex.Message}", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
btnOpen.Enabled = true;
Cursor = Cursors.Default;
}
}
}
}
private async Task LoadTextFileAsync()
{
dataTable.BeginLoadData();
dataTable.Rows.Clear();
dataTable.Columns.Clear();
_totalRows = await CountTextFileLinesAsync();
if (_totalRows == 0) return;
using (var reader = new StreamReader(_currentFilePath))
{
string firstLine = await reader.ReadLineAsync();
var columns = firstLine.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < columns.Length; i++)
{
dataTable.Columns.Add($"列{i + 1}", typeof(string));
}
}
await LoadPageAsync();
dataTable.EndLoadData();
GenerateColumnCheckBoxes();
}
private async Task LoadBinaryFileAsync()
{
dataTable.BeginLoadData();
dataTable.Rows.Clear();
dataTable.Columns.Clear();
await Task.Run(() =>
{
using (var stream = File.OpenRead(_currentFilePath))
using (var reader = new BinaryReader(stream))
{
int colCount = reader.ReadInt32();
for (int i = 0; i < colCount; i++)
{
dataTable.Columns.Add($"列{i + 1}", typeof(double));
}
long dataLength = stream.Length - sizeof(int);
_totalRows = dataLength / (colCount * sizeof(double));
}
});
await LoadPageAsync();
dataTable.EndLoadData();
GenerateColumnCheckBoxes();
}
private async Task<int> CountTextFileLinesAsync()
{
return await Task.Run(() => File.ReadLines(_currentFilePath).Count());
}
private async Task LoadPageAsync()
{
dataTable.BeginLoadData();
dataTable.Rows.Clear();
try
{
lblStatus.Text = $"正在加载第 {_currentPage + 1} 页...";
progressBar.Value = 0;
if (_isBinaryMode)
{
await LoadBinaryPageAsync();
}
else
{
await LoadTextPageAsync();
}
}
finally
{
dataTable.EndLoadData();

被折叠的 条评论
为什么被折叠?



