Importing raster data

Andrea Giacomelli andreag at crs4.it
Wed Jan 28 04:35:37 EST 1998


> I'm trying to import a raster file in ascii/text format with lat/long
> coordinates into GRASS. The file has the following format:
> 
> north: 47.937500000000
> south: 24.062500000000
> east: -66.479166666667
> west: -90.520833333333
> rows: 573
> cols: 577
> 785 790 786 783 779 771 768 766 ...
> 

Hi,
I don't know if you have solved your problem in the meantime.
Some time ago, I wrote this simple/informal (*VERY INFORMAL*) 
C program to automate some typical
reformatting tasks in files coming from r.out.ascii.
Maybe it can be of help.

NOTE: I don't think awk will do it, with 577 columns.

I give you my regards, and I will be glad to have feedback from you!
(source is after the signature...)


                =========================================
                Andrea Giacomelli
                Centre for Advanced Studies, Research and
                Development in Sardinia
                Environment Division

                http://www.crs4.it/~andreag
                =========================================

---8<----CUT HERE---8<------------------------

/* WYD input GRASS ascii; output various formats (3-d plot, correlation etc) */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define CHKP printf("output format for z values: %s\n\n",pformat);
#define CHKC printf("%f %f %f %f %f %f\n",n,s,e,w,nr,nc);

int   rcd_plot();
int  tred_plot();
int  dued_plot();
int  read_head();
char *ask_form();

/*----------globals-----------*/

float n,s,e,w,nr,nc;
FILE *fpin,*fpin2,*fpout;
char fnin[100],fnin2[100],fnout[100];
char pformat[50];
float divby,divby_x,divby_y;

/*----------vai cosi'---------*/

main()
{	char option,ancora;

	ancora='Y';

		printf("Reads a GRASS ascii file and re-formats it\n");
		printf("============================================\n");

		printf("Choose output format for data >\n");
		printf("[A] array with rows cols data\n");
		printf("[B] vector for 3-d plot\n");
		printf("[C] vector for 2-d correlation plot\n");
		printf("Allora ? ");
		option=getchar();

		switch(toupper(option))
		{	case 'A':	rcd_plot();
					break;
		
			case 'B':	tred_plot();
					break;

			case 'C':	dued_plot();
					break;

			default :	printf("\07\07Jimi Hendrix lives...\n");
					break;
		}


	printf("\n\nTanti saluti da Andreuzzo...\n\n\n");

}

/*============= Read header data ==============*/

int read_head(fp)
FILE *fp;
{	char dummy[10];

	fscanf(fp,"%s %f",dummy,&n);
	fscanf(fp,"%s %f",dummy,&s);
	fscanf(fp,"%s %f",dummy,&e);
	fscanf(fp,"%s %f",dummy,&w);
	fscanf(fp,"%s %f",dummy,&nr);
	fscanf(fp,"%s %f",dummy,&nc);

	CHKC

}

/*===============================================================*/

char *ask_form(question)
char question[];
{	char whichf[30];

	printf("printf() format for %s (e.g %% 5.2f) ? ",question);
	fscanf(stdin,"%s",whichf);

	printf("chosen format is: <%s>\n\n",whichf);

	return(whichf);
}

/*===============================================================*/

