HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – GDAL – 扭曲y轴坐标系(Apple MapKit)的扭曲图像使图像颠倒大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一张地图的图像,我希望在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)的扭曲图像使图像颠倒所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: