Programování s knihovnou GDAL: Porovnání verzí
m →C++ |
|||
Řádek 12: | Řádek 12: | ||
<source lang="cpp"> | <source lang="cpp"> | ||
#include <iostream> | |||
#include "gdal_priv.h" | |||
using std::cout; | |||
using std::cerr; | |||
using std::endl; | |||
GDALDataset *open_file(const char *filename) | |||
{ | |||
GDALDataset *poDs; | |||
poDs = (GDALDataset *) GDALOpen(filename, GA_ReadOnly); | |||
if (poDs == NULL) { | |||
cerr << "Otevreni '" << filename << "' selhalo." << endl; | |||
return NULL; | |||
} | |||
return poDs; | |||
} | |||
int calculate_ndvi(GDALDataset *poDsNdvi, GDALDataset *poDsTm3, GDALDataset *poDsTm4) | |||
{ | |||
GDALRasterBand *poBandNdvi, *poBandTm3, *poBandTm4; | |||
poBandNdvi = poDsNdvi->GetRasterBand(1); | |||
poBandTm3 = poDsTm3->GetRasterBand(1); | |||
poBandTm4 = poDsTm4->GetRasterBand(1); | |||
if (!poBandNdvi || !poBandTm3 || !poBandTm4) | |||
return -1; | |||
unsigned char *pafScanlineTm3, *pafScanlineTm4; | |||
double *pafScanlineNdvi; | |||
int nXSize = poBandTm3->GetXSize(); | |||
int nYSize = poBandTm3->GetYSize(); | |||
if (nXSize != poBandTm4->GetXSize() || | |||
nYSize != poBandTm4->GetYSize()) | |||
return -1; | |||
pafScanlineTm3 = (unsigned char *) CPLMalloc(sizeof(unsigned char) * nXSize); | |||
pafScanlineTm4 = (unsigned char *) CPLMalloc(sizeof(unsigned char) * nXSize); | |||
pafScanlineNdvi = (double *) CPLMalloc(sizeof(double) * nXSize); | |||
for (int row = 0; row < nYSize; row++) { | |||
poBandTm3->RasterIO(GF_Read, 0, row, nXSize, 1, | |||
pafScanlineTm3, nXSize, 1, GDT_Byte, | |||
0, 0); | |||
poBandTm4->RasterIO(GF_Read, 0, row, nXSize, 1, | |||
pafScanlineTm4, nXSize, 1, GDT_Byte, | |||
0, 0); | |||
for (int col = 0; col < nXSize; col++) { | |||
pafScanlineNdvi[col] = double(pafScanlineTm4[col] - pafScanlineTm3[col]) / | |||
(pafScanlineTm4[col] + pafScanlineTm3[col]); | |||
} | |||
poBandNdvi->RasterIO(GF_Write, 0, row, nXSize, 1, | |||
pafScanlineNdvi, nXSize, 1, GDT_Float32, | |||
0, 0); | |||
} | |||
CPLFree(pafScanlineTm3); | |||
CPLFree(pafScanlineTm4); | |||
CPLFree(pafScanlineNdvi); | |||
return 0; | |||
} | |||
int main(int argc, char **argv) | |||
{ | |||
const char *filenameTm3, *filenameTm4; | |||
double trans[6]; | |||
GDALDriver *poDriver; | |||
GDALDataset *poDsTm3, *poDsTm4, *poDsNdvi; | |||
if (argc != 3) { | |||
cerr << "Pouziti: " << argv[0] << " tm3 tm4" << endl; | |||
return 1; | |||
} | |||
filenameTm3 = argv[1]; | |||
filenameTm4 = argv[2]; | |||
// registrovat dostupne GDAL ovladace | |||
GDALAllRegister(); | |||
// otevrit rastrove soubory 'tm3' a 'tm4' pro cteni | |||
poDsTm3 = open_file(filenameTm3); | |||
poDsTm4 = open_file(filenameTm4); | |||
if (poDsTm3 == NULL || poDsTm4 == NULL) | |||
return 1; | |||
poDriver = poDsTm3->GetDriver(); | |||
poDsNdvi = poDriver->Create("ndvi.tif", poDsTm3->GetRasterXSize(), poDsTm3->GetRasterYSize(), | |||
1, GDT_Float32, NULL); | |||
poDsTm3->GetGeoTransform(trans); | |||
poDsNdvi->SetGeoTransform(trans); | |||
poDsNdvi->SetProjection(poDsTm3->GetProjectionRef()); | |||
if (poDsNdvi == NULL) | |||
cerr << "Nelze vytvorit vystupni soubor 'ndvi.tif'" << endl; | |||
if (calculate_ndvi(poDsNdvi, poDsTm3, poDsTm4) != 0) | |||
cerr << "Nelze vypocitat NDVI" << endl; | |||
GDALClose(poDsTm3); | |||
GDALClose(poDsTm4); | |||
GDALClose(poDsNdvi); | |||
return 0; | |||
} | |||
</source> | </source> | ||
Verze z 19. 10. 2010, 13:59
Tato stránka obsahuje ukázku zdrojového textu demonstračního programu využívající pro přístup k rastrovým datům knihovnu GDAL. Program počítá normalizovaný vegetační index, více informace na cvičení předmětu Zpracování obrazových dat.
kde tm4 je 4. kanál družicové scény Landsat TM, tm3 je kanál třetí.
C++
#include <iostream>
#include "gdal_priv.h"
using std::cout;
using std::cerr;
using std::endl;
GDALDataset *open_file(const char *filename)
{
GDALDataset *poDs;
poDs = (GDALDataset *) GDALOpen(filename, GA_ReadOnly);
if (poDs == NULL) {
cerr << "Otevreni '" << filename << "' selhalo." << endl;
return NULL;
}
return poDs;
}
int calculate_ndvi(GDALDataset *poDsNdvi, GDALDataset *poDsTm3, GDALDataset *poDsTm4)
{
GDALRasterBand *poBandNdvi, *poBandTm3, *poBandTm4;
poBandNdvi = poDsNdvi->GetRasterBand(1);
poBandTm3 = poDsTm3->GetRasterBand(1);
poBandTm4 = poDsTm4->GetRasterBand(1);
if (!poBandNdvi || !poBandTm3 || !poBandTm4)
return -1;
unsigned char *pafScanlineTm3, *pafScanlineTm4;
double *pafScanlineNdvi;
int nXSize = poBandTm3->GetXSize();
int nYSize = poBandTm3->GetYSize();
if (nXSize != poBandTm4->GetXSize() ||
nYSize != poBandTm4->GetYSize())
return -1;
pafScanlineTm3 = (unsigned char *) CPLMalloc(sizeof(unsigned char) * nXSize);
pafScanlineTm4 = (unsigned char *) CPLMalloc(sizeof(unsigned char) * nXSize);
pafScanlineNdvi = (double *) CPLMalloc(sizeof(double) * nXSize);
for (int row = 0; row < nYSize; row++) {
poBandTm3->RasterIO(GF_Read, 0, row, nXSize, 1,
pafScanlineTm3, nXSize, 1, GDT_Byte,
0, 0);
poBandTm4->RasterIO(GF_Read, 0, row, nXSize, 1,
pafScanlineTm4, nXSize, 1, GDT_Byte,
0, 0);
for (int col = 0; col < nXSize; col++) {
pafScanlineNdvi[col] = double(pafScanlineTm4[col] - pafScanlineTm3[col]) /
(pafScanlineTm4[col] + pafScanlineTm3[col]);
}
poBandNdvi->RasterIO(GF_Write, 0, row, nXSize, 1,
pafScanlineNdvi, nXSize, 1, GDT_Float32,
0, 0);
}
CPLFree(pafScanlineTm3);
CPLFree(pafScanlineTm4);
CPLFree(pafScanlineNdvi);
return 0;
}
int main(int argc, char **argv)
{
const char *filenameTm3, *filenameTm4;
double trans[6];
GDALDriver *poDriver;
GDALDataset *poDsTm3, *poDsTm4, *poDsNdvi;
if (argc != 3) {
cerr << "Pouziti: " << argv[0] << " tm3 tm4" << endl;
return 1;
}
filenameTm3 = argv[1];
filenameTm4 = argv[2];
// registrovat dostupne GDAL ovladace
GDALAllRegister();
// otevrit rastrove soubory 'tm3' a 'tm4' pro cteni
poDsTm3 = open_file(filenameTm3);
poDsTm4 = open_file(filenameTm4);
if (poDsTm3 == NULL || poDsTm4 == NULL)
return 1;
poDriver = poDsTm3->GetDriver();
poDsNdvi = poDriver->Create("ndvi.tif", poDsTm3->GetRasterXSize(), poDsTm3->GetRasterYSize(),
1, GDT_Float32, NULL);
poDsTm3->GetGeoTransform(trans);
poDsNdvi->SetGeoTransform(trans);
poDsNdvi->SetProjection(poDsTm3->GetProjectionRef());
if (poDsNdvi == NULL)
cerr << "Nelze vytvorit vystupni soubor 'ndvi.tif'" << endl;
if (calculate_ndvi(poDsNdvi, poDsTm3, poDsTm4) != 0)
cerr << "Nelze vypocitat NDVI" << endl;
GDALClose(poDsTm3);
GDALClose(poDsTm4);
GDALClose(poDsNdvi);
return 0;
}