[Proj] please help C++ idiot with datum conversion
Frank Warmerdam
warmerdam at pobox.com
Thu Jul 15 13:49:56 EDT 2004
Mike Zulauf wrote:
> Hi all,
>
> I have what I believe to be a simple question. I've got a very simple
> bit of code C++ that converts a vector containing NAD27 long-lat to
> NAD27 State Plane coordinates. It's written so that I can call it from
> Fortran. It appears to be working, and giving correct results.
>
> I need to modify it, however, so that it will also do a datum
> conversion, from WGS84 lat-lon to NAD27 State Plane coordinates. I'm
> sure this is simple, but I'm a newbie with PROJ. To make matters worse,
> I'm not a C++ programmer. I generally work with Fortran.
>
> Below is the code as it stands now. What's the best way to modify the
> code to include the datum conversion? It's ok to just have it
> hard-wired - I don't need it to be flexible (ie, it doesn't need to be
> able to handle NAD27 _or_ WGS84, just WGS84). But I still need the
> output to be NAD27.
>
> Even though it works as it is now (without datum conversion), it's
> entirely likely I have some stupid error or nonstandard code, since I'm
> not a C++ programmer. If there's anything of that sort which might
> cause problems down the line, I wouldn't mind hearing about that either.
Mike,
I have included an alternate implementation using pj_transform(). The
code compiled but I haven't tested it. Note:
o I use proj_api.h, the public include file instead of projects.h which is
really only for internal use (or backward compatibility).
o I use pj_transform() instead of pj_fwd() as it includes support for two
arbitrary coordinate systems and extra stuff like datum conversion.
#include <stdio.h>
#include <proj_api.h>
void conv_coords(double coord_1[], double coord_2[], int *ni,
int *conv_stat)
{
static const char *src_crs = "+proj=latlong +datum=WGS84";
static const char *dst_crs = "+init=nad27:3601 +datum=NAD27";
projPJ src_PJ, dst_PJ;
projUV data;
int i;
src_PJ = pj_init_plus( src_crs );
dst_PJ = pj_init_plus( dst_crs );
*conv_stat = 1;
if ( src_PJ == NULL || dst_PJ == NULL )
{
printf("pj_init error\n");
*conv_stat = 0;
}
for (i = 0; i <= *ni-1; i++)
{
double dummyz = 0.0;
if( pj_transform( src_PJ, dst_PJ, 1, 0,
coord_1 + i, coord_2 + i, &dummyz ) != 0 )
{
printf("pj_fwd error\n");
*conv_stat = 0;
}
if (coord_1[i] != HUGE_VAL)
{
coord_1[i] = data.u;
coord_2[i] = data.v;
}
else
{
printf("pj_fwd error\n");
*conv_stat = 0;
}
}
pj_free(src_PJ);
pj_free(dst_PJ);
}
Good luck,
--
---------------------------------------+--------------------------------------
I set the clouds in motion - turn up | Frank Warmerdam, warmerdam at pobox.com
light and sound - activate the windows | http://pobox.com/~warmerdam
and watch the world go round - Rush | Geospatial Programmer for Rent
More information about the Proj
mailing list