[OSRS-PROJ] geod_api
Alexander Weidauer
alex.weidauer at huckfinn.de
Sat Jun 1 06:33:51 PDT 2002
Hi Folks,
I work on earthquake relocations at university of potsdam and try to
change the
coordinate transformation routines of the USGS to ellipsoid and datum
variable
routines. Therfore i encapsulate then proj code into a "Transformer
Class" and
it works well. See ANHANG:
Now iI use also great circle computations to applicate perhaps the
azimut angle
to the normal correction vectors of a earthquake event. The routines
are fixed to
WGS 72 ellipsoid and I want to use the parameter settings like the
routine GEOD
to create similar Container class.
My question, is there a geod_api.h available like the proj_api.h to
realize this
or must I investigate the programming code of the geod.c tool.
With friendly geetings A. Weidauer
I try to create a class container for proj tools like this :
ANHANG:
//--- uCoordinates.hpp ----------------------------------------------------
#include "uConst.hpp"
#include "uObject.hpp"
#include <proj_api.h>
class cCoordinateTransformer : private cObject {
private:
projUV p;
projPJ PlainLL;
projPJ Src,Dst;
void SetCoordSystem(const char* aProjection, projPJ& pj);
public:
cCoordinateTransformer();
~cCoordinateTransformer();
void SetPlainLLSystem(const char* aProjection);
void SetPlainSrcSystem(const char* aProjection);
void SetPlainDestSystem(const char* aProjection);
void cvsLLToPlain (tDouble Longitude,
tDouble Latitude,
tDouble& XDistanceKM,
tDouble& YDistanceKM);
void cvsPlainToLL(tDouble XDistanceKM,
tDouble YDistanceKM,
tDouble& Longitude,
tDouble& Latitude);
void cvsPlainToPlain(tDouble XSourceKM, tDouble YSourceKM,
tDouble XDestKM, tDouble YDestKM);
};
typedef cCoordinateTransformer* rCoordinateTransformer;
// --- Class implementation
---------------------------------------------------------------
cCoordinateTransformer::cCoordinateTransformer(): cObject() {
PlainLL=NULL;
Src=NULL;
Dst=NULL;
}
//-----------------------------------------------------------------------
cCoordinateTransformer::~cCoordinateTransformer() {
if (PlainLL!=NULL) { pj_free(PlainLL); }
if (Src!=NULL) { pj_free(Src); }
if (Dst!=NULL) { pj_free(Dst); }
}
//-----------------------------------------------------------------------
void cCoordinateTransformer::SetCoordSystem(const char* aProjection,
projPJ& pj)
{ char buffer[512];
if (pj!=NULL) { pj_free(pj);}
pj = pj_init_plus(aProjection);
if (pj==NULL) {
sprintf(buffer,"Cannot set projection \"%s\" !",aProjection);
FatalError(-1,buffer);
}
}
//-----------------------------------------------------------------------
void cCoordinateTransformer::SetPlainLLSystem(const char* aProjection)
{ SetCoordSystem(aProjection,PlainLL); }
//-----------------------------------------------------------------------
void cCoordinateTransformer::SetPlainSrcSystem(const char* aProjection)
{ SetCoordSystem(aProjection,Src); }
//-----------------------------------------------------------------------
void cCoordinateTransformer::SetPlainDestSystem(const char* aProjection)
{ SetCoordSystem(aProjection,Dst); }
//-----------------------------------------------------------------------
void cCoordinateTransformer::cvsLLToPlain(tDouble Longitude,
tDouble Latitude,
tDouble& XKM,
tDouble& YKM)
{
if (PlainLL==NULL) {
FatalError(-1," lon lat to plain transformer ! Coordinate system
not specified !");
}
p.u = DEG_TO_RAD * Longitude;
p.v = DEG_TO_RAD * Latitude;
p = pj_fwd(p, PlainLL);
XKM = p.u/1000;
YKM = p.v/1000;
}
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
void cCoordinateTransformer::cvsPlainToLL(tDouble XKM,
tDouble YKM,
tDouble& Longitude,
tDouble& Latitude)
{
if (PlainLL==NULL) {
FatalError(-1," lon lat to plain transformer ! Coordinate system
not specified !");
}
p.u = XKM*1000;
p.v = YKM*1000;
p = pj_inv(p, PlainLL);
XKM = p.u * RAD_TO_DEG;
YKM = p.v * RAD_TO_DEG;
}
//-----------------------------------------------------------------------
void cCoordinateTransformer::cvsPlainToPlain(tDouble XSourceKM, tDouble
YSourceKM,
tDouble XDestKM, tDouble
YDestKM)
{
if (Src==NULL) {
FatalError(-1," lon lat to plain transformer ! Source coordinate
system not specified !");
}
if (Dst==NULL) {
FatalError(-1," lon lat to plain transformer ! Source coordinate
system not specified !");
}
p.u = XSourceKM*1000.0;
p.v = YSourceKM*1000.0;
p=pj_inv(p,Src);
p=pj_fwd(p,Dst);
XDestKM = p.u *1000.0;
YDestKM = p.v *1000.0;
}
----------------------------------------
PROJ.4 Discussion List
See http://www.remotesensing.org/proj for subscription, unsubscription
and other information.
More information about the Proj
mailing list