lambert_ruby 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NzM5YmI2MWY2OWFhZTVlZmE4ODQ1NGU5YWYzZmU3NGYwNjljYzY3ZQ==
5
+ data.tar.gz: !binary |-
6
+ YWM1NWNiNTBlOWIyMGMzZDFjNGYyZmIyZGVjZTEwMjZmYmE1NDk3MA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ YmI2ZmIwNDkxMjk2YjMwYTQzY2I3OTY0MTE0MmI1NWNjNjVhMjg3M2QyYmVh
10
+ MmY5ODVkNjQ0M2IwMzE0ZmQzYjcxZDJhNjU2ZDQzNGI3NTA5YTNiODE1MTc4
11
+ YzA5YzQ3MGY5YTI0ZGViZWEzNjBiZTg1YmNkNDU3OGVhYWQxOWE=
12
+ data.tar.gz: !binary |-
13
+ NTUzODYwZmQyYzQ2YTMwY2I4MDE2ZjRjOThlOTVhN2YxYzQwYWQyMDUwZjIw
14
+ YmU5MzRkN2EzNWU1N2VkNzBhMjU3ZGY0ZTE4MmY4M2IxM2IyOGFhY2ZjMDJi
15
+ ODVjMTg4NjM4Zjk3YWUyOWYwOTgxOTJlOTgwZWNhNzYzMzM0MWE=
@@ -0,0 +1,3 @@
1
+ require 'mkmf'
2
+
3
+ create_makefile('lambert_ruby/lambert_ruby')
@@ -0,0 +1,171 @@
1
+ /*
2
+ * Source des algorithmes : http://geodesie.ign.fr/contenu/fichiers/documentation/algorithmes/notice/NTG_71.pdf
3
+ *
4
+ */
5
+
6
+ #include "lambert.h"
7
+ #include <math.h>
8
+ #include <stdio.h>
9
+
10
+ #define RAD_TO_DEG(x) x*180/M_PI
11
+
12
+ #define DISPLAY_YGLambertPoint(YGLambertPoint) printf(#YGLambertPoint" X:%f | Y:%f | Z:%f\n",YGLambertPoint.x,YGLambertPoint.y,YGLambertPoint.z);
13
+ #define DISPLAY_YGLambertPoint_REF(YGLambertPoint) printf(#YGLambertPoint" X:%f | Y:%f | Z:%f\n",YGLambertPoint->x,YGLambertPoint->y,YGLambertPoint->z);
14
+
15
+ static double lambert_n[6] = {0.7604059656, 0.7289686274, 0.6959127966, 0.6712679322, 0.7289686274, 0.7256077650};
16
+ static double lambert_c[6] = {11603796.98, 11745793.39, 11947992.52, 12136281.99, 11745793.39, 11754255.426};
17
+ static double lambert_xs[6]= {600000.0, 600000.0, 600000.0, 234.358, 600000.0, 700000.0};
18
+ static double lambert_ys[6]= {5657616.674, 6199695.768, 6791905.085, 7239161.542, 8199695.768, 12655612.050};
19
+
20
+
21
+ /*
22
+ * ALGO0002
23
+ */
24
+
25
+ double lat_from_lat_iso(double lat_iso, double e,double eps)
26
+ {
27
+
28
+ double phi_0 = 2*atan(exp(lat_iso)) - M_PI_2;
29
+ double phi_i = 2*atan(pow((1+e*sin(phi_0))/(1-e*sin(phi_0)),e/2.0)*exp(lat_iso)) - M_PI_2;
30
+ double delta ;
31
+ while(delta = fabs(phi_i - phi_0),delta > eps)
32
+ {
33
+ phi_0 = phi_i;
34
+ phi_i = 2*atan(pow((1+e*sin(phi_0))/(1-e*sin(phi_0)),e/2.0)*exp(lat_iso)) - M_PI_2;
35
+ }
36
+
37
+ return phi_i;
38
+
39
+ }
40
+ /*
41
+ * ALGO0004 - Lambert vers geographiques
42
+ */
43
+
44
+ void lambert_to_geographic(const YGLambertPoint * org,YGLambertPoint *dest, LambertZone zone, double lon_merid, double e, double eps)
45
+ {
46
+ double n = lambert_n[zone];
47
+ double C = lambert_c[zone];
48
+ double x_s = lambert_xs[zone];
49
+ double y_s = lambert_ys[zone];
50
+
51
+ double x = org->x;
52
+ double y = org->y;
53
+
54
+ double lon, gamma, R, lat_iso;
55
+
56
+ R = sqrt((x-x_s)*(x-x_s)+(y-y_s)*(y-y_s));
57
+
58
+ gamma = atan((x-x_s)/(y_s-y));
59
+
60
+ lon = lon_merid + gamma/n;
61
+
62
+ lat_iso = -1/n*log(fabs(R/C));
63
+
64
+ double lat = lat_from_lat_iso(lat_iso,e,eps);
65
+
66
+ dest->x = lon;
67
+ dest->y = lat;
68
+ }
69
+
70
+
71
+ /*
72
+ * ALGO0021 - Calcul de la grande Normale
73
+ *
74
+ */
75
+
76
+ double lambert_normal(double lat, double a, double e)
77
+ {
78
+
79
+ return a/sqrt(1-e*e*sin(lat)*sin(lat));
80
+ }
81
+
82
+ /**
83
+ * ALGO0009 - Transformations geographiques -> cartésiennes
84
+ *
85
+ *
86
+ */
87
+
88
+ YGLambertPoint geographic_to_cartesian(double lon, double lat, double he, double a, double e)
89
+ {
90
+ double N = lambert_normal(lat,a,e);
91
+
92
+ YGLambertPoint pt = {0,0,0};
93
+ pt.x = (N+he)*cos(lat)*cos(lon);
94
+
95
+ pt.y = (N+he)*cos(lat)*sin(lon);
96
+
97
+ pt.z = (N*(1-e*e)+he)*sin(lat);
98
+
99
+ return pt;
100
+
101
+ }
102
+
103
+ /*
104
+ * ALGO0012 - Passage des coordonnées cartésiennes aux coordonnées géographiques
105
+ */
106
+
107
+ YGLambertPoint cartesian_to_geographic(YGLambertPoint org, double meridien, double a, double e , double eps)
108
+ {
109
+ double x = org.x, y = org.y, z = org.z;
110
+
111
+ double lon = meridien + atan(y/x);
112
+
113
+ double module = sqrt(x*x + y*y);
114
+
115
+ double phi_0 = atan(z/(module*(1-(a*e*e)/sqrt(x*x+y*y+z*z))));
116
+ double phi_i = atan(z/module/(1-a*e*e*cos(phi_0)/(module * sqrt(1-e*e*sin(phi_0)*sin(phi_0)))));
117
+ double delta;
118
+ while(delta = fabs(phi_i - phi_0),delta > eps)
119
+ {
120
+ phi_0 = phi_i;
121
+ phi_i = atan(z/module/(1-a*e*e*cos(phi_0)/(module * sqrt(1-e*e*sin(phi_0)*sin(phi_0)))));
122
+
123
+ }
124
+
125
+ double he = module/cos(phi_i) - a/sqrt(1-e*e*sin(phi_i)*sin(phi_i));
126
+
127
+ YGLambertPoint pt;
128
+ pt.x = lon;
129
+ pt.y = phi_i;
130
+ pt.z = he;
131
+
132
+ return pt;
133
+ }
134
+
135
+
136
+
137
+ /*
138
+ * Convert Lambert -> WGS84
139
+ * http://geodesie.ign.fr/contenu/fichiers/documentation/pedagogiques/transfo.pdf
140
+ *
141
+ */
142
+
143
+ void lambert_to_wgs84(const YGLambertPoint * org, YGLambertPoint *dest,LambertZone zone){
144
+
145
+ lambert_to_geographic(org,dest,zone,LON_MERID_PARIS,E_CLARK_IGN,DEFAULT_EPS);
146
+
147
+ YGLambertPoint temp = geographic_to_cartesian(dest->x,dest->y,dest->z,A_CLARK_IGN,E_CLARK_IGN);
148
+
149
+ temp.x= temp.x - 168;
150
+ temp.y= temp.y - 60;
151
+ temp.z= temp.z + 320;
152
+
153
+ //WGS84 refers to greenwich
154
+ temp = cartesian_to_geographic(temp, LON_MERID_GREENWICH, A_WGS84,E_WGS84,DEFAULT_EPS);
155
+
156
+ dest->x = temp.x;
157
+ dest->y = temp.y;
158
+
159
+ }
160
+
161
+
162
+ void lambert_to_wgs84_deg(const YGLambertPoint * org, YGLambertPoint *dest, LambertZone zone)
163
+ {
164
+ YGLambertPoint temp = {0,0,0};
165
+
166
+ lambert_to_wgs84(org,&temp,zone);
167
+
168
+ dest->x = temp.x * 180/M_PI;
169
+ dest->y = temp.y * 180/M_PI;
170
+ dest->z = temp.z * 180/M_PI;
171
+ }
@@ -0,0 +1,71 @@
1
+ #define DEFAULT_EPS 1e-10
2
+ #define E_CLARK_IGN 0.08248325676
3
+ #define E_WGS84 0.08181919106
4
+
5
+ #define A_CLARK_IGN 6378249.2
6
+ #define A_WGS84 6378137.0
7
+
8
+ #define LON_MERID_PARIS 0
9
+ #define LON_MERID_GREENWICH 0.04079234433
10
+
11
+ #define DISPLAY_YGLambertPoint(YGLambertPoint) printf(#YGLambertPoint" X:%f | Y:%f | Z:%f\n",YGLambertPoint.x,YGLambertPoint.y,YGLambertPoint.z);
12
+ #define DISPLAY_YGLambertPoint_REF(YGLambertPoint) printf(#YGLambertPoint" X:%f | Y:%f | Z:%f\n",YGLambertPoint->x,YGLambertPoint->y,YGLambertPoint->z);
13
+
14
+ typedef enum {
15
+ LAMBERT_I=0,
16
+ LAMBERT_II=1,
17
+ LAMBERT_III=2,
18
+ LAMBERT_IV=3,
19
+ LAMBERT_II_E=4,
20
+ LAMBERT_93= 5
21
+ } LambertZone;
22
+
23
+ typedef struct {
24
+ double x;
25
+ double y;
26
+ double z;
27
+ } YGLambertPoint;
28
+
29
+
30
+ /*
31
+ * ALGO0021 - Calcul de la grande Normale
32
+ *
33
+ */
34
+ double lambert_normal(double lat, double a, double e);
35
+
36
+ /*
37
+ * Convert a YGLambertPoint struct from one lambert zone to WGS84 (Rad)
38
+ *
39
+ */
40
+ void lambert_to_wgs84(const YGLambertPoint * org, YGLambertPoint *dest, LambertZone zone);
41
+
42
+ /*
43
+ * Convert a YGLambertPoint struct from one lambert zone to WGS84 (Deg)
44
+ *
45
+ */
46
+ void lambert_to_wgs84_deg(const YGLambertPoint * org, YGLambertPoint *dest, LambertZone zone);
47
+
48
+ /*
49
+ * ALGO0002
50
+ */
51
+
52
+ double lat_from_lat_iso(double lat_iso, double e, double eps);
53
+
54
+ /*
55
+ * ALGO0012
56
+ */
57
+
58
+ YGLambertPoint cartesian_to_geographic(YGLambertPoint org, double meridien, double a, double e , double eps);
59
+
60
+ /*
61
+ * ALGO004
62
+ */
63
+ void lambert_to_geographic(const YGLambertPoint * org,YGLambertPoint *dest, LambertZone zone, double lon_merid, double e, double eps);
64
+
65
+ /**
66
+ * ALGO0009 - Transformations geographiques -> cartésiennes
67
+ *
68
+ *
69
+ */
70
+
71
+ YGLambertPoint geographic_to_cartesian(double lon, double lat, double he, double a, double e);
@@ -0,0 +1,171 @@
1
+ /*
2
+ * Source des algorithmes : http://geodesie.ign.fr/contenu/fichiers/documentation/algorithmes/notice/NTG_71.pdf
3
+ *
4
+ */
5
+
6
+ #include "lambert.h"
7
+ #include <math.h>
8
+ #include <stdio.h>
9
+
10
+ #define RAD_TO_DEG(x) x*180/M_PI
11
+
12
+ #define DISPLAY_YGLambertPoint(YGLambertPoint) printf(#YGLambertPoint" X:%f | Y:%f | Z:%f\n",YGLambertPoint.x,YGLambertPoint.y,YGLambertPoint.z);
13
+ #define DISPLAY_YGLambertPoint_REF(YGLambertPoint) printf(#YGLambertPoint" X:%f | Y:%f | Z:%f\n",YGLambertPoint->x,YGLambertPoint->y,YGLambertPoint->z);
14
+
15
+ static double lambert_n[6] = {0.7604059656, 0.7289686274, 0.6959127966, 0.6712679322, 0.7289686274, 0.7256077650};
16
+ static double lambert_c[6] = {11603796.98, 11745793.39, 11947992.52, 12136281.99, 11745793.39, 11754255.426};
17
+ static double lambert_xs[6]= {600000.0, 600000.0, 600000.0, 234.358, 600000.0, 700000.0};
18
+ static double lambert_ys[6]= {5657616.674, 6199695.768, 6791905.085, 7239161.542, 8199695.768, 12655612.050};
19
+
20
+
21
+ /*
22
+ * ALGO0002
23
+ */
24
+
25
+ double lat_from_lat_iso(double lat_iso, double e,double eps)
26
+ {
27
+
28
+ double phi_0 = 2*atan(exp(lat_iso)) - M_PI_2;
29
+ double phi_i = 2*atan(pow((1+e*sin(phi_0))/(1-e*sin(phi_0)),e/2.0)*exp(lat_iso)) - M_PI_2;
30
+ double delta ;
31
+ while(delta = fabs(phi_i - phi_0),delta > eps)
32
+ {
33
+ phi_0 = phi_i;
34
+ phi_i = 2*atan(pow((1+e*sin(phi_0))/(1-e*sin(phi_0)),e/2.0)*exp(lat_iso)) - M_PI_2;
35
+ }
36
+
37
+ return phi_i;
38
+
39
+ }
40
+ /*
41
+ * ALGO0004 - Lambert vers geographiques
42
+ */
43
+
44
+ void lambert_to_geographic(const YGLambertPoint * org,YGLambertPoint *dest, LambertZone zone, double lon_merid, double e, double eps)
45
+ {
46
+ double n = lambert_n[zone];
47
+ double C = lambert_c[zone];
48
+ double x_s = lambert_xs[zone];
49
+ double y_s = lambert_ys[zone];
50
+
51
+ double x = org->x;
52
+ double y = org->y;
53
+
54
+ double lon, gamma, R, lat_iso;
55
+
56
+ R = sqrt((x-x_s)*(x-x_s)+(y-y_s)*(y-y_s));
57
+
58
+ gamma = atan((x-x_s)/(y_s-y));
59
+
60
+ lon = lon_merid + gamma/n;
61
+
62
+ lat_iso = -1/n*log(fabs(R/C));
63
+
64
+ double lat = lat_from_lat_iso(lat_iso,e,eps);
65
+
66
+ dest->x = lon;
67
+ dest->y = lat;
68
+ }
69
+
70
+
71
+ /*
72
+ * ALGO0021 - Calcul de la grande Normale
73
+ *
74
+ */
75
+
76
+ double lambert_normal(double lat, double a, double e)
77
+ {
78
+
79
+ return a/sqrt(1-e*e*sin(lat)*sin(lat));
80
+ }
81
+
82
+ /**
83
+ * ALGO0009 - Transformations geographiques -> cartésiennes
84
+ *
85
+ *
86
+ */
87
+
88
+ YGLambertPoint geographic_to_cartesian(double lon, double lat, double he, double a, double e)
89
+ {
90
+ double N = lambert_normal(lat,a,e);
91
+
92
+ YGLambertPoint pt = {0,0,0};
93
+ pt.x = (N+he)*cos(lat)*cos(lon);
94
+
95
+ pt.y = (N+he)*cos(lat)*sin(lon);
96
+
97
+ pt.z = (N*(1-e*e)+he)*sin(lat);
98
+
99
+ return pt;
100
+
101
+ }
102
+
103
+ /*
104
+ * ALGO0012 - Passage des coordonnées cartésiennes aux coordonnées géographiques
105
+ */
106
+
107
+ YGLambertPoint cartesian_to_geographic(YGLambertPoint org, double meridien, double a, double e , double eps)
108
+ {
109
+ double x = org.x, y = org.y, z = org.z;
110
+
111
+ double lon = meridien + atan(y/x);
112
+
113
+ double module = sqrt(x*x + y*y);
114
+
115
+ double phi_0 = atan(z/(module*(1-(a*e*e)/sqrt(x*x+y*y+z*z))));
116
+ double phi_i = atan(z/module/(1-a*e*e*cos(phi_0)/(module * sqrt(1-e*e*sin(phi_0)*sin(phi_0)))));
117
+ double delta;
118
+ while(delta = fabs(phi_i - phi_0),delta > eps)
119
+ {
120
+ phi_0 = phi_i;
121
+ phi_i = atan(z/module/(1-a*e*e*cos(phi_0)/(module * sqrt(1-e*e*sin(phi_0)*sin(phi_0)))));
122
+
123
+ }
124
+
125
+ double he = module/cos(phi_i) - a/sqrt(1-e*e*sin(phi_i)*sin(phi_i));
126
+
127
+ YGLambertPoint pt;
128
+ pt.x = lon;
129
+ pt.y = phi_i;
130
+ pt.z = he;
131
+
132
+ return pt;
133
+ }
134
+
135
+
136
+
137
+ /*
138
+ * Convert Lambert -> WGS84
139
+ * http://geodesie.ign.fr/contenu/fichiers/documentation/pedagogiques/transfo.pdf
140
+ *
141
+ */
142
+
143
+ void lambert_to_wgs84(const YGLambertPoint * org, YGLambertPoint *dest,LambertZone zone){
144
+
145
+ lambert_to_geographic(org,dest,zone,LON_MERID_PARIS,E_CLARK_IGN,DEFAULT_EPS);
146
+
147
+ YGLambertPoint temp = geographic_to_cartesian(dest->x,dest->y,dest->z,A_CLARK_IGN,E_CLARK_IGN);
148
+
149
+ temp.x= temp.x - 168;
150
+ temp.y= temp.y - 60;
151
+ temp.z= temp.z + 320;
152
+
153
+ //WGS84 refers to greenwich
154
+ temp = cartesian_to_geographic(temp, LON_MERID_GREENWICH, A_WGS84,E_WGS84,DEFAULT_EPS);
155
+
156
+ dest->x = temp.x;
157
+ dest->y = temp.y;
158
+
159
+ }
160
+
161
+
162
+ void lambert_to_wgs84_deg(const YGLambertPoint * org, YGLambertPoint *dest, LambertZone zone)
163
+ {
164
+ YGLambertPoint temp = {0,0,0};
165
+
166
+ lambert_to_wgs84(org,&temp,zone);
167
+
168
+ dest->x = temp.x * 180/M_PI;
169
+ dest->y = temp.y * 180/M_PI;
170
+ dest->z = temp.z * 180/M_PI;
171
+ }
@@ -0,0 +1,71 @@
1
+ #define DEFAULT_EPS 1e-10
2
+ #define E_CLARK_IGN 0.08248325676
3
+ #define E_WGS84 0.08181919106
4
+
5
+ #define A_CLARK_IGN 6378249.2
6
+ #define A_WGS84 6378137.0
7
+
8
+ #define LON_MERID_PARIS 0
9
+ #define LON_MERID_GREENWICH 0.04079234433
10
+
11
+ #define DISPLAY_YGLambertPoint(YGLambertPoint) printf(#YGLambertPoint" X:%f | Y:%f | Z:%f\n",YGLambertPoint.x,YGLambertPoint.y,YGLambertPoint.z);
12
+ #define DISPLAY_YGLambertPoint_REF(YGLambertPoint) printf(#YGLambertPoint" X:%f | Y:%f | Z:%f\n",YGLambertPoint->x,YGLambertPoint->y,YGLambertPoint->z);
13
+
14
+ typedef enum {
15
+ LAMBERT_I=0,
16
+ LAMBERT_II=1,
17
+ LAMBERT_III=2,
18
+ LAMBERT_IV=3,
19
+ LAMBERT_II_E=4,
20
+ LAMBERT_93= 5
21
+ } LambertZone;
22
+
23
+ typedef struct {
24
+ double x;
25
+ double y;
26
+ double z;
27
+ } YGLambertPoint;
28
+
29
+
30
+ /*
31
+ * ALGO0021 - Calcul de la grande Normale
32
+ *
33
+ */
34
+ double lambert_normal(double lat, double a, double e);
35
+
36
+ /*
37
+ * Convert a YGLambertPoint struct from one lambert zone to WGS84 (Rad)
38
+ *
39
+ */
40
+ void lambert_to_wgs84(const YGLambertPoint * org, YGLambertPoint *dest, LambertZone zone);
41
+
42
+ /*
43
+ * Convert a YGLambertPoint struct from one lambert zone to WGS84 (Deg)
44
+ *
45
+ */
46
+ void lambert_to_wgs84_deg(const YGLambertPoint * org, YGLambertPoint *dest, LambertZone zone);
47
+
48
+ /*
49
+ * ALGO0002
50
+ */
51
+
52
+ double lat_from_lat_iso(double lat_iso, double e, double eps);
53
+
54
+ /*
55
+ * ALGO0012
56
+ */
57
+
58
+ YGLambertPoint cartesian_to_geographic(YGLambertPoint org, double meridien, double a, double e , double eps);
59
+
60
+ /*
61
+ * ALGO004
62
+ */
63
+ void lambert_to_geographic(const YGLambertPoint * org,YGLambertPoint *dest, LambertZone zone, double lon_merid, double e, double eps);
64
+
65
+ /**
66
+ * ALGO0009 - Transformations geographiques -> cartésiennes
67
+ *
68
+ *
69
+ */
70
+
71
+ YGLambertPoint geographic_to_cartesian(double lon, double lat, double he, double a, double e);
@@ -0,0 +1,195 @@
1
+ #include <CUnit/Basic.h>
2
+ #include <CUnit/Console.h>
3
+ #include <CUnit/Automated.h>
4
+ #include <math.h>
5
+ #include <stdlib.h>
6
+ #include "../src/lambert.h"
7
+
8
+ #define DISPLAY_POINT(point) printf(#point" X:%f | Y:%f | Z:%f\n",point.x,point.y,point.z);
9
+
10
+ int init_suite_success(void) { return 0; }
11
+ int init_suite_failure(void) { return -1; }
12
+ int clean_suite_success(void) { return 0; }
13
+ int clean_suite_failure(void) { return -1; }
14
+
15
+ char buffer[20];
16
+ char format[20];
17
+
18
+ double truncate(double val, int n)
19
+ {
20
+ sprintf(format,"%%.%df",n);
21
+ sprintf(buffer,format,val);
22
+ return atof(buffer);
23
+
24
+ }
25
+
26
+ double rounded_down(double val,int n){
27
+ double p = pow(10,n);
28
+ return floorf(val*p)/p;
29
+ }
30
+
31
+ void test_lambert_deg(void)
32
+ {
33
+ YGLambertPoint org = {999534.581,112186.569,0};
34
+ YGLambertPoint dest = {0,0,0};
35
+ LambertZone zone = LAMBERT_I;
36
+
37
+ lambert_to_wgs84_deg(&org, &dest, zone);
38
+ printf("(Deg)Lon:%.11f - Lat:%.11f - H:%.11f\n",dest.x,dest.y,dest.z);
39
+ }
40
+
41
+ void test_lambert(void)
42
+ {
43
+
44
+ YGLambertPoint org = {999534.581,112186.569,0};
45
+ YGLambertPoint dest = {0,0,0};
46
+ LambertZone zone = LAMBERT_I;
47
+
48
+ lambert_to_wgs84(&org, &dest, zone);
49
+
50
+ }
51
+
52
+ void test_algo009(void)
53
+ {
54
+ double lon[3] = {0.01745329248 ,0.00290888212 ,0.00581776423};
55
+ double lat[3] = {0.02036217457,0.00000000000 ,-0.03199770300};
56
+ double he[3] = {100.0000,10.0000 ,2000.0000};
57
+ double a[3] = {6378249.2000 ,6378249.2000 ,6378249.2000};
58
+ double e[3] = {0.08248325679 ,0.08248325679 ,0.08248325679};
59
+
60
+
61
+ unsigned int i;
62
+ for (i =0; i < 3;++i)
63
+ {
64
+ YGLambertPoint pt = geographic_to_cartesian(lon[i],lat[i],he[i],a[i],e[i]);
65
+ DISPLAY_POINT(pt);
66
+ }
67
+
68
+ }
69
+
70
+ void test_algo0021 (void)
71
+
72
+ {
73
+ double n = 6393174.9755;
74
+ double lat = 0.97738438100;
75
+ double a = 6378388.0000;
76
+ double e = 0.081991890;
77
+
78
+ double calc = lambert_normal(lat,a,e);
79
+ printf("Expected:%.4f | Computed:%.4f\n",n,calc);
80
+ CU_ASSERT(n == truncate(calc,4));
81
+
82
+ }
83
+ void test_algo0002(void)
84
+ {
85
+
86
+ /*
87
+ * See IGN "Jeux d'essai"
88
+ */
89
+
90
+ double lat_iso[3] = {1.00552653648,-0.30261690060 ,0.2000000000};
91
+ double e[3] = {0.08199188998,0.08199188998,0.08199188998};
92
+ double eps[3] = {1.0e-11,1.0e-11,1.0e-11};
93
+
94
+ double phi[3] = {0.87266462600, -0.29999999997 ,0.19998903369};
95
+
96
+ unsigned int index;
97
+
98
+ for(index = 0;index < 3;index++)
99
+ {
100
+ double result = lat_from_lat_iso(lat_iso[index], e[index], eps[index]);
101
+ result = truncate(result,11);
102
+ CU_ASSERT(result == phi[index]);
103
+ }
104
+ }
105
+
106
+
107
+ void test_algo0012(void)
108
+ {
109
+
110
+ double a[3] = {6378249.2000, 6378249.2000 ,6378249.2000};
111
+ double e[3] = {0.08248325679, 0.08248325679, 0.08248325679};
112
+ double x[3] = {6376064.6950, 6378232.2150, 6376897.5370};
113
+ double y[3] = {111294.6230, 18553.5780, 37099.7050};
114
+ double z[3] = {128984.7250, 0.0000, -202730.9070};
115
+ double eps[3] = {1e-11,1e-11,1e-11};
116
+
117
+ double lon[3] = {0.01745329248, 0.00290888212, 0.00581776423};
118
+ double lat[3] = {0.02036217457, 0.00000000000, -0.03199770301};
119
+ double he[3] = {99.9995, 10.0001, 2000.0001};
120
+
121
+ unsigned int i;
122
+ double ign_eps = 1e-11;
123
+ for(i=0; i < 3;++i)
124
+ {
125
+ YGLambertPoint sample = {x[i],y[i],z[i]};
126
+ YGLambertPoint val ;
127
+ val = cartesian_to_geographic(sample,LON_MERID_PARIS,a[i],e[i],eps[i]);
128
+
129
+ // printf("X Computed:%.11f - Expected:%.11f\n",val.x,lon[i]);
130
+ CU_ASSERT(fabs(val.x - lon[i]) <= ign_eps);
131
+ // printf("Y Computed:%.11f - Expected:%.11f\n",val.y,lat[i]);
132
+ CU_ASSERT(fabs(val.y - lat[i]) <= ign_eps);
133
+ // printf("Z Computed:%.11f - Expected:%.11f\n",val.z,he[i]);
134
+ CU_ASSERT(truncate(val.z,4) == he[i] ) ;
135
+ }
136
+
137
+
138
+ }
139
+ void test_algo004(void)
140
+ {
141
+
142
+ YGLambertPoint org = {1029705.083,272723.849,0};
143
+ YGLambertPoint dest = {0,0,0};
144
+ YGLambertPoint expected = {0.145512099,0.872664626};
145
+
146
+
147
+ lambert_to_geographic(&org,&dest, LAMBERT_I, LON_MERID_GREENWICH,E_CLARK_IGN,1e-9);
148
+ printf("Lat:%.9f - Lon:%.9f - Expected:Lat:%.9f - Lon:%.9f\n",dest.x,dest.y,expected.x,expected.y);
149
+ CU_ASSERT(fabs(dest.x - expected.x) <= 1e-9);
150
+ CU_ASSERT(fabs(dest.y - expected.y) <= 1e-9);
151
+ }
152
+
153
+ int main(int argc, char **argv){
154
+
155
+ CU_pSuite pSuite = NULL;
156
+
157
+ /* initialize the CUnit test registry */
158
+ if (CUE_SUCCESS != CU_initialize_registry())
159
+ return CU_get_error();
160
+
161
+ /* add a suite to the registry */
162
+ pSuite = CU_add_suite("Suite_success", init_suite_success, clean_suite_success);
163
+ if (NULL == pSuite) {
164
+ CU_cleanup_registry();
165
+ return CU_get_error();
166
+ }
167
+
168
+ /* add the tests to the suite */
169
+ if ( NULL == CU_add_test(pSuite, "Test Algo0002", test_algo0002) ||
170
+ NULL == CU_add_test(pSuite, "Test Algo0012", test_algo0012) ||
171
+ NULL == CU_add_test(pSuite,"Test Algo004",test_algo004) ||
172
+ NULL == CU_add_test(pSuite,"Test algo0021",test_algo0021) ||
173
+ NULL == CU_add_test(pSuite,"test_algo009",test_algo009) ||
174
+ NULL == CU_add_test(pSuite,"test_algo009",test_lambert_deg) ||
175
+ NULL == CU_add_test(pSuite, "Test lambert", test_lambert)
176
+ )
177
+ {
178
+ CU_cleanup_registry();
179
+ return CU_get_error();
180
+ }
181
+
182
+ CU_basic_set_mode(CU_BRM_VERBOSE);
183
+ CU_basic_run_tests();
184
+ // CU_automated_run_tests();
185
+
186
+ CU_list_tests_to_file();
187
+
188
+
189
+ /* Clean up registry and return */
190
+ CU_cleanup_registry();
191
+ return CU_get_error();
192
+
193
+ return 0;
194
+
195
+ }
@@ -0,0 +1,69 @@
1
+ #include <ruby.h>
2
+ #include "lambert.h"
3
+
4
+ static VALUE rb_mLambert;
5
+ static VALUE rb_cPoint;
6
+
7
+ static VALUE p_init(int argc, VALUE* argv, VALUE self)
8
+ {
9
+
10
+ VALUE x, y, z;
11
+
12
+ rb_scan_args(argc,argv, "21",&x, &y, &z);
13
+
14
+ if(NIL_P(z))
15
+ {
16
+ z = rb_float_new(0.0);
17
+ }
18
+
19
+ Check_Type(x,T_FLOAT);
20
+ Check_Type(y,T_FLOAT);
21
+ Check_Type(z,T_FLOAT);
22
+
23
+ rb_iv_set(self, "@x", x);
24
+ rb_iv_set(self, "@y", y);
25
+ rb_iv_set(self, "@z", z);
26
+
27
+ return self;
28
+ }
29
+
30
+ static VALUE p_convert(VALUE self,VALUE zone){
31
+
32
+ double x, y, z;
33
+ LambertZone cZone = NUM2INT(zone);
34
+
35
+ x = NUM2DBL(rb_iv_get(self,"@x"));
36
+ y = NUM2DBL(rb_iv_get(self,"@y"));
37
+ z = NUM2DBL(rb_iv_get(self,"@z"));
38
+
39
+ YGLambertPoint org = {x,y,z};
40
+ YGLambertPoint dest = {0,0,0};
41
+
42
+ lambert_to_wgs84_deg(&org,&dest,cZone);
43
+
44
+ rb_iv_set(self, "@x", rb_float_new(dest.x));
45
+ rb_iv_set(self, "@y", rb_float_new(dest.y));
46
+ rb_iv_set(self, "@z", rb_float_new(dest.z));
47
+
48
+
49
+ return Qnil;
50
+ }
51
+
52
+ void Init_lambert_ruby(void) {
53
+
54
+ rb_mLambert = rb_define_module("Lambert");
55
+ rb_cPoint = rb_define_class_under(rb_mLambert,"LambertPoint",rb_cObject);
56
+ rb_define_attr(rb_cPoint,"x",1,1);
57
+ rb_define_attr(rb_cPoint,"y",1,1);
58
+ rb_define_attr(rb_cPoint,"z",1,1);
59
+
60
+ rb_define_method(rb_cPoint,"initialize",p_init,-1);
61
+ rb_define_method(rb_cPoint,"wgs84",p_convert,1);
62
+
63
+ rb_define_const(rb_mLambert,"LambertI",INT2NUM(LAMBERT_I));
64
+ rb_define_const(rb_mLambert,"LambertII",INT2NUM(LAMBERT_II));
65
+ rb_define_const(rb_mLambert,"LambertIII",INT2NUM(LAMBERT_III));
66
+ rb_define_const(rb_mLambert,"LambertIV",INT2NUM(LAMBERT_IV));
67
+ rb_define_const(rb_mLambert,"LambertIIExtended",INT2NUM(LAMBERT_II_E));
68
+ rb_define_const(rb_mLambert,"Lambert93",INT2NUM(LAMBERT_93));
69
+ }
@@ -0,0 +1 @@
1
+ require 'lambert_ruby/lambert_ruby'
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lambert_ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Yannick Heinrich
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-24 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Ruby wrapper for the lambert library that converts Lambert coordinates
14
+ to WGS84. It wraps the original C files with a basic Ruby interface.
15
+ email: yannick.heinrich@gmail.com
16
+ executables: []
17
+ extensions:
18
+ - ext/lambert_ruby/extconf.rb
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/lambert_ruby.rb
22
+ - ext/lambert_ruby/lambert/src/lambert.c
23
+ - ext/lambert_ruby/lambert/tests/test_lambert_cunit.c
24
+ - ext/lambert_ruby/lambert.c
25
+ - ext/lambert_ruby/lambert_ruby.c
26
+ - ext/lambert_ruby/lambert/src/lambert.h
27
+ - ext/lambert_ruby/lambert.h
28
+ - ext/lambert_ruby/extconf.rb
29
+ homepage: https://github.com/YaGeek/lambert-ruby
30
+ licenses:
31
+ - GPL-2
32
+ metadata: {}
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ requirements: []
48
+ rubyforge_project:
49
+ rubygems_version: 2.0.3
50
+ signing_key:
51
+ specification_version: 4
52
+ summary: Ruby wrapper for the lambert library that converts Lambert coordinates to
53
+ WGS84
54
+ test_files: []