proj4rb 0.4.0-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
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
+