7 # include <vcl_msvc_warnings.h> 14 #define SMALL_STEP 1.0e-6 // assumed to be in radians 50 local_cs_name_(lvcs.local_cs_name_),
51 localCSOriginLat_(lvcs.localCSOriginLat_),
52 localCSOriginLon_(lvcs.localCSOriginLon_),
53 localCSOriginElev_(lvcs.localCSOriginElev_),
54 lat_scale_(lvcs.lat_scale_),
55 lon_scale_(lvcs.lon_scale_),
56 geo_angle_unit_(lvcs.geo_angle_unit_),
57 localXYZUnit_(lvcs.localXYZUnit_),
61 localUTMOrigin_X_East_(lvcs.localUTMOrigin_X_East_),
62 localUTMOrigin_Y_North_(lvcs.localUTMOrigin_Y_North_),
63 localUTMOrigin_Zone_(lvcs.localUTMOrigin_Zone_)
93 double lat_scale,
double lon_scale,
99 :local_cs_name_(cs_name),
100 localCSOriginLat_(orig_lat),
101 localCSOriginLon_(orig_lon),
102 localCSOriginElev_(orig_elev),
103 lat_scale_(lat_scale),
104 lon_scale_(lon_scale),
105 geo_angle_unit_(ang_unit),
106 localXYZUnit_(len_unit),
111 double local_to_meters, local_to_feet, local_to_radians, local_to_degrees;
138 : local_cs_name_(cs_name),
139 localCSOriginLat_(orig_lat), localCSOriginLon_(orig_lon),
140 localCSOriginElev_(orig_elev),
141 geo_angle_unit_(ang_unit), localXYZUnit_(len_unit), lox_(0), loy_(0), theta_(0)
143 double local_to_meters, local_to_feet, local_to_radians, local_to_degrees;
167 double lat_high,
double lon_high,
170 : local_cs_name_(cs_name), localCSOriginElev_(elev),
171 geo_angle_unit_(ang_unit), localXYZUnit_(elev_unit)
173 double average_lat = (lat_low + lat_high)/2.0;
174 double average_lon = (lon_low + lon_high)/2.0;
178 double local_to_meters, local_to_feet, local_to_radians, local_to_degrees;
210 double fmin = std::fabs(geoval - (
int)geoval)*60.0;
211 int isec = (int) ((fmin - (
int)fmin)*60.0 + .5);
212 int imin = (int) ((isec == 60) ? fmin+1 : fmin) ;
213 int extra = (geoval>0) ? 1 : -1;
214 degrees = (int) ( (imin == 60) ? geoval+extra : geoval);
215 minutes = ( imin== 60 ? 0 : imin);
216 seconds = (fmin - (int)fmin)*60.0;
222 double wgs84_phi, wgs84_lamda, wgs84_hgt;
223 double grs80_x, grs80_y, grs80_z;
224 double grs80_x1, grs80_y1, grs80_z1;
225 double to_meters, to_feet, to_radians, to_degrees;
243 &wgs84_phi, &wgs84_lamda, &wgs84_hgt);
244 wgs84_phi *= to_radians;
245 wgs84_lamda *= to_radians;
252 &wgs84_phi, &wgs84_lamda, &wgs84_hgt);
253 wgs84_phi *= to_radians;
254 wgs84_lamda *= to_radians;
258 wgs84_phi = wgs84_lamda = wgs84_hgt = 0.0;
279 &wgs84_phi, &wgs84_lamda, &wgs84_hgt);
280 wgs84_phi *= to_radians;
281 wgs84_lamda *= to_radians;
301 (grs80_y - grs80_y1)*(grs80_y - grs80_y1) +
302 (grs80_z - grs80_z1)*(grs80_z - grs80_z1));
314 &wgs84_phi, &wgs84_lamda, &wgs84_hgt);
315 wgs84_phi *= to_radians;
316 wgs84_lamda *= to_radians;
336 (grs80_y - grs80_y1)*(grs80_y - grs80_y1) +
337 (grs80_z - grs80_z1)*(grs80_z - grs80_z1));
351 const double pointin_y,
352 const double pointin_z,
354 double& pointout_lon,
355 double& pointout_lat,
361 double local_to_meters, local_to_feet, local_to_radians, local_to_degrees;
366 double local_lat, local_lon, local_elev;
367 double global_lat, global_lon, global_elev;
370 double aligned_x = pointin_x;
371 double aligned_y = pointin_y;
375 bool south_flag =
false;
383 if (output_len_unit ==
METERS) {
400 local_lat, local_lon, local_elev, south_flag);
403 global_lat = local_lat;
404 global_lon = local_lon;
405 global_elev = local_elev;
412 &global_lat, &global_lon, &global_elev);
419 &global_lat, &global_lon, &global_elev);
423 <<
" unrecognized." <<
'\n';
424 global_lat = global_lon = global_elev = 0.0;
441 global_lat = local_lat;
442 global_lon = local_lon;
443 global_elev = local_elev;
453 &global_lat, &global_lon, &global_elev);
459 &global_lat, &global_lon, &global_elev);
463 <<
" unrecognized." <<
'\n';
464 global_lat = global_lon = global_elev = 0.0;
475 &global_lat, &global_lon, &global_elev);
482 &global_lat, &global_lon, &global_elev);
486 <<
" unrecognized." <<
'\n';
487 global_lat = global_lon = global_elev = 0.0;
498 &global_lat, &global_lon, &global_elev);
505 &global_lat, &global_lon, &global_elev);
509 <<
" unrecognized." <<
'\n';
510 global_lat = global_lon = global_elev = 0.0;
515 <<
" unrecognized." <<
'\n';
516 global_lat = global_lon = global_elev = 0.0;
522 if (output_ang_unit==
DEG)
524 pointout_lon = global_lon;
525 pointout_lat = global_lat;
533 if (output_len_unit ==
METERS)
534 pointout_z = global_elev;
540 <<
" [" << pointin_y <<
", " << pointin_x <<
", " << pointin_z
541 <<
"] MAPS TO Global " 543 <<
" [" << pointout_lat <<
", " << pointout_lon <<
", " << pointout_z <<
"]\n";
556 const double pointin_lat,
557 const double pointin_z,
565 double local_to_meters, local_to_feet, local_to_radians, local_to_degrees;
569 double global_lat, global_lon, global_elev;
570 double local_lat, local_lon, local_elev;
572 global_lat = pointin_lat;
573 global_lon = pointin_lon;
574 global_elev = pointin_z;
578 if (input_len_unit ==
METERS) {
599 std::cerr <<
"global cs UTM is not supported with other local cs like wgs84, etc.!\n";
612 if (input_len_unit==
FEET)
619 local_lat = global_lat;
620 local_lon = global_lon;
621 local_elev = global_elev;
629 &local_lat, &local_lon, &local_elev);
634 &local_lat, &local_lon, &local_elev);
639 &local_lat, &local_lon, &local_elev);
642 u.
transform(local_lat, local_lon, pointout_x, pointout_y, zone);
644 std::cerr <<
"In vpgl_lvcs::global_to_local() -- the UTM zone of the input point is not the same as the zone of the lvcs origin!\n";
662 <<
" unrecognized." <<
'\n';
663 local_lat = local_lon = local_elev = 0.0;
672 &local_lat, &local_lon, &local_elev);
677 &local_lat, &local_lon, &local_elev);
682 &local_lat, &local_lon, &local_elev);
685 u.
transform(local_lat, local_lon, pointout_x, pointout_y, zone);
687 std::cerr <<
"In vpgl_lvcs::global_to_local() -- the UTM zone of the input point is not the same as the zone of the lvcs origin!\n";
705 <<
" unrecognized." <<
'\n';
706 local_lat = local_lon = local_elev = 0.0;
715 &local_lat, &local_lon, &local_elev);
720 &local_lat, &local_lon, &local_elev);
725 u.
transform(global_lat, global_lon, pointout_x, pointout_y, zone);
727 std::cerr <<
"In vpgl_lvcs::global_to_local() -- the UTM zone of the input point is not the same as the zone of the lvcs origin!\n";
745 <<
" unrecognized." <<
'\n';
746 local_lat = local_lon = local_elev = 0.0;
751 <<
" unrecognized." <<
'\n';
752 local_lat = local_lon = local_elev = 0.0;
777 <<
" [" << pointin_lon <<
", " << pointin_lat <<
", " << pointin_z
778 <<
"] MAPS TO Local " 780 <<
" [" << pointout_x <<
", " << pointout_lat <<
", " << pointout_z <<
"]\n";
788 std::string len_u =
"meters", ang_u=
"degrees";
795 <<
"angle unit " << ang_u <<
'\n' 796 <<
"length unit " << len_u <<
'\n' 800 <<
"local transform(lox loy theta) : (" <<
lox_ <<
' ' <<
loy_ 801 <<
' ' <<
theta_ <<
")\n]\n";
807 std::string len_u =
"meters", ang_u=
"degrees";
809 std::string local_cs_name_str;
810 strm >> local_cs_name_str;
811 if (local_cs_name_str.compare(
"wgs84") == 0)
813 else if (local_cs_name_str.compare(
"nad27n") == 0)
815 else if (local_cs_name_str.compare(
"wgs72") == 0)
817 else if (local_cs_name_str.compare(
"utm") == 0)
820 std::cerr <<
"undefined local_cs_name\n";
822 strm >> len_u >> ang_u;
823 if (len_u.compare(
"feet") == 0)
825 else if (len_u.compare(
"meters") == 0)
828 std::cerr <<
"undefined localXYZUnit_ " << len_u <<
'\n';
830 if (ang_u.compare(
"degrees") == 0)
832 else if (ang_u.compare(
"radians") == 0)
835 std::cerr <<
"undefined geo_angle_unit_ " << ang_u <<
'\n';
842 double local_to_meters, local_to_feet, local_to_radians, local_to_degrees;
863 strm <<
"wgs84" <<
'\n';
865 strm <<
"nad27n" <<
'\n';
867 strm <<
"wgs72" <<
'\n';
869 strm <<
"utm" <<
'\n';
871 std::cerr <<
"undefined local_cs_name\n";
897 double xo = x -
lox_;
898 double yo = y -
loy_;
902 if (std::fabs(theta) < 1e-5)
909 ct = std::cos(-theta);
910 st = std::sin(-theta);
926 if (std::fabs(theta) < 1e-5)
933 ct = std::cos(-theta);
934 st = std::sin(-theta);
936 double xo = ct*x + st*y;
937 double yo = -st*x + ct*y;
946 local_coord_sys.
print(os);
952 local_coord_sys.
read(is);
1021 std::cerr <<
"I/O ERROR: vpgl_lvcs::b_read(vsl_b_istream&)\n" 1022 <<
" Unknown version number "<< ver <<
'\n';
1023 is.
is().clear(std::ios::badbit);
#define RADIANS_TO_DEGREES
double localCSOriginLon_
Lon (in geo_angle_unit_) of the origin.
short version() const
Return IO version number;.
double localCSOriginElev_
Elev (in localXYZUnit_) of the origin.
A geographic coordinate system.
void write(std::ostream &strm)
void radians_to_degrees(double &lon, double &lat, double &z)
void local_to_global(const double lx, const double ly, const double lz, cs_names cs_name, double &lon, double &lat, double &gz, AngUnits output_ang_unit=DEG, LenUnits output_len_unit=METERS)
Converts pointin, given in local vertical coord system, to pointout in the global coord system given ...
double localUTMOrigin_Y_North_
void print(std::ostream &) const
Print internals on strm.
void vsl_b_write(vsl_b_ostream &os, vpgl_affine_camera< T > const &camera)
Binary save camera to stream.
double localUTMOrigin_X_East_
void global_to_local(const double lon, const double lat, const double gz, cs_names cs_name, double &lx, double &ly, double &lz, AngUnits output_ang_unit=DEG, LenUnits output_len_unit=METERS)
Converts pointin, given in a global coord system described by global_cs_name, to pointout in the loca...
void latlong_to_GRS(double geodetic_lat, double lon, double el, double *x, double *y, double *z, double A, double B)
Major and minor axes of earth.
double theta_
Direction of north in radians.
void degrees_to_dms(double, int °rees, int &minutes, double &seconds)
void nad27n_to_wgs72(double phi, double lamda, double height, double *wgs72_phi, double *wgs72_lamda, double *wgs72_hgt)
elev in wgs72 (meters)
double loy_
Origin in local co-ordinates.
void set_length_conversions(LenUnits len_unit, double &to_meters, double &to_feet)
std::istream & is() const
void b_write(vsl_b_ostream &os) const
Binary save self to stream.
void vsl_b_read(vsl_b_istream &is, vpgl_affine_camera< T > &camera)
Binary load camera from stream.
void wgs84_to_nad27n(double phi, double lamda, double height, double *nad27n_phi, double *nad27n_lamda, double *nad27n_hgt)
elev new (meters)
double lox_
Origin in local co-ordinates.
void local_transform(double &x, double &y)
Transform from local co-ordinates to north=y,east=x.
A rip-off of the IUE utm_geodedic and geodetic_utm transform classes which allows the GeoPt to suppor...
LenUnits localXYZUnit_
Input (x,y,z) unit (meters or feet) in local CS.
void b_read(vsl_b_istream &is)
Binary load self from stream.
static vpgl_lvcs::cs_names str_to_enum(const char *)
double localCSOriginLat_
Lat (in geo_angle_unit_) of the origin.
vpgl_lvcs(double orig_lat=0, double orig_lon=0, double orig_elev=0, cs_names cs_name=wgs84, double lat_scale=0, double lon_scale=0, AngUnits ang_unit=DEG, LenUnits len_unit=METERS, double lox=0, double loy=0, double theta=0)
Radians from y axis to north in local co-ordinates.
void read(std::istream &strm)
Read internals from strm.
AngUnits geo_angle_unit_
lat lon angle unit (degrees or radians)
bool operator==(vpgl_lvcs const &r) const
double lat_scale_
radians/meter along lat at the origin)
void inverse_local_transform(double &x, double &y)
Transform from north=y,east=x aligned axes to local co-ordinates.
cs_names local_cs_name_
Name of local frame's coord system ("nad27n", "wgs84" etc.)
vpgl_lvcs & operator=(const vpgl_lvcs &)
std::ostream & operator<<(std::ostream &s, const vpgl_local_rational_camera< T > &p)
Write to stream.
void wgs72_to_wgs84(double phi, double lamda, double height, double *wgs84_phi, double *wgs84_lamda, double *wgs84_hgt)
elev new (meters)
void set_angle_conversions(AngUnits ang_unit, double &to_radians, double &to_degrees)
void nad27n_to_wgs84(double phi, double lamda, double height, double *wgs84_phi, double *wgs84_lamda, double *wgs84_hgt)
elev new (meters)
#define DEGREES_TO_RADIANS
double lon_scale_
radians/meter along lon at the origin)
void wgs72_to_nad27n(double phi, double lamda, double height, double *nad27n_phi, double *nad27n_lamda, double *nad27n_hgt)
elev in nad27n (meters)
void wgs84_to_wgs72(double phi, double lamda, double height, double *wgs72_phi, double *wgs72_lamda, double *wgs72_hgt)
elev new (meters)
void transform(int utm_zone, double x, double y, double z, double &lat, double &lon, double &elev, bool south_flag=false, double utm_central_meridian=0)
std::istream & operator >>(std::istream &is, vpgl_lvcs &local_coord_sys)
static VPGL_EXPORT const char * cs_name_strings[]