|
|
Řádek 1: |
Řádek 1: |
| {{Upravit}} | | {{freegiswiki|GDAL / Ukázka použití}} |
| 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/OGR|GDAL]]'''. Program počítá [http://en.wikipedia.org/wiki/Normalized_Difference_Vegetation_Index normalizovaný vegetační index], více informace na cvičení předmětu [[153YZOD Zpracování obrazových dat - cvičení 4#Podíl obrazu|Zpracování obrazových dat]].
| |
| | |
| <center>
| |
| <math>
| |
| ndvi = \frac{(tm4 - tm3)}{(tm4 + tm3)}
| |
| </math>
| |
| </center>
| |
| kde <tt>tm4</tt> je 4. kanál družicové scény Landsat TM, <tt>tm3</tt> je kanál třetí.
| |
| __TOC__
| |
| == C++ ==
| |
| | |
| <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>
| |
| | |
| == Python ==
| |
| | |
| <source lang="python">
| |
| @TODO
| |
| </source>
| |
| | |
| == Související články ==
| |
| | |
| * [[Programování s knihovnou OGR]]
| |
| * [[153GIS2 - 10. cvičení - GRASS GIS|Ukázka skriptů pro GRASS GIS]]
| |
| | |
| == Externí odkazy ==
| |
| | |
| * [http://gdal.osgeo.org/gdal_datamodel.html GDAL Data Model]
| |
| * [http://gdal.osgeo.org/hierarchy.html API Reference Documentation]
| |
| * [http://gdal.osgeo.org/gdal_tutorial.html GDAL API Tutorial]
| |
| * [http://gdal.osgeo.org/gdal_drivertut.html GDAL Driver Implementation Tutorial]
| |
| * [http://trac.osgeo.org/gdal/wiki/rfc8_devguide RFC 8: Developer Guidelines]
| |
| | |
| {{GFOSS}}
| |
| {{Programování}}
| |
| {{C++}}
| |
| {{Python}}
| |