Если у вас есть GeoTiff, возможно ли преобразовать точку широты / долготы в X, Y с помощью GeoTransform? - PullRequest
5 голосов
/ 14 января 2012

Я использую библиотеку GDAL.В настоящее время я могу взять верхнюю левую точку и верхнюю правую точку и вырезать изображение из оригинала.Теперь я хотел бы взять две точки WKT и преобразовать их в координаты X, Y, чтобы сделать то же самое.Мне просто интересно, можно ли это сделать, если я знаю GeoTransform и какую систему координат он использует (WGS84)?

Ответы [ 3 ]

5 голосов
/ 15 ноября 2012

Я сталкивался с этим и раньше, и вот достаточно хороший способ преобразования координат.

Примечание из документации 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 );
0 голосов
/ 23 ноября 2017

Я использую этот метод:

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.

0 голосов
/ 18 января 2012

Я использовал аффинное преобразование для изображения, чтобы вычислить некоторые примерные широты / долготы.Единственная проблема, с которой я столкнулся, заключалась в том, что если изображение ориентировано на север, 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);

Этот ответ может быть отключен на один или два пикселя.Если вы используете геотрансформацию, снова переменные северного направления могут испортить ответ, который возвращается.До сих пор я проверял это только для изображений на север.

...