bln格式文件介绍
BLN 文件格式是一种简单的文本文件格式,通常用于 Golden Software 的绘图软件,如 Surfer。它用于定义边界线、断层线或其他线性数据。BLN 文件格式相对简单,主要包括以下几个部分:
每条线的开始行:这一行通常包含两个或三个数值:
-
点的数量:即该条线由多少个点组成。
-
闭合标志(可选):通常是
0
或1
,其中1
表示这是一个闭合的多边形,0
表示非闭合的线条。 -
ID 或标签(可选):一个额外的数字或文本标签,用于标识线条或多边形。
坐标点:在开始行之后,每行包含一对坐标(X 和 Y),这些坐标定义了线条的形状。这些坐标通常是经纬度或其他地图坐标系中的点。
这是一个描述三角形的bln文件内容示例:
3, 1 100.0, 200.0 110.0, 240.0 120.0, 180.0 |
地理数据shp文件下载
首先我们需要获得一个区域的边界数据:这里我的数据采用免费的数据开源网站GADM进行下载:
数据处理
接下来将我们下载得到的文件在arcgis中打开:
可以看到一幅冰岛的图层:
属性表内容只有一个面:
我们先把面转成线:
线导出结果:
接下来把线导出成点。
(注:如果最终需要的文件是一个地区或者流域的大致轮廓的边界文件,为了避免连接边界的时候出现问题,最好进行数据预处理,将多余的破碎的部分删除,只保留主体,这个部分需要手动操作。如果不需要,可以跳过数据预处理部分)
数据预处理:右击arcgis上方空白部分,调出工具栏,启用Editor;
打开Editor,选择Start Editing开始编辑,选择线图层
手动选择破碎的区域,右键删除(这里主要的破碎区域为冰岛的附属小岛)
删除所有的破碎区域之后,要记得保存结果并结束编辑:
删除所有破碎区域之后的冰岛线图层:
数据处理:
接下来把线数据导出为点数据,为了尽可能保留图层的边界特征,采用在转折处生成点,这样生成的点数将远远大于直接进行直线转点:
线图层转点结果:
添加x,y字段(经纬度数据)
此时要确保自己的图层在Geographic Coordinate System下,且为GCS_WGS_1984等标准格式下:如果没有要使用投影工具进行转化:
右击x和y字段(如果没有经纬度字段需要使用Add Filed自行添加),选择calculate Geometry,计算经纬度坐标。(计算出的经纬度数据为-180到180之间为正确值)
- 计算完经纬度的数据需要重新导出为txt
- 在 ArcMap 中,打开你的项目并加载 Polyline 图层。
- 右键点击图层,选择“打开属性表(Open Attribute Table)”。
- 在属性表视图中,点击“选项(Table Options)”按钮,选择“导出(Export)”。
- 在导出对话框中,选择输出类型是TXT (可能的输出为.txt或者.csv)
若输出的结果为csv则直接使用,若为txt建议先转化为csv,转化方式如下:
打开Matlab,输入下面代码,文件路径需要自行替换:
% Specify the path to the input text file and the output CSV file
inputFile = 'path_to_your_file\filename.txt';
outputFile = 'path_to_your_file\filename.csv';
% Read the data from the text file
data = readtable(inputFile, 'Delimiter', '\t', 'ReadVariableNames', false);
% Write the data to a CSV file
writetable(data, outputFile, 'Delimiter', ',', 'WriteVariableNames', false);
调整一下生成的csv文件的格式:
选中所有数据(即选中第一列,可以选中第一行后滑到最下面,按住shift键,点击最后一行即可按列全部选中),在这种情况下数据都放在第一列中,虽然看起来好像很长,占用了其他列的位置。
在excel上边栏中选择:数据->分列->分隔符号->勾选逗号(分隔符号根据实际情况决定):
分列后结果:
删除其他列,只保留点号和经纬度坐标:
bln文件生成
方法一:直接打开csv或者txt文件属性,将其后缀名改为.bln
若出现这种在文件名字后面看不到后缀名的情况,是因为后缀名被隐藏了,可以显示后缀名:
(平时使用时后缀名显示是不建议打开的,因为可能在修改文件名的时候不小心改变了后缀名,导致系统不知道要用什么软件来打开这个文件)
在主文件夹处点击这三个点:
选择选项:
在文件夹选项中点击查看,取消勾选“隐藏已知文件类型的拓展名”:
此时可以看到文件后缀名已经正确显示了:
修改文件后缀名为.bln:
修改结果:
但现在第一列并不是标准的bln格式,需要手动修改第一行数据为:点数,闭合标志……
方法二:
打开Matlab,输入下面代码:
% 读取 CSV 文件,跳过标题行(如果有)并指定使用逗号作为分隔符
data = readmatrix('path_to_your_file\filename.csv', 'Delimiter', ',', 'Range', 'B2');
% 计算点的数量
numPoints = size(data, 1);
% 选择是否闭合多边形,1 为闭合,0 为不闭合
isClosed = 1;
% 创建输出文件
outputFile = fopen('path_to_your_file\filename.bln', 'wt');
% 写入点的数量和闭合标志
fprintf(outputFile, '%d, %d\n', numPoints, isClosed);
% 写入点的坐标(第一列为经度,第二列为纬度,因为跳过了点号)
for i = 1:numPoints
fprintf(outputFile, '%f, %f\n', data(i, 1), data(i, 2));
end
% 关闭文件
fclose(outputFile);
最后就得到我们需要的bln文件了:
如果你觉得之前生成的点数过多而不需要那么高的精度,或者是遇到一些点连接顺序出错的问题,可以通过减少点数来解决。因为通过Feature Vertices To Points生成的点是相对均匀的,我们可以通过每隔n个点保留一个点的方法来减少点数,同时保留图像形状的正确显示。
打开matlab,输入一下代码实现转换:
clc;
% 指定BLN文件的路径
file_path = 'file.bln'; %此处替换为你的.bln文件的相对路径或者绝对路径
% 读取文件
data = readmatrix(file_path, 'FileType', 'text');
% 假设数据的坐标点从第二行开始,第一列是X坐标,第二列是Y坐标
points = data(2:end, 1:2);
% 初始化一个新数组来存储每隔50个点的第一个点
reduced_points = [];
% 每50个点选取第一个,可以将50修改为其他数字来决定处理后剩余的点数
for i = 1:50:size(points, 1)
reduced_points = [reduced_points; points(i, :)]; % 正确使用变量名
end
% 更新第一行数据,假设第一行初始位置为点数信息
new_point_count = size(reduced_points, 1);
if size(data, 2) > 1
first_row = [new_point_count, data(1, 2:end)]; % 保留第一行其他可能的元数据
else
first_row = new_point_de_first_row; % 假设第一行数据只包含点数,进行更新
end
% 创建新数据数组,包含更新后的第一行和点数据
new_data = [first_row; reduced_points];
% 创建一个新的输出文件,包含处理后的点
output_file_path = strrep(file_path, '.bln', '_processed.bln');
% 使用 dlmwrite 写入文件,这里使用空格作为分隔符
dlmwrite(output_file_path, new_data, 'delimiter', ' ', 'precision', 9);
fprintf('Processed data saved to %s\n', output_file_path);
处理结果:
快开始你的工作吧!