rgeo-proj4 2.0.1 → 3.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.
- checksums.yaml +4 -4
- data/ext/proj4_c_impl/extconf.rb +7 -3
- data/ext/proj4_c_impl/main.c +199 -87
- data/lib/rgeo/coord_sys/proj4.rb +32 -15
- data/lib/rgeo/coord_sys/srs_database/proj4_data.rb +7 -8
- data/lib/rgeo/proj4/version.rb +1 -1
- metadata +36 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62f84fd831d1035bdd65d52dcfdcf03c46ee0dc99c3ca74ce3e2051faa53c66a
|
4
|
+
data.tar.gz: cd095e159586c6e57ae4e8f2eb0c5f84719adf6c7bf521c6b86b34e78ae7b824
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c982a9cda985160dbc50d62ca5d5798da685d98a63be3df1fb9c4687e7bc42ab5e651e6245e55757d948f4717496b2c178b881e2072292b19ca9530b7db1663
|
7
|
+
data.tar.gz: 4d30068d4ddaaed6372e42cce1fdcba32be62e8dd8bbe8891556df03f7a6e821cbf0481e4f580eaaaa4efaf1fa7ed0c64da251062b8873673bf69b7d7e6f07dc
|
data/ext/proj4_c_impl/extconf.rb
CHANGED
@@ -45,15 +45,19 @@ else
|
|
45
45
|
|
46
46
|
found_proj_ = false
|
47
47
|
header_dirs_, lib_dirs_ = dir_config("proj", header_dirs_, lib_dirs_)
|
48
|
-
|
49
|
-
if have_header("proj_api.h", nil, dflag)
|
48
|
+
if have_header("proj.h")
|
50
49
|
$libs << " -lproj"
|
51
|
-
|
50
|
+
|
51
|
+
if have_func("proj_create", "proj.h")
|
52
52
|
found_proj_ = true
|
53
|
+
have_func("proj_create_crs_to_crs_from_pj", "proj.h")
|
54
|
+
have_func("proj_normalize_for_visualization", "proj.h")
|
53
55
|
else
|
54
56
|
$libs.gsub!(" -lproj", "")
|
55
57
|
end
|
56
58
|
end
|
59
|
+
have_func("rb_gc_mark_movable")
|
60
|
+
|
57
61
|
unless found_proj_
|
58
62
|
puts "**** WARNING: Unable to find Proj headers or Proj version is too old."
|
59
63
|
puts "**** Compiling without Proj support."
|
data/ext/proj4_c_impl/main.c
CHANGED
@@ -1,12 +1,21 @@
|
|
1
1
|
/*
|
2
2
|
Main initializer for Proj4 wrapper
|
3
3
|
*/
|
4
|
-
#ifdef
|
5
|
-
#ifdef
|
6
|
-
#
|
4
|
+
#ifdef HAVE_PROJ_H
|
5
|
+
#ifdef HAVE_PROJ_CREATE
|
6
|
+
#ifdef HAVE_PROJ_CREATE_CRS_TO_CRS_FROM_PJ
|
7
|
+
#ifdef HAVE_PROJ_NORMALIZE_FOR_VISUALIZATION
|
7
8
|
#define RGEO_PROJ4_SUPPORTED
|
8
9
|
#endif
|
9
10
|
#endif
|
11
|
+
#endif
|
12
|
+
#endif
|
13
|
+
|
14
|
+
#ifdef HAVE_RB_GC_MARK_MOVABLE
|
15
|
+
#define mark rb_gc_mark_movable
|
16
|
+
#else
|
17
|
+
#define mark rb_gc_mark
|
18
|
+
#endif
|
10
19
|
|
11
20
|
#ifdef __cplusplus
|
12
21
|
#define RGEO_BEGIN_C extern "C" {
|
@@ -20,7 +29,7 @@
|
|
20
29
|
#ifdef RGEO_PROJ4_SUPPORTED
|
21
30
|
|
22
31
|
#include <ruby.h>
|
23
|
-
#include <
|
32
|
+
#include <proj.h>
|
24
33
|
|
25
34
|
#endif
|
26
35
|
|
@@ -32,76 +41,105 @@ RGEO_BEGIN_C
|
|
32
41
|
|
33
42
|
|
34
43
|
typedef struct {
|
35
|
-
|
44
|
+
PJ *pj;
|
36
45
|
VALUE original_str;
|
37
46
|
char uses_radians;
|
38
47
|
} RGeo_Proj4Data;
|
39
48
|
|
40
49
|
|
41
|
-
|
50
|
+
// Destroy function for proj data.
|
51
|
+
static void rgeo_proj4_free(void *ptr)
|
52
|
+
{
|
53
|
+
RGeo_Proj4Data *data = (RGeo_Proj4Data *)ptr;
|
54
|
+
if(data->pj){
|
55
|
+
proj_destroy(data->pj);
|
56
|
+
}
|
57
|
+
free(data);
|
58
|
+
}
|
42
59
|
|
60
|
+
static size_t rgeo_proj4_memsize(const void *ptr)
|
61
|
+
{
|
62
|
+
size_t size = 0;
|
63
|
+
const RGeo_Proj4Data *data = (const RGeo_Proj4Data *)ptr;
|
43
64
|
|
44
|
-
|
65
|
+
size += sizeof(*data);
|
66
|
+
if(data->pj){
|
67
|
+
size += sizeof(data->pj);
|
68
|
+
}
|
69
|
+
return size;
|
70
|
+
}
|
45
71
|
|
46
|
-
static void
|
72
|
+
static void rgeo_proj4_mark(void *ptr)
|
47
73
|
{
|
48
|
-
|
49
|
-
|
74
|
+
RGeo_Proj4Data *data = (RGeo_Proj4Data *)ptr;
|
75
|
+
if(!NIL_P(data->original_str)){
|
76
|
+
mark(data->original_str);
|
50
77
|
}
|
51
|
-
free(data);
|
52
78
|
}
|
53
79
|
|
80
|
+
#ifdef HAVE_RB_GC_MARK_MOVABLE
|
81
|
+
static void rgeo_proj4_compact(void *ptr)
|
82
|
+
{
|
83
|
+
RGeo_Proj4Data *data = (RGeo_Proj4Data *)ptr;
|
84
|
+
if(data && !NIL_P(data->original_str)){
|
85
|
+
data->original_str = rb_gc_location(data->original_str);
|
86
|
+
}
|
87
|
+
}
|
88
|
+
#endif
|
54
89
|
|
55
|
-
static void
|
90
|
+
static void rgeo_proj4_clear_struct(RGeo_Proj4Data *data)
|
56
91
|
{
|
57
|
-
if
|
58
|
-
|
92
|
+
if(data->pj){
|
93
|
+
proj_destroy(data->pj);
|
94
|
+
data->pj = NULL;
|
95
|
+
data->original_str = Qnil;
|
59
96
|
}
|
60
97
|
}
|
61
98
|
|
99
|
+
static const rb_data_type_t rgeo_proj4_data_type = {
|
100
|
+
"RGeo::CoordSys::Proj4",
|
101
|
+
{rgeo_proj4_mark, rgeo_proj4_free, rgeo_proj4_memsize,
|
102
|
+
#ifdef HAVE_RB_GC_MARK_MOVABLE
|
103
|
+
rgeo_proj4_compact
|
104
|
+
#endif
|
105
|
+
},
|
106
|
+
0, 0,
|
107
|
+
RUBY_TYPED_FREE_IMMEDIATELY};
|
62
108
|
|
63
|
-
static VALUE
|
109
|
+
static VALUE rgeo_proj4_data_alloc(VALUE self)
|
64
110
|
{
|
65
111
|
VALUE result;
|
66
|
-
RGeo_Proj4Data*
|
112
|
+
RGeo_Proj4Data *data = ALLOC(RGeo_Proj4Data);
|
67
113
|
|
68
114
|
result = Qnil;
|
69
|
-
|
70
|
-
if
|
115
|
+
|
116
|
+
if(data){
|
71
117
|
data->pj = NULL;
|
72
118
|
data->original_str = Qnil;
|
73
119
|
data->uses_radians = 0;
|
74
|
-
result =
|
120
|
+
result = TypedData_Wrap_Struct(self, &rgeo_proj4_data_type, data);
|
75
121
|
}
|
76
122
|
return result;
|
77
123
|
}
|
78
124
|
|
79
|
-
|
80
125
|
static VALUE method_proj4_initialize_copy(VALUE self, VALUE orig)
|
81
126
|
{
|
82
|
-
RGeo_Proj4Data*
|
83
|
-
|
84
|
-
|
85
|
-
char* str;
|
127
|
+
RGeo_Proj4Data *self_data;
|
128
|
+
RGeo_Proj4Data *orig_data;
|
129
|
+
const char* str;
|
86
130
|
|
87
131
|
// Clear out any existing value
|
88
|
-
|
89
|
-
|
90
|
-
if (pj) {
|
91
|
-
pj_free(pj);
|
92
|
-
self_data->pj = NULL;
|
93
|
-
self_data->original_str = Qnil;
|
94
|
-
}
|
132
|
+
TypedData_Get_Struct(self, RGeo_Proj4Data, &rgeo_proj4_data_type, self_data);
|
133
|
+
rgeo_proj4_clear_struct(self_data);
|
95
134
|
|
96
135
|
// Copy value from orig
|
97
|
-
|
136
|
+
TypedData_Get_Struct(orig, RGeo_Proj4Data, &rgeo_proj4_data_type, orig_data);
|
98
137
|
if (!NIL_P(orig_data->original_str)) {
|
99
|
-
self_data->pj =
|
138
|
+
self_data->pj = proj_create(PJ_DEFAULT_CTX, StringValuePtr(orig_data->original_str));
|
100
139
|
}
|
101
140
|
else {
|
102
|
-
str =
|
103
|
-
self_data->pj =
|
104
|
-
pj_dalloc(str);
|
141
|
+
str = proj_as_proj_string(PJ_DEFAULT_CTX, orig_data->pj, PJ_PROJ_4, NULL);
|
142
|
+
self_data->pj = proj_create(PJ_DEFAULT_CTX, str);
|
105
143
|
}
|
106
144
|
self_data->original_str = orig_data->original_str;
|
107
145
|
self_data->uses_radians = orig_data->uses_radians;
|
@@ -112,22 +150,16 @@ static VALUE method_proj4_initialize_copy(VALUE self, VALUE orig)
|
|
112
150
|
|
113
151
|
static VALUE method_proj4_set_value(VALUE self, VALUE str, VALUE uses_radians)
|
114
152
|
{
|
115
|
-
RGeo_Proj4Data*
|
116
|
-
projPJ pj;
|
153
|
+
RGeo_Proj4Data *self_data;
|
117
154
|
|
118
155
|
Check_Type(str, T_STRING);
|
119
156
|
|
120
157
|
// Clear out any existing value
|
121
|
-
|
122
|
-
|
123
|
-
if (pj) {
|
124
|
-
pj_free(pj);
|
125
|
-
self_data->pj = NULL;
|
126
|
-
self_data->original_str = Qnil;
|
127
|
-
}
|
158
|
+
TypedData_Get_Struct(self, RGeo_Proj4Data, &rgeo_proj4_data_type, self_data);
|
159
|
+
rgeo_proj4_clear_struct(self_data);
|
128
160
|
|
129
161
|
// Set new data
|
130
|
-
self_data->pj =
|
162
|
+
self_data->pj = proj_create(PJ_DEFAULT_CTX, StringValuePtr(str));
|
131
163
|
self_data->original_str = str;
|
132
164
|
self_data->uses_radians = RTEST(uses_radians) ? 1 : 0;
|
133
165
|
|
@@ -138,17 +170,18 @@ static VALUE method_proj4_set_value(VALUE self, VALUE str, VALUE uses_radians)
|
|
138
170
|
static VALUE method_proj4_get_geographic(VALUE self)
|
139
171
|
{
|
140
172
|
VALUE result;
|
141
|
-
RGeo_Proj4Data*
|
142
|
-
RGeo_Proj4Data*
|
173
|
+
RGeo_Proj4Data *new_data;
|
174
|
+
RGeo_Proj4Data *self_data;
|
143
175
|
|
144
176
|
result = Qnil;
|
145
177
|
new_data = ALLOC(RGeo_Proj4Data);
|
146
178
|
if (new_data) {
|
147
|
-
|
148
|
-
|
179
|
+
TypedData_Get_Struct(self, RGeo_Proj4Data, &rgeo_proj4_data_type, self_data);
|
180
|
+
|
181
|
+
new_data->pj = proj_crs_get_geodetic_crs(PJ_DEFAULT_CTX, self_data->pj);
|
149
182
|
new_data->original_str = Qnil;
|
150
183
|
new_data->uses_radians = self_data->uses_radians;
|
151
|
-
result =
|
184
|
+
result = TypedData_Wrap_Struct(CLASS_OF(self), &rgeo_proj4_data_type, new_data);
|
152
185
|
}
|
153
186
|
return result;
|
154
187
|
}
|
@@ -156,44 +189,97 @@ static VALUE method_proj4_get_geographic(VALUE self)
|
|
156
189
|
|
157
190
|
static VALUE method_proj4_original_str(VALUE self)
|
158
191
|
{
|
159
|
-
|
192
|
+
RGeo_Proj4Data *data;
|
193
|
+
TypedData_Get_Struct(self, RGeo_Proj4Data, &rgeo_proj4_data_type, data);
|
194
|
+
return data->original_str;
|
160
195
|
}
|
161
196
|
|
162
197
|
|
163
198
|
static VALUE method_proj4_uses_radians(VALUE self)
|
164
199
|
{
|
165
|
-
|
200
|
+
RGeo_Proj4Data *data;
|
201
|
+
TypedData_Get_Struct(self, RGeo_Proj4Data, &rgeo_proj4_data_type, data);
|
202
|
+
return data->uses_radians ? Qtrue : Qfalse;
|
166
203
|
}
|
167
204
|
|
168
205
|
|
169
206
|
static VALUE method_proj4_canonical_str(VALUE self)
|
170
207
|
{
|
171
208
|
VALUE result;
|
172
|
-
|
173
|
-
char*
|
209
|
+
PJ *pj;
|
210
|
+
const char *str;
|
211
|
+
RGeo_Proj4Data *data;
|
174
212
|
|
175
213
|
result = Qnil;
|
176
|
-
|
214
|
+
TypedData_Get_Struct(self, RGeo_Proj4Data, &rgeo_proj4_data_type, data);
|
215
|
+
pj = data->pj;
|
177
216
|
if (pj) {
|
178
|
-
str =
|
217
|
+
str = proj_as_proj_string(PJ_DEFAULT_CTX, pj, PJ_PROJ_4, NULL);
|
179
218
|
if (str) {
|
180
219
|
result = rb_str_new2(str);
|
181
|
-
pj_dalloc(str);
|
182
220
|
}
|
183
221
|
}
|
184
222
|
return result;
|
185
223
|
}
|
186
224
|
|
225
|
+
static VALUE method_proj4_wkt_str(VALUE self)
|
226
|
+
{
|
227
|
+
VALUE result;
|
228
|
+
PJ *pj;
|
229
|
+
const char *str;
|
230
|
+
RGeo_Proj4Data *data;
|
231
|
+
|
232
|
+
result = Qnil;
|
233
|
+
TypedData_Get_Struct(self, RGeo_Proj4Data, &rgeo_proj4_data_type, data);
|
234
|
+
pj = data->pj;
|
235
|
+
if (pj) {
|
236
|
+
const char *const options[] = {"MULTILINE=NO", NULL};
|
237
|
+
str = proj_as_wkt(PJ_DEFAULT_CTX, pj, PJ_WKT2_2019, options);
|
238
|
+
if(str){
|
239
|
+
result = rb_str_new2(str);
|
240
|
+
}
|
241
|
+
}
|
242
|
+
return result;
|
243
|
+
}
|
244
|
+
|
245
|
+
static VALUE method_proj4_auth_name_str(VALUE self)
|
246
|
+
{
|
247
|
+
VALUE result;
|
248
|
+
PJ *pj;
|
249
|
+
const char *id;
|
250
|
+
const char *auth;
|
251
|
+
RGeo_Proj4Data *data;
|
252
|
+
|
253
|
+
result = Qnil;
|
254
|
+
TypedData_Get_Struct(self, RGeo_Proj4Data, &rgeo_proj4_data_type, data);
|
255
|
+
pj = data->pj;
|
256
|
+
if (pj) {
|
257
|
+
auth = proj_get_id_auth_name(pj, 0);
|
258
|
+
id = proj_get_id_code(pj, 0);
|
259
|
+
if(id && auth){
|
260
|
+
result = rb_sprintf("%s:%s", auth, id);
|
261
|
+
}
|
262
|
+
}
|
263
|
+
return result;
|
264
|
+
}
|
187
265
|
|
188
266
|
static VALUE method_proj4_is_geographic(VALUE self)
|
189
267
|
{
|
190
268
|
VALUE result;
|
191
|
-
|
269
|
+
PJ *pj;
|
270
|
+
PJ_TYPE proj_type;
|
271
|
+
RGeo_Proj4Data *data;
|
192
272
|
|
193
273
|
result = Qnil;
|
194
|
-
|
274
|
+
TypedData_Get_Struct(self, RGeo_Proj4Data, &rgeo_proj4_data_type, data);
|
275
|
+
pj = data->pj;
|
195
276
|
if (pj) {
|
196
|
-
|
277
|
+
proj_type = proj_get_type(pj);
|
278
|
+
if(proj_type == PJ_TYPE_GEOGRAPHIC_2D_CRS || proj_type == PJ_TYPE_GEOGRAPHIC_3D_CRS){
|
279
|
+
result = Qtrue;
|
280
|
+
} else {
|
281
|
+
result = Qfalse;
|
282
|
+
}
|
197
283
|
}
|
198
284
|
return result;
|
199
285
|
}
|
@@ -202,12 +288,16 @@ static VALUE method_proj4_is_geographic(VALUE self)
|
|
202
288
|
static VALUE method_proj4_is_geocentric(VALUE self)
|
203
289
|
{
|
204
290
|
VALUE result;
|
205
|
-
|
291
|
+
PJ *pj;
|
292
|
+
PJ_TYPE proj_type;
|
293
|
+
RGeo_Proj4Data *data;
|
206
294
|
|
207
295
|
result = Qnil;
|
208
|
-
|
296
|
+
TypedData_Get_Struct(self, RGeo_Proj4Data, &rgeo_proj4_data_type, data);
|
297
|
+
pj = data->pj;
|
209
298
|
if (pj) {
|
210
|
-
|
299
|
+
proj_type = proj_get_type(pj);
|
300
|
+
result = proj_type == PJ_TYPE_GEOCENTRIC_CRS ? Qtrue : Qfalse;
|
211
301
|
}
|
212
302
|
return result;
|
213
303
|
}
|
@@ -215,42 +305,62 @@ static VALUE method_proj4_is_geocentric(VALUE self)
|
|
215
305
|
|
216
306
|
static VALUE method_proj4_is_valid(VALUE self)
|
217
307
|
{
|
218
|
-
|
308
|
+
RGeo_Proj4Data *data;
|
309
|
+
TypedData_Get_Struct(self, RGeo_Proj4Data, &rgeo_proj4_data_type, data);
|
310
|
+
return data->pj ? Qtrue : Qfalse;
|
219
311
|
}
|
220
312
|
|
221
313
|
|
222
314
|
static VALUE cmethod_proj4_version(VALUE module)
|
223
315
|
{
|
224
|
-
return
|
316
|
+
return rb_sprintf("%d.%d.%d", PROJ_VERSION_MAJOR, PROJ_VERSION_MINOR, PROJ_VERSION_PATCH);
|
225
317
|
}
|
226
318
|
|
227
319
|
|
228
320
|
static VALUE cmethod_proj4_transform(VALUE module, VALUE from, VALUE to, VALUE x, VALUE y, VALUE z)
|
229
321
|
{
|
230
322
|
VALUE result;
|
231
|
-
|
232
|
-
|
323
|
+
RGeo_Proj4Data *from_data;
|
324
|
+
RGeo_Proj4Data *to_data;
|
325
|
+
PJ *from_pj;
|
326
|
+
PJ *to_pj;
|
327
|
+
PJ *crs_to_crs;
|
328
|
+
PJ *gis_pj;
|
233
329
|
double xval, yval, zval;
|
234
|
-
|
330
|
+
PJ_COORD input;
|
331
|
+
PJ_COORD output;
|
235
332
|
|
236
333
|
result = Qnil;
|
237
|
-
|
238
|
-
|
334
|
+
TypedData_Get_Struct(from, RGeo_Proj4Data, &rgeo_proj4_data_type, from_data);
|
335
|
+
TypedData_Get_Struct(to, RGeo_Proj4Data, &rgeo_proj4_data_type, to_data);
|
336
|
+
from_pj = from_data->pj;
|
337
|
+
to_pj = to_data->pj;
|
239
338
|
if (from_pj && to_pj) {
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
339
|
+
crs_to_crs = proj_create_crs_to_crs_from_pj(PJ_DEFAULT_CTX, from_pj, to_pj, 0, NULL);
|
340
|
+
if(crs_to_crs){
|
341
|
+
// necessary to use proj_normalize_for_visualization so that we
|
342
|
+
// do not have to worry about the order of coordinates in every
|
343
|
+
// coord system.
|
344
|
+
gis_pj = proj_normalize_for_visualization(PJ_DEFAULT_CTX, crs_to_crs);
|
345
|
+
if(gis_pj){
|
346
|
+
proj_destroy(crs_to_crs);
|
347
|
+
crs_to_crs = gis_pj;
|
348
|
+
|
349
|
+
xval = rb_num2dbl(x);
|
350
|
+
yval = rb_num2dbl(y);
|
351
|
+
zval = NIL_P(z) ? 0.0 : rb_num2dbl(z);
|
352
|
+
|
353
|
+
input = proj_coord(xval, yval, zval, HUGE_VAL);
|
354
|
+
output = proj_trans(crs_to_crs, PJ_FWD, input);
|
355
|
+
|
356
|
+
result = rb_ary_new2(NIL_P(z) ? 2 : 3);
|
357
|
+
rb_ary_push(result, DBL2NUM(output.xyz.x));
|
358
|
+
rb_ary_push(result, DBL2NUM(output.xyz.y));
|
359
|
+
if(!NIL_P(z)){
|
360
|
+
rb_ary_push(result, DBL2NUM(output.xyz.z));
|
361
|
+
}
|
253
362
|
}
|
363
|
+
proj_destroy(crs_to_crs);
|
254
364
|
}
|
255
365
|
}
|
256
366
|
return result;
|
@@ -266,10 +376,10 @@ static VALUE cmethod_proj4_create(VALUE klass, VALUE str, VALUE uses_radians)
|
|
266
376
|
Check_Type(str, T_STRING);
|
267
377
|
data = ALLOC(RGeo_Proj4Data);
|
268
378
|
if (data) {
|
269
|
-
data->pj =
|
379
|
+
data->pj = proj_create(PJ_DEFAULT_CTX, StringValuePtr(str));
|
270
380
|
data->original_str = str;
|
271
381
|
data->uses_radians = RTEST(uses_radians) ? 1 : 0;
|
272
|
-
result =
|
382
|
+
result = TypedData_Wrap_Struct(klass, &rgeo_proj4_data_type, data);
|
273
383
|
}
|
274
384
|
return result;
|
275
385
|
}
|
@@ -285,12 +395,14 @@ static void rgeo_init_proj4()
|
|
285
395
|
coordsys_module = rb_define_module_under(rgeo_module, "CoordSys");
|
286
396
|
proj4_class = rb_define_class_under(coordsys_module, "Proj4", rb_cObject);
|
287
397
|
|
288
|
-
rb_define_alloc_func(proj4_class,
|
398
|
+
rb_define_alloc_func(proj4_class, rgeo_proj4_data_alloc);
|
289
399
|
rb_define_module_function(proj4_class, "_create", cmethod_proj4_create, 2);
|
290
400
|
rb_define_method(proj4_class, "initialize_copy", method_proj4_initialize_copy, 1);
|
291
401
|
rb_define_method(proj4_class, "_set_value", method_proj4_set_value, 2);
|
292
402
|
rb_define_method(proj4_class, "_original_str", method_proj4_original_str, 0);
|
293
403
|
rb_define_method(proj4_class, "_canonical_str", method_proj4_canonical_str, 0);
|
404
|
+
rb_define_method(proj4_class, "_as_text", method_proj4_wkt_str, 0);
|
405
|
+
rb_define_method(proj4_class, "_auth_name", method_proj4_auth_name_str, 0);
|
294
406
|
rb_define_method(proj4_class, "_valid?", method_proj4_is_valid, 0);
|
295
407
|
rb_define_method(proj4_class, "_geographic?", method_proj4_is_geographic, 0);
|
296
408
|
rb_define_method(proj4_class, "_geocentric?", method_proj4_is_geocentric, 0);
|
data/lib/rgeo/coord_sys/proj4.rb
CHANGED
@@ -41,8 +41,8 @@ module RGeo
|
|
41
41
|
# there are sometimes multiple ways to express a given coordinate
|
42
42
|
# system.
|
43
43
|
|
44
|
-
def eql?(
|
45
|
-
|
44
|
+
def eql?(other)
|
45
|
+
other.class == self.class && other.canonical_hash == canonical_hash && other._radians? == _radians?
|
46
46
|
end
|
47
47
|
alias == eql?
|
48
48
|
|
@@ -105,6 +105,21 @@ module RGeo
|
|
105
105
|
_original_str
|
106
106
|
end
|
107
107
|
|
108
|
+
# Returns the WKT representation of the CRS.
|
109
|
+
|
110
|
+
def as_text
|
111
|
+
_as_text
|
112
|
+
end
|
113
|
+
|
114
|
+
# Returns the string representing the authority and code of the
|
115
|
+
# CRS if it exists, nil otherwise.
|
116
|
+
#
|
117
|
+
# Ex. EPSG:4326
|
118
|
+
|
119
|
+
def auth_name
|
120
|
+
_auth_name
|
121
|
+
end
|
122
|
+
|
108
123
|
# Returns true if this Proj4 object is a geographic (lat-long)
|
109
124
|
# coordinate system.
|
110
125
|
|
@@ -172,7 +187,7 @@ module RGeo
|
|
172
187
|
if defn_.is_a?(::Hash)
|
173
188
|
defn_ = defn_.map { |k_, v_| v_ ? "+#{k_}=#{v_}" : "+#{k_}" }.join(" ")
|
174
189
|
end
|
175
|
-
|
190
|
+
|
176
191
|
result_ = _create(defn_, opts_[:radians])
|
177
192
|
result_ = nil unless result_._valid?
|
178
193
|
end
|
@@ -208,14 +223,15 @@ module RGeo
|
|
208
223
|
# or three elements.
|
209
224
|
|
210
225
|
def transform_coords(from_proj_, to_proj_, x_, y_, z_ = nil)
|
211
|
-
if
|
212
|
-
x_ *= ImplHelper::Math::
|
213
|
-
y_ *= ImplHelper::Math::
|
226
|
+
if from_proj_._radians? && from_proj_._geographic?
|
227
|
+
x_ *= ImplHelper::Math::DEGREES_PER_RADIAN
|
228
|
+
y_ *= ImplHelper::Math::DEGREES_PER_RADIAN
|
214
229
|
end
|
230
|
+
|
215
231
|
result_ = _transform_coords(from_proj_, to_proj_, x_, y_, z_)
|
216
|
-
if result_ &&
|
217
|
-
result_[0] *= ImplHelper::Math::
|
218
|
-
result_[1] *= ImplHelper::Math::
|
232
|
+
if result_ && to_proj_._radians? && to_proj_._geographic?
|
233
|
+
result_[0] *= ImplHelper::Math::RADIANS_PER_DEGREE
|
234
|
+
result_[1] *= ImplHelper::Math::RADIANS_PER_DEGREE
|
219
235
|
end
|
220
236
|
result_
|
221
237
|
end
|
@@ -259,15 +275,16 @@ module RGeo
|
|
259
275
|
to_has_m_ = to_factory_.property(:has_m_coordinate)
|
260
276
|
x_ = from_point_.x
|
261
277
|
y_ = from_point_.y
|
262
|
-
if
|
263
|
-
x_ *= ImplHelper::Math::
|
264
|
-
y_ *= ImplHelper::Math::
|
278
|
+
if from_proj_._radians? && from_proj_._geographic?
|
279
|
+
x_ *= ImplHelper::Math::DEGREES_PER_RADIAN
|
280
|
+
y_ *= ImplHelper::Math::DEGREES_PER_RADIAN
|
265
281
|
end
|
266
282
|
coords_ = _transform_coords(from_proj_, to_proj_, x_, y_, from_has_z_ ? from_point_.z : nil)
|
267
283
|
return unless coords_
|
268
|
-
|
269
|
-
|
270
|
-
coords_[
|
284
|
+
|
285
|
+
if to_proj_._radians? && to_proj_._geographic?
|
286
|
+
coords_[0] *= ImplHelper::Math::RADIANS_PER_DEGREE
|
287
|
+
coords_[1] *= ImplHelper::Math::RADIANS_PER_DEGREE
|
271
288
|
end
|
272
289
|
extras_ = []
|
273
290
|
extras_ << coords_[2].to_f if to_has_z_
|
@@ -81,11 +81,12 @@ module RGeo
|
|
81
81
|
ident_ = ident_.to_s
|
82
82
|
return @cache[ident_] if @cache&.include?(ident_)
|
83
83
|
result_ = nil
|
84
|
-
|
84
|
+
case @populate_state
|
85
|
+
when 0
|
85
86
|
data_ = search_file(ident_)
|
86
87
|
result_ = Entry.new(ident_, authority: @authority, authority_code: @authority ? ident_ : nil, name: data_[1], proj4: data_[2]) if data_
|
87
88
|
@cache[ident_] = result_ if @cache
|
88
|
-
|
89
|
+
when 1
|
89
90
|
search_file(nil)
|
90
91
|
result_ = @cache[ident_]
|
91
92
|
@populate_state = 2
|
@@ -113,12 +114,10 @@ module RGeo
|
|
113
114
|
cur_name_ = line_[comment_delim_ + 1..-1].strip
|
114
115
|
line_ = line_[0..comment_delim_ - 1].strip
|
115
116
|
end
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
line_ = Regexp.last_match(2).strip
|
121
|
-
end
|
117
|
+
if !cur_ident_ && (line_ =~ /^<(\w+)>(.*)/)
|
118
|
+
cur_ident_ = Regexp.last_match(1)
|
119
|
+
cur_text_ = []
|
120
|
+
line_ = Regexp.last_match(2).strip
|
122
121
|
end
|
123
122
|
next unless cur_ident_
|
124
123
|
if line_[-2..-1] == "<>"
|
data/lib/rgeo/proj4/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rgeo-proj4
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tee Parham, Daniel Azuma
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rgeo
|
@@ -30,28 +30,42 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '5.
|
33
|
+
version: '5.14'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '5.
|
40
|
+
version: '5.14'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry-byebug
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.9.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.9.0
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rake
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
61
|
+
version: '13.0'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
68
|
+
version: '13.0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rake-compiler
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +80,20 @@ dependencies:
|
|
66
80
|
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '1.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.8.1
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.8.1
|
69
97
|
description: Proj4 extension for rgeo.
|
70
98
|
email:
|
71
99
|
- parhameter@gmail.com, dazuma@gmail.com
|
@@ -93,14 +121,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
93
121
|
requirements:
|
94
122
|
- - ">="
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version: 2.
|
124
|
+
version: 2.5.0
|
97
125
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
126
|
requirements:
|
99
127
|
- - ">="
|
100
128
|
- !ruby/object:Gem::Version
|
101
129
|
version: '0'
|
102
130
|
requirements: []
|
103
|
-
rubygems_version: 3.
|
131
|
+
rubygems_version: 3.1.4
|
104
132
|
signing_key:
|
105
133
|
specification_version: 4
|
106
134
|
summary: Proj4 extension for rgeo.
|