Beispiel #1
0
struct PolygonData *make_fov(double tval,struct RadarNetwork *network,
                             int id) {
  double rho,lat,lon;
  int i,rn,bm;
  float pnt[2];
  int yr,mo,dy,hr,mt;
  double sc;
  int frang=180;
  int rsep=45;
  struct PolygonData *ptr=NULL;
  struct RadarSite *site=NULL;

  TimeEpochToYMDHMS(tval,&yr,&mo,&dy,&hr,&mt,&sc);
 
  ptr=PolygonMake(sizeof(float)*2,NULL);
         
  for (i=0;i<network->rnum;i++) {
  
    if (network->radar[i].status !=1) continue;
    if (network->radar[i].id==id) continue;
    site=RadarYMDHMSGetSite(&(network->radar[i]),yr,mo,dy,hr,mt,(int) sc);
    if (site==NULL) continue;
    PolygonAddPolygon(ptr,1);
    
    for (rn=0;rn<=site->maxrange;rn++) {
      RPosGeo(0,0,rn,site,frang,rsep,
                          site->recrise,0,&rho,&lat,&lon);
      pnt[0]=lat;
      pnt[1]=lon;
      PolygonAdd(ptr,pnt);
    }
    for (bm=1;bm<=site->maxbeam;bm++) {
      RPosGeo(0,bm,site->maxrange,site,frang,rsep,
                          site->recrise,0,&rho,&lat,&lon);
      pnt[0]=lat;
      pnt[1]=lon;
      PolygonAdd(ptr,pnt);
    }
    for (rn=site->maxrange-1;rn>=0;rn--) {
      RPosGeo(0,site->maxbeam,rn,site,frang,rsep,
                          site->recrise,0,&rho,&lat,&lon);
      pnt[0]=lat;
      pnt[1]=lon;
      PolygonAdd(ptr,pnt);
    }
    for (bm=site->maxbeam-1;bm>0;bm--) {
      RPosGeo(0,bm,0,site,frang,rsep,
                          site->recrise,0,&rho,&lat,&lon);
      pnt[0]=lat;
      pnt[1]=lon;
      PolygonAdd(ptr,pnt);
    }
  }
  return ptr;
}
Beispiel #2
0
int RPosRngBmAzmElv(int bm,int rn,int year,
                     struct RadarSite *hdw,double frang,
                     double rsep,double rx,double height,
                     double *azm,double *elv) {

  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;
  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));
  *azm=atan2d(ghy,-ghx);
  return 0;
}
Beispiel #3
0
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;
}
static PyObject *
PosGeo(PyRPosObject *self, PyObject *args, PyObject *kwds)
{
  PyObject *list=NULL, *timetuple=NULL;
  char *radarcode;
  struct RadarNetwork *network;
  struct Radar *radar;
  struct RadarSite *site;
  int center, bcrd, rcrd;
  int frang,rsep,rxrise,height;
  int yr,mo,dy,hr,mt;
  double sc;
  int stid;
  double rho,lat,lng;
  char *envstr=NULL;
  FILE *fp;
  int r,c;
  static char *kwlist[] = {"center","bcrd","rcrd","frang","rsep","rxrise","height", "radarcode","radarid","time",NULL};
  PyDateTime_IMPORT;
  center=0;
  bcrd=1;
  rcrd=15;
  frang=1200;
  rxrise=0;
  rsep=100;
  height=300;
  radarcode="kod";
  stid=-1;
  yr=2008;
  mo=7;
  dy=12;
  hr=12;
  mt=0;
  sc=0; 

  if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iiiiiiisiO", kwlist, 
                                      &center,&bcrd,&rcrd,&frang,&rsep,&rxrise,&height,&radarcode,&stid,&timetuple))
     return NULL; 

  if ( timetuple != NULL) {
    if (PyDateTime_Check(timetuple)) {	
      yr=PyDateTime_GET_YEAR(timetuple);   
      mo=PyDateTime_GET_MONTH(timetuple);  
      dy=PyDateTime_GET_DAY(timetuple);   
      hr=PyDateTime_DATE_GET_HOUR(timetuple);   
      mt=PyDateTime_DATE_GET_MINUTE(timetuple);   
      sc=PyDateTime_DATE_GET_SECOND(timetuple);   
    }
  }
  envstr=getenv("SD_RADAR");
  if (envstr==NULL) {
    fprintf(stderr,"Environment variable 'SD_RADAR' must be defined.\n");
    exit(-1);
  }

  fp=fopen(envstr,"r");

  if (fp==NULL) {
    fprintf(stderr,"Could not locate radar information file.\n");
    exit(-1);
  }

  network=RadarLoad(fp);
  fclose(fp); 

  if (network==NULL) {
    fprintf(stderr,"Failed to read radar information.\n");
    exit(-1);
  }

  envstr=getenv("SD_HDWPATH");
  if (envstr==NULL) {
    fprintf(stderr,"Environment variable 'SD_HDWPATH' must be defined.\n");
    exit(-1);
  }

  RadarLoadHardware(envstr,network);


  if (stid==-1) {
    stid=RadarGetID(network,radarcode);
  }
  radar=RadarGetRadar(network,stid);
  site=RadarYMDHMSGetSite(radar,yr,mo,dy,hr,mt,(int) sc);
  RPosGeo(center,bcrd,rcrd,site,frang,rsep,rxrise,height,&rho,&lat,&lng);
  radar=NULL;
  site=NULL;
  for (r=0;r<network->rnum;r++) {
    for (c=0;c<network->radar[r].cnum;c++) { 
      if (network->radar[r].code[c] !=NULL) free(network->radar[r].code[c]);
    } 
    if (network->radar[r].code !=NULL) free(network->radar[r].code);
    if (network->radar[r].name !=NULL) free(network->radar[r].name);
    if (network->radar[r].operator !=NULL) free(network->radar[r].operator);
    if (network->radar[r].hdwfname !=NULL) free(network->radar[r].hdwfname);
    if (network->radar[r].site !=NULL) free(network->radar[r].site);
  }
  free(network->radar);
  free(network);
  list = PyList_New(0);
  PyList_Append(list,Py_BuildValue("d",rho));
  PyList_Append(list,Py_BuildValue("d",lat));
  PyList_Append(list,Py_BuildValue("d",lng));
  return list;  
}