int dued_plot()
{	int a,b;
	float dat_x,dat_y;

	printf("X-file in ? ");
	fscanf(stdin,"%s",fnin);
	printf("Y-file in ? ");
	fscanf(stdin,"%s",fnin2);
	printf("File out ? ");
	fscanf(stdin,"%s",fnout); 

	printf("Divide x values by : ");
	fscanf(stdin,"%f",&divby_x);
	printf("Divide y values by : ");
	fscanf(stdin,"%f",&divby_y);

	strcpy(pformat,ask_form("X data"));
	strcat(pformat," ");
	strcat(pformat,ask_form("Y data"));
	strcat(pformat,"\n");

	CHKP

	if((fpin=fopen(fnin,"r"))==NULL) exit(-1);
	if((fpin2=fopen(fnin2,"r"))==NULL) exit(-1);
	if((fpout=fopen(fnout,"w"))==NULL) exit(-2);



/*------------- Read header data --------------*/

	read_head(fpin);
	read_head(fpin2);

/*--------------Write data---------------------*/

	for(a=1;a<=nr;a++)
		for(b=1;b<=nc;b++)
		{	fscanf(fpin,"%f",&dat_x);
			fscanf(fpin2,"%f",&dat_y);
		fprintf(fpout,pformat,dat_x/divby_x,dat_y/divby_y);
/*			fprintf(stdout,pformat,dat_x/divby_x,dat_y/divby_y); */
		}

	fclose(fpin);
	fclose(fpin2);
	fclose(fpout);

}
/*=================================================================*/
int tred_plot()
{	float a,b;
	float dat_out;
	float step_x,step_y;

	printf("file in ? ");
	scanf("%s",fnin);
	printf("File out ? ");
	scanf("%s",fnout);

	printf("\nDivide Z-values by : ");
	scanf("%f",&divby);


	if((fpin=fopen(fnin,"r"))==NULL) exit(-1);
	if((fpout=fopen(fnout,"w"))==NULL) exit(-2);
	read_head(fpin);


	step_x=(e-w)/nc;
	step_y=(s-n)/nr;

	printf("X interval is %f ; step is %f\n\n",e-w,step_x);
	strcpy(pformat,ask_form("X axis"));
	strcat(pformat," ");
	printf("Y interval is %f ; step is %f\n\n",n-s,step_y);
	strcat(pformat,ask_form("Y axis"));
	strcat(pformat," ");
	strcat(pformat,ask_form("Z data"));
	strcat(pformat,"\n"); 
	CHKP

/*------------compute--------------*/

	for(a=n;a>=s;a+=step_y)
        {
		for(b=w;b<=e;b+=step_x)
		{	fscanf(fpin,"%f",&dat_out);
			fprintf(fpout,pformat,b-w,a-s,dat_out/divby);
			fprintf(stdout,pformat,b-w,a-s,dat_out/divby);
		}
		fprintf(fpout,"\n");
	}
	fclose(fpin);
	fclose(fpout);

}



/*=============================================================*/

int rcd_plot()
{	int a,b,d_in;
	float d_out;
	int om_in,om_out;
	char opt;

	printf("File in ? ");
	scanf("%s",fnin);
	printf("File out ? ");
	scanf("%s",fnout);

	if((fpin=fopen(fnin,"r"))==NULL) exit(-1);
	if((fpout=fopen(fnout,"w"))==NULL) exit(-2);

	printf("Divide by ? ");
	scanf("%f",&divby);
	printf("Out of mask value of IN file ? ");
	scanf("%d",&om_in);
	printf("Out of mask value of OUT file ? ");
	scanf("%d",&om_out);

	strcpy(pformat,ask_form("output"));
	strcat(pformat," ");
	CHKP 

	printf("The format string is <%s>\n\n",pformat);

	read_head(fpin);

	
	printf("Do you want rows & cols written at the beginning of the file ? ");
	scanf("%s",&opt);

	printf("HERE %c",opt);

	switch(toupper(opt))
	{     case 'Y': fprintf(stdout,"%4.0f %4.0f\n",nr,nc);
			break;

              case 'N': printf("%4.0f %4.0f\n",nr,nc);
			break;

              deafult:  printf("Tanti saluti a cicciuzzo!\n\n\n");
			break;
        }

	for(a=1;a<=nr;a++)
	{	for(b=1;b<=nc;b++)
		{	fscanf(fpin,"%d",&d_in);
			if(d_in==om_in)
			  fprintf(fpout,"%d ",om_out);
			else
			{  d_out=((float) d_in)/divby;
			   fprintf(fpout,pformat,d_out);
			}
		}
		fprintf(fpout,"\n");
	}

	fclose(fpin);
	fclose(fpout);
}



More information about the grass-user mailing list