User:Maxbe/Kartenversuch/unsort2xyx.c

From OpenStreetMap Wiki
Jump to navigation Jump to search

Quelltext zum Umwandlung von bayerischen Höhendaten in das gdal-eigen xyz-Format. Das Programm soll weder schön sein, noch vielseitig. Es kann nur eine Datei namens "baydgm50.unsorted_xyz" in eine Datei namens "baydgm50.xyz" umwandeln und auch nur Daten mit den im oberen Programmteil angegebenen Eckwerten und 50 Metern Auflösung.

Verwendungszweck: siehe User:Maxbe/Kartenversuch#Bessere Höhendaten für Österreich und Bayern


#include <stdio.h>
#include <stdlib.h>

long int x_1=4279050;
long int x_2=4636750;
long int y_1=5236050;
long int y_2=5605500;
long int d=50;

main(){
 double    *height,ele;
 long int  dx,dy,x,y,s,rw,hw;
 char      z[100];
 char      *p;

 dx=(x_2-x_1)/d+1;
 dy=(y_2-y_1)/d+1;
 s=dx*dy;

 printf("Brauche %d*%d*%d=%dByte\n",dx,dy,sizeof(double),s*sizeof(double));
 height=(double*)calloc(s,sizeof(double));

 if(height==NULL){printf("Speicher ist alle, ich brauche %d Byte\n",s*sizeof(double));}
 else {printf("Speicher ist genug da: %d\nInitialisiere die Werte auf nodata=-3.4e+38\n",s*sizeof(double));}

 for(y=y_1;y<=y_2;y+=d){
  dy=(y-y_1)/d;
  for(x=x_1;x<=x_2;x+=d){
   dx=(x-x_1)/d;
   s=dx+dy*((x_2-x_1)/d);
   height[s]=-999999;
  }
 }

 FILE *f=fopen("baydgm50.unsorted_xyz", "r");
 if(f){
  printf("lese baydgm50.unsorted_xyz\n");
  while( fgets(z,100,f) ){
   p=strtok(z," \n");
   rw=atoi(p);
   p=strtok(NULL," \n");
   hw=atoi(p);
   p=strtok(NULL," \n");
   ele=atof(p);
   dx=(rw-x_1)/d;
   dy=(hw-y_1)/d;
   s=dx+dy*((x_2-x_1)/d);
   height[s]=ele;
  }
  fclose(f);
 }

 f=fopen("baydgm50.xyz", "w");
 if(f){
  printf("schreibe baydgm50.xyz\n");
  for(y=y_1;y<=y_2;y+=d){
   dy=(y-y_1)/d;
   for(x=x_1;x<=x_2;x+=d){
    dx=(x-x_1)/d;
    s=dx+dy*((x_2-x_1)/d);
    ele=height[s];
    fprintf(f,"%d %d %7.1f\n",x,y,ele);
   }
  }
  fclose(f);
 }
}