Here the solution!
cheers
m
---------- Forwarded message ----------
From: E. Jorge Tizado <[email protected]>
Date: Mon, Dec 10, 2012 at 11:43 AM
Subject: Re: Fwd: [GRASS-user] i.landsat.toar unable to read metadata file
To: Markus Neteler <[email protected]>
Hi Markus,
The Andras problem is solved!
The problem arises in another new! change of the 'standard' metadata
file MTL.txt; now use LANDSAT_7 instead of Landsat7 as spacecraft_id
I modify the code to avoid this problem with other users;
I attach the file landsat_met.c for replacement in SVN servers (grass6
and grass_trunk)
Best
Jorge
> Hi Jorge,
>
> do you have a possibility to help this user?
>
> thanks
> Markus
>
--
+---------------------------------------------------------+
| Dr. E. Jorge Tizado
| Dpto. Biodiversidad y Gestión Ambiental: Zoología
| Universidad de León - Campus de Ponferrada
| E-24400 Ponferrada (León, España)
+---------------------------------------------------------+
| tfno.: 987 442 018 - 696 138 405
| e-mail: [email protected]
| web: http://www3.unileon.es/personal/wwdbajtm/index.php
+---------------------------------------------------------+
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <math.h>
#include <grass/gis.h>
#include <grass/glocale.h>
#include "local_proto.h"
#include "earth_sun.h"
#define MAX_STR 127
#define METADATA_SIZE 65535 /* MTL.txt file size 65535 bytes */
#define TM5_MET_SIZE 28700 /* .met file size 28686 bytes */
inline void chrncpy(char *dest, char src[], int n)
{
if (src == NULL)
{
dest[0] = '\0';
}
else
{
int i;
for (i = 0; i < n && src[i] != '\0' && src[i] != '\"'; i++) dest[i] = src[i];
dest[i] = '\0';
}
}
/****************************************************************************
* PURPOSE: Read values of Landsat MSS/TM from header (.met) file
*****************************************************************************/
void get_metdata(const char mettext[], char *text, char value[])
{
char *ptr;
ptr = strstr(mettext, text);
if (ptr == NULL)
{
value[0] = 0;
return;
}
ptr = strstr(ptr, " VALUE ");
if (ptr == NULL) return;
while (*ptr++ != '\"') ;
int i = 0;
while (*ptr != '\"' && i < MAX_STR) value[i++] = *ptr++;
value[i] = '\0';
return;
}
void lsat_metdata(char *metfile, lsat_data * lsat)
{
FILE *f;
char mettext[TM5_MET_SIZE];
char name[MAX_STR], value[MAX_STR];
/* char metdate[MAX_STR]; */
if ((f = fopen(metfile, "r")) == NULL)
G_fatal_error(_("Metadata file <%s> not found"), metfile);
fread(mettext, TM5_MET_SIZE, 1, f);
/* --------------------------------------- */
get_metdata(mettext, "PLATFORMSHORTNAME", value);
chrncpy(name, value + 8, 1);
lsat->number = atoi(name);
get_metdata(mettext, "SENSORSHORTNAME", value);
chrncpy(lsat->sensor, value + 1, 4);
get_metdata(mettext, "CALENDARDATE", value);
chrncpy(lsat->date, value, 10);
if (lsat->creation[0] == 0)
{
get_metdata(mettext, "PRODUCTIONDATETIME", value);
if (!value[0])
G_fatal_error(_("Product creation date not in metadata file <%s>, input this data in the command line parameters"), metfile);
chrncpy(lsat->creation, value, 10);
}
if (lsat->sun_elev == 0)
{
get_metdata(mettext, "SolarElevation", value);
if (!value[0])
G_fatal_error(_("Unable to read solar elevation from metadata file in metadata file <%s>, input this data in the command line parameters"), metfile);
lsat->sun_elev = atof(value);
}
/* Fill data with the sensor_XXX functions */
switch(lsat->number)
{
case 1:
set_MSS1(lsat);
break;
case 2:
set_MSS2(lsat);
break;
case 3:
set_MSS3(lsat);
break;
case 4:
if (lsat->sensor[0] == 'M')
set_MSS4(lsat);
else
set_TM4(lsat);
break;
case 5:
if (lsat->sensor[0] == 'M')
set_MSS5(lsat);
else
set_TM5(lsat);
break;
default:
G_warning("Unable to recognize satellite platform [%d]", lsat->number);
break;
}
/* --------------------------------------- */
(void)fclose(f);
return;
}
/****************************************************************************
* PURPOSE: Read values of Landsat from MTL metadata (MTL.txt) file
*****************************************************************************/
void get_mtldata(const char mtltext[], char *text, char value[])
{
char *ptr;
ptr = strstr(mtltext, text);
if (ptr == NULL)
{
value[0] = '\0';
return;
}
while (*ptr++ != '=') ;
while (*ptr <= ' ' || *ptr == '\"') *ptr++;
int i = 0;
while (i < MAX_STR && *ptr != '\"' && *ptr > ' ') value[i++] = *ptr++;
value[i] = '\0';
return;
}
void lsat_mtldata(char *mtlfile, lsat_data * lsat)
{
FILE *f;
char mtldata[METADATA_SIZE];
char name[MAX_STR], value[MAX_STR];
int i;
if ((f = fopen(mtlfile, "r")) == NULL)
G_fatal_error(_("Metadata file <%s> not found"), mtlfile);
fread(mtldata, METADATA_SIZE, 1, f);
/* --------------------------------------- */
get_mtldata(mtldata, "SPACECRAFT_ID", value);
/* new MTL.txt use Landsat_7 instead of Landsat7 */
i = 0;
while( value[i] && (value[i] < '0' || value[i] > '9') ) i++;
lsat->number = atoi(value + i);
/* the new code replace
chrncpy(name, value + 7, 1);
lsat->number = atoi(name);
*/
get_mtldata(mtldata, "SENSOR_ID", value);
chrncpy(lsat->sensor, value, 4);
get_mtldata(mtldata, "ACQUISITION_DATE", value);
chrncpy(lsat->date, value, 10);
get_mtldata(mtldata, "CREATION_TIME", value);
chrncpy(lsat->creation, value, 10);
get_mtldata(mtldata, "SUN_ELEVATION", value);
lsat->sun_elev = atof(value);
/* Fill data with the sensor_XXX functions */
switch(lsat->number)
{
case 1:
set_MSS1(lsat);
break;
case 2:
set_MSS2(lsat);
break;
case 3:
set_MSS3(lsat);
break;
case 4:
if (lsat->sensor[0] == 'M')
set_MSS4(lsat);
else
set_TM4(lsat);
break;
case 5:
if (lsat->sensor[0] == 'M')
set_MSS5(lsat);
else
set_TM5(lsat);
break;
case 7:
get_mtldata(mtldata, "BAND1_GAIN", value);
get_mtldata(mtldata, "BAND2_GAIN", value + 1);
get_mtldata(mtldata, "BAND3_GAIN", value + 2);
get_mtldata(mtldata, "BAND4_GAIN", value + 3);
get_mtldata(mtldata, "BAND5_GAIN", value + 4);
get_mtldata(mtldata, "BAND6_GAIN1", value + 5);
get_mtldata(mtldata, "BAND6_GAIN2", value + 6);
get_mtldata(mtldata, "BAND7_GAIN", value + 7);
get_mtldata(mtldata, "BAND8_GAIN", value + 8);
value[9] = '\0';
set_ETM(lsat, value);
break;
default:
G_warning("Unable to recognize satellite platform [%d]", lsat->number);
break;
}
/* Update the information from metadata file */
for (i = 0; i < lsat->bands; i++) {
snprintf(name, MAX_STR, "LMAX_BAND%d", lsat->band[i].code);
get_mtldata(mtldata, name, value);
lsat->band[i].lmax = atof(value);
snprintf(name, MAX_STR, "LMIN_BAND%d", lsat->band[i].code);
get_mtldata(mtldata, name, value);
lsat->band[i].lmin = atof(value);
snprintf(name, MAX_STR, "QCALMAX_BAND%d", lsat->band[i].code);
get_mtldata(mtldata, name, value);
lsat->band[i].qcalmax = atof(value);
snprintf(name, MAX_STR, "QCALMIN_BAND%d", lsat->band[i].code);
get_mtldata(mtldata, name, value);
lsat->band[i].qcalmin = atof(value);
}
/* --------------------------------------- */
(void)fclose(f);
return;
}
_______________________________________________
grass-user mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/grass-user