我有相当大的 LiDAR 数据 block (约 1600 万点云),我已将其缩减为 X、Y、Z 数据(例如):
436003.73 8758000.16 330.97
436007.17 8758000.40 330.49
436009.98 8758000.25 330.26
436011.71 8758000.16 330.10
我想创建此数据的 DEM,但由于数据集庞大,我的计算机发现这很困难。我不是特别精通 MATLAB/Octave,但我正在学习。
目前我正在使用 griddata
和 meshgrid
命令,如下所示:
cd ~/Octave
dem=load('436003_ed.txt');
x=dem(:,1);
y=dem(:,2);
z=dem(:,3);
minx=min(x);
miny=min(y);
minz=min(z);
maxz=max(z);
maxx=max(x);
maxy=max(y);
rijx=minx:2:maxx;
rijy=miny:2:maxy;
[XI,YI]=meshgrid(rijx,rijy);
ZI=griddata(x,y,z,XI,YI);
...这就是我在对数据进行网格化时内存不足的情况。
我假设部分问题是因为我将整个数据集作为变量 (dem=load('436003_ed.txt');
) 打开为 ~500MB 文件,这当然是非常耗费内存。有人告诉我可以使用 fopen
命令的替代方法:
fid=fopen('436003_ed.txt');
XYZ=fscanf(fid,'%f %f %f');
然而,这似乎提供了一种奇怪的格式,因为它本身并没有加载到 RAM 中?
有没有一种方法可以让我逐行加载它,将每个 Z 值放入适当的 DEM 单元格中,同时计算该单元格的总高程和命中数(这样我就可以平均高程之后)生成 DEM?这将否定 meshgrid
和 griddata
命令的使用。
作为一个全新的人,我不知道要查找和使用哪些命令!
非常感谢。我有 MATLAB R2013b,如果有帮助的话,我也一直在通过 Octave 做一些这样的事情。
更新
我使用一些名为 GDAL 的命令行工具库(特别是 http://www.gdal.org/ GDAL 网格)解决了这个问题。这帮助我对数据进行网格化。虽然这是对我的查询的回答,但这并不是我正在寻找的确切答案。
虽然我原来的方法可能会起作用,但如果我的计算机有足够的内存,还有其他方法可以在 MATLAB 中编写脚本 - 使用 fscanf
和 fopen
命令 - 我还发现如何正确执行此操作。
最佳答案
Octave 目前使用 GraphicsMagick 或 ImageMagick 进行图像 IO。但是,这两个项目都只处理整数,而您的数据是 float ,因此您将无法使用典型的 imwrite
函数将其另存为图像。如果你真的想将它保存为图像,你可以编写你自己的 libtiff 接口(interface)。不过,我相信 Matlab 可以处理浮点图像。
关于您的代码,我不知道您会如何处理内存不足的问题,但您有一些不必要的行。您可以替换:
x=dem(:,1);
y=dem(:,2);
z=dem(:,3);
minx=min(x);
miny=min(y);
minz=min(z);
maxz=max(z);
maxx=max(x);
maxy=max(y);
rijx=minx:2:maxx;
rijy=miny:2:maxy;
与:
mins = min (dem);
maxs = max (dem);
rijx = mins(1):2:maxs(1);
rijy = mins(2):2:maxs(2);
关于matlab - 如何从非网格 XZY 点生成 DEM? ( Octave /MATLAB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20868480/