影像裁剪一些体会
最近一直在做影像裁剪的功能:
从影像服务器上下载影像(WebMercator投影),服务接口需要传入WGS84坐标的多边形,返回WebMercator影像。
客户端需要进行影像的转换成高斯投影(Beijing54为例)
认为WGS84地理坐标到北京54高斯投影在存在七参数的情况下是可逆变换。
WGS84地理坐标到WebMercator投影是投影变换是可逆变换。这有点让人难以理解!
这里采用的WebMercator投影是基于WGS84椭球的表示方法,而不是和Google提出的那种一样是基于球的。这一点很重要,因为七参数是WGS84椭球到克拉索夫椭球的。
WGS84是地心坐标系。影像裁剪高程值统一都取0,不确定是不是因为高程都取0(因为球上加载了DEM,取得了高程值)的原因三维地球上取的点可以正确转换到北京54投影坐标。
想得到的影像是一个矩形区域,如果直接传入WGS84地理坐标系下的矩形,裁剪出来的影像是没有黑边的。
但是根据Beijing54高斯投影坐标系下划分的矩形,反算到WGS84坐标再传入得到的影像是有黑边的,即使这时候把得到的影像重新转换成Beijing54投影坐标系,这时候像元普遍增加了-1~30个不等。
影像不同基准面进行转换基本上都会产生黑边。
因此在得到了Beijing54投影后的影像后还需要进行再一次的裁剪。这时候就用范围裁剪就好了,AE只需要改变IRasterProps的有关属性就能实现,实在太强大了。

1 //基准变换并重裁剪
2 public static void DatumTransformation(IRasterDataset2 rasterDataset, ISpatialReference outSR, IGeoTransformation geoTransformation, string path, IPolygon Vectorlayer)
3 {
4 IRaster raster = rasterDataset.CreateFullRaster();
5 IRasterProps rasterProps = (IRasterProps)raster;
6 double cellSize = rasterProps.MeanCellSize().X;//注意先获取象素大小
7 rasterProps.SpatialReference = outSR;//设置完新的空间参考之后会改变象素大小,因此要重采样
8 IGeoTransformationOperationSet operationSet = new GeoTransformationOperationSetClass();
9 operationSet.Set(esriTransformDirection.esriTransformForward, geoTransformation);
10 operationSet.Set(esriTransformDirection.esriTransformReverse, geoTransformation);
11
12 IRaster2 raster2 = (IRaster2)raster;
13 raster2.GeoTransformations = operationSet;//基准面转换
14 IEnvelope envelop = new EnvelopeClass();
15 envelop.XMin = Vectorlayer.Envelope.XMin;
16 envelop.YMin = Vectorlayer.Envelope.YMin;
17 envelop.XMax = Vectorlayer.Envelope.XMax + cellSize;
18 envelop.YMax = Vectorlayer.Envelope.YMax + cellSize;
19 rasterProps.Extent = envelop;//再次裁剪,此时会改变象素大小,默认保证行列数不变
20 IRasterGeometryProc ReSample = new RasterGeometryProcClass();
21 ReSample.Resample(rstResamplingTypes.RSP_NearestNeighbor, cellSize, raster);//重采样
22 IRasterBandCollection bandCol = (IRasterBandCollection)raster;
23 int nBandCount = bandCol.Count;
24 if (nBandCount == 3)
25 {
26 int[] nodata = { 0, 0, 0 };
27 rasterProps.NoDataValue = nodata;
28 }
29 else
30 {
31 rasterProps.NoDataValue = 0;
32 }
33 ISaveAs saveas = (ISaveAs)raster;
34 saveas.SaveAs(path, null, "JPEG");
35 }
地理坐标有三种形式:
1.天文经纬度,纬度为铅垂线与赤道面夹角;
2.大地经纬度,纬度为椭球面切线与赤道面夹角;
3.地心经纬度,纬度为地心连线与赤道面夹角。
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2013-08-04 感想——关于球