• 影像裁剪一些体会


    最近一直在做影像裁剪的功能:

    从影像服务器上下载影像(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         }
    View Code

     

    地理坐标有三种形式:

    1.天文经纬度,纬度为铅垂线与赤道面夹角;

    2.大地经纬度,纬度为椭球面切线与赤道面夹角;

    3.地心经纬度,纬度为地心连线与赤道面夹角。

     

  • 相关阅读:
    RabbitMq环境搭建
    Springboot集成quartz
    java8时间工具类
    AngularJS学习笔记之directive——scope选项与绑定策略
    理解$watch ,$apply 和 $digest --- 理解数据绑定过程
    AngularJS中service,factory,provider的区别
    AngularJS的Filter用法详解
    Angular.js中使用$watch监听模型变化
    history
    data-*
  • 原文地址:https://www.cnblogs.com/yhlx125/p/3890512.html
Copyright © 2020-2023  润新知