当前位置:首页 > 发言稿 > [基于arcengine10的dem数据自动接边检查实现] dem数据
 

[基于arcengine10的dem数据自动接边检查实现] dem数据

发布时间:2019-07-20 03:52:32 影响了:

  摘 要:实际生产数据管理中,DEM数据的接边不一致非常普遍。然而DEM数据接边检查却是一项繁重的任务。本文基于arcengine10新增的栅格数据接口实现DEM数据自动接边检查,并运到到实际生产过程中。极大的提高了工作效率。
  关键词:dem 数据接边 arcengine10
  中图分类号:P2 文献标识码:A 文章编号:1672-3791(2012)06(c)-0009-02
  实际生产中,图幅接边是其中重要的一环。而dem(数字高程模型)数据与常用的点、线、面矢量数据不同,其采用栅格矩形格网形式表达。格网DEM的一个缺点是数据量过大,给数据管理带来了不方便。日常管理中发现,DEM数据接边处不一样问题很普遍。DEM接边要求很严格,必须严格吻合既相同格网高程值必须一样,不允许有限差,而且栅格格网个数特别多。这就使得在日常生产管理中,DEM数据的接边及接边检查非常繁重。
  1 ArcEngine10新增操作栅格数据接口
  DEM数据为矩形格网,其两者相交区域也必然为矩形格网。要实现DEM数据的接边检查,就要查看2个相邻DEM重叠格网信息,就要对重叠格网每一个单元进行读取操作。在arcEngine10之前的版本中,对栅格数据的操作采用的是光标法(rastercursor),其方法是将栅格数据自动分成几个光标块,再将光标块当成像素块(PixelBlock)的集合,再操作像素块集合从而操作每一个像素块(也就的单元格网)。该方法通过操作栅格数据中光标块内部单元格网,对其进行读取、修改等操作,但是却不能对指定单元格网(具体的某一个)进行读取、修改等操作,其只能对某个光标块中的单元格网进行操作,而光标块大小在整个栅格中的具体位置很难判断。从而得到不到某个单元格网的具体坐标位置。在ArcGis10版本中新增加一个RawBlocks对象,并且实现IRawBlock接口,通过该接口可以得到某个单元格网(像素块)的具体坐标位置。该RawBlocks对象实现不通过以上光标法对栅格数据进行操作,而是通过瓦片(tiling)方法进行操作。IRawBlocks接口实现5个成员如表1所示。
  而RasterInfo方法得到一个RasterInfo对象,该对象同样为arcengine10新增类。其主要用处为:获得栅格数据的坐标原点,栅格数据坐标范围,单元格网大小(x,y轴大小数值),单元格网的行数(BlockHeight),列数(BlockWidth)等。RawBlocks对象操作栅格数据的具体用法如以下几点。
  (1)将单波段栅格数据直接赋予Raw-Blocks对象,多波段的数据分波段赋予RawBlocks对象。(2)通过RasterInfo方法得到RasterInfo对象,得到各个具体瓦片。(3)在每个瓦片中,得到具体的单元格网,从而对栅格格网进行操作。(4)通过瓦片坐标,瓦片中单元格网的位置,得到单元格网的具体坐标。
  2 Dem数据接边检查
  分幅的DEM数据必须进行接边。因为DEM数据是用栅格格网表达,对其进行接边就是要讲两两相邻数据重叠处的每个格网进行高程值的一致性处理。因为栅格格网个数特别多,其接边首先要进行接边处检查,判断具体格网高程值是否需要修改。对等待接边检查的DEM数据2幅DEM数据进行接边检查,其流程可以概括如图1。
  3 实验
  在vs2010环境,基于C#+ArcEngine10编程实现DEM数据自动接边检查程序。两DEM数据相减后得到相交区域的矩形格网后,如果接边一致,那么其单元格网应该为0值。对格网内部单元格网进行0值检查为程序核心。程序核心操作为:对栅格数据由系统分得的瓦片逐一检查,然后将瓦片中的具体格网的值进行非0判断,为非0则记录该格网的中心坐标等信息。
  部分的代码如下:
  for (int pbYcursor = startY; pbYcursor < endY; pbYcursor++)
  {
  for (int pbXcursor = startX; pbXcursor < endX; pbXcursor++)
  {
  rawBlocks.ReadBlock(pbXcursor, pbYcursor, 0, pb);
  System.Array safeArray = (System.Array)pb.get_SafeArray(0);
  for (int safeArrayHeight = 0; safeArrayHeight < pb.Height; safeArrayHeight++)
  {
  for (int safeArrayWidth = 0; safeArrayWidth < pb.Width; safeArrayWidth++)
  {
  object value = safeArray.GetValue(safeArrayWidth, safeArrayHeight);
  double dVal = Convert.ToDouble(value);
  if (!Math.Equals(dVal, 0.0) && !Math.Equals(dVal, -3.4028234663852886E+38))
  {
  IPoint p_val = new ESRI.ArcGIS.Geometry.Point ();
  p_val.X = rasInfo.Origin.X + (pbXcursor * rasInfo.BlockWidth + safeArrayWidth + 0.5) * rasInfo.CellSize.X;
  p_val.Y = rasInfo.Origin.Y - ( rasInfo.BlockHeight * pbYcursor+safeArrayHeight + 0.5) * rasInfo.CellSize.Y;
  }
  }
  }
  }
  }
  我们对实际DEM数据进行了自动接边检查实验。对同一度带下1∶1万的DEM数据共932幅进行接边检查,其中有两两相交后产生的新数据共3081个。有接边问题的相交区域共204个,检查出有非0值的高程不一致的格网个数共111282个,需要修改。运行耗时3小时07分钟。
  4 结语
  本文介绍了arcengine10新增栅格数据操作对象RawBlocks对象及其IRawBlock接口,提出了对DEM数据自动接边检查流程,最后实现了DEM数据自动接边检查并运用到实际生产当中。DEM数据接边检查任务繁杂,细致,通过基于arcengine的自动接边检查程序,提高了生产效率。今后的研究中将着力解决程序运行速度问题,将程序进行优化,缩短运行时间,从而使得生产效率更高效。
  参考文献
  [1] 坞伦.地理信息系统原理、方法和应用[M].科学出版社,2000.
  [2] 胡鹏,黄杏元,华一新,地理信息系统教程[M].武汉大学出版社,2002,2.

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3