ArcEngine和GDAL读写栅格数据机制对比(二)—— IPixelBlock读写栅格

以下是设定一个矩形框,用IPixelBlock将256*256瓦片tile拼接成一个整块影像的代码,row1, col1, row2, col2是一个矩形框行列号范围。level是瓦片的金字塔等级。这里的瓦片已经下载完毕,位于domSavePath文件夹下。

 1             //选择的Google瓦块的行列号范围
 2             int row1, col1, row2, col2;
 3             int nTileSize = 256;
 4             row1 = topLeft.Row;
 5             col1 = topLeft.Col;
 6             row2 = bottomRight.Row;
 7             col2 = bottomRight.Col;
 8             //拼接影像大小
 9             int nImgSizeX = (col2 - col1 + 1) * nTileSize;
10             int nImgSizeY = (row2 - row1 + 1) * nTileSize;
11
12             double leftlon = (((col1 * 20037508.343) * 2.0) / (Math.Pow(2.0, (double)level - 1.0))) - 20037508.343;
13             double toplat = 20037508.343 - (((row1 * 20037508.343) * 2.0) / (Math.Pow(2.0, (double)level - 1.0)));
14             double pixel = 40075016.686 / (nTileSize * Math.Pow(2.0, (double)level - 1.0));
15             //拼接图像的左上角点,WebMecator投影
16             IPoint origin = new PointClass();
17             origin.PutCoords(leftlon, toplat);
18             //创建拼接图像
19             IRasterDataset mergeRasterDs = CreateRasterDataset(domSavePath, "Full.tif", origin, nImgSizeX, nImgSizeY, pixel, pixel, 3);
20
21             for (int ii = row1; ii <= row2; ii++)
22             {
23                 for (int jj = col1; jj <= col2; jj++)
24                 {
25                     //瓦片的名称
26                     string tileName = ii.ToString().PadLeft(8, ‘0‘) + "_" + jj.ToString().PadLeft(8, ‘0‘) + "." + _fileEndExtent;
27                     string FilePath = domSavePath + @"\" + tileName;
28                     if (!File.Exists(FilePath))
29                     {
30                         continue;
31                     }
32                     //读取瓦片数据集
33                     IRasterDataset tileRasterDs = OpenFileRasterDataset(domSavePath, tileName);
34                     IRasterDataset2 tileRasterDs2 = tileRasterDs as IRasterDataset2;
35                     IRaster tileRaster = tileRasterDs2.CreateFullRaster();
36                     //设置瓦片像素快大小
37                     IPnt tileBlockSize = new PntClass();
38                     tileBlockSize.SetCoords(256, 256);
39                     IPixelBlock3 readPixelblock = tileRaster.CreatePixelBlock(tileBlockSize) as IPixelBlock3;
40                     //瓦块所在的左上角点
41                     IPnt tileTopleftCorner = new PntClass();
42                     tileTopleftCorner.SetCoords(0, 0);
43                     tileRaster.Read(tileTopleftCorner, readPixelblock as IPixelBlock);
44
45                     //If you need to set NoData for some of the pixels, you need to set it on band
46                     //to get the raster band.
47                     //IRasterBandCollection rasterBands = (IRasterBandCollection)rasterDataset;
48                     //IRasterBand rasterBand;
49                     //IRasterProps rasterProps;
50                     //rasterBand = rasterBands.Item(0);
51                     //rasterProps = (IRasterProps)rasterBand;
52                     //Set NoData if necessary. For a multiband image, a NoData value needs to be set for each band.
53                     //rasterProps.NoDataValue = 255;
54
55                     //从数据集中读取IRaster
56                     IRasterDataset2 mergeRasterDs2 = mergeRasterDs as IRasterDataset2;
57                     IRaster mergeRaster = mergeRasterDs2.CreateFullRaster();
58
59                     //Create a pixel block using the weight and height of the raster dataset.
60                     //If the raster dataset is large, a smaller pixel block should be used.
61                     //Refer to the topic "How to access pixel data using a raster cursor".
62                     IPnt blocksize2 = new PntClass();
63                     blocksize2.SetCoords(256, 256);
64                     IPixelBlock3 writePixelblock = mergeRaster.CreatePixelBlock(tileBlockSize) as IPixelBlock3;
65
66                     System.Array pixelsTarget;
67                     System.Array pixelsOrigin;//瓦块的像素坐标
68                     for (int iplane = 0; iplane < 3; iplane++)
69                     {
70                         pixelsOrigin = (System.Array)readPixelblock.get_PixelData(iplane);
71                         pixelsTarget = (System.Array)writePixelblock.get_PixelData(iplane);
72                         for (int i = 0; i < 256; i++)
73                         {
74                             for (int j = 0; j < 256; j++)
75                             {
76                                 object obj = pixelsOrigin.GetValue(i, j);
77                                 pixelsTarget.SetValue(obj, i, j);
78                             }
79                         }
80                         writePixelblock.set_PixelData(iplane, (System.Array)pixelsOrigin);
81                     }
82                     //瓦块偏移左上角的像素值
83                     int nOffsetX = (jj - col1) * nTileSize;
84                     int nOffsetY = (ii - row1) * nTileSize;
85                     //定义pixel block左上角点坐标,执行写入.
86                     IPnt upperLeft = new PntClass();
87                     upperLeft.SetCoords(nOffsetX, nOffsetY);
88
89                     //写入拼接影像中
90                     IRasterEdit mergeRasterEdit = (IRasterEdit)mergeRaster;
91                     mergeRasterEdit.Write(upperLeft, (IPixelBlock)writePixelblock);
92
93                     //释放mergeRasterEdit引用.
94                     System.Runtime.InteropServices.Marshal.ReleaseComObject(mergeRasterEdit);
95                 }
96             }
调用的CreateRasterDataset方法的代码如下:

 1  public static IRasterDataset CreateRasterDataset(string path, string fileName, IPoint origin, int width, int height, double xCell, double yCell, int NumBand)
 2         {
 3             try
 4             {
 5                 IRasterWorkspace2 rasterWs = OpenRasterWorkspace(path);
 6                 //定义空间参考
 7                 string prj = "PROJCS[\"Popular Visualisation CRS / Mercator\",GEOGCS[\"Popular Visualisation CRS\",DATUM[\"Popular_Visualisation_Datum\",SPHEROID[\"Popular_Visualisation_Sphere\",6378137.0,0.0]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Mercator_1SP\"],PARAMETER[\"false_easting\",0.0],PARAMETER[\"false_northing\",0.0],PARAMETER[\"central_meridian\",0.0],PARAMETER[\"scale_factor\",1.0],UNIT[\"Meter\",1.0]]";
 8
 9                 ISpatialReference sr = CreateWebMector();
10                 if (sr == null)
11                 {
12                     sr = new UnknownCoordinateSystemClass();
13                 }
14                 IRasterDataset rasterDataset = null;
15                 if (!File.Exists(string.Format(@"{0}\{1}", path, fileName)))
16                 {
17                     //创建TIFF格式栅格数据.
18                     rasterDataset = rasterWs.CreateRasterDataset(fileName, "TIFF",
19                     origin, width, height, xCell, yCell, NumBand, rstPixelType.PT_UCHAR, sr,
20                     true);
21                 }
22                 else
23                 {
24                     throw new ArgumentException("栅格数据已经存在");
25                 }
26                 return rasterDataset;
27             }
28             catch (Exception ex)
29             {
30                 System.Diagnostics.Debug.WriteLine(ex.Message);
31                 return null;
32             }
33         }

