/*------------------------------------------------------------------------------ * datum.c : datum transformation * * Copyright (C) 2007 by T.TAKASU, All rights reserved. * * version : $Revision: 1.1 $ $Date: 2008/07/17 21:48:06 $ * history : 2007/02/08 1.0 new *-----------------------------------------------------------------------------*/ #include "rtklib.h" #define MAXPRM 400000 /* max number of parameter records */ typedef struct { /* datum trans parameter type */ int code; /* mesh code */ float db,dl; /* difference of latitude/longitude (sec) */ } tprm_t; static tprm_t *prm=NULL; /* datum trans parameter table */ static int n=0; /* datum trans parameter table size */ /* compare datum trans parameters --------------------------------------------*/ static int cmpprm(const void *p1, const void *p2) { tprm_t *q1=(tprm_t *)p1,*q2=(tprm_t *)p2; return q1->code-q2->code; } /* search datum trans parameter ----------------------------------------------*/ static int searchprm(double lat, double lon) { int i,j,k,n1,m1,n2,m2,code; lon-=6000.0; n1=(int)(lat/40.0); lat-=n1*40.0; m1=(int)(lon/60.0); lon-=m1*60.0; n2=(int)(lat/5.0); lat-=n2*5.0; m2=(int)(lon/7.5); lon-=m2*7.5; code=n1*1000000+m1*10000+n2*1000+m2*100+(int)(lat/0.5)*10+(int)(lon/0.75); for (i=0,j=n-1;i:error) * notes : parameters file shall comply with GSI TKY2JGD.par *-----------------------------------------------------------------------------*/ extern int loaddatump(const char *file) { FILE *fp; char buff[256]; if (n>0) return 0; /* already loaded */ if (!(fp=fopen(file,"r"))) { fprintf(stderr,"%s : datum prm file open error : %s\n",__FILE__,file); return -1; } if (!(prm=(tprm_t *)malloc(sizeof(tprm_t)*MAXPRM))) { fprintf(stderr,"%s : memory allocation error\n",__FILE__); return -1; } while (fgets(buff,sizeof(buff),fp)&&n=3) n++; } fclose(fp); qsort(prm,n,sizeof(tprm_t),cmpprm); /* sort parameter table */ return 0; } /* tokyo datum to JGD2000 datum ------------------------------------------------ * transform position in Tokyo datum to JGD2000 datum * args : double *pos I position in Tokyo datum {lat,lon,h} (rad,m) * O position in JGD2000 datum {lat,lon,h} (rad,m) * return : status (0:ok,0>:error,out of range) * notes : before calling, call loaddatump() to set parameter table *-----------------------------------------------------------------------------*/ extern int tokyo2jgd(double *pos) { double post[2],dpos[2]; post[0]=pos[0]; post[1]=pos[1]; if (dlatdlon(post,dpos)) return -1; pos[0]=post[0]+dpos[0]; pos[1]=post[1]+dpos[1]; return 0; } /* JGD2000 datum to Tokyo datum ------------------------------------------------ * transform position in JGD2000 datum to Tokyo datum * args : double *pos I position in JGD2000 datum {lat,lon,h} (rad,m) * O position in Tokyo datum {lat,lon,h} (rad,m) * return : status (0:ok,0>:error,out of range) * notes : before calling, call loaddatump() to set parameter table *-----------------------------------------------------------------------------*/ extern int jgd2tokyo(double *pos) { double posj[2],dpos[2]; int i; posj[0]=pos[0]; posj[1]=pos[1]; for (i=0;i<2;i++) { if (dlatdlon(pos,dpos)) return -1; pos[0]=posj[0]-dpos[0]; pos[1]=posj[1]-dpos[1]; } return 0; }