Я сталкивался с этим и раньше, и вот достаточно хороший способ преобразования координат.
Примечание из документации 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 );