----用我到目前为止所做的更新以及剩下要解决的问题可以在下面的第3点找到----
使用Octave我想从30个不同的GeoTIFF创建30个水平框和胡须图而不展开(x轴)。这是我希望情节看起来如何的草图:
理想情况下,对我来说最好的解决方案是Octave代码(工作流程),它允许我在一个目录中放置多个GeoTIFF,然后一键创建一次所有GeotIFF的框和胡须图 - 就像上面的草图一样
可以下载具有3个GeoTIFF的GeoTIFF样本here。该文件在QGIS中如下所示:
它保持第1波段的高程值(每个框和须图应该基于的高度值,没有数据值(-999),应该从图中排除无数据值。
现在这就是我所得到的:
img = imread ("filname.tif")
将文件转换为Octave。使用hist (img(:), 200);
显示所有单元格都集中在65300左右。imagesc (img, [65100 65600])
后面跟colorbar
显示图像范围,但很明显,这种方式根本不会显示图像范围。 t导入实际单元格值。我无法找到一个有效的解决方案来导入带有单元格值的GeoTIFF,因此我目前的解决方法是使用gdal_translate -of aaigrid
从QGIS导出GeoTIFF,这会创建一个我手动编辑的.asc文件删除标题行,重命名为.csv并加载到Octave。那个.csv可以找到here。要加载它并创建一个盒子图,我目前正在使用此代码(感谢@Andy和@Cris Luengo):
pkg load statistics s = urlread ("https://drive.google.com/uc?export=download&id=1RzJ-EO0OXgfMmMRG8wiCBz-51RcwSM5h"); o = str2double (strsplit (s, ";")); o(isnan (o)) = []; boxplot (o) set(gca,"xtick",[]) view([-90 90]) print out.png
结果非常接近,但我仍未能: A)直接从文件夹加载GeoTIFF。如果这是不可能的,我将不得不修改代码以将目录中的所有*.csv
加载到同一个框图中,并按文件名标记每个图(我不确定如何完成。 B)让x轴反转(从200-450开始,而不是相反)。这是由view([-90 90])
引起的,我用它来使箱形图水平而不是垂直,这是布局原因所需要的。
有关如何解决上次调整的任何想法?
----背景信息----
我有30个GeoTIFF,其中包含来自视域分析的结果,对于每2x2米的正方形,有一个值告诉我建筑物在从视域点可见之前有多高(以米为单位)。结果覆盖整个斯德哥尔摩市,但上面提到的30个GeoTIFFs是计划新开发项目的区域的较小片段。结果有助于规划者了解新开发项目如何影响30个地方(对文化遗产管理而言非常重要)。
作为更大的PDF报告的一部分(这些结果用不同比例的不同地图可视化)我试图制作一个盒子和胡须图(作为对地图的赞美),给读者一个根据30个视域(GeoTIFF)结果中的每一个(30个位置中的每个位置都有一个方框和胡须),计划在计划开发区域剩余多少空间。以下是报告中地图的外观示例:
答案 0 :(得分:3)
不直接读取GeoTIFF,而是在引擎盖下调用gdal_translate。只需将所有.tif放在同一目录中即可。确保gdal_translate在你的路径中:
pkg load statistics
clear all;
fns = glob ("*.tif");
for k=1:numel (fns)
ofn = tmpnam;
cmd = sprintf ('gdal_translate -of aaigrid "%s" "%s"', fns{k}, ofn);
[s, out] = system (cmd);
if (s != 0)
error ('calling gdal_translate failed with "%s"', out);
endif
fid = fopen (ofn, "r");
# read 6 headerlines
hdr = [];
for i=1:6
s = strsplit (fgetl (fid), " ");
hdr.(s{1}) = str2double (s{2});
endfor
d = dlmread (fid);
# check size against header
assert (size (d), [hdr.nrows hdr.ncols])
# set nodata to NA
d (d == hdr.NODATA_value) = NA;
raw{k} = d;
# create copy with existing values
raw_v{k} = d(! isna (d));
fclose (fid);
endfor
## generate plot
boxplot (raw_v)
set (gca, "xtick", 1:numel(fns),
"xticklabel", strrep (fns, ".tif", ""));
view ([-90 90])
zoom (0.95)
print ("out.png")
给出