proj4rb 0.4.0-x86-mingw32

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.
Files changed (55) hide show
  1. data/MIT-LICENSE +9 -0
  2. data/README.rdoc +163 -0
  3. data/Rakefile +72 -0
  4. data/data/GL27 +22 -0
  5. data/data/MD +0 -0
  6. data/data/TN +0 -0
  7. data/data/WI +0 -0
  8. data/data/WO +0 -0
  9. data/data/conus +0 -0
  10. data/data/epsg +5443 -0
  11. data/data/epsg-deprecated +2 -0
  12. data/data/esri +5937 -0
  13. data/data/esri.extra +948 -0
  14. data/data/hawaii +0 -0
  15. data/data/nad.lst +142 -0
  16. data/data/nad27 +809 -0
  17. data/data/nad83 +744 -0
  18. data/data/ntv1_can.dat +0 -0
  19. data/data/null +0 -0
  20. data/data/other.extra +49 -0
  21. data/data/proj_def.dat +17 -0
  22. data/data/prvi +0 -0
  23. data/data/stgeorge +0 -0
  24. data/data/stlrnc +0 -0
  25. data/data/stpaul +0 -0
  26. data/data/world +212 -0
  27. data/example/basic.rb +18 -0
  28. data/example/list-datums.rb +17 -0
  29. data/example/list-ellipsoids.rb +17 -0
  30. data/example/list-errors.rb +11 -0
  31. data/example/list-prime-meridians.rb +17 -0
  32. data/example/list-projection-types.rb +17 -0
  33. data/example/list-units.rb +17 -0
  34. data/example/version.rb +8 -0
  35. data/ext/Makefile +212 -0
  36. data/ext/extconf.rb +13 -0
  37. data/ext/mkmf.log +25 -0
  38. data/ext/projrb.c +560 -0
  39. data/ext/vc/proj4_ruby.sln +19 -0
  40. data/ext/vc/proj4_ruby.vcproj +208 -0
  41. data/lib/1.8/proj4_ruby.so +0 -0
  42. data/lib/1.9/proj4_ruby.so +0 -0
  43. data/lib/proj4.rb +466 -0
  44. data/test/test_constants.rb +20 -0
  45. data/test/test_create_projection.rb +64 -0
  46. data/test/test_datums.rb +44 -0
  47. data/test/test_ellipsoids.rb +45 -0
  48. data/test/test_errors.rb +70 -0
  49. data/test/test_init_projection.rb +108 -0
  50. data/test/test_prime_meridians.rb +44 -0
  51. data/test/test_projection_type.rb +43 -0
  52. data/test/test_simple_projection.rb +57 -0
  53. data/test/test_transform.rb +114 -0
  54. data/test/test_units.rb +45 -0
  55. metadata +145 -0
