示例#1
0
int AACGMtransform(int ssze,void *src,int dsze,void *dst,void *data) {

  float *pnt;
  int s;
  double mlon,mlat;
  double glon,glat,r;

  pnt=(float *)src;

  if (data==NULL) {
    glat=pnt[0];
    glon=pnt[1];
    s=AACGMConvert(glat,glon,300,&mlat,&mlon,&r,0);
    pnt=(float *)dst;
    pnt[0]=mlat;
    pnt[1]=mlon;
  } else {
    mlat=pnt[0];
    mlon=pnt[1];
    s=AACGMConvert(mlat,mlon,300,&glat,&glon,&r,1);
    pnt=(float *)dst;
    pnt[0]=glat;
    pnt[1]=glon;
  }
  return s;

}
示例#2
0
文件: aacgm.c 项目: ajribeiro/VT_RST3
int main(int argc,char *argv[]) {
  int arg;
 
  double ilon=0.0,ilat=0.0,alt=0.0;
  double olon=0.0,olat=0.0,r;
  char *fmt=NULL;
  char *dfmt="%f %f\n";
  char *fname=NULL;
  FILE *fp;

  unsigned char option=0;
  unsigned char help=0;
  unsigned char flag=0;
  int c;

  char txt[256];
  
  OptionAdd(&opt,"-help",'x',&help);
  OptionAdd(&opt,"-option",'x',&option);
  OptionAdd(&opt,"i",'x',&flag);
  OptionAdd(&opt,"lon",'d',&ilon);
  OptionAdd(&opt,"lat",'d',&ilat);
  OptionAdd(&opt,"alt",'d',&alt);
  OptionAdd(&opt,"fmt",'t',&fmt);
  OptionAdd(&opt,"f",'t',&fname);

  arg=OptionProcess(1,argc,argv,&opt,NULL);

  if (help==1) {
    OptionPrintInfo(stdout,hlpstr);
    exit(0);
  }

  if (option==1) {
    OptionDump(stdout,&opt);
    exit(0);
  }

  if (fmt==NULL) fmt=dfmt;

  if (fname==NULL) {
    AACGMConvert(ilat,ilon,alt,&olat,&olon,&r,flag);
    fprintf(stdout,fmt,olat,olon);    
  } else {
    if (strcmp(fname,"-")==0) fp=stdin;
    else fp=fopen(fname,"r");
    if (fp==NULL) exit(1);
    while(fgets(txt,255,fp) !=NULL) {
      for (c=0;(txt[c] !=0) && (c<256);c++) 
      if (txt[c]=='#') break;
      if (txt[c]=='#') continue;
      if (sscanf(txt,"%lf %lf %lf\n",
          &ilat,&ilon,&alt) !=3) continue;
      AACGMConvert(ilat,ilon,alt,&olat,&olon,&r,flag);
      fprintf(stdout,fmt,olat,olon);    
    }
  }
  return 0;
}
示例#3
0
void RPosMagGS(int center,int bcrd,int rcrd,
                struct RadarSite *pos,
                int frang,int rsep,int rxrise,double height,
                double *rho,double *lat,double *lng) {
  double rx;
  double radius;
  double psi,d;
  double re=6356.779;
  double offset=0;
  double bm_edge=0;
  double range_edge=0;
  
  if (center==0) {
    bm_edge=-pos->bmsep*0.5;
    range_edge=-0.5*rsep*20/3;
  }
  
  if (rxrise==0) rx=pos->recrise;
  else rx=rxrise;

  offset=pos->maxbeam/2.0-0.5;
  psi=pos->bmsep*(bcrd-offset)+bm_edge;

  
  d=slant_range(frang,rsep,rx,range_edge,rcrd+1)/2;
  if (height < 90) height=-re+sqrt((re*re)+2*d*re*sind(height)+(d*d));
 
  fldpnth_gs(pos->geolat,pos->geolon,psi,pos->boresite,
		  height,d,rho,lat,lng); 
 
  AACGMConvert(*lat,*lng,(double) height,lat,lng,&radius,0);
 
 

}
示例#4
0
int cell_convert(float xoff,float yoff,float wdt,float hgt,
                 float lat,float lon,float *px,float *py,int magflg,
                 int (*trnf)(int,void *,int,void *,void *data),void *data) {
  int s;
  float map[2],pnt[2];

   if (!magflg) {
      double mlat,mlon,glat,glon,r;
      int s;
      mlat=lat;
      mlon=lon;
      s=AACGMConvert(mlat,mlon,150,&glat,&glon,&r,1);
      lat=glat;
      lon=glon;
    }
    map[0]=lat;
    map[1]=lon;
    s=(*trnf)(2*sizeof(float),map,2*sizeof(float),pnt,data);
    if (s !=0) return -1;
    *px=xoff+wdt*pnt[0];
    *py=yoff+hgt*pnt[1]; 
    return 0;
}
示例#5
0
文件: invmag.c 项目: SDFrance/RSTLite
int RPosInvMag(int bm,int rn,int year,struct RadarSite *hdw,double frang,
             double rsep,double rx,double height,
             double *mlat,double *mlon,double *azm) {

  double flat,flon,frho;
  double fx,fy,fz;

  double gx,gy,gz;
  double glat,glon;
  double gdlat,gdlon,gdrho;
  double gbx,gby,gbz; 
  double ghx,ghy,ghz;
  double bx,by,bz,b;
  double dummy,elv,azc;

  double tmp_ht;
  double xlat,xlon,nlat,nlon;
  int s;

  gdlat=hdw->geolat;
  gdlon=hdw->geolon;

  if (rx==0) rx=hdw->recrise;

  RPosGeo(1,bm,rn,hdw,frang,rsep,rx,
             height,&frho,&flat,&flon);

  sphtocar(frho,flat,flon,&fx,&fy,&fz);       
  geodtgc(1,&gdlat,&gdlon,&gdrho,&glat,&glon,&dummy);
  sphtocar(gdrho,glat,glon,&gbx,&gby,&gbz);       
  gx=fx-gbx;
  gy=fy-gby;
  gz=fz-gbz;     
  norm_vec(&gx,&gy,&gz);
  glbthor(1,flat,flon,&gx,&gy,&gz,&ghx,&ghy,&ghz);
  norm_vec(&ghx,&ghy,&ghz);

  s=IGRFMagCmp(year,frho,flat,flon,&bx,&by,&bz,&b);
  if (s==-1) return -1;
  
  norm_vec(&bx,&by,&bz);
  ghz=-(bx*ghx+by*ghy)/bz;
  norm_vec(&ghx,&ghy,&ghz);
  elv=atan2d(ghz,sqrt(ghx*ghx+ghy*ghy));
  azc=atan2d(ghy,-ghx);
      
  geodtgc(-1,&gdlat,&gdlon,&gdrho,&flat,&flon,&dummy);
  tmp_ht=frho-gdrho;
   
  AACGMConvert(flat,flon,tmp_ht,mlat,mlon,&dummy,0);
        
  fldpnt_sph(frho,flat,flon,azc,rsep,&xlat,&xlon);
      
  s=AACGMConvert(xlat,xlon,tmp_ht,&nlat,&nlon,&dummy,0);
  if (s==-1) return -1;
       
  if ((nlon-*mlon) > 180)  nlon=nlon-360;
  if ((nlon-*mlon) < -180) nlon=nlon+360;

  fldpnt_azm(*mlat,*mlon,nlat,nlon,azm);      
  return 0;
}
示例#6
0
void plot_maxmin(struct Plot *plot,
                 struct CnvGrid *ptr,int magflg,
		 float xoff,float yoff,float wdt,float hgt,float sze,
                 int (*trnf)(int,void *,int,void *,void *data),void *data,
                 unsigned int color,char mask,float width,
                 struct PlotDash *dash) {

  int i,s;

  double min=1e10;
  double max=-1e10;
  float max_lon=0,max_lat=0;
  float min_lon=0,min_lat=0;
  float map[2],pnt[2];
  float px,py;

  for (i=0;i<ptr->num;i++) {
    if (ptr->mag[i]>max) {
       max_lon=ptr->lon[i];
       max_lat=ptr->lat[i];
       max=ptr->mag[i];
    }
    if (ptr->mag[i]<min) {
       min_lon=ptr->lon[i];
       min_lat=ptr->lat[i];
       min=ptr->mag[i];
    }
  }  
  
  if (!magflg) {
    double mlat,mlon,glat,glon,r;
    int s;
    mlat=max_lat;
    mlon=max_lon;
    s=AACGMConvert(mlat,mlon,150,&glat,&glon,&r,1);
    max_lat=glat;
    max_lon=glon;
    mlat=min_lat;
    mlon=min_lon;
    s=AACGMConvert(mlat,mlon,150,&glat,&glon,&r,1);
    min_lat=glat;
    min_lon=glon;
  }

   
  map[0]=max_lat;
  map[1]=max_lon;
   
  s=(*trnf)(2*sizeof(float),map,2*sizeof(float),pnt,data);
  
  if (s==0) {
    px=xoff+pnt[0]*wdt;
    py=yoff+pnt[1]*hgt;       
    PlotLine(plot,px-sze,py,px+sze,py,color,mask,width,dash);   
    PlotLine(plot,px,py-sze,px,py+sze,color,mask,width,dash);   
 
  } 

  map[0]=min_lat;
  map[1]=min_lon;
   
  s=(*trnf)(2*sizeof(float),map,2*sizeof(float),pnt,data);
  
  if (s==0) {
    px=xoff+pnt[0]*wdt;
    py=yoff+pnt[1]*hgt;       
    PlotLine(plot,px-sze,py+sze,px+sze,py-sze,color,mask,width,dash);  
    PlotLine(plot,px-sze,py-sze,px+sze,py+sze,color,mask,width,dash);  
  } 

}
示例#7
0
int main(int argc,char *argv[]) {

  int s=0;

  int arg;
  
  char *cfname=NULL;
  FILE *fp;
  

  int wdt=540,hgt=540;

  unsigned char help=0; 
  unsigned char option=0; 


  MapTransform  tfunc;
  unsigned char flip=0;
  unsigned char gvp=0;
  unsigned char ortho=0;
  unsigned char stereo=0;
  unsigned char cylind=0;
  float lat=90,lon=0;
  float latmin=50.0;
  float sf=1.0;

  unsigned char sqflg=0;


  unsigned char magflg=0;
  unsigned char rotflg=0;

  unsigned char lstflg=0;
  unsigned char smflg=0;

  float marg[4];


  int x,y;

  float e;

  char *tmetxt=NULL;
  char *dtetxt=NULL;

  double tval=-1;
  double dval=-1;

  int yr,mo,dy,hr,mt;
  double sc;
  int yrsec;
  float tme_shft;
 
  float glat,glon;
  float fx,fy;
  int px,py;

  float ka=0.8;
  float kd=0.3;
  float ks=0.4;
  float sn=4;

  double LsoT,LT,Hangle,dec,eqt,mlon;

  float minlat,minlon,maxlat,maxlon;

  float Lvec[3]={-1.0,0.0,0.5}; /* lighting vector */
 
  OptionAdd(&opt,"-help",'x',&help);
  OptionAdd(&opt,"-option",'x',&option);

  OptionAdd(&opt,"cf",'t',&cfname);

  OptionAdd(&opt,"wdt",'i',&wdt);
  OptionAdd(&opt,"hgt",'i',&hgt);

  OptionAdd(&opt,"square",'x',&sqflg);


  OptionAdd(&opt,"ortho",'x',&ortho);
  OptionAdd(&opt,"stereo",'x',&stereo);
  OptionAdd(&opt,"gvp",'x',&gvp);

  OptionAdd(&opt,"lat",'f',&lat);
  OptionAdd(&opt,"lon",'f',&lon);
  OptionAdd(&opt,"latmin",'f',&latmin);
  OptionAdd(&opt,"sf",'f',&sf);
  OptionAdd(&opt,"mag",'x',&magflg);
  OptionAdd(&opt,"rotate",'x',&rotflg);
  OptionAdd(&opt,"flip",'x',&flip);

  OptionAdd(&opt,"lst",'x',&lstflg);
 
  OptionAdd(&opt,"t",'t',&tmetxt);
  OptionAdd(&opt,"d",'t',&dtetxt);
  
  OptionAdd(&opt,"smooth",'x',&smflg);

  OptionAdd(&opt,"ka",'f',&ka); 
  OptionAdd(&opt,"kd",'f',&kd);
  OptionAdd(&opt,"ks",'f',&ks);
  OptionAdd(&opt,"n",'f',&sn);
 


  arg=OptionProcess(1,argc,argv,&opt,NULL);  

  if (cfname !=NULL) { /* load the configuration file */
    int farg;
    do {
      fp=fopen(cfname,"r");
      if (fp==NULL) break;
      free(cfname);
      cfname=NULL;
      optf=OptionProcessFile(fp);
      if (optf !=NULL) {
        farg=OptionProcess(0,optf->argc,optf->argv,&opt,NULL);
        OptionFreeFile(optf);
       }   
       fclose(fp);
    } while (cfname !=NULL);
  }

  if (help==1) {
    OptionPrintInfo(stdout,hlpstr);
    exit(0);
  }

  if (option==1) {
    OptionDump(stdout,&opt);
    exit(0);
  }


  
  if (argc==arg) {
    OptionPrintInfo(stderr,errstr);
    exit(-1);
  }


  fp=fopen(argv[arg],"r");
  if (fp==NULL) {
    fprintf(stderr,"File not found.\n");
    exit(-1);
  }

  s=ElevationLoad(fp,&eldata);
  fclose(fp);

  if (s !=0) {
    fprintf(stderr,"Error loading elevation data.\n");
    exit(-1);
  }
  
  if (tmetxt !=NULL) tval=strtime(tmetxt);
  if (dtetxt !=NULL) {
    dval=strdate(dtetxt);
    tval+=dval;
  }
  TimeEpochToYMDHMS(tval,&yr,&mo,&dy,&hr,&mt,&sc);
  yrsec=TimeYMDHMSToYrsec(yr,mo,dy,hr,mt,sc);

  if ((ortho==0) && (stereo==0) && (gvp==0)) cylind=1;

  if ((lat<0) && (latmin>0)) latmin=-latmin;
  if ((lat>0) && (latmin<0)) latmin=-latmin;

  tfunc=MapCylindrical;
  if (ortho) tfunc=MapOrthographic;
  if (stereo) tfunc=MapStereographic;
  if (gvp) tfunc=MapGeneralVerticalPerspective;


  marg[0]=lat;
  marg[1]=lon;
  
  if ((ortho) || (gvp)) marg[2]=sf;
  else if (stereo) marg[2]=1.25*0.5*sf*90.0/(90-fabs(latmin));
  else marg[2]=1;
  marg[3]=flip;

  SZASolarLoc(yr,yrsec,&mlon,&dec);
  eqt=SZAEqOfTime(mlon,yr);

  if (magflg) tme_shft=-AACGMConvertMLT(yr,yrsec,0.0)*15.0; 
    else {
      if (lstflg) {
        LsoT=(hr*3600+mt*60+sc)+eqt;
        Hangle=15*(LsoT/3600);
        tme_shft=-Hangle;
      } else {
        LT=(hr*3600+mt*60+sc);
        Hangle=15*(LT/3600);
        tme_shft=-Hangle;
      }
    }

  if (rotflg)  marg[1]=lon+tme_shft;

  if ((wdt==0) || (hgt==0)) {
    fprintf(stderr,"invalid plot size.\n");
    exit(-1);
  }
      
  if (cylind) {
    marg[1]=0;
    marg[2]=0;
  }
 
  GeoMap(wdt,hgt,tfunc,marg,&ilat,&ilon);
  
  zbuf=malloc(sizeof(float)*wdt*hgt);

  minlat=eldata.lat+eldata.latsec/3600.0;
  minlon=eldata.lon+eldata.lonsec/3600.0;
  maxlat=minlat+eldata.numlat*eldata.latstp/36000.0;
  maxlon=minlon+eldata.numlon*eldata.lonstp/36000.0;
 
  if ((cylind) || (sqflg)) fbclp=NULL;
  else fbclp=fbclip(wdt,hgt);

  for (x=0;x<wdt;x++) {
    for (y=0;y<hgt;y++) {
      zbuf[y*wdt+x]=-1e6;
      if ((fbclp !=NULL) && (fbclp->clp[y*wdt+x]==0)) continue;
      if ((ilat[y*wdt+x]<-90.0) || (ilat[y*wdt+x]>90)) continue;
      glat=ilat[y*wdt+x];
      glon=ilon[y*wdt+x];

      if (magflg) {
	double mlat,mlon,rho;
        s=AACGMConvert(glat,glon,300.0,&mlat,&mlon,&rho,1);
        glat=mlat;
        glon=mlon;
      }

      if (cylind) {
        if (rotflg) glon+=lon+tme_shft;
        else glon+=lon;
      }
      if (glon>180) glon-=360;

      if (glat<minlat) continue;
      if (glon<minlon) continue;
      if (glat>=maxlat) continue;
      if (glon>=maxlon) continue;

      fy=(glat-minlat)/(maxlat-minlat);
      fx=(glon-minlon)/(maxlon-minlon);
     
      px=eldata.numlon*fx;
      py=eldata.numlat*fy;
 
      if (smflg) {    
        float l,r,b,t;
        l=eldata.data[px*eldata.numlat+py];
        if (px<eldata.numlon-1) r=eldata.data[(px+1)*eldata.numlat+py];
        else r=l;
        b=l+(r-l)*(eldata.numlon*fx-px);
        if (py<eldata.numlat-1) {
          l=eldata.data[px*eldata.numlat+py+1];
          if (px<eldata.numlon-1) r=eldata.data[(px+1)*eldata.numlat+py+1];
          else r=l;
	  t=l+(r-l)*(eldata.numlon*fx-px);
	} else t=b;
        e=b+(t-b)*(eldata.numlat*fy-py);
      } else e=eldata.data[px*eldata.numlat+py];
      zbuf[y*wdt+x]=e;
    }
  }
  PhongModel(wdt,hgt,0,zbuf,Lvec,kd,ks,sn,&dbuf,&sbuf); 
  ConvertFwriteInt(stdout,wdt);
  ConvertFwriteInt(stdout,hgt);
  for (y=0;y<hgt;y++) {
    for (x=0;x<wdt;x++) {
      ConvertFwriteFloat(stdout,zbuf[y*wdt+x]);
    }
  }
  
  for (y=0;y<hgt;y++) {
    for (x=0;x<wdt;x++) {
      ConvertFwriteFloat(stdout,ka+dbuf[y*wdt+x]);
    }
  }

  for (y=0;y<hgt;y++) {
    for (x=0;x<wdt;x++) {
      ConvertFwriteFloat(stdout,sbuf[y*wdt+x]);
    }
  }

  return 0;
}  
示例#8
0
float *SZAMap(int yr,int mo,int dy,int hr,int mt,int sc,float latmin,
               int wdt,int hgt,int mode,
	       int (*trf)(int ssze,void *src,int dsze, void *dst,void *data),
                 void *data) {

  float lat,lon;
  float xstep=1.0;
  float ystep=1.0;
  int xnum,ynum;

  int x,y;
  int s,i,j;
  float *pnt=NULL;
  float *zbuf=NULL;
  int *vertex=NULL;
  int *mapping=NULL;
  float *image=NULL;
  int num=0,tnum,poly=0,tpoly;
  float zeroval=-400;

  double LsoT;
  double Hangle;
  double Z,eqt;
  double dec;

  double tlon,tlat,r;

  dec=SZASolarDec(yr,mo,dy,hr,mt,sc);
  eqt=SZAEqOfTime(yr,mo,dy,hr,mt,sc);

  xnum=(360/xstep)+1;
  ynum=180.0/ystep+1;

  zbuf=malloc(sizeof(float)*xnum*ynum);
  pnt=malloc(sizeof(float)*xnum*ynum*2);
  vertex=malloc(sizeof(int)*xnum*ynum*4);
  mapping=malloc(sizeof(int)*xnum*ynum);

  for (y=0;y<ynum;y++) {
    for (x=0;x<xnum;x++) {
      lon=x*xstep;
      lat=-90+y*ystep;


      if (mode==0) {
	tlat=lat;
	tlon=lon;
      } else {
	s=AACGMConvert(lat,lon,0,&tlat,&tlon,&r,1);
      }

      LsoT=(hr*3600+mt*60+sc)+(tlon*4*60)+eqt;
      Hangle=15*((LsoT/3600)-12);
      Z=SZAAngle(tlon,tlat,dec,Hangle);
      
      if ((y !=ynum-1) && (x !=xnum-1)) {
	vertex[4*poly]=num;
	vertex[4*poly+1]=num+1;
	vertex[4*poly+2]=vertex[4*poly+1]+xnum;
	vertex[4*poly+3]=num+xnum;
	poly++;
      }

      zbuf[num]=Z;
      pnt[2*num]=lat;
      pnt[2*num+1]=lon;
      num++;
    }
  }
 
  tnum=0;
  for (i=0;i<num;i++) {
    mapping[i]=-1;
    s=(*trf)(2*sizeof(float),&pnt[2*i],2*sizeof(float),
              &pnt[2*tnum],data);
    if (s !=0) continue;
    mapping[i]=tnum;
    zbuf[tnum]=zbuf[i];
    pnt[2*tnum]=pnt[2*tnum]*wdt;
    pnt[2*tnum+1]=pnt[2*tnum+1]*hgt;
    tnum++;
  }

  tpoly=0;
  for (i=0;i<poly;i++) {
    for (j=0;j<4;j++) {
      if (mapping[vertex[4*i+j]]==-1) break;
      vertex[4*tpoly+j]=mapping[vertex[4*i+j]];
    }
    if (j<4) continue;
    tpoly++;
  }

  
  image=Raster(wdt,hgt,0,raster_FLOAT,&zeroval,tpoly,pnt,vertex,
               zbuf);
  
  free(pnt);
  free(vertex);
  free(zbuf);
  free(mapping);
  return image;

}