ios – GDAL – 扭曲y轴坐标系(Apple MapKit)的扭曲图像使图像颠倒

ios – GDAL – 扭曲y轴坐标系(Apple MapKit)的扭曲图像使图像颠倒,第1张

概述我有一张地图的图像,我希望在iOS上的内置地图上进行地理参考和叠加.我正在以编程方式使用GDAL. 第1步(确定) – 地理参考(工作正常) 目前我正在计算三个地面控制点的GeoTransform(6个系数),以便对图像进行地理参考,它给出了正确的6个系数. 第2步(问题) – Warp图像获取GeoTransform以获取新的变换图像 图像变得颠倒了!这是因为目标坐标系统(Apple在MapKi 我有一张地图的图像,我希望在iOS上的内置地图上进行地理参考和叠加.我正在以编程方式使用GDAL.

第1步(确定) – 地理参考(工作正常)

目前我正在计算三个地面控制点的Geotransform(6个系数),以便对图像进行地理参考,它给出了正确的6个系数.

第2步(问题) – Warp图像获取Geotransform以获取新的变换图像

图像变得颠倒了!这是因为目标坐标系统(Apple在MapKit中自己的坐标系统)具有反转的y轴,当你向南时,它会增加.

如何让GDAL正确地扭曲图像(同时给我一个正确的Geotransform来配合它)?

我试过的

在变形之前,我在原始Geotransform中更改了值5/6.这给出了图像的正确扭曲,但新的Geotransform是错误的.

当前代码

- (WarpResultC*)warpImageWithGeotransform:(NSArray<NSNumber*>*)geotransformArray sourcefile:(Nsstring*)infilepath destinationfile:(Nsstring*)outfilepath{    GDALAllRegister();    GDALDriverH hDriver;    GDALDataType eDT;    GDALDatasetH hDstDS;    GDALDatasetH hSrcDS;    // Open the source file.    hSrcDS = GDALOpen( infilepath.UTF8String,GA_Readonly );    CPLAssert( hSrcDS != NulL );    // Set the Geotransform on the source image    // HERE IS WHERE I NEED NEGATIVE VALUES OF 4 & 5 TO GET A PROPER IMAGE    double geotransform[] = { geotransformArray[0].doubleValue,geotransformArray[1].doubleValue,geotransformArray[2].doubleValue,geotransformArray[3].doubleValue,-geotransformArray[4].doubleValue,-geotransformArray[5].doubleValue };    GDALSetGeotransform(hSrcDS,geotransform);    // Create output with same datatype as first input band.    eDT = GDALGetRasterDataType(GDALGetRasterBand(hSrcDS,1));    // Get output driver (GeoTIFF format)    hDriver = GDALGetDriverByname( "GTiff" );    CPLAssert( hDriver != NulL );    // Create a transformer that maps from source pixel/line coordinates    // to destination georeferenced coordinates (not destination    // pixel line).  We do that by omitting the destination dataset    // handle (setting it to NulL).    voID *htransformArg = GDALCreateGenimgProjtransformer( hSrcDS,NulL,FALSE,1 );    CPLAssert( htransformArg != NulL );    // Get approximate output georeferenced bounds and resolution for file.    double adfDstGeotransform[6];    int nPixels=0,nlines=0;    CPLErr eErr = GDALSuggesteDWarpOutput( hSrcDS,GDALGenimgProjtransform,htransformArg,adfDstGeotransform,&nPixels,&nlines );    CPLAssert( eErr == CE_None );    GDALDestroyGenimgProjtransformer( htransformArg );    // Create the output file.    hDstDS = GDALCreate( hDriver,outfilepath.UTF8String,nPixels,nlines,4,eDT,NulL );    CPLAssert( hDstDS != NulL );    // Write out the projection deFinition.    GDALSetGeotransform( hDstDS,adfDstGeotransform );    // copy the color table,if required.    GDALcolortableH hCT = GDALGetRastercolortable( GDALGetRasterBand(hSrcDS,1) );    if( hCT != NulL )        GDALSetRastercolortable( GDALGetRasterBand(hDstDS,1),hCT );    // Setup warp options.    GDALWarpOptions *psWarpOptions = GDALCreateWarpOptions();    psWarpOptions->hSrcDS = hSrcDS;    psWarpOptions->hDstDS = hDstDS;    /* -------------------------------------------------------------------- */    /*      Do we have a source Alpha band?                                 */    /* -------------------------------------------------------------------- */    bool enableSrcAlpha = GDALGetRastercolorInterpretation( GDALGetRasterBand(hSrcDS,GDALGetRasterCount(hSrcDS) )) == GCI_AlphaBand;    if(enableSrcAlpha) { printf( "Using band %d of source image as Alpha.\n",GDALGetRasterCount(hSrcDS) ); }    /* -------------------------------------------------------------------- */    /*      Setup band mapPing.                                             */    /* -------------------------------------------------------------------- */    if(enableSrcAlpha)        psWarpOptions->nBandCount = GDALGetRasterCount(hSrcDS) - 1;    else        psWarpOptions->nBandCount = GDALGetRasterCount(hSrcDS);    psWarpOptions->panSrcBands = (int *) CPLMalloc(psWarpOptions->nBandCount*sizeof(int));    psWarpOptions->panDstBands = (int *) CPLMalloc(psWarpOptions->nBandCount*sizeof(int));    for( int i = 0; i < psWarpOptions->nBandCount; i++ )    {        psWarpOptions->panSrcBands[i] = i+1;        psWarpOptions->panDstBands[i] = i+1;    }    /* -------------------------------------------------------------------- */    /*      Setup Alpha bands used if any.                                  */    /* -------------------------------------------------------------------- */    if( enableSrcAlpha )        psWarpOptions->nSrcAlphaBand = GDALGetRasterCount(hSrcDS);    psWarpOptions->nDstAlphaBand = GDALGetRasterCount(hDstDS);    psWarpOptions->pfnProgress = GDALTermProgress;    // Establish reprojection transformer.    psWarpOptions->ptransformerArg = GDALCreateGenimgProjtransformer( hSrcDS,hDstDS,0.0,1 );    psWarpOptions->pfntransformer = GDALGenimgProjtransform;    // Initialize and execute the warp operation.    GDALWarpOperation oOperation;    oOperation.Initialize( psWarpOptions );    CPLErr warpError = oOperation.ChunkAnDWarpImage( 0,GDALGetRasterXSize( hDstDS ),GDALGetRasterYSize( hDstDS ) );    CPLAssert( warpError == CE_None );    GDALDestroyGenimgProjtransformer( psWarpOptions->ptransformerArg );    GDALDestroyWarpOptions( psWarpOptions );    GDALClose( hDstDS );    GDALClose( hSrcDS );    WarpResultC* warpResultC = [WarpResultC new];    warpResultC.geotransformValues = @[@(adfDstGeotransform[0]),@(adfDstGeotransform[1]),@(adfDstGeotransform[2]),@(adfDstGeotransform[3]),@(adfDstGeotransform[4]),@(adfDstGeotransform[5])];    warpResultC.newX = nPixels;    warpResultC.newY = nlines;    return warpResultC;}
解决方法 您可以使用 GDALCreateGenImgProjTransformer执行此 *** 作.从文档:
创建一个从源像素/线坐标映射到目标地理坐标坐标(不是目标像素线)的变换器.我们通过省略目标数据集句柄(将其设置为NulL)来做到这一点.

从gdal_alg.h开始的任务的其他相关信息:
创建图像到图像变换器.

此函数创建一个转换对象,该对象从一个图像上的像素/线坐标映射到另一个图像上的像素/线坐标.图像可能在不同的坐标系中被地理参考,并且可以使用GCP在它们的像素/线坐标和地理参考坐标之间进行映射(与应该使用它们的地理变换的默认假设相反).

此变换器可能执行三个连接转换.

第一阶段是从源图像像素/线坐标到源图像地理参考坐标,并且可以使用地理变换来完成,或者如果没有使用从GCP导出的多项式模型来定义.如果使用GCP,则使用GDALGCPtransform()完成此阶段.

第二阶段是将源坐标系中的投影更改为目标坐标系,假设它们不同.这是使用GDALReprojectiontransform()在内部完成的.

第三阶段是从目标图像地理配准坐标转换为目标图像坐标.这是使用目标图像地理转换完成的,如果不可用,则使用从GCP派生的多项式模型.如果使用GCP,则使用GDALGCPtransform()完成此阶段.如果在创建转换时hDstDS为NulL,则跳过此阶段.

总结

以上是内存溢出为你收集整理的ios – GDAL – 扭曲y轴坐标系(Apple MapKit)的扭曲图像使图像颠倒全部内容,希望文章能够帮你解决ios – GDAL – 扭曲y轴坐标系(Apple MapKit)的扭曲图像使图像颠倒所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1003698.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存