OpenCPN Partial API docs
Loading...
Searching...
No Matches
georef.cpp File Reference

Implement georef.h – georef utilities. More...

#include <vector>
#include <utility>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <algorithm>
#include <wx/debug.h>
#include "model/georef.h"
#include "model/cutil.h"

Go to the source code of this file.

Macros

#define NAN   (*(double *)&lNaN)
 
#define TOL   1e-10
 
#define CONV   1e-10
 
#define N_ITER   10
 
#define I_ITER   20
 
#define ITOL   1.e-12
 
#define DTOL   1e-12
 
#define HALFPI   1.5707963267948966
 
#define SPI   3.14159265359
 
#define TWOPI   6.2831853071795864769
 
#define ONEPI   3.14159265358979323846
 
#define MERI_TOL   1e-9
 
#define _LMDIF
 
#define BUG   0
 
#define LM_MACHEP   1.2e-16
 
#define LM_DWARF   1.0e-38
 
#define LM_SQRT_DWARF   3.834e-20
 
#define LM_SQRT_GIANT   1.304e19
 
#define MIN(a, b)   (((a) <= (b)) ? (a) : (b))
 
#define MAX(a, b)   (((a) >= (b)) ? (a) : (b))
 
#define SQR(x)   (x) * (x)
 

Functions

void datumParams (short datum, double *a, double *es)
 
int GetDatumIndex (const char *str)
 
void toDMS (double a, char *bufp, int bufplen)
 
double fromDMS (char *dms)
 
void todmm (int flag, double a, char *bufp, int bufplen)
 
void toDMM (double a, char *bufp, int bufplen)
 
void toSM (double lat, double lon, double lat0, double lon0, double *x, double *y)
 
double toSMcache_y30 (double lat0)
 
void toSMcache (double lat, double lon, double y30, double lon0, double *x, double *y)
 
void fromSM (double x, double y, double lat0, double lon0, double *lat, double *lon)
 
void fromSMR (double x, double y, double lat0, double lon0, double axis_meters, double *lat, double *lon)
 
void toSM_ECC (double lat, double lon, double lat0, double lon0, double *x, double *y)
 
void fromSM_ECC (double x, double y, double lat0, double lon0, double *lat, double *lon)
 
void toPOLY (double lat, double lon, double lat0, double lon0, double *x, double *y)
 
void fromPOLY (double x, double y, double lat0, double lon0, double *lat, double *lon)
 
void toTM (float lat, float lon, float lat0, float lon0, double *x, double *y)
 
void fromTM (double x, double y, double lat0, double lon0, double *lat, double *lon)
 
void cache_phi0 (double lat0, double *sin_phi0, double *cos_phi0)
 
void toORTHO (double lat, double lon, double sin_phi0, double cos_phi0, double lon0, double *x, double *y)
 
void fromORTHO (double x, double y, double lat0, double lon0, double *lat, double *lon)
 
double toPOLARcache_e (double lat0)
 
void toPOLAR (double lat, double lon, double e, double lat0, double lon0, double *x, double *y)
 
void fromPOLAR (double x, double y, double lat0, double lon0, double *lat, double *lon)
 
void toSTEREO (double lat, double lon, double sin_phi0, double cos_phi0, double lon0, double *x, double *y)
 
void fromSTEREO (double x, double y, double lat0, double lon0, double *lat, double *lon)
 
void toGNO (double lat, double lon, double sin_phi0, double cos_phi0, double lon0, double *x, double *y)
 
void fromGNO (double x, double y, double lat0, double lon0, double *lat, double *lon)
 
void toEQUIRECT (double lat, double lon, double lat0, double lon0, double *x, double *y)
 
void fromEQUIRECT (double x, double y, double lat0, double lon0, double *lat, double *lon)
 
void MolodenskyTransform (double lat, double lon, double *to_lat, double *to_lon, int from_datum_index, int to_datum_index)
 
double adjlon (double lon)
 
void ll_gc_ll (double lat, double lon, double brg, double dist, double *dlat, double *dlon)
 
void ll_gc_ll_reverse (double lat1, double lon1, double lat2, double lon2, double *bearing, double *dist)
 
void PositionBearingDistanceMercator (double lat, double lon, double brg, double dist, double *dlat, double *dlon)
 
double DistLoxodrome (double slat, double slon, double dlat, double dlon)
 
double DistGreatCircle (double slat, double slon, double dlat, double dlon)
 
void DistanceBearingMercator (double lat1, double lon1, double lat0, double lon0, double *brg, double *dist)
 
double my_fit_function (double tx, double ty, int n_par, double *p)
 ================================================================================= Customized section for openCPN georeferencing
 
