代码备忘录(1)影像地理坐标的获取以及坐标系之间的转换(基于GDAL)

来源:互联网 发布:阿里巴巴农村淘宝图片 编辑:程序博客网 时间:2024/05/21 10:09

影像地理坐标获取以及坐标系之间的坐标转换

    GDALAllRegister();    CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");//支持中文路径!    ///读入输入影像    const char * pszFile = imgfile.c_str();    GDALDataset *poDataset = (GDALDataset*)GDALOpen(pszFile, GA_ReadOnly);//使用只读方式打开图像     if (poDataset == NULL)    {        printf("File: %s不能打开!\n", pszFile);    }    GDALRasterBand *pBand_temp = NULL;    pBand_temp = poDataset->GetRasterBand(1);    ///获取四角点经纬度    double adfGeoTransform[6];    if (poDataset->GetGeoTransform(adfGeoTransform) == CE_Failure)    {        printf("获取仿射变换参数失败");    }    std::cout << "仿射变换参数:" << endl << adfGeoTransform[0] << endl << adfGeoTransform[1] << endl << adfGeoTransform[2] << endl << adfGeoTransform[3] << endl << adfGeoTransform[4] << endl << adfGeoTransform[5] << endl;    double X1 = adfGeoTransform[0] ;//经度    double Y1 = adfGeoTransform[3];//纬度    double X2 = adfGeoTransform[0] + iw * adfGeoTransform[1];    double Y2 = adfGeoTransform[3];    double X3 = adfGeoTransform[0] + iw  * adfGeoTransform[1];    double Y3 = adfGeoTransform[3] + ih  * adfGeoTransform[5];    double X4 = adfGeoTransform[0];    double Y4 = adfGeoTransform[3] + ih * adfGeoTransform[5];    /////输出影像四个角点的地理坐标    std::cout << Y1 << endl << X1 << endl;    std::cout << Y2 << endl << X2 << endl;    std::cout << Y3 << endl << X3 << endl;    std::cout << Y4 << endl << X4 << endl;    double X[4] = { X1, X2, X3 ,X4};    double Y[4] = { Y1, Y2, Y3, Y4};    int* flag = NULL;    ///若坐标系为非GWS84,则进行空间坐标系转化    OGRSpatialReference obj_OSRS;    obj_OSRS.SetWellKnownGeogCS("WGS84");    const char* spr=poDataset->GetProjectionRef();    OGRSpatialReference OSRS(spr);    if (obj_OSRS.IsSame(&OSRS) == TRUE)    {        std::cout << "数据为GWS84地理坐标系统" << std::endl;        ///地理边界        dataxml.topleft_latitude = Y1;        dataxml.topleft_longitude = X1;        dataxml.topright_latitude = Y2;        dataxml.topright_longitude = X2;        dataxml.bottomright_latitude = Y3;        dataxml.bottomright_longitude = X3;        dataxml.bottomleft_latitude = Y4;        dataxml.bottomleft_longitude = X4;    }    else    {        OGRCoordinateTransformation *transf1=OGRCreateCoordinateTransformation(&OSRS, &obj_OSRS);        if (transf1 == NULL)        {            std::cout << "数据不支持转化" << std::endl;        }        else        {            std::cout << "支持坐标系统之间转化" << std::endl;        }        transf1->TransformEx(4, X, Y, NULL, flag);        ///地理边界        dataxml.topleft_latitude = Y[0];        dataxml.topleft_longitude = X[0];        dataxml.topright_latitude = Y[1];        dataxml.topright_longitude = X[1];        dataxml.bottomright_latitude = Y[2];        dataxml.bottomright_longitude = X[2];        dataxml.bottomleft_latitude = Y[3];        dataxml.bottomleft_longitude = X[3];        OGRCoordinateTransformation::DestroyCT(transf1);    }    /*if (OSRS.IsGeographic() == TRUE)    {        cout << "镶嵌数据为地理坐标系统" << endl;    }    if (OSRS.IsProjected()==TRUE)    {        cout << "镶嵌数据为投影坐标系统" << endl;    }*/    /*std::string srs_txt = srcdata + "\\" + dataname + ".txt";    ofstream out_sr(srs_txt);    out_sr << spr;    out_sr.close();*/    /*OGRSpatialReference::DestroySpatialReference(&obj_OSRS);    OGRSpatialReference::DestroySpatialReference(&OSRS);*/    /////输出影像四个角点的地理坐标    std::cout << Y[0] << endl << X[0] << endl;    std::cout << Y[1] << endl << X[1] << endl;    std::cout << Y[2] << endl << X[2] << endl;    std::cout << Y[3] << endl << X[3] << endl;
0 0