diff options
| author | ivost <ivost@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2009-01-18 16:29:57 +0000 |
|---|---|---|
| committer | ivost <ivost@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2009-01-18 16:29:57 +0000 |
| commit | 0edefa72381a149dfff329b64020ff3ec97035a4 (patch) | |
| tree | 47873886f8a8ec806c3ef0213d578eabda2e5693 /packages/proj4 | |
| parent | 629d6dc1ae8373f766cca72f672588d09534052c (diff) | |
| download | fpc-0edefa72381a149dfff329b64020ff3ec97035a4.tar.gz | |
* enabled proj4 for linux (other platforms will follow)
* finished proj4 translation
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@12563 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/proj4')
| -rw-r--r-- | packages/proj4/src/proj.pas | 835 |
1 files changed, 508 insertions, 327 deletions
diff --git a/packages/proj4/src/proj.pas b/packages/proj4/src/proj.pas index a21c9db3d1..957fc7c296 100644 --- a/packages/proj4/src/proj.pas +++ b/packages/proj4/src/proj.pas @@ -4,14 +4,14 @@ } (****************************************************************************** - * $Id: projects.h 1504 2009-01-06 02:11:57Z warmerdam $ + * $Id: proj_api.h,v 1.17 2008/07/21 20:47:09 fwarmerdam Exp $ * * Project: PROJ.4 - * Purpose: Primary (private) include file for PROJ.4 library. - * Author: Gerald Evenden + * Purpose: Public (application) include file for PROJ.4 API, and constants. + * Author: Frank Warmerdam, <warmerdam@pobox.com> * ****************************************************************************** - * Copyright (c) 2000, Frank Warmerdam + * Copyright (c) 2001, Frank Warmerdam <warmerdam@pobox.com> * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -30,12 +30,13 @@ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. - *****************************************************************************) + ******************************************************************************) unit proj; {$mode objfpc} {$MINENUMSIZE 4} +{$h+} interface @@ -59,343 +60,523 @@ const {$LINKLIB proj} {$ENDIF} +{ List of projections (proj=) + aea : Albers Equal Area + Conic Sph&Ell + lat_1= lat_2= + aeqd : Azimuthal Equidistant + Azi, Sph&Ell + lat_0 guam + airy : Airy + Misc Sph, no inv. + no_cut lat_b= + aitoff : Aitoff + Misc Sph + alsk : Mod. Stererographics of Alaska + Azi(mod) + apian : Apian Globular I + Misc Sph, no inv. + august : August Epicycloidal + Misc Sph, no inv. + bacon : Bacon Globular + Misc Sph, no inv. + bipc : Bipolar conic of western hemisphere + Conic Sph. + boggs : Boggs Eumorphic + PCyl., no inv., Sph. + bonne : Bonne (Werner lat_1=90) + Conic Sph&Ell + lat_1= + cass : Cassini + Cyl, Sph&Ell + cc : Central Cylindrical + Cyl, Sph + cea : Equal Area Cylindrical + Cyl, Sph&Ell + lat_ts= + chamb : Chamberlin Trimetric + Misc Sph, no inv. + lat_1= lon_1= lat_2= lon_2= lat_3= lon_3= + collg : Collignon + PCyl, Sph. + crast : Craster Parabolic (Putnins P4) + PCyl., Sph. + denoy : Denoyer Semi-Elliptical + PCyl., no inv., Sph. + eck1 : Eckert I + PCyl., Sph. + eck2 : Eckert II + PCyl. Sph. + eck3 : Eckert III + PCyl, Sph. + eck4 : Eckert IV + PCyl, Sph. + eck5 : Eckert V + PCyl, Sph. + eck6 : Eckert VI + PCyl, Sph. + eqc : Equidistant Cylindrical (Plate Caree) + Cyl, Sph + lat_ts= + eqdc : Equidistant Conic + Conic, Sph&Ell + lat_1= lat_2= + euler : Euler + Conic, Sph + lat_1= and lat_2= + fahey : Fahey + Pcyl, Sph. + fouc : Foucaut + PCyl., Sph. + fouc_s : Foucaut Sinusoidal + PCyl., Sph. + gall : Gall (Gall Stereographic) + Cyl, Sph + geos : Geostationary Satellite View + Azi, Sph&Ell + h= + gins8 : Ginsburg VIII (TsNIIGAiK) + PCyl, Sph., no inv. + gn_sinu : General Sinusoidal Series + PCyl, Sph. + m= n= + gnom : Gnomonic + Azi, Sph. + goode : Goode Homolosine + PCyl, Sph. + gs48 : Mod. Stererographics of 48 U.S. + Azi(mod) + gs50 : Mod. Stererographics of 50 U.S. + Azi(mod) + hammer : Hammer & Eckert-Greifendorff + Misc Sph, no inv. + W= M= + hatano : Hatano Asymmetrical Equal Area + PCyl, Sph. + imw_p : International Map of the World Polyconic + Mod. Polyconic, Ell + lat_1= and lat_2= [lon_1=] + kav5 : Kavraisky V + PCyl., Sph. + kav7 : Kavraisky VII + PCyl, Sph. + krovak : Krovak + PCyl., Ellps. + labrd : Laborde + Cyl, Sph + Special for Madagascar + laea : Lambert Azimuthal Equal Area + Azi, Sph&Ell + lagrng : Lagrange + Misc Sph, no inv. + W= + larr : Larrivee + Misc Sph, no inv. + lask : Laskowski + Misc Sph, no inv. + lonlat : Lat/long (Geodetic) + + latlon : Lat/long (Geodetic alias) + + lcc : Lambert Conformal Conic + Conic, Sph&Ell + lat_1= and lat_2= or lat_0 + lcca : Lambert Conformal Conic Alternative + Conic, Sph&Ell + lat_0= + leac : Lambert Equal Area Conic + Conic, Sph&Ell + lat_1= south + lee_os : Lee Oblated Stereographic + Azi(mod) + loxim : Loximuthal + PCyl Sph + lsat : Space oblique for LANDSAT + Cyl, Sph&Ell + lsat= path= + mbt_s : McBryde-Thomas Flat-Polar Sine (No. 1) + PCyl., Sph. + mbt_fps : McBryde-Thomas Flat-Pole Sine (No. 2) + Cyl., Sph. + mbtfpp : McBride-Thomas Flat-Polar Parabolic + Cyl., Sph. + mbtfpq : McBryde-Thomas Flat-Polar Quartic + Cyl., Sph. + mbtfps : McBryde-Thomas Flat-Polar Sinusoidal + PCyl, Sph. + merc : Mercator + Cyl, Sph&Ell + lat_ts= + mil_os : Miller Oblated Stereographic + Azi(mod) + mill : Miller Cylindrical + Cyl, Sph + moll : Mollweide + PCyl., Sph. + murd1 : Murdoch I + Conic, Sph + lat_1= and lat_2= + murd2 : Murdoch II + Conic, Sph + lat_1= and lat_2= + murd3 : Murdoch III + Conic, Sph + lat_1= and lat_2= + nell : Nell + PCyl., Sph. + nell_h : Nell-Hammer + PCyl., Sph. + nicol : Nicolosi Globular + Misc Sph, no inv. + nsper : Near-sided perspective + Azi, Sph + h= + nzmg : New Zealand Map Grid + fixed Earth + ob_tran : General Oblique Transformation + Misc Sph + o_proj= plus parameters for projection + o_lat_p= o_lon_p= (new pole) or + o_alpha= o_lon_c= o_lat_c= or + o_lon_1= o_lat_1= o_lon_2= o_lat_2= + ocea : Oblique Cylindrical Equal Area + Cyl, Sphlonc= alpha= or + lat_1= lat_2= lon_1= lon_2= + oea : Oblated Equal Area + Misc Sph + n= m= theta= + omerc : Oblique Mercator + Cyl, Sph&Ell + no_rot rot_conv no_uoff and + alpha= lonc= or + lon_1= lat_1= lon_2= lat_2= + ortel : Ortelius Oval + Misc Sph, no inv. + ortho : Orthographic + Azi, Sph. + pconic : Perspective Conic + Conic, Sph + lat_1= and lat_2= + poly : Polyconic (American) + Conic, Sph&Ell + putp1 : Putnins P1 + PCyl, Sph. + putp2 : Putnins P2 + PCyl., Sph. + putp3 : Putnins P3 + PCyl., Sph. + putp3p : Putnins P3' + PCyl., no inv., Sph. + putp4p : Putnins P4' + PCyl., Sph. + putp5 : Putnins P5 + PCyl., Sph. + putp5p : Putnins P5' + PCyl., Sph. + putp6 : Putnins P6 + PCyl., Sph. + putp6p : Putnins P6' + PCyl., Sph. + qua_aut : Quartic Authalic + PCyl., Sph. + robin : Robinson + PCyl., Sph. + rouss : Roussilhe Stereographic + Azi., Ellps. + rpoly : Rectangular Polyconic + Conic, Sph., no inv. + lat_ts= + sinu : Sinusoidal (Sanson-Flamsteed) + PCyl, Sph&Ell + somerc : Swiss. Obl. Mercator + Cyl, Ell + For CH1903 + stere : Stereographic + Azi, Sph&Ell + lat_ts= + sterea : Oblique Stereographic Alternative + Azimuthal, Sph&Ell + tcc : Transverse Central Cylindrical + Cyl, Sph, no inv. + tcea : Transverse Cylindrical Equal Area + Cyl, Sph + tissot : Tissot + Conic, Sph + lat_1= and lat_2= + tmerc : Transverse Mercator + Cyl, Sph&Ell + tpeqd : Two Point Equidistant + Misc Sph + lat_1= lon_1= lat_2= lon_2= + tpers : Tilted perspective + Azi, Sph + tilt= azi= h= + ups : Universal Polar Stereographic + Azi, Sph&Ell + south + urm5 : Urmaev V + PCyl., Sph. + n= q= alphi= + urmfps : Urmaev Flat-Polar Sinusoidal + PCyl, Sph. + n= + utm : Universal Transverse Mercator (UTM) + Cyl, Sph + zone= south + vandg : van der Grinten (I) + Misc Sph + vandg2 : van der Grinten II + Misc Sph, no inv. + vandg3 : van der Grinten III + Misc Sph, no inv. + vandg4 : van der Grinten IV + Misc Sph, no inv. + vitk1 : Vitkovsky I + Conic, Sph + lat_1= and lat_2= + wag1 : Wagner I (Kavraisky VI) + PCyl, Sph. + wag2 : Wagner II + PCyl., Sph. + wag3 : Wagner III + PCyl., Sph. + lat_ts= + wag4 : Wagner IV + PCyl., Sph. + wag5 : Wagner V + PCyl., Sph. + wag6 : Wagner VI + PCyl, Sph. + wag7 : Wagner VII + Misc Sph, no inv. + weren : Werenskiold I + PCyl., Sph. + wink1 : Winkel I + PCyl., Sph. + lat_ts= + wink2 : Winkel II + PCyl., Sph., no inv. + lat_1= + wintri : Winkel Tripel + Misc Sph + lat_1 +} -(***********************************************************************) -(* Header : projects.h *) -(***********************************************************************) - -(* prototype hypot for systems where absent *) -#ifndef _WIN32 -extern double hypot(double, double); -#endif +type + size_t = ptrint; -#ifdef _WIN32_WCE -# include <wce_stdlib.h> -# include <wce_stdio.h> -# define rewind wceex_rewind -# define getenv wceex_getenv -# define strdup _strdup -# define hypot _hypot -#endif -(* some useful constants *) +(* Try to update this every version! *) const - HALFPI = 1.5707963267948966; - FORTPI = 0.78539816339744833; - PI = 3.14159265358979323846; - TWOPI = 6.2831853071795864769; + PJ_VERSION = 461; -(* maximum tag id length for +init and default files *) - ID_TAG_MAX = 50; +//extern char const pj_release[]; /* global release id string */ -(* directory delimiter for DOS support *) -{$IFDEF WINDOWS} - DIR_CHAR = '\\'; -{$ELSE} - DIR_CHAR = '/'; -{$ENDIF} +const + RAD_TO_DEG = 57.29577951308232; + DEG_TO_RAD = 0.0174532925199432958; -(* datum_type values *) - PJD_UNKNOWN = 0; - PJD_3PARAM = 1; - PJD_7PARAM = 2; - PJD_GRIDSHIFT = 3; - PJD_WGS84 = 4; (* WGS84 (or anything considered equivelent) *) -(* datum system errors *) - PJD_ERR_GEOCENTRIC = -45; +//extern int pj_errno; /* global error return code */ type projUV = record - u,v: double; + u, v: cdouble; end; - COMPLEX = record - r,i: double; - end; + projPJ = pointer; + projXY = projUV; + projLP = projUV; -(*#ifndef PJ_LIB__ -#define XY projUV -#define LP projUV -#else -typedef struct { double x, y; } XY; -typedef struct { double lam, phi; } LP; -#endif*) - -typedef union { double f; int i; char *s; } PVALUE; -struct PJconsts; - -struct PJ_LIST { - char *id; (* projection keyword *) - struct PJconsts *(*proj)(struct PJconsts*);(* projection entry point *) - char * const *descr; (* description text *) -}; -struct PJ_ELLPS { - char *id; (* ellipse keyword name *) - char *major; (* a= value *) - char *ell; (* elliptical parameter *) - char *name; (* comments *) -}; -struct PJ_UNITS { - char *id; (* units keyword *) - char *to_meter; (* multiply by value to get meters *) - char *name; (* comments *) -}; - -struct PJ_DATUMS { - char *id; (* datum keyword *) - char *defn; (* ie. "to_wgs84=..." *) - char *ellipse_id; (* ie from ellipse table *) - char *comments; (* EPSG code, etc *) -}; - -struct PJ_PRIME_MERIDIANS { - char *id; (* prime meridian keyword *) - char *defn; (* offset from greenwich in DMS format. *) -}; - -struct DERIVS { - double x_l, x_p; (* derivatives of x for lambda-phi *) - double y_l, y_p; (* derivatives of y for lambda-phi *) -}; - -struct FACTORS { - struct DERIVS der; - double h, k; (* meridinal, parallel scales *) - double omega, thetap; (* angular distortion, theta prime *) - double conv; (* convergence *) - double s; (* areal scale factor *) - double a, b; (* max-min scale error *) - int code; (* info as to analytics, see following *) -}; -#define IS_ANAL_XL_YL 01 (* derivatives of lon analytic *) -#define IS_ANAL_XP_YP 02 (* derivatives of lat analytic *) -#define IS_ANAL_HK 04 (* h and k analytic *) -#define IS_ANAL_CONV 010 (* convergence analytic *) - (* parameter list struct *) -typedef struct ARG_list { - struct ARG_list *next; - char used; - char param[1]; } paralist; - (* base projection data structure *) - - -typedef struct PJconsts { - XY (*fwd)(LP, struct PJconsts *); - LP (*inv)(XY, struct PJconsts *); - void (*spc)(LP, struct PJconsts *, struct FACTORS *); - void (*pfree)(struct PJconsts *); - const char *descr; - paralist *params; (* parameter list *) - int over; (* over-range flag *) - int geoc; (* geocentric latitude flag *) - int is_latlong; (* proj=latlong ... not really a projection at all *) - int is_geocent; (* proj=geocent ... not really a projection at all *) - double - a, (* major axis or radius if es==0 *) - a_orig, (* major axis before any +proj related adjustment *) - es, (* e ^ 2 *) - es_orig, (* es before any +proj related adjustment *) - e, (* eccentricity *) - ra, (* 1/A *) - one_es, (* 1 - e^2 *) - rone_es, (* 1/one_es *) - lam0, phi0, (* central longitude, latitude *) - x0, y0, (* easting and northing *) - k0, (* general scaling factor *) - to_meter, fr_meter; (* cartesian scaling *) - - int datum_type; (* PJD_UNKNOWN/3PARAM/7PARAM/GRIDSHIFT/WGS84 *) - double datum_params[7]; - double from_greenwich; (* prime meridian offset (in radians) *) - double long_wrap_center; (* 0.0 for -180 to 180, actually in radians*) - -#ifdef PROJ_PARMS__ -PROJ_PARMS__ -#endif (* end of optional extensions *) -} PJ; - -(* public API *) -#include "proj_api.h" - -(* Generate pj_list external or make list from include file *) -#ifndef PJ_LIST_H -extern struct PJ_LIST pj_list[]; -#else -#define PROJ_HEAD(id, name) \ - struct PJconsts *pj_##id(struct PJconsts*); extern char * const pj_s_##id; - -#ifndef lint -#define DO_PJ_LIST_ID -#endif -#include PJ_LIST_H -#ifndef lint -#undef DO_PJ_LIST_ID -#endif -#undef PROJ_HEAD -#define PROJ_HEAD(id, name) {#id, pj_##id, &pj_s_##id}, - struct PJ_LIST -pj_list[] = { -#include PJ_LIST_H - {0, 0, 0}, - }; -#undef PROJ_HEAD -#endif - -#ifndef PJ_ELLPS__ -extern struct PJ_ELLPS pj_ellps[]; -#endif - -#ifndef PJ_UNITS__ -extern struct PJ_UNITS pj_units[]; -#endif - -#ifndef PJ_DATUMS__ -extern struct PJ_DATUMS pj_datums[]; -extern struct PJ_PRIME_MERIDIANS pj_prime_meridians[]; -#endif - -#ifdef PJ_LIB__ - (* repeatative projection code *) -#define PROJ_HEAD(id, name) static const char des_##id [] = name -#define ENTRYA(name) \ - C_NAMESPACE_VAR const char * const pj_s_##name = des_##name; \ - C_NAMESPACE PJ *pj_##name(PJ *P) { if (!P) { \ - if( (P = (PJ*) pj_malloc(sizeof(PJ))) != NULL) { \ - P->pfree = freeup; P->fwd = 0; P->inv = 0; \ - P->spc = 0; P->descr = des_##name; -#define ENTRYX } return P; } else { -#define ENTRY0(name) ENTRYA(name) ENTRYX -#define ENTRY1(name, a) ENTRYA(name) P->a = 0; ENTRYX -#define ENTRY2(name, a, b) ENTRYA(name) P->a = 0; P->b = 0; ENTRYX -#define ENDENTRY(p) } return (p); } -#define E_ERROR(err) { pj_errno = err; freeup(P); return(0); } -#define E_ERROR_0 { freeup(P); return(0); } -#define F_ERROR { pj_errno = -20; return(xy); } -#define I_ERROR { pj_errno = -20; return(lp); } -#define FORWARD(name) static XY name(LP lp, PJ *P) { XY xy = {0.0,0.0} -#define INVERSE(name) static LP name(XY xy, PJ *P) { LP lp = {0.0,0.0} -#define FREEUP static void freeup(PJ *P) { -#define SPECIAL(name) static void name(LP lp, PJ *P, struct FACTORS *fac) -#endif -#define MAX_TAB_ID 80 -typedef struct { float lam, phi; } FLP; -typedef struct { int lam, phi; } ILP; - -struct CTABLE { - char id[MAX_TAB_ID]; (* ascii info *) - LP ll; (* lower left corner coordinates *) - LP del; (* size of cells *) - ILP lim; (* limits of conversion matrix *) - FLP *cvs; (* conversion matrix *) -}; - -typedef struct _pj_gi { - char *gridname; (* identifying name of grid, eg "conus" or ntv2_0.gsb *) - char *filename; (* full path to filename *) - - const char *format; (* format of this grid, ie "ctable", "ntv1", - "ntv2" or "missing". *) - - int grid_offset; (* offset in file, for delayed loading *) - - struct CTABLE *ct; - - struct _pj_gi *next; - struct _pj_gi *child; -} PJ_GRIDINFO; (* procedure prototypes *) -double dmstor(const char *, char **); -void set_rtodms(int, int); -char *rtodms(char *, double, int, int); -double adjlon(double); -double aacos(double), aasin(double), asqrt(double), aatan2(double, double); -PVALUE pj_param(paralist *, char *); -paralist *pj_mkparam(char *); -int pj_ell_set(paralist *, double *, double *); -int pj_datum_set(paralist *, PJ *); -int pj_prime_meridian_set(paralist *, PJ *); -int pj_angular_units_set(paralist *, PJ *); -double *pj_enfn(double); -double pj_mlfn(double, double, double, double *); -double pj_inv_mlfn(double, double, double *); -double pj_qsfn(double, double, double); -double pj_tsfn(double, double, double); -double pj_msfn(double, double, double); -double pj_phi2(double, double); -double pj_qsfn_(double, PJ *); -double *pj_authset(double); -double pj_authlat(double, double *); -COMPLEX pj_zpoly1(COMPLEX, COMPLEX *, int); -COMPLEX pj_zpolyd1(COMPLEX, COMPLEX *, int, COMPLEX *); -FILE *pj_open_lib(char *, char *); - -int pj_deriv(LP, double, PJ *, struct DERIVS *); -int pj_factors(LP, PJ *, double, struct FACTORS *); - -struct PW_COEF {(* row coefficient structure *) - int m; (* number of c coefficients (=0 for none) *) - double *c; (* power coefficients *) -}; - -(* Approximation structures and procedures *) -typedef struct { (* Chebyshev or Power series structure *) - projUV a, b; (* power series range for evaluation *) - (* or Chebyshev argument shift/scaling *) - struct PW_COEF *cu, *cv; - int mu, mv; (* maximum cu and cv index (+1 for count) *) - int power; (* != 0 if power series, else Chebyshev *) -} Tseries; -Tseries *mk_cheby(projUV, projUV, double, projUV *, projUV (*)(projUV), int, int, int); -projUV bpseval(projUV, Tseries *); -projUV bcheval(projUV, Tseries *); -projUV biveval(projUV, Tseries *); -void *vector1(int, int); -void **vector2(int, int, int); -void freev2(void **v, int nrows); -int bchgen(projUV, projUV, int, int, projUV **, projUV(*)(projUV)); -int bch2bps(projUV, projUV, projUV **, int, int); -(* nadcon related protos *) -LP nad_intr(LP, struct CTABLE *); -LP nad_cvt(LP, int, struct CTABLE *); -struct CTABLE *nad_init(char *); -struct CTABLE *nad_ctable_init( FILE * fid ); -int nad_ctable_load( struct CTABLE *, FILE * fid ); -void nad_free(struct CTABLE *); - -(* higher level handling of datum grid shift files *) - -PJ_GRIDINFO **pj_gridlist_from_nadgrids( const char *, int * ); -void pj_deallocate_grids(); - -PJ_GRIDINFO *pj_gridinfo_init( const char * ); -int pj_gridinfo_load( PJ_GRIDINFO * ); -void pj_gridinfo_free( PJ_GRIDINFO * ); - -void *proj_mdist_ini(double); -double proj_mdist(double, double, double, const void *); -double proj_inv_mdist(double, const void *); -void *pj_gauss_ini(double, double, double *,double *); -LP pj_gauss(LP, const void *); -LP pj_inv_gauss(LP, const void *); - -extern char const pj_release[]; - -struct PJ_ELLPS *pj_get_ellps_ref( void ); -struct PJ_DATUMS *pj_get_datums_ref( void ); -struct PJ_UNITS *pj_get_units_ref( void ); -struct PJ_LIST *pj_get_list_ref( void ); -struct PJ_PRIME_MERIDIANS *pj_get_prime_meridians_ref( void ); - -#ifndef DISABLE_CVSID -# define PJ_CVSID(string) static char pj_cvsid[] = string; \ -static char *cvsid_aw() { return( cvsid_aw() ? ((char *) NULL) : pj_cvsid ); } -#else -# define PJ_CVSID(string) -#endif - -#ifdef __cplusplus -} +function pj_fwd(val: projLP; proj: projPJ): projXY; cdecl; external; +function pj_inv(val: projXY; proj: projPJ): projLP; cdecl; external; +function pj_transform(src, dst: projPJ; point_count: clong; point_offset: cint; x,y,z: pcdouble): cint; cdecl; external; +function pj_datum_transform(src, dst: projPJ; point_count: clong; point_offset: cint; x,y,z: pcdouble): cint; cdecl; external; +function pj_geocentric_to_geodetic(a, es: cdouble; point_count: clong; point_offset: cint; x,y,z: pcdouble): cint; cdecl; external; +function pj_geodetic_to_geocentric(a, es: cdouble; point_count: clong; point_offset: cint; x,y,z: pcdouble): cint; cdecl; external; +function pj_compare_datums(srcdefn: projPJ; dstdefn: projPJ): cint; cdecl; external; +function pj_apply_gridshift(c: pchar; i: cint; point_count: clong; point_offset: cint; x,y,z: pcdouble): cint; cdecl; external; + +type + projFinder = function(s: pchar): pchar; cdecl; + +procedure pj_deallocate_grids; cdecl; external; +function pj_is_latlong(proj: projPJ): cint; cdecl; external; +function pj_is_geocent(proj: projPJ): cint; cdecl; external; +procedure pj_pr_list(proj: projPJ); cdecl; external; +procedure pj_free(proj: projPJ); cdecl; external; +procedure pj_set_finder(finder: projFinder); cdecl; external; +procedure pj_set_searchpath(count: cint; path: ppchar); cdecl; external; +function pj_init(argc: cint; argv: ppchar): projPJ; cdecl; external; +function pj_init_plus(args: pchar): projPJ; cdecl; external; +function pj_get_def(proj: projPJ; i: cint): pchar; cdecl; external; +function pj_latlong_from_proj(proj: projPJ): projPJ; cdecl; external; +function pj_malloc(size: size_t): pointer; cdecl; external; +procedure pj_dalloc(ptr: pointer); cdecl; external; +function pj_strerrno(err: cint): pchar; cdecl; external; +function pj_get_errno_ref: pcint; cdecl; external; +function pj_get_release: pchar; cdecl; external; + + + +(***************************************************************************) +(* RSC IDENTIFIER: GEOCENTRIC + * + * ABSTRACT + * + * This component provides conversions between Geodetic coordinates (latitude, + * longitude in radians and height in meters) and Geocentric coordinates + * (X, Y, Z) in meters. + * + * ERROR HANDLING + * + * This component checks parameters for valid values. If an invalid value + * is found, the error code is combined with the current error code using + * the bitwise or. This combining allows multiple error codes to be + * returned. The possible error codes are: + * + * GEOCENT_NO_ERROR : No errors occurred in function + * GEOCENT_LAT_ERROR : Latitude out of valid range + * (-90 to 90 degrees) + * GEOCENT_LON_ERROR : Longitude out of valid range + * (-180 to 360 degrees) + * GEOCENT_A_ERROR : Semi-major axis less than or equal to zero + * GEOCENT_B_ERROR : Semi-minor axis less than or equal to zero + * GEOCENT_A_LESS_B_ERROR : Semi-major axis less than semi-minor axis + * + * + * REUSE NOTES + * + * GEOCENTRIC is intended for reuse by any application that performs + * coordinate conversions between geodetic coordinates and geocentric + * coordinates. + * + * + * REFERENCES + * + * An Improved Algorithm for Geocentric to Geodetic Coordinate Conversion, + * Ralph Toms, February 1996 UCRL-JC-123138. + * + * Further information on GEOCENTRIC can be found in the Reuse Manual. + * + * GEOCENTRIC originated from : U.S. Army Topographic Engineering Center + * Geospatial Information Division + * 7701 Telegraph Road + * Alexandria, VA 22310-3864 + * + * LICENSES + * + * None apply to this component. + * + * RESTRICTIONS + * + * GEOCENTRIC has no restrictions. + * + * ENVIRONMENT + * + * GEOCENTRIC was tested and certified in the following environments: + * + * 1. Solaris 2.5 with GCC version 2.8.1 + * 2. Windows 95 with MS Visual C++ version 6 + * + * MODIFICATIONS + * + * Date Description + * ---- ----------- + * + * + *) + + +(***************************************************************************) +(* + * DEFINES + *) +const + GEOCENT_NO_ERROR = $0000; + GEOCENT_LAT_ERROR = $0001; + GEOCENT_LON_ERROR = $0002; + GEOCENT_A_ERROR = $0004; + GEOCENT_B_ERROR = $0008; + GEOCENT_A_LESS_B_ERROR = $0010; + + +(***************************************************************************) +(* + * FUNCTION PROTOTYPES + *) + +type + PGeocentricInfo = ^GeocentricInfo; + GeocentricInfo = record + Geocent_a : cdouble; (* Semi-major axis of ellipsoid in meters *) + Geocent_b : cdouble; (* Semi-minor axis of ellipsoid *) + Geocent_a2 : cdouble; (* Square of semi-major axis *) + Geocent_b2 : cdouble; (* Square of semi-minor axis *) + Geocent_e2 : cdouble; (* Eccentricity squared *) + Geocent_ep2 : cdouble; (* 2nd eccentricity squared *) + end; + + +procedure pj_Init_Geocentric(var gi: GeocentricInfo); cdecl; external; +function pj_Set_Geocentric_Parameters(var gi: GeocentricInfo; a, b: cdouble): clong; cdecl; external; + +(* + * The function Set_Geocentric_Parameters receives the ellipsoid parameters + * as inputs and sets the corresponding state variables. + * + * a : Semi-major axis, in meters. (input) + * b : Semi-minor axis, in meters. (input) + *) + + +procedure pj_Get_Geocentric_Parameters(var gi: GeocentricInfo; var a, b: cdouble); cdecl; external; + +(* + * The function Get_Geocentric_Parameters returns the ellipsoid parameters + * to be used in geocentric coordinate conversions. + * + * a : Semi-major axis, in meters. (output) + * b : Semi-minor axis, in meters. (output) + *) + + +function pj_Convert_Geodetic_To_Geocentric(var gi: GeocentricInfo; Latitude, Longitude, Height: cdouble; + var X, Y, Z: cdouble): clong; cdecl; external; + +(* + * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates + * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z), + * according to the current ellipsoid parameters. + * + * Latitude : Geodetic latitude in radians (input) + * Longitude : Geodetic longitude in radians (input) + * Height : Geodetic height, in meters (input) + * X : Calculated Geocentric X coordinate, in meters. (output) + * Y : Calculated Geocentric Y coordinate, in meters. (output) + * Z : Calculated Geocentric Z coordinate, in meters. (output) + * + *) + + +procedure pj_Convert_Geocentric_To_Geodetic(var gi: GeocentricInfo; X, Y, Z: cdouble; + var Latitude, Longitude, Height: cdouble); cdecl; external; + +(* + * The function Convert_Geocentric_To_Geodetic converts geocentric + * coordinates (X, Y, Z) to geodetic coordinates (latitude, longitude, + * and height), according to the current ellipsoid parameters. + * + * X : Geocentric X coordinate, in meters. (input) + * Y : Geocentric Y coordinate, in meters. (input) + * Z : Geocentric Z coordinate, in meters. (input) + * Latitude : Calculated latitude value in radians. (output) + * Longitude : Calculated longitude value in radians. (output) + * Height : Calculated height value, in meters. (output) + *) + +implementation end. |