int Georef_Calculate_Coefficients_Onedir (int n_points, int n_par, double *tx, double *ty, double *y, double *p, double hintp0, double hintp1, double hintp2)
 
int Georef_Calculate_Coefficients (struct GeoRef *cp, int nlin_lon)
 
int Georef_Calculate_Coefficients_Proj (struct GeoRef *cp)
 
void lm_evaluate_default (double *par, int m_dat, double *fvec, void *data, int *info)
 
void lm_print_default (int n_par, double *par, int m_dat, double *fvec, void *data, int iflag, int iter, int nfev)
 
void lm_initialize_control (lm_control_type *control)
 =================================================================================
 
void lm_minimize (int m_dat, int n_par, double *par, lm_evaluate_ftype *evaluate, lm_print_ftype *printout, void *data, lm_control_type *control)
 
void lm_qrfac (int m, int n, double *a, int pivot, int *ipvt, double *rdiag, double *acnorm, double *wa)
 
void lm_qrsolv (int n, double *r, int ldr, int *ipvt, double *diag, double *qtb, double *x, double *sdiag, double *wa)
 
void lm_lmpar (int n, double *r, int ldr, int *ipvt, double *diag, double *qtb, double delta, double *par, double *x, double *sdiag, double *wa1, double *wa2)
 
void lm_lmdif (int m, int n, double *x, double *fvec, double ftol, double xtol, double gtol, int maxfev, double epsfcn, double *diag, int mode, double factor, int *info, int *nfev, double *fjac, int *ipvt, double *qtf, double *wa1, double *wa2, double *wa3, double *wa4, lm_evaluate_ftype *evaluate, lm_print_ftype *printout, void *data)
 
double lm_enorm (int n, double *x)
 
double lat_gc_crosses_meridian (double lat1, double lon1, double lat2, double lon2, double lon)
 
double lat_rl_crosses_meridian (double lat1, double lon1, double lat2, double lon2, double lon)
 

Variables

struct DATUM const gDatum []
 
struct ELLIPSOID const gEllipsoid []
 
short nDatums = sizeof(gDatum) / sizeof(struct DATUM)
 
const char * lm_infmsg []
 
const char * lm_shortmsg []
 

Detailed Description

Implement georef.h – georef utilities.

Parts of this file were adapted from source code found in John F. Waers (jfwae.nosp@m.rs@c.nosp@m.sn.ne.nosp@m.t) public domain program MacGPS45

Definition in file georef.cpp.

Macro Definition Documentation

◆ _LMDIF

#define _LMDIF

Definition at line 1459 of file georef.cpp.

◆ BUG

#define BUG   0

Definition at line 1804 of file georef.cpp.

◆ CONV

#define CONV   1e-10

Definition at line 496 of file georef.cpp.

◆ DTOL

#define DTOL   1e-12

Definition at line 987 of file georef.cpp.

◆ HALFPI

#define HALFPI   1.5707963267948966

Definition at line 989 of file georef.cpp.

◆ I_ITER

#define I_ITER   20

Definition at line 498 of file georef.cpp.

◆ ITOL

#define ITOL   1.e-12

Definition at line 499 of file georef.cpp.

◆ LM_DWARF

#define LM_DWARF   1.0e-38

Definition at line 1814 of file georef.cpp.

◆ LM_MACHEP

#define LM_MACHEP   1.2e-16

Definition at line 1813 of file georef.cpp.

◆ LM_SQRT_DWARF

#define LM_SQRT_DWARF   3.834e-20

Definition at line 1821 of file georef.cpp.

◆ LM_SQRT_GIANT

#define LM_SQRT_GIANT   1.304e19

Definition at line 1822 of file georef.cpp.

◆ MAX

#define MAX (   a,
 
)    (((a) >= (b)) ? (a) : (b))

Definition at line 1833 of file georef.cpp.

◆ MERI_TOL

#define MERI_TOL   1e-9

Definition at line 993 of file georef.cpp.

◆ MIN

#define MIN (   a,
 
)    (((a) <= (b)) ? (a) : (b))

Definition at line 1832 of file georef.cpp.

◆ N_ITER

#define N_ITER   10

Definition at line 497 of file georef.cpp.

◆ NAN

#define NAN   (*(double *)&lNaN)

Definition at line 46 of file georef.cpp.

◆ ONEPI

#define ONEPI   3.14159265358979323846

Definition at line 992 of file georef.cpp.

◆ SPI

#define SPI   3.14159265359

Definition at line 990 of file georef.cpp.

◆ SQR

#define SQR (   x)    (x) * (x)

