OpenCPN Partial API docs
Loading...
Searching...
No Matches
georef.h
Go to the documentation of this file.
1/***************************************************************************
2 * Copyright (C) 2010 by David S. Register *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, see <https://www.gnu.org/licenses/>. *
16 **************************************************************************/
17
27#ifndef GEOREF_H_
28#define GEOREF_H_
29
30#include <stdio.h>
31#include <string.h>
32#include <ctype.h>
33
34//------------------------
35struct DATUM {
36 const char *name;
37 short ellipsoid;
38 double dx;
39 double dy;
40 double dz;
41};
42
43struct ELLIPSOID {
44 const char *name; // name of ellipsoid
45 double a; // semi-major axis, meters
46 double invf; // 1/f
47};
48
63struct GeoRef {
64 int status;
66 int count;
67 int order;
68 double *tx;
69 double *ty;
70 double *lon;
71 double *lat;
72 double *pwx;
74 double *pwy;
76 double *wpx;
77 double *wpy;
78 int txmax;
79 int tymax;
80 int txmin;
81 int tymin;
82 double lonmax;
83 double lonmin;
84 double latmax;
85 double latmin;
86};
87
88#ifndef PI
89#define PI 3.1415926535897931160E0 /* pi */
90#endif
91#define DEGREE (PI / 180.0)
92#define RADIAN (180.0 / PI)
93
94#define DATUM_INDEX_WGS84 101
95#define DATUM_INDEX_UNKNOWN -1
96
97static const double WGS84_semimajor_axis_meters =
98 6378137.0; // WGS84 semimajor axis
99static const double mercator_k0 = 0.9996;
100static const double WGSinvf = 298.257223563; /* WGS84 1/f */
101
102void datumParams(short datum, double *a, double *es);
103
104// Make these conversion routines useable by C or C++
105
106#ifdef __cplusplus
117extern "C" void toDMS(double a, char *bufp, int bufplen);
128extern "C" void toDMM(double a, char *bufp, int bufplen);
129
143extern "C" void todmm(int flag, double a, char *bufp, int bufplen);
144
161extern "C" void toTM(float lat, float lon, float lat0, float lon0, double *x,
162 double *y);
163
180extern "C" void fromTM(double x, double y, double lat0, double lon0,
181 double *lat, double *lon);
182
197extern "C" void toSM(double lat, double lon, double lat0, double lon0,
198 double *x, double *y);
199
210extern "C" double toSMcache_y30(double lat0);
211
227extern "C" void toSMcache(double lat, double lon, double y30, double lon0,
228 double *x, double *y);
244extern "C" void fromSM(double x, double y, double lat0, double lon0,
245 double *lat, double *lon);
246
263extern "C" void fromSMR(double x, double y, double lat0, double lon0,
264 double axis_meters, double *lat, double *lon);
265
281extern "C" void toSM_ECC(double lat, double lon, double lat0, double lon0,
282 double *x, double *y);
283
299extern "C" void fromSM_ECC(double x, double y, double lat0, double lon0,
300 double *lat, double *lon);
301
317extern "C" void toPOLY(double lat, double lon, double lat0, double lon0,
318 double *x, double *y);
319
334extern "C" void fromPOLY(double x, double y, double lat0, double lon0,
335 double *lat, double *lon);
336
349extern "C" void cache_phi0(double lat0, double *sin_phi0, double *cos_phi0);
350
367extern "C" void toORTHO(double lat, double lon, double sin_phi0,
368 double cos_phi0, double lon0, double *x, double *y);
369
384extern "C" void fromORTHO(double x, double y, double lat0, double lon0,
385 double *lat, double *lon);
386
397extern "C" double toPOLARcache_e(double lat0);
398
414extern "C" void toPOLAR(double lat, double lon, double e, double lat0,
415 double lon0, double *x, double *y);
416
430extern "C" void fromPOLAR(double x, double y, double lat0, double lon0,
431 double *lat, double *lon);
432
451extern "C" void toSTEREO(double lat, double lon, double sin_phi0,
452 double cos_phi0, double lon0, double *x, double *y);
469extern "C" void fromSTEREO(double x, double y, double lat0, double lon0,
470 double *lat, double *lon);
471
491extern "C" void toGNO(double lat, double lon, double sin_phi0, double cos_phi0,
492 double lon0, double *x, double *y);
510extern "C" void fromGNO(double x, double y, double lat0, double lon0,
511 double *lat, double *lon);
512
528extern "C" void toEQUIRECT(double lat, double lon, double lat0, double lon0,
529 double *x, double *y);
530
545extern "C" void fromEQUIRECT(double x, double y, double lat0, double lon0,
546 double *lat, double *lon);
547
564extern "C" void ll_gc_ll(double lat, double lon, double crs, double dist,
565 double *dlat, double *dlon);
581extern "C" void ll_gc_ll_reverse(double lat1, double lon1, double lat2,
582 double lon2, double *bearing, double *dist);
583
601extern "C" void PositionBearingDistanceMercator(double lat, double lon,
602 double brg, double dist,
603 double *dlat, double *dlon);
617extern "C" double DistGreatCircle(double slat, double slon, double dlat,
618 double dlon);
633extern "C" double DistLoxodrome(double slat, double slon, double dlat,
634 double dlon);
635
647extern "C" int GetDatumIndex(const char *str);
648
664extern "C" void MolodenskyTransform(double lat, double lon, double *to_lat,
665 double *to_lon, int from_datum_index,
666 int to_datum_index);
667
685extern "C" void DistanceBearingMercator(double lat1, double lon1, double lat0,
686 double lon0, double *brg, double *dist);
687
688extern "C" int Georef_Calculate_Coefficients(struct GeoRef *cp, int nlin_lon);
689extern "C" int Georef_Calculate_Coefficients_Proj(struct GeoRef *cp);
707extern "C" double lat_gc_crosses_meridian(double lat1, double lon1, double lat2,
708 double lon2, double lon);
726extern "C" double lat_rl_crosses_meridian(double lat1, double lon1, double lat2,
727 double lon2, double lon);
728
729#else
730void toDMS(double a, char *bufp, int bufplen);
731void toDMM(double a, char *bufp, int bufplen);
732int GetDatumIndex(const char *str);
733void MolodenskyTransform(double lat, double lon, double *to_lat, double *to_lon,
734 int from_datum_index, int to_datum_index);
735double lat_gc_crosses_meridian(double lat1, double lon1, double lat2,
736 double lon2, double lon);
737double lat_rl_crosses_meridian(double lat1, double lon1, double lat2,
738 double lon2, double lon);
739
740#endif
741
742//--------------------
743
744/*
745 * lmfit
746 *
747 * Solves or minimizes the sum of squares of m nonlinear
748 * functions of n variables.
749 *
750 * From public domain Fortran version
751 * of Argonne National Laboratories MINPACK
752 * argonne national laboratory. minpack project. march 1980.
753 * burton s. garbow, kenneth e. hillstrom, jorge j. more
754 * C translation by Steve Moshier
755 * Joachim Wuttke converted the source into C++ compatible ANSI style
756 * and provided a simplified interface
757 */
758
759// parameters for calling the high-level interface lmfit
760// ( lmfit.c provides lm_initialize_control which sets default values ):
761typedef struct {
762 double ftol; // relative error desired in the sum of squares.
763 double xtol; // relative error between last two approximations.
764 double gtol; // orthogonality desired between fvec and its derivs.
765 double epsilon; // step used to calculate the jacobian.
766 double stepbound; // initial bound to steps in the outer loop.
767 double fnorm; // norm of the residue vector fvec.
768 int maxcall; // maximum number of iterations.
769 int nfev; // actual number of iterations.
770 int info; // status of minimization.
772
773// the subroutine that calculates fvec:
774typedef void(lm_evaluate_ftype)(double *par, int m_dat, double *fvec,
775 void *data, int *info);
776// default implementation therof, provided by lm_eval.c:
777void lm_evaluate_default(double *par, int m_dat, double *fvec, void *data,
778 int *info);
779
780// the subroutine that informs about fit progress:
781typedef void(lm_print_ftype)(int n_par, double *par, int m_dat, double *fvec,
782 void *data, int iflag, int iter, int nfev);
783// default implementation therof, provided by lm_eval.c:
784void lm_print_default(int n_par, double *par, int m_dat, double *fvec,
785 void *data, int iflag, int iter, int nfev);
786
787// compact high-level interface:
789void lm_minimize(int m_dat, int n_par, double *par, lm_evaluate_ftype *evaluate,
790 lm_print_ftype *printout, void *data,
791 lm_control_type *control);
792double lm_enorm(int, double *);
793
794// low-level interface for full control:
795void lm_lmdif(int m, int n, double *x, double *fvec, double ftol, double xtol,
796 double gtol, int maxfev, double epsfcn, double *diag, int mode,
797 double factor, int *info, int *nfev, double *fjac, int *ipvt,
798 double *qtf, double *wa1, double *wa2, double *wa3, double *wa4,
799 lm_evaluate_ftype *evaluate, lm_print_ftype *printout,
800 void *data);
801
802#ifndef _LMDIF
803extern const char *lm_infmsg[];
804extern const char *lm_shortmsg[];
805#endif
806
807// This is an opaque (to lmfit) structure set up before the call to lmfit()
808typedef struct {
809 double *user_tx;
810 double *user_ty;
811 double *user_y;
812 double (*user_func)(double user_tx_point, double user_ty_point, int n_par,
813 double *par);
814 int print_flag;
815 int n_par;
817
818#endif // GEOREF_H_
void lm_initialize_control(lm_control_type *control)
=================================================================================
Definition georef.cpp:1743
Definition georef.h:35
Structure containing georeferencing information for transforming between geographic and projected/pix...
Definition georef.h:63
double lonmin
Minimum longitude in reference data.
Definition georef.h:83
int order
Polynomial order for the transformation (1, 2, or 3)
Definition georef.h:67
int count
Number of reference points used.
Definition georef.h:66
double lonmax
Maximum longitude in reference data.
Definition georef.h:82
int txmin
Minimum x value in target space.
Definition georef.h:80
double * pwx
Polynomial coefficients for pixel-to-world longitude transformation.
Definition georef.h:72
double * tx
Array of x-coordinates in target (typically pixel) space.
Definition georef.h:68
double * wpx
Polynomial coefficients for world-to-pixel x transformation.
Definition georef.h:76
double * lat
Array of latitudes corresponding to reference points.
Definition georef.h:71
double * lon
Array of longitudes corresponding to reference points.
Definition georef.h:70
int status
Status of the georeferencing (0 = valid, other values indicate errors)
Definition georef.h:64
int tymin
Minimum y value in target space.
Definition georef.h:81
double * ty
Array of y-coordinates in target (typically pixel) space.
Definition georef.h:69
int tymax
Maximum y value in target space.
Definition georef.h:79
double latmin
Minimum latitude in reference data.
Definition georef.h:85
int txmax
Maximum x value in target space.
Definition georef.h:78
double latmax
Maximum latitude in reference data.
Definition georef.h:84
double * wpy
Polynomial coefficients for world-to-pixel y transformation.
Definition georef.h:77
double * pwy
Polynomial coefficients for pixel-to-world latitude transformation.
Definition georef.h:74