Пришлось столкнуться с этим монстром - GDAL...
Вот есть у меня массив - изображение. Знаю, что изображение в проекции UTM (зона, гемисфера). Знаю геогр.координаты углов изображения, центра.
Есть у меня вектора координат точек (широта,долгота) в проекции WGS84. Надо поставить точки на изображение.
Пример того, что есть:
Код: Выделить всё
void Points2Img(uchar* img, int h, int w, GeoBox box, vector<double> &Lat, vector<double> &Lon)
{
CPLSetConfigOption("GDAL_DATA", "..\\..\\gdal-data");
OGRSpatialReference oSourceSRS, oTargetSRS;
OGRCoordinateTransformation *poCT;
oSourceSRS.importFromEPSG(4326); //WGS84 точек
oTargetSRS.importFromEPSG(32628);//UTM изображения
poCT = OGRCreateCoordinateTransformation(&oSourceSRS, &oTargetSRS);
//перевод геогр.координат верхнего левого и нижнего правого углов в координаты UTM
poCT->Transform(1, &box.left_top.x, &box.left_top.y);
poCT->Transform(1, &box.rght_bot.x, &box.rght_bot.y);
//сколько единиц в одном пикселе
double unit_in_pixY = abs(box.left_top.y - box.rght_bot.y) / (h - 1);
double unit_in_pixX = abs(box.rght_bot.x - box.left_top.x) / (w - 1);
//перепроецируем координаты точек из WGS84 в заданный UTM
poCT->Transform(Lat.size(), &Lon[0], &Lat[0]);
//проставляем точки на изображении
int y, x;
for (size_t pp = 0; pp < Lat.size(); ++pp)
{
y = round(double(h-1) - (Lat[pp] - box.rght_bot.y) / unit_in_pixY); //ось Y на изображение направлена на "юг"
x = round((Lon[pp] - box.left_top.x) / unit_in_pixX);
if(проверка y,x)
img[y*h + x] = 255;
}
}
Вопрос в том, так ли это? У меня возникли сомнения.
Начал копать в другом направлении:
Код: Выделить всё
GDALDataset *pSrcDataset = (GDALDataset *)GDALOpen("tst.bmp", GA_ReadOnly);
OGRSpatialReference oSRS_proj;
oSRS_proj.importFromEPSG(32628);
char *pszSRS_WKT = 0;
oSRS_proj.exportToWkt(&pszSRS_WKT);
CPLErr err = pSrcDataset->SetProjection(pszSRS_WKT);
double adfGeoTransform[6] = {0, 0, 0, 0, 0, 0};
pSrcDataset->GetGeoTransform(adfGeoTransform);
double adfInvGeoTransform[6] = {0, 0, 0, 0, 0, 0};
GDALInvGeoTransform(adfGeoTransform, adfInvGeoTransform);
//......................
GDALApplyGeoTransform(adfInvGeoTransform, Lon[i],Lat[i], &new_x, &new_y);
Вывод: pSrcDataset->SetProjection(pszSRS_WKT) не приводит к формированию коэффициентов.
В итоге не понятно как получить adfGeoTransform...