5

我正在使用 GDAL 库。目前,我可以采用左上点和右上点并从原件中切出图像。我现在想做的是获取两个 WKT 点并转换为 X、Y 坐标来做同样的事情。我只是想知道如果我知道 GeoTransform 以及它使用的坐标系(WGS84)是否可以做到这一点?

4

3 回答 3

6

我之前也遇到过这个问题,这是一种很好的坐标变换方法。

GDAL 文档中的注释:

GDALDataset::GetProjectionRef() 返回的坐标系描述了由 GDALDataset::GetGeoTransform() 返回的仿射地理配准变换所隐含的地理配准坐标。

我们可以将它与OGRCoordinateTransformation一起使用来为我们进行转换。

基本上代码看起来像这样:

// Load up some dataset.
dataset = (GDALDataset *) GDALOpen( mapfile, GA_ReadOnly );

// Define Geographic coordinate system - set it to WGS84.
OGRSpatialReference *poSRS_Geog = new OGRSpatialReference();
poSRS_Geog->importFromEPSG( 4326 ); // WGS84

// Define Projected coordinate system - set to the GeoTransform.
const char *sProj = dataset->GetProjectionRef();
OGRSpatialReference *poSRS_Proj = new OGRSpatialReference( sProj );

// Set up the coordinate transform (geographic-to-projected).
OGRCoordinateTransformation *poCT_Geog2Proj;
poCT_Geog2Proj = OGRCreateCoordinateTransformation( poSRS_Geog, poSRS_Proj );

// Now everything is set up and we set transforming coordinates!
// Pass Lon/Lat coordinates to the Transform function:
double x = lon;
double y = lat;
poCT_Geog2Proj->Transform( 1, &x, &y );

// Now x and y variables will contain the X/Y pixel coordinates.

这就是您可以在经度/纬度和像素坐标之间进行转换的方式。请注意,您可以将数组与Transform(), 一起使用,并将多个坐标一起转换。第一个参数是要变换的坐标对的数量,第二个和第三个参数是指向 x 和 y 的指针。我只是在这里改造一对。

请注意,设置逆变换同样容易:

// Set up the coordinate transform (projected-to-geographic).
OGRCoordinateTransformation *poCT_Proj2Geog;
poCT_Proj2Geog = OGRCreateCoordinateTransformation( poSRS_Proj, poSRS_Geog );
于 2012-11-15T00:25:38.343 回答
0

我使用图像的仿射变换来计算一些样本纬度/经度。我遇到的唯一问题是,如果图像是北向的,那么在计算纬度/经度时,geoTransform[2] 和 geTransform[4] 需要归零。

x = (int)Math.Abs(Math.Round((Latitude - geotransform[0]) / geotransform[1]));
y = (int)Math.Abs(Math.Round((Longitude - geotransform[3]) / geotransform[5]));

如果你想暴力破解它,你可以执行以下操作(我这样做并且它有效,但这只是伪代码):

//Get the Pixel for the length and width, this portion is for the full image
pixelXSize = AbsoluteValue((latitudeAt(Zero)-(latitudeAt(Length)-1))/imageLength);
pixelYSize = AbsoluteValue((longitudeAt(Zero)-(LongitudeAt(Width)-1))/imageWidth);

//Calculate the x,y conversion for the points you want to calculate
x = AbsoluteValue((latitudeToConvert-latitudeAt(Zero))/pixelXSize);
y = AbsoluteValue((longitudeToConvert-longitudteAt(Zero))/pixelYSize);

这个答案可能会偏离一两个像素。如果您使用的是地理变换,那么北向变量可能会混淆返回的答案。到目前为止,我只对朝北的图像进行了测试。

于 2012-01-18T00:13:28.337 回答
0

我使用这种方法:

void transformCoordinatesEPSG(OGRGeometry &geometry,int from, int to) {
    OGRSpatialReference srcSpatialReference;
    OGRErr error = srcSpatialReference.importFromEPSG(from);

    #ifdef __OGRTRANSFORMDEBUG
        qDebug() << "Import EPSG  " << from << "return " << error;
    #endif

    OGRSpatialReference dstSpatialReference;
    error = error | dstSpatialReference.importFromEPSG(to);

    #ifdef __OGRTRANSFORMDEBUG
    qDebug() << "Import EPSG  " << to << "return " << error;
    #endif

    OGRCoordinateTransformation* coordTrans = OGRCreateCoordinateTransformation(&srcSpatialReference, &dstSpatialReference);
    geometry.transform(coordTrans);
}

纬度/经度必须为 4326。

于 2017-11-23T07:58:56.853 回答