1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
/* -*-Mode: C;-*-
* Module: index <-> x-y <-> latlon wrapper routines
* CdXyIndex - x-y -> index
* CdIndexXy - index -> x-y
* CdLatLonXy - latlon -> x-y
* CdXyLatLon - x-y -> latlon
* CdIndexLatLon - index -> latlon
* CdLatLonIndex - latlon -> index
* CdMapGeom - map CDMS geom/order to NEONS geom
*
* Copyright: 1994, Regents of the University of California
* This software may not be distributed to others without
* permission of the author.
*
* Author: Bob Drach, Lawrence Livermore National Laboratory
* drach@llnl.gov
*
* Version: $Id$
*
* Revision History:
*
* $Log: cdRegTrfm.c,v $
* Revision 1.2 1996/02/21 23:56:46 drach
* - Overlayed cdtime routines in cdTimeConv.c:
* - Added seconds, julian calendar, changed include to cdmsint.h for old
* time routines in timeArith.c and timeConv.c
*
* Revision 1.1 1994/08/12 19:03:53 drach
* Entered into CVS
*
*
*/
#include <string.h>
#include <stdio.h>
#include <cdmsint.h>
#include <isdb.h>
extern void xy_index(REG_GEOM *, long *, long *, long *, int *);
extern void latlon_index(REG_GEOM *, double *, double *, long *, int *);
extern void index_xy(REG_GEOM *, long *, long *, long *, int *);
extern void index_latlon(REG_GEOM *, long *, double *, double *, int *);
extern void xy_latlon(REG_GEOM *, double *, double *, double *, double *, int *);
extern void latlon_xy(REG_GEOM *, double *, double *, double *, double *, int *);
extern void getf_latlon(REG_GEOM *, double *, double *, float *, float *, int *);
extern void putf_latlon(REG_GEOM *, double *, double *, float *, float *, int *);
/* copy CDMS geom to NEONS ngeom */
void
CdCopyGeom(CdRegGeom *geom, REG_GEOM *ngeom)
{
strncpy(ngeom->prjn_name,geom->prjnName,21);
ngeom->nx = geom->nx;
ngeom->ny = geom->ny;
ngeom->lat = geom->lat;
ngeom->lon = geom->lon;
ngeom->orig_ix = geom->orig_ix;
ngeom->orig_iy = geom->orig_iy;
ngeom->x_int_dis = geom->x_int_dis;
ngeom->y_int_dis = geom->y_int_dis;
ngeom->parm_1 = geom->parm_1;
ngeom->parm_2 = geom->parm_2;
ngeom->parm_3 = geom->parm_3;
return;
}
/* Copy CDMS geom & order to NEONS ngeom */
void
CdMapGeom(CdRegGeom *geom, CdOrder *order, REG_GEOM *ngeom)
{
if(order->lonDir < 0){
fprintf(stderr,"CDMS error: longitude direction must be non-negative.\n");
}
if(order->lonDir < order->latDir)
if(order->latDir > 0)
strcpy(ngeom->stor_dsc,"+x in +y");
else
strcpy(ngeom->stor_dsc,"+x in -y");
else
if(order->latDir > 0)
strcpy(ngeom->stor_dsc,"+y in +x");
else
strcpy(ngeom->stor_dsc,"-y in +x");
CdCopyGeom(geom,ngeom);
return;
}
int
CdXyIndex(CdRegGeom *geom, CdOrder *order, long ix, long iy, long *index)
{
REG_GEOM ngeom;
int status;
CdMapGeom(geom,order,&ngeom);
xy_index(&ngeom,&ix,&iy,index,&status);
return (status == 0 ? 0 : 1);
}
int
CdIndexXy(CdRegGeom *geom, CdOrder *order, long index, long *ix, long *iy)
{
REG_GEOM ngeom;
int status;
CdMapGeom(geom,order,&ngeom);
index_xy(&ngeom,&index,ix,iy,&status);
return (status == 0 ? 0 : 1);
}
int
CdLatLonXy(CdRegGeom *geom, double lat, double lon, double *x, double *y)
{
REG_GEOM ngeom;
int status;
CdCopyGeom(geom,&ngeom); /* order is unused */
latlon_xy(&ngeom,&lat,&lon,x,y,&status);
return (status == 0 ? 0 : 1);
}
int
CdXyLatLon(CdRegGeom *geom, double x, double y, double *lat, double *lon)
{
REG_GEOM ngeom;
int status;
CdCopyGeom(geom,&ngeom); /* order is unused */
xy_latlon(&ngeom,&x,&y,lat,lon,&status);
return (status == 0 ? 0 : 1);
}
int
CdIndexLatLon(CdRegGeom *geom, CdOrder *order, long index, double *lat, double *lon)
{
REG_GEOM ngeom;
int status;
CdMapGeom(geom,order,&ngeom);
index_latlon(&ngeom,&index,lat,lon,&status);
return (status == 0 ? 0 : 1);
}
int
CdLatLonIndex(CdRegGeom *geom, CdOrder *order, double lat, double lon, long *index)
{
REG_GEOM ngeom;
int status;
CdMapGeom(geom,order,&ngeom);
latlon_index(&ngeom,&lat,&lon,index,&status);
return (status == 0 ? 0 : 1);
}
|