Octave:没有GeoTIFF传播的盒子和胡须情节

时间:2018-01-10 19:57:50

标签: octave geotiff

----用我到目前为止所做的更新以及剩下要解决的问题可以在下面的第3点找到----

使用Octave我想从30个不同的GeoTIFF创建30个水平框和胡须图而不展开(x轴)。这是我希望情节看起来如何的草图: enter image description here

理想情况下,对我来说最好的解决方案是Octave代码(工作流程),它允许我在一个目录中放置多个GeoTIFF,然后一键创建一次所有GeotIFF的框和胡须图 - 就像上面的草图一样

可以下载具有3个GeoTIFF的GeoTIFF样本here。该文件在QGIS中如下所示: enter image description here

它保持第1波段的高程值(每个框和须图应该基于的高度值,没有数据值(-999),应该从图中排除无数据值。

现在这就是我所得到的:

  1. 使用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
  2. 要加载它并创建一个盒子图,我目前正在使用此代码(感谢@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
    
  3. 结果非常接近,但我仍未能: A)直接从文件夹加载GeoTIFF。如果这是不可能的,我将不得不修改代码以将目录中的所有*.csv加载到同一个框图中,并按文件名标记每个图(我不确定如何完成。 B)让x轴反转(从200-450开始,而不是相反)。这是由view([-90 90])引起的,我用它来使箱形图水平而不是垂直,这是布局原因所需要的。 enter image description here

  4. 有关如何解决上次调整的任何想法?

    ----背景信息----

    我有30个GeoTIFF,其中包含来自视域分析的结果,对于每2x2米的正方形,有一个值告诉我建筑物在从视域点可见之前有多高(以米为单位)。结果覆盖整个斯德哥尔摩市,但上面提到的30个GeoTIFFs是计划新开发项目的区域的较小片段。结果有助于规划者了解新开发项目如何影响30个地方(对文化遗产管理而言非常重要)。

    作为更大的PDF报告的一部分(这些结果用不同比例的不同地图可视化)我试图制作一个盒子和胡须图(作为对地图的赞美),给读者一个根据30个视域(GeoTIFF)结果中的每一个(30个位置中的每个位置都有一个方框和胡须),计划在计划开发区域剩余多少空间。以下是报告中地图的外观示例: enter image description here

1 个答案:

答案 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")

给出

boxplot from three tif