Definition at line 1834 of file georef.cpp.

◆ TOL

#define TOL   1e-10

Definition at line 495 of file georef.cpp.

◆ TWOPI

#define TWOPI   6.2831853071795864769

Definition at line 991 of file georef.cpp.

Function Documentation

◆ adjlon()

double adjlon ( double  lon)

Definition at line 995 of file georef.cpp.

◆ cache_phi0()

void cache_phi0 ( double  lat0,
double *  sin_phi0,
double *  cos_phi0 
)

Definition at line 683 of file georef.cpp.

◆ datumParams()

void datumParams ( short  datum,
double *  a,
double *  es 
)

Definition at line 232 of file georef.cpp.

◆ DistanceBearingMercator()

void DistanceBearingMercator ( double  lat1,
double  lon1,
double  lat0,
double  lon0,
double *  brg,
double *  dist 
)

Definition at line 1392 of file georef.cpp.

◆ DistGreatCircle()

double DistGreatCircle ( double  slat,
double  slon,
double  dlat,
double  dlon 
)

Definition at line 1291 of file georef.cpp.

◆ DistLoxodrome()

double DistLoxodrome ( double  slat,
double  slon,
double  dlat,
double  dlon 
)

Definition at line 1263 of file georef.cpp.

◆ fromDMS()

double fromDMS ( char *  dms)

Definition at line 304 of file georef.cpp.

◆ fromEQUIRECT()

void fromEQUIRECT ( double  x,
double  y,
double  lat0,
double  lon0,
double *  lat,
double *  lon 
)

Definition at line 880 of file georef.cpp.

◆ fromGNO()

void fromGNO ( double  x,
double  y,
double  lat0,
double  lon0,
double *  lat,
double *  lon 
)

Definition at line 855 of file georef.cpp.

◆ fromORTHO()

void fromORTHO ( double  x,
double  y,
double  lat0,
double  lon0,
double *  lat,
double *  lon 
)

Definition at line 716 of file georef.cpp.

◆ fromPOLAR()

void fromPOLAR ( double  x,
double  y,
double  lat0,
double  lon0,
double *  lat,
double *  lon 
)

Definition at line 765 of file georef.cpp.

◆ fromPOLY()

void fromPOLY ( double  x,
double  y,
double  lat0,
double  lon0,
double *  lat,
double *  lon 
)

Definition at line 529 of file georef.cpp.

◆ fromSM()

void fromSM ( double  x,
double  y,
double  lat0,
double  lon0,
double *  lat,
double *  lon 
)

Definition at line 402 of file georef.cpp.

◆ fromSM_ECC()

void fromSM_ECC ( double  x,
double  y,
double  lat0,
double  lon0,
double *  lat,
double *  lon 
)

Definition at line 463 of file georef.cpp.

◆ fromSMR()

void fromSMR ( double  x,
double  y,
double  lat0,
double  lon0,
double  axis_meters,
double *  lat,
double *  lon 
)

Definition at line 426 of file georef.cpp.

◆ fromSTEREO()

void fromSTEREO ( double  x,
double  y,
double  lat0,
double  lon0,
double *  lat,
double *  lon 
)

Definition at line 824 of file georef.cpp.

◆ fromTM()

void fromTM ( double  x,
double  y,
double  lat0,
double  lon0,
double *  lat,
double *  lon 
)

Definition at line 628 of file georef.cpp.

◆ Georef_Calculate_Coefficients()

int Georef_Calculate_Coefficients ( struct GeoRef cp,
int  nlin_lon 
)

Definition at line 1531 of file georef.cpp.

◆ Georef_Calculate_Coefficients_Onedir()

int Georef_Calculate_Coefficients_Onedir ( int  n_points,
int  n_par,
double *  tx,
double *  ty,
double *  y,
double *  p,
double  hintp0,
double  hintp1,
double  hintp2 
)

Definition at line 1483 of file georef.cpp.

◆ Georef_Calculate_Coefficients_Proj()

int Georef_Calculate_Coefficients_Proj ( struct GeoRef cp)

Definition at line 1606 of file georef.cpp.

◆ GetDatumIndex()

int GetDatumIndex ( const char *  str)

Definition at line 276 of file georef.cpp.

◆ lat_gc_crosses_meridian()

double lat_gc_crosses_meridian ( double  lat1,
double  lon1,
double  lat2,
double  lon2,
double  lon 
)

Definition at line 2854 of file georef.cpp.

◆ lat_rl_crosses_meridian()

double lat_rl_crosses_meridian ( double  lat1,
double  lon1,
double  lat2,
double  lon2,
double  lon 
)

