Programování s knihovnou GDAL: Porovnání verzí

Z GeoWikiCZ
m (Obsah stránky nahrazen textem „{{freegiswiki|GDAL / Ukázka použití}}“)
 
Řá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}}

Aktuální verze z 9. 1. 2013, 15:08