CreateRasterDataset

调用的OpenRasterWorkspace方法代码:

 1  public static IRasterWorkspace2 OpenRasterWorkspace(string PathName)
 2         {
 3             //This function opens a raster workspace.
 4             try
 5             {
 6                 IWorkspaceFactory workspaceFact = new RasterWorkspaceFactoryClass();
 7                 return workspaceFact.OpenFromFile(PathName, 0) as IRasterWorkspace2;
 8             }
 9             catch (Exception ex)
10             {
11                 System.Diagnostics.Debug.WriteLine(ex.Message);
12                 return null;
13             }
14         }

时间: 2024-10-21 02:56:27

ArcEngine和GDAL读写栅格数据机制对比(二)—— IPixelBlock读写栅格的相关文章

IOS-沙盒机制(二 文件读写)

一 目录说明 如下图所示,一个沙盒中典型存在下面的目录和文件 各个目录及文件说明: 1.Documents      您应该将所有的应用程序数据文件写入到这个目录下,这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app   这是应用程序的程序包目录,包含应用程序的本身.由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动. 3.Library              这个目录下有两个子目录:Caches 和 Prefer

基于Keepalived高可用集群的MariaDB读写分离机制实现

一 MariaDB读写分离机制 在实现读写分离机制之前先理解一下三种主从复制方式:1.异步复制:MariaDB默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主节点如果挂掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整.2.全同步复制:指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端.因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必