Definition at line 2872 of file georef.cpp.

◆ ll_gc_ll()

void ll_gc_ll ( double  lat,
double  lon,
double  brg,
double  dist,
double *  dlat,
double *  dlon 
)

Definition at line 1012 of file georef.cpp.

◆ ll_gc_ll_reverse()

void ll_gc_ll_reverse ( double  lat1,
double  lon1,
double  lat2,
double  lon2,
double *  bearing,
double *  dist 
)

Definition at line 1151 of file georef.cpp.

◆ lm_enorm()

double lm_enorm ( int  n,
double *  x 
)

Definition at line 2788 of file georef.cpp.

◆ lm_evaluate_default()

void lm_evaluate_default ( double *  par,
int  m_dat,
double *  fvec,
void *  data,
int *  info 
)

Definition at line 1667 of file georef.cpp.

◆ lm_initialize_control()

void lm_initialize_control ( lm_control_type control)

=================================================================================

Definition at line 1743 of file georef.cpp.

◆ lm_lmdif()

void lm_lmdif ( int  m,
int  n,
double *  x,
double *  fvec,
double  ftol,
double  xtol,
double  gtol,
int  maxfev,
double  epsfcn,
double *  diag,
int  mode,
double  factor,
int *  info,
int *  nfev,
double *  fjac,
int *  ipvt,
double *  qtf,
double *  wa1,
double *  wa2,
double *  wa3,
double *  wa4,
lm_evaluate_ftype *  evaluate,
lm_print_ftype *  printout,
void *  data 
)

Definition at line 1838 of file georef.cpp.

◆ lm_lmpar()

void lm_lmpar ( int  n,
double *  r,
int  ldr,
int *  ipvt,
double *  diag,
double *  qtb,
double  delta,
double *  par,
double *  x,
double *  sdiag,
double *  wa1,
double *  wa2 
)

Definition at line 2284 of file georef.cpp.

◆ lm_minimize()

void lm_minimize ( int  m_dat,
int  n_par,
double *  par,
lm_evaluate_ftype *  evaluate,
lm_print_ftype *  printout,
void *  data,
lm_control_type control 
)

Definition at line 1752 of file georef.cpp.

◆ lm_print_default()

void lm_print_default ( int  n_par,
double *  par,
int  m_dat,
double *  fvec,
void *  data,
int  iflag,
int  iter,
int  nfev 
)

Definition at line 1696 of file georef.cpp.

◆ lm_qrfac()

void lm_qrfac ( int  m,
int  n,
double *  a,
int  pivot,
int *  ipvt,
double *  rdiag,
double *  acnorm,
double *  wa 
)

Definition at line 2491 of file georef.cpp.

◆ lm_qrsolv()

void lm_qrsolv ( int  n,
double *  r,
int  ldr,
int *  ipvt,
double *  diag,
double *  qtb,
double *  x,
double *  sdiag,
double *  wa 
)

Definition at line 2628 of file georef.cpp.

◆ MolodenskyTransform()

void MolodenskyTransform ( double  lat,
double  lon,
double *  to_lat,
double *  to_lon,
int  from_datum_index,
int  to_datum_index 
)

Definition at line 906 of file georef.cpp.

◆ my_fit_function()

double my_fit_function ( double  tx,
double  ty,
int  n_par,
double *  p 
)

================================================================================= Customized section for openCPN georeferencing

Definition at line 1464 of file georef.cpp.

◆ PositionBearingDistanceMercator()

void PositionBearingDistanceMercator ( double  lat,
double  lon,
double  brg,
double  dist,
double *  dlat,
double *  dlon 
)

Definition at line 1258 of file georef.cpp.

◆ toDMM()

void toDMM ( double  a,
char *  bufp,
int  bufplen 
)

Definition at line 341 of file georef.cpp.

◆ todmm()

void todmm ( int  flag,
double  a,
char *  bufp,
int  bufplen 
)

Definition at line 322 of file georef.cpp.

◆ toDMS()

void toDMS ( double  a,
char *  bufp,
int  bufplen 
)

Definition at line 291 of file georef.cpp.

◆ toEQUIRECT()

void toEQUIRECT ( double  lat,
double  lon,
double  lat0,
double  lon0,
double *  x,
double *  y 
)

Definition at line 868 of file georef.cpp.

◆ toGNO()

void toGNO ( double  lat,
double  lon,
double  sin_phi0,
double  cos_phi0,
double  lon0,
double *  x,
double *  y 
)

Definition at line 839 of file georef.cpp.

◆ toORTHO()