data/ext/extconf.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'mkmf'
2
+
3
+ dir_config('proj')
4
+
5
+ if not have_header('proj_api.h')
6
+ raise('Cannot find proj_api.h header')
7
+ end
8
+
9
+ if not have_library('proj', 'pj_init')
10
+ raise('Cannot find proj4 library')
11
+ end
12
+
13
+ create_makefile 'proj4_ruby'
data/ext/mkmf.log ADDED
@@ -0,0 +1,25 @@
1
+ have_header: checking for proj_api.h... -------------------- no
2
+
3
+ "gcc -o conftest -Ic:/MinGW/local/ruby/include/ruby-1.9.1/i386-mingw32 -Ic:/MinGW/local/ruby/include/ruby-1.9.1/ruby/backward -Ic:/MinGW/local/ruby/include/ruby-1.9.1 -I. -O3 -g -Wall -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long conftest.c -L. -Lc:/MinGW/local/ruby/lib -L. -lmsvcrt-ruby191-static -lshell32 -lws2_32 "
4
+ checked program was:
5
+ /* begin */
6
+ 1: #include "ruby.h"
7
+ 2:
8
+ 3: #include <winsock2.h>
9
+ 4: #include <windows.h>
10
+ 5: int main() {return 0;}
11
+ /* end */
12
+
13
+ "gcc -E -Ic:/MinGW/local/ruby/include/ruby-1.9.1/i386-mingw32 -Ic:/MinGW/local/ruby/include/ruby-1.9.1/ruby/backward -Ic:/MinGW/local/ruby/include/ruby-1.9.1 -I. -O3 -g -Wall -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long conftest.c -o conftest.i"
14
+ conftest.c:5:22: proj_api.h: No such file or directory
15
+ checked program was:
16
+ /* begin */
17
+ 1: #include "ruby.h"
18
+ 2:
19
+ 3: #include <winsock2.h>
20
+ 4: #include <windows.h>
21
+ 5: #include <proj_api.h>
22
+ /* end */
23
+
24
+ --------------------
25
+
data/ext/projrb.c ADDED
@@ -0,0 +1,560 @@
1
+ #include <ruby.h>
2
+ #include <projects.h>
3
+ #include <proj_api.h>
4
+
5
+ static VALUE mProjrb;
6
+
7
+ static VALUE cDef;
8
+ static VALUE cDatum;
9
+ static VALUE cEllipsoid;
10
+ static VALUE cPrimeMeridian;
11
+ static VALUE cProjectionType;
12
+ static VALUE cUnit;
13
+
14
+ static VALUE cError;
15
+ static VALUE cProjection;
16
+
17
+ static ID idGetX;
18
+ static ID idSetX;
19
+ static ID idGetY;
20
+ static ID idSetY;
21
+ static ID idGetZ;
22
+ static ID idSetZ;
23
+ static ID idParseInitParameters;
24
+ static ID idRaiseError;
25
+
26
+ typedef struct {projPJ pj;} _wrap_pj;
27
+
28
+
29
+ static void raise_error(int pj_errno_ref) {
30
+ VALUE error_id = INT2NUM(pj_errno_ref);
31
+ rb_funcall(cError, idRaiseError, 1, error_id);
32
+ }
33
+
34
+ static void proj_free(void* p){
35
+ _wrap_pj * wpj = (_wrap_pj*) p;
36
+ if(wpj->pj != 0)
37
+ pj_free(wpj->pj);
38
+ free(p);
39
+ }
40
+
41
+ static VALUE proj_alloc(VALUE klass){
42
+ _wrap_pj* wpj;
43
+ VALUE obj;
44
+ wpj = (_wrap_pj*) malloc(sizeof(_wrap_pj));
45
+ wpj->pj = 0; //at init the projection has not been defined
46
+ obj = Data_Wrap_Struct(klass, 0, proj_free, wpj);
47
+ return obj;
48
+ }
49
+
50
+
51
+ /** Returns the current error message.
52
+
53
+ call-seq: Error.message(errno)
54
+
55
+ */
56
+ static VALUE proj_error_message(VALUE self, VALUE rerrno) {
57
+ int error_id = NUM2INT(rerrno);
58
+ char *msg = pj_strerrno(error_id);
59
+ if (msg)
60
+ return rb_str_new2(msg);
61
+ else
62
+ return rb_str_new2("unknown error");
63
+ }
64
+
65
+
66
+ /**Creates a new projection object. See the intro for details.
67
+
68
+ call-seq: new(String) -> Proj4::Projection
69
+ new(Array) -> Proj4::Projection
70
+ new(Hash) -> Proj4::Projection
71
+
72
+ */
73
+ static VALUE proj_initialize(VALUE self, VALUE params){
74
+ _wrap_pj* wpj;
75
+ VALUE proj_params = rb_funcall(cProjection, idParseInitParameters, 1, params);
76
+ int size = RARRAY_LEN(proj_params);
77
+ char** c_params = (char **) malloc(size*sizeof(char *));
78
+ int i;
79
+
80
+ for (i=0; i < size; i++)
81
+ {
82
+ VALUE item = rb_ary_entry(proj_params, i);
83
+ c_params[i]= StringValuePtr(item);
84
+ }
85
+
86
+ Data_Get_Struct(self,_wrap_pj,wpj);
87
+ wpj->pj = pj_init(size,c_params);
88
+ free(c_params);
89
+ if(wpj->pj == 0) {
90
+ int pj_errno_ref = *pj_get_errno_ref();
91
+ if (pj_errno_ref > 0) {
92
+ rb_raise(rb_eSystemCallError, "Unknown system call error");
93
+ } else {
94
+ raise_error(pj_errno_ref);
95
+ }
96
+ }
97
+ return self;
98
+ }
99
+
100
+ /**Has this projection an inverse?
101
+
102
+ call-seq: hasInverse? -> true or false
103
+
104
+ */
105
+ static VALUE proj_has_inverse(VALUE self){
106
+ _wrap_pj* wpj;
107
+ Data_Get_Struct(self,_wrap_pj,wpj);
108
+ return wpj->pj->inv ? Qtrue : Qfalse;
109
+ }
110
+
111
+ /**Is this projection a latlong projection?
112
+
113
+ call-seq: isLatLong? -> true or false
114
+
115
+ */
116
+ static VALUE proj_is_latlong(VALUE self){
117
+ _wrap_pj* wpj;
118
+ Data_Get_Struct(self,_wrap_pj,wpj);
119
+ return pj_is_latlong(wpj->pj) ? Qtrue : Qfalse;
120
+ }
121
+
122
+ /**Is this projection a geocentric projection?
123
+
124
+ call-seq: isGeocentric? -> true or false
125
+
126
+ */
127
+ static VALUE proj_is_geocent(VALUE self){
128
+ _wrap_pj* wpj;
129
+ Data_Get_Struct(self,_wrap_pj,wpj);
130
+ return pj_is_geocent(wpj->pj) ? Qtrue : Qfalse;
131
+ }
132
+
133
+ /**Get the expanded definition of this projection as a string.
134
+
135
+ call-seq: getDef -> String
136
+
137
+ */
138
+ static VALUE proj_get_def(VALUE self){
139
+ _wrap_pj* wpj;
140
+ Data_Get_Struct(self,_wrap_pj,wpj);
141
+ return rb_str_new2(pj_get_def(wpj->pj, 0));
142
+ }
143
+
144
+ /**Transforms a point in WGS84 LonLat in radians to projected coordinates.
145
+ This version of the method changes the point in-place.
146
+
147
+ call-seq: forward!(point) -> point
148
+
149
+ */
150
+ static VALUE proj_forward(VALUE self,VALUE point){
151
+ _wrap_pj* wpj;
152
+ int pj_errno_ref;
153
+ projLP pj_point;
154
+ projXY pj_result;
155
+ Data_Get_Struct(self,_wrap_pj,wpj);
156
+
157
+ pj_point.u = NUM2DBL( rb_funcall(point, idGetX, 0) );
158
+ pj_point.v = NUM2DBL( rb_funcall(point, idGetY, 0) );
159
+ pj_result = pj_fwd(pj_point, wpj->pj);
160
+
161
+ pj_errno_ref = *pj_get_errno_ref();
162
+ if (pj_errno_ref == 0) {
163
+ rb_funcall(point, idSetX, 1, rb_float_new(pj_result.u) );
164
+ rb_funcall(point, idSetY, 1, rb_float_new(pj_result.v) );
165
+ return point;
166
+ } else if (pj_errno_ref > 0) {
167
+ rb_raise(rb_eSystemCallError, "Unknown system call error");
168
+ } else {
169
+ raise_error(pj_errno_ref);
170
+ }
171
+ return self; /* Makes gcc happy */
172
+ }
173
+
174
+ /**Transforms a point in the coordinate system defined at initialization of the Projection object to WGS84 LonLat in radians.
175
+ This version of the method changes the point in-place.
176
+
177
+ call-seq: inverse!(point) -> point
178
+
179
+ */
180
+ static VALUE proj_inverse(VALUE self,VALUE point){
181
+ _wrap_pj* wpj;
182
+ int pj_errno_ref;
183
+ projXY pj_point;
184
+ projLP pj_result;
185
+
186
+ Data_Get_Struct(self,_wrap_pj,wpj);
187
+
188
+ pj_point.u = NUM2DBL( rb_funcall(point, idGetX, 0) );
189
+ pj_point.v = NUM2DBL( rb_funcall(point, idGetY, 0) );
190
+ pj_result = pj_inv(pj_point, wpj->pj);
191
+
192
+ pj_errno_ref = *pj_get_errno_ref();
193
+ if (pj_errno_ref == 0) {
194
+ rb_funcall(point, idSetX, 1, rb_float_new(pj_result.u) );
195
+ rb_funcall(point, idSetY, 1, rb_float_new(pj_result.v) );
196
+ return point;
197
+ } else if (pj_errno_ref > 0) {
198
+ rb_raise(rb_eSystemCallError, "Unknown system call error");
199
+ } else {
200
+ raise_error(pj_errno_ref);
201
+ }
202
+ return self; /* Makes gcc happy */
203
+ }
204
+
205
+ /**Transforms a point from one projection to another. The second parameter is
206
+ either a Proj4::Point object or you can use any object which
207
+ responds to the x, y, z read and write accessor methods. (In fact you
208
+ don't even need the z accessor methods, 0 is assumed if they don't exist).
209
+ This is the destructive variant of the method, i.e. it will overwrite your
210
+ existing point coordinates but otherwise leave the point object alone.
211
+
212
+ call-seq: transform!(destinationProjection, point) -> point
213
+
214
+ */
215
+ static VALUE proj_transform(VALUE self, VALUE dst, VALUE point){
216
+ _wrap_pj* wpjsrc;
217
+ _wrap_pj* wpjdst;
218
+ double array_x[1];
219
+ double array_y[1];
220
+ double array_z[1];
221
+ int result;
222
+
223
+ Data_Get_Struct(self,_wrap_pj,wpjsrc);
224
+ Data_Get_Struct(dst,_wrap_pj,wpjdst);
225
+
226
+ array_x[0] = NUM2DBL( rb_funcall(point, idGetX, 0) );
227
+ array_y[0] = NUM2DBL( rb_funcall(point, idGetY, 0) );
228
+
229
+ /* if point objects has a method 'z' we get the z coordinate, otherwise we just assume 0 */
230
+ if ( rb_respond_to(point, idGetZ) ) {
231
+ array_z[0] = NUM2DBL( rb_funcall(point, idGetZ, 0) );
232
+ } else {
233
+ array_z[0] = 0.0;
234
+ }
235
+
236
+ result = pj_transform(wpjsrc->pj, wpjdst->pj, 1, 1, array_x, array_y, array_z);
237
+ if (! result) {
238
+ rb_funcall(point, idSetX, 1, rb_float_new(array_x[0]) );
239
+ rb_funcall(point, idSetY, 1, rb_float_new(array_y[0]) );
240
+ /* if point objects has a method 'z=' we set the z coordinate, otherwise we ignore it */
241
+ if ( rb_respond_to(point, idSetZ) ) {
242
+ rb_funcall(point, idSetZ, 1, rb_float_new(array_z[0]) );
243
+ }
244
+ return point;
245
+ } else if (result > 0) {
246
+ rb_raise(rb_eSystemCallError, "Unknown system call error");
247
+ } else {
248
+ raise_error(result);
249
+ }
250
+ return self; /* Makes gcc happy */
251
+ }
252
+
253
+ #if PJ_VERSION >= 449
254
+ /**Return list of all datums we know about.
255
+
256
+ call-seq: list -> Array of Proj4::Datum
257
+
258
+ */
259
+ static VALUE datum_list(VALUE self){
260
+ struct PJ_DATUMS *datum;
261
+ VALUE list = rb_ary_new();
262
+ for (datum = pj_get_datums_ref(); datum->id; datum++){
263
+ rb_ary_push(list, Data_Wrap_Struct(cDatum, 0, 0, datum));
264
+ }
265
+ return list;
266
+ }
267
+ /**Get ID of the datum.
268
+
269
+ call-seq: id -> String
270
+
271
+ */
272
+ static VALUE datum_get_id(VALUE self){
273
+ struct PJ_DATUMS *datum;
274
+ Data_Get_Struct(self,struct PJ_DATUMS,datum);
275
+ return rb_str_new2(datum->id);
276
+ }
277
+ /**Get ID of the ellipse used by the datum.
278
+
279
+ call-seq: ellipse_id -> String
280
+
281
+ */
282
+ static VALUE datum_get_ellipse_id(VALUE self){
283
+ struct PJ_DATUMS *datum;
284
+ Data_Get_Struct(self,struct PJ_DATUMS,datum);
285
+ return rb_str_new2(datum->ellipse_id);
286
+ }
287
+ /**Get definition of the datum.
288
+
289
+ call-seq: defn -> String
290
+
291
+ */
292
+ static VALUE datum_get_defn(VALUE self){
293
+ struct PJ_DATUMS *datum;
294
+ Data_Get_Struct(self,struct PJ_DATUMS,datum);
295
+ return rb_str_new2(datum->defn);
296
+ }
297
+ /**Get comments about the datum.
298
+
299
+ call-seq: comments -> String
300
+
301
+ */
302
+ static VALUE datum_get_comments(VALUE self){
303
+ struct PJ_DATUMS *datum;
304
+ Data_Get_Struct(self,struct PJ_DATUMS,datum);
305
+ return rb_str_new2(datum->comments);
306
+ }
307
+
308
+ /**Return list of all reference ellipsoids we know about.
309
+
310
+ call-seq: list -> Array of Proj4::Ellipsoid
311
+
312
+ */
313
+ static VALUE ellipsoid_list(VALUE self){
314
+ struct PJ_ELLPS *el;
315
+ VALUE list = rb_ary_new();
316
+ for (el = pj_get_ellps_ref(); el->id; el++){
317
+ rb_ary_push(list, Data_Wrap_Struct(cEllipsoid, 0, 0, el));
318
+ }
319
+ return list;
320
+ }
321
+ /**Get ID of the reference ellipsoid.
322
+
323
+ call-seq: id -> String
324
+
325
+ */
326
+ static VALUE ellipsoid_get_id(VALUE self){
327
+ struct PJ_ELLPS *el;
328
+ Data_Get_Struct(self,struct PJ_ELLPS,el);
329
+ return rb_str_new2(el->id);
330
+ }
331
+ /**Get equatorial radius (semi-major axis, a value) of the reference ellipsoid.
332
+
333
+ call-seq: major -> String
334
+
335
+ */
336
+ static VALUE ellipsoid_get_major(VALUE self){
337
+ struct PJ_ELLPS *el;
338
+ Data_Get_Struct(self,struct PJ_ELLPS,el);
339
+ return rb_str_new2(el->major);
340
+ }
341
+ /**Get elliptical parameter of the reference ellipsoid. This is either the polar radius (semi-minor axis, b value) or the inverse flattening (1/f, rf).
342
+
343
+ call-seq: ell -> String
344
+
345
+ */
346
+ static VALUE ellipsoid_get_ell(VALUE self){
347
+ struct PJ_ELLPS *el;
348
+ Data_Get_Struct(self,struct PJ_ELLPS,el);
349
+ return rb_str_new2(el->ell);
350
+ }
351
+ /**Get name of the reference ellipsoid.
352
+
353
+ call-seq: name -> String
354
+
355
+ */
356
+ static VALUE ellipsoid_get_name(VALUE self){
357
+ struct PJ_ELLPS *el;
358
+ Data_Get_Struct(self,struct PJ_ELLPS,el);
359
+ return rb_str_new2(el->name);
360
+ }
361
+
362
+ /**Return list of all prime meridians we know about.
363
+
364
+ call-seq: list -> Array of Proj4::PrimeMeridian
365
+
366
+ */
367
+ static VALUE prime_meridian_list(VALUE self){
368
+ struct PJ_PRIME_MERIDIANS *prime_meridian;
369
+ VALUE list = rb_ary_new();
370
+ for (prime_meridian = pj_get_prime_meridians_ref(); prime_meridian->id; prime_meridian++){
371
+ rb_ary_push(list, Data_Wrap_Struct(cPrimeMeridian, 0, 0, prime_meridian));
372
+ }
373
+ return list;
374
+ }
375
+ /**Get ID of this prime_meridian.
376
+
377
+ call-seq: id -> String
378
+
379
+ */
380
+ static VALUE prime_meridian_get_id(VALUE self){
381
+ struct PJ_PRIME_MERIDIANS *prime_meridian;
382
+ Data_Get_Struct(self,struct PJ_PRIME_MERIDIANS,prime_meridian);
383
+ return rb_str_new2(prime_meridian->id);
384
+ }
385
+ /**Get definition of this prime_meridian.
386
+
387
+ call-seq: defn -> String
388
+
389
+ */
390
+ static VALUE prime_meridian_get_defn(VALUE self){
391
+ struct PJ_PRIME_MERIDIANS *prime_meridian;
392
+ Data_Get_Struct(self,struct PJ_PRIME_MERIDIANS,prime_meridian);
393
+ return rb_str_new2(prime_meridian->defn);
394
+ }
395
+
396
+ /**Return list of all projection types we know about.
397
+
398
+ call-seq: list -> Array of Proj4::ProjectionType
399
+
400
+ */
401
+ static VALUE projection_type_list(VALUE self){
402
+ struct PJ_LIST *pt;
403
+ VALUE list = rb_ary_new();
404
+ for (pt = pj_get_list_ref(); pt->id; pt++){
405
+ rb_ary_push(list, Data_Wrap_Struct(cProjectionType, 0, 0, pt));
406
+ }
407
+ return list;
408
+ }
409
+ /**Get ID of this projection type.
410
+
411
+ call-seq: id -> String
412
+
413
+ */
414
+ static VALUE projection_type_get_id(VALUE self){
415
+ struct PJ_LIST *pt;
416
+ Data_Get_Struct(self,struct PJ_LIST,pt);
417
+ return rb_str_new2(pt->id);
418
+ }
419
+ /**Get description of this projection type as a multiline string.
420
+
421
+ call-seq: descr -> String
422
+
423
+ */
424
+ static VALUE projection_type_get_descr(VALUE self){
425
+ struct PJ_LIST *pt;
426
+ Data_Get_Struct(self,struct PJ_LIST,pt);
427
+ return rb_str_new2(*(pt->descr));
428
+ }
429
+
430
+ /**Return list of all units we know about.
431
+
432
+ call-seq: list -> Array of Proj4::Unit
433
+
434
+ */
435
+ static VALUE unit_list(VALUE self){
436
+ struct PJ_UNITS *unit;
437
+ VALUE list = rb_ary_new();
438
+ for (unit = pj_get_units_ref(); unit->id; unit++){
439
+ rb_ary_push(list, Data_Wrap_Struct(cUnit, 0, 0, unit));
440
+ }
441
+ return list;
442
+ }
443
+ /**Get ID of the unit.
444
+
445
+ call-seq: id -> String
446
+
447
+ */
448
+ static VALUE unit_get_id(VALUE self){
449
+ struct PJ_UNITS *unit;
450
+ Data_Get_Struct(self,struct PJ_UNITS,unit);
451
+ return rb_str_new2(unit->id);
452
+ }
453
+ /**Get conversion factor of this unit to a meter. Note that this is a string, it can either contain a floating point number or it can be in the form numerator/denominator.
454
+
455
+ call-seq: to_meter -> String
456
+
457
+ */
458
+ static VALUE unit_get_to_meter(VALUE self){
459
+ struct PJ_UNITS *unit;
460
+ Data_Get_Struct(self,struct PJ_UNITS,unit);
461
+ return rb_str_new2(unit->to_meter);
462
+ }
463
+ /**Get name (description) of the unit.
464
+
465
+ call-seq: name -> String
466
+
467
+ */
468
+ static VALUE unit_get_name(VALUE self){
469
+ struct PJ_UNITS *unit;
470
+ Data_Get_Struct(self,struct PJ_UNITS,unit);
471
+ return rb_str_new2(unit->name);
472
+ }
473
+
474
+ #endif
475
+
476
+ #if defined(_WIN32)
477
+ __declspec(dllexport)
478
+ #endif
479
+ void Init_proj4_ruby(void) {
480
+
481
+ idGetX = rb_intern("x");
482
+ idSetX = rb_intern("x=");
483
+ idGetY = rb_intern("y");
484
+ idSetY = rb_intern("y=");
485
+ idGetZ = rb_intern("z");
486
+ idSetZ = rb_intern("z=");
487
+ idParseInitParameters = rb_intern("_parse_init_parameters");
488
+ idRaiseError = rb_intern("raise_error");
489
+
490
+ mProjrb = rb_define_module("Proj4");
491
+
492
+ /**
493
+ Radians per degree
494
+ */
495
+ rb_define_const(mProjrb,"DEG_TO_RAD", rb_float_new(DEG_TO_RAD));
496
+ /**
497
+ Degrees per radian
498
+ */
499
+ rb_define_const(mProjrb,"RAD_TO_DEG", rb_float_new(RAD_TO_DEG));
500
+ /**
501
+ Version of C libproj
502
+ */
503
+ rb_define_const(mProjrb,"LIBVERSION", rb_float_new(PJ_VERSION));
504
+
505
+ cError = rb_define_class_under(mProjrb,"Error",rb_path2class("StandardError"));
506
+ rb_define_singleton_method(cError,"message",proj_error_message,1);
507
+
508
+ cProjection = rb_define_class_under(mProjrb,"Projection",rb_cObject);
509
+ rb_define_alloc_func(cProjection,proj_alloc);
510
+ rb_define_method(cProjection,"initialize",proj_initialize,1);
511
+ rb_define_method(cProjection,"hasInverse?",proj_has_inverse,0);
512
+ rb_define_method(cProjection,"isLatLong?",proj_is_latlong,0);
513
+ rb_define_method(cProjection,"isGeocent?",proj_is_geocent,0);
514
+ rb_define_alias(cProjection,"isGeocentric?","isGeocent?");
515
+ rb_define_method(cProjection,"getDef",proj_get_def,0);
516
+ rb_define_method(cProjection,"forward!",proj_forward,1);
517
+ rb_define_method(cProjection,"inverse!",proj_inverse,1);
518
+ rb_define_method(cProjection,"transform!",proj_transform,2);
519
+
520
+ #if PJ_VERSION >= 449
521
+ cDef = rb_define_class_under(mProjrb,"Def",rb_cObject);
522
+
523
+ /* The Datum class holds information about datums ('WGS84', 'potsdam', ...) known to Proj.4. */
524
+ cDatum = rb_define_class_under(mProjrb,"Datum",cDef);
525
+ rb_define_singleton_method(cDatum,"list",datum_list,0);
526
+ rb_define_method(cDatum,"id",datum_get_id,0);
527
+ rb_define_method(cDatum,"ellipse_id",datum_get_ellipse_id,0);
528
+ rb_define_method(cDatum,"defn",datum_get_defn,0);
529
+ rb_define_method(cDatum,"comments",datum_get_comments,0);
530
+
531
+ /* The Ellipsoid class holds information about ellipsoids ('WGS84', 'bessel', ...) known to Proj.4. */
532
+ cEllipsoid = rb_define_class_under(mProjrb,"Ellipsoid",cDef);
533
+ rb_define_singleton_method(cEllipsoid,"list",ellipsoid_list,0);
534
+ rb_define_method(cEllipsoid,"id",ellipsoid_get_id,0);
535
+ rb_define_method(cEllipsoid,"major",ellipsoid_get_major,0);
536
+ rb_define_method(cEllipsoid,"ell",ellipsoid_get_ell,0);
537
+ rb_define_method(cEllipsoid,"name",ellipsoid_get_name,0);
538
+
539
+ /* The PrimeMeridian class holds information about prime meridians ('greenwich', 'lisbon', ...) known to Proj.4. */
540
+ cPrimeMeridian = rb_define_class_under(mProjrb,"PrimeMeridian",cDef);
541
+ rb_define_singleton_method(cPrimeMeridian,"list",prime_meridian_list,0);
542
+ rb_define_method(cPrimeMeridian,"id",prime_meridian_get_id,0);
543
+ rb_define_method(cPrimeMeridian,"defn",prime_meridian_get_defn,0);
544
+
545
+ /* The ProjectionType class holds information about projections types ('merc', 'aea', ...) known to Proj.4. */
546
+ cProjectionType = rb_define_class_under(mProjrb,"ProjectionType",cDef);
547
+ rb_define_singleton_method(cProjectionType,"list",projection_type_list,0);
548
+ rb_define_method(cProjectionType,"id",projection_type_get_id,0);
549
+ rb_define_method(cProjectionType,"descr",projection_type_get_descr,0);
550
+
551
+ /* The Unit class holds information about the units ('m', 'km', 'mi', ...) known to Proj.4. */
552
+ cUnit = rb_define_class_under(mProjrb,"Unit",cDef);
553
+ rb_define_singleton_method(cUnit,"list",unit_list,0);
554
+ rb_define_method(cUnit,"id",unit_get_id,0);
555
+ rb_define_method(cUnit,"to_meter",unit_get_to_meter,0);
556
+ rb_define_method(cUnit,"name",unit_get_name,0);
557
+
558
+ #endif
559
+ }
560
+