android 休眠唤醒机制分析(二) — early_suspend

本文转自:http://blog.csdn.net/g_salamander/article/details/7982170 early_suspend是Android休眠流程的第一阶段即浅度休眠,不会受到wake_lock的阻止,一般用于关闭lcd.tp等设备为运行的应用节约电能.Android的PowerManagerService会根据用户的操作情况调整电源状态,如果需要休眠则会调用到HAL层的set_screen_state()接口,在set_screen_state()中会向/sys/

【.NET特供-第三季】ASP.NET MVC系列:传统WebForm网站和MVC网站运行机制对比

本文以图形化的方式,从'运行机制'方面对比传统WebForm网站和MVC网站. 请参看以下图形: 一.运行机制 当我们访问一个网站的时候,浏览器和服务器都是做了哪些动作呢? (本文只是提供一个简单的运行过程,有兴趣的找资料研究一下复杂的网络过程.) (一)WebForm网站运行机制 假设为:www.baidu.com/index.aspx 1.Http请求(物理地址:index.aspx) ①发送请求 浏览器向服务器发送请求报文,此时由IIS虚拟目录接受.(通过配置过IIS,把网站挂载在服务器上

[转帖]脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么? http://www.52im.net/thread-1732-1-1.html 1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机网络编程的基础,TCP/UDP收发消息都靠它.我们熟悉的web服务器底层依赖它,我们用到的MySQL关系数据库.Redis内存数据库底层依赖它.我们用微信和别

[评测]低配环境下,PostgresQL和Mysql读写性能简单对比

[评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲高终和寡 *******************如果你看到这一行,说明爬虫在本人还没有发布完成的时候就抓走了我的文章,导致内容不完整,请去上述的原文链接查看原文**************** 由于最近经过朋友启发,又有了一个写个人项目的小想法,在这次个人项目中准备学习并使用一些之前自己没有掌握的新

Android-- Android事件机制之二:onTouch详解

Android事件机制之二:onTouch详解 在其中对OntouchEvent中的总结中,不是很具体.本文将主要对onTouch进行总结. onTouch是Android系统中整个事件机制的基础.Android中的其他事件,如onClick.onLongClick等都是以onTouch为基础的. onTouch包括从手指按下到离开手机屏幕的整个过程,在微观形式上,具体表现为action_down.action_move和action_up等过程. onTouch两种主要定义形式如下: (1)在

浅谈linux读写同步机制RCU

RCU是linux系统的一种读写同步机制,说到底他也是一种内核同步的手段,本问就RCU概率和实现机制,给出笔者的理解. [RCU概率] 我们先看下内核文档中对RCU的定义: RCU is a synchronization mechanism that was added to the Linux kernel during the 2.5 development effort that is optimized for read-mostly situations. 翻译:RCU是在2.5版本

本地缓存机制之二

4.下面我们设计缓存项下载成功和失败的两个委托方法: @protocol CacheItemDelegate <NSObject> //下载成功执行该方法 - (void) cacheItemDelegateSucceeded :(CacheItem *)paramSender withRemoteURL:(NSURL *)paramRemoteURL withAboutToBeReleasedData:(NSData *)paramAboutToBeReleasedData; //下载失败执