void toORTHO ( double  lat,
double  lon,
double  sin_phi0,
double  cos_phi0,
double  lon0,
double *  x,
double *  y 
)

Definition at line 689 of file georef.cpp.

◆ toPOLAR()

void toPOLAR ( double  lat,
double  lon,
double  e,
double  lat0,
double  lon0,
double *  x,
double *  y 
)

Definition at line 747 of file georef.cpp.

◆ toPOLARcache_e()

double toPOLARcache_e ( double  lat0)

Definition at line 742 of file georef.cpp.

◆ toPOLY()

void toPOLY ( double  lat,
double  lon,
double  lat0,
double  lon0,
double *  x,
double *  y 
)

Definition at line 501 of file georef.cpp.

◆ toSM()

void toSM ( double  lat,
double  lon,
double  lat0,
double  lon0,
double *  x,
double *  y 
)

Definition at line 351 of file georef.cpp.

◆ toSM_ECC()

void toSM_ECC ( double  lat,
double  lon,
double  lat0,
double  lon0,
double *  x,
double *  y 
)

Definition at line 437 of file georef.cpp.

◆ toSMcache()

void toSMcache ( double  lat,
double  lon,
double  y30,
double  lon0,
double *  x,
double *  y 
)

Definition at line 381 of file georef.cpp.

◆ toSMcache_y30()

double toSMcache_y30 ( double  lat0)

Definition at line 374 of file georef.cpp.

◆ toSTEREO()

void toSTEREO ( double  lat,
double  lon,
double  sin_phi0,
double  cos_phi0,
double  lon0,
double *  x,
double *  y 
)

Definition at line 812 of file georef.cpp.

◆ toTM()

void toTM ( float  lat,
float  lon,
float  lat0,
float  lon0,
double *  x,
double *  y 
)

Definition at line 575 of file georef.cpp.

Variable Documentation

◆ gDatum

struct DATUM const gDatum[]

Definition at line 65 of file georef.cpp.

◆ gEllipsoid

struct ELLIPSOID const gEllipsoid[]
Initial value:
= {
{"Airy 1830", 6377563.396, 299.3249646},
{"Modified Airy", 6377340.189, 299.3249646},
{"Australian National", 6378160.0, 298.25},
{"Bessel 1841", 6377397.155, 299.1528128},
{"Clarke 1866", 6378206.4, 294.9786982},
{"Clarke 1880", 6378249.145, 293.465},
{"Everest (India 1830)", 6377276.345, 300.8017},
{"Everest (1948)", 6377304.063, 300.8017},
{"Modified Fischer 1960", 6378155.0, 298.3},
{"Everest (Pakistan)", 6377309.613, 300.8017},
{"Indonesian 1974", 6378160.0, 298.247},
{"GRS 80", 6378137.0, 298.257222101},
{"Helmert 1906", 6378200.0, 298.3},
{"Hough 1960", 6378270.0, 297.0},
{"International 1924", 6378388.0, 297.0},
{"Krassovsky 1940", 6378245.0, 298.3},
{"South American 1969", 6378160.0, 298.25},
{"Everest (Malaysia 1969)", 6377295.664, 300.8017},
{"Everest (Sabah Sarawak)", 6377298.556, 300.8017},
{"WGS 72", 6378135.0, 298.26},
{"WGS 84", 6378137.0, 298.257223563},
{"Bessel 1841 (Namibia)", 6377483.865, 299.1528128},
{"Everest (India 1956)", 6377301.243, 300.8017},
{"Struve 1860", 6378298.3, 294.73}
}

Definition at line 199 of file georef.cpp.

◆ lm_infmsg

const char* lm_infmsg[]
Initial value:
= {
"improper input parameters",
"the relative error in the sum of squares is at most tol",
"the relative error between x and the solution is at most tol",
"both errors are at most tol",
"fvec is orthogonal to the columns of the jacobian to machine precision",
"number of calls to fcn has reached or exceeded 200*(n+1)",
"ftol is too small. no further reduction in the sum of squares is possible",
"xtol too small. no further improvement in approximate solution x possible",
"gtol too small. no further improvement in approximate solution x possible",
"not enough memory",
"break requested within function evaluation"}

Definition at line 1784 of file georef.cpp.

◆ lm_shortmsg

const char* lm_shortmsg[]
Initial value:
= {"invalid input", "success (f)", "success (p)",
"success (f,p)", "degenerate", "call limit",
"failed (f)", "failed (p)", "failed (o)",
"no memory", "user break"}

Definition at line 1797 of file georef.cpp.

◆ nDatums

short nDatums = sizeof(gDatum) / sizeof(struct DATUM)

Definition at line 228 of file georef.cpp.