ffi-geos 1.2.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +4851 -0
  3. data/.travis.yml +24 -9
  4. data/FUNDING.yml +2 -0
  5. data/Gemfile +12 -16
  6. data/Guardfile +6 -8
  7. data/MIT-LICENSE +1 -1
  8. data/README.rdoc +2 -20
  9. data/Rakefile +4 -2
  10. data/ffi-geos.gemspec +13 -14
  11. data/lib/ffi-geos.rb +342 -244
  12. data/lib/ffi-geos/buffer_params.rb +9 -20
  13. data/lib/ffi-geos/coordinate_sequence.rb +351 -65
  14. data/lib/ffi-geos/geometry.rb +267 -191
  15. data/lib/ffi-geos/geometry_collection.rb +74 -12
  16. data/lib/ffi-geos/interrupt.rb +11 -16
  17. data/lib/ffi-geos/line_string.rb +157 -33
  18. data/lib/ffi-geos/linear_ring.rb +2 -3
  19. data/lib/ffi-geos/multi_line_string.rb +1 -2
  20. data/lib/ffi-geos/multi_point.rb +0 -1
  21. data/lib/ffi-geos/multi_polygon.rb +0 -1
  22. data/lib/ffi-geos/point.rb +70 -15
  23. data/lib/ffi-geos/polygon.rb +124 -21
  24. data/lib/ffi-geos/prepared_geometry.rb +11 -12
  25. data/lib/ffi-geos/strtree.rb +64 -77
  26. data/lib/ffi-geos/tools.rb +16 -19
  27. data/lib/ffi-geos/utils.rb +36 -60
  28. data/lib/ffi-geos/version.rb +1 -3
  29. data/lib/ffi-geos/wkb_reader.rb +4 -9
  30. data/lib/ffi-geos/wkb_writer.rb +15 -20
  31. data/lib/ffi-geos/wkt_reader.rb +2 -5
  32. data/lib/ffi-geos/wkt_writer.rb +20 -31
  33. data/sonar-project.properties +16 -0
  34. data/test/.rubocop.yml +36 -0
  35. data/test/coordinate_sequence_tests.rb +322 -52
  36. data/test/geometry_collection_tests.rb +388 -4
  37. data/test/geometry_tests.rb +466 -121
  38. data/test/interrupt_tests.rb +9 -12
  39. data/test/line_string_tests.rb +213 -25
  40. data/test/linear_ring_tests.rb +1 -3
  41. data/test/misc_tests.rb +28 -30
  42. data/test/multi_line_string_tests.rb +0 -2
  43. data/test/point_tests.rb +158 -2
  44. data/test/polygon_tests.rb +283 -2
  45. data/test/prepared_geometry_tests.rb +8 -11
  46. data/test/strtree_tests.rb +14 -15
  47. data/test/test_helper.rb +75 -51
  48. data/test/tools_tests.rb +1 -4
  49. data/test/utils_tests.rb +85 -76
  50. data/test/wkb_reader_tests.rb +18 -18
  51. data/test/wkb_writer_tests.rb +15 -22
  52. data/test/wkt_reader_tests.rb +1 -4
  53. data/test/wkt_writer_tests.rb +8 -17
  54. metadata +11 -7
@@ -1,7 +1,5 @@
1
- # encoding: UTF-8
2
1
  # frozen_string_literal: true
3
2
 
4
- $: << File.dirname(__FILE__)
5
3
  require 'test_helper'
6
4
 
7
5
  class MultiLineStringTests < Minitest::Test
data/test/point_tests.rb CHANGED
@@ -1,7 +1,5 @@
1
- # encoding: UTF-8
2
1
  # frozen_string_literal: true
3
2
 
4
- $: << File.dirname(__FILE__)
5
3
  require 'test_helper'
6
4
 
7
5
  class PointTests < Minitest::Test
@@ -103,4 +101,162 @@ class PointTests < Minitest::Test
103
101
  assert_equal(geom.object_id, geom.normalize.object_id)
104
102
  assert_equal(geom.object_id, geom.normalize!.object_id)
105
103
  end
104
+
105
+ def test_x_max
106
+ geom = read('POINT (-10 -15)')
107
+ assert_equal(-10, geom.x_max)
108
+ end
109
+
110
+ def test_x_min
111
+ geom = read('POINT (-10 -15)')
112
+ assert_equal(-10, geom.x_min)
113
+ end
114
+
115
+ def test_y_max
116
+ geom = read('POINT (-10 -15)')
117
+ assert_equal(-15, geom.y_max)
118
+ end
119
+
120
+ def test_y_min
121
+ geom = read('POINT (-10 -15)')
122
+ assert_equal(-15, geom.y_min)
123
+ end
124
+
125
+ def test_z_max
126
+ geom = read('POINT (-10 -15)')
127
+ assert_equal(0, geom.z_max)
128
+
129
+ geom = read('POINT Z (-10 -15 -20)')
130
+ assert_equal(-20, geom.z_max)
131
+ end
132
+
133
+ def test_z_min
134
+ geom = read('POINT (-10 -15)')
135
+ assert_equal(0, geom.z_min)
136
+
137
+ geom = read('POINT Z (-10 -15 -20)')
138
+ assert_equal(-20, geom.z_min)
139
+ end
140
+
141
+ def test_snap_to_grid
142
+ wkt = 'POINT (10.12 10.12)'
143
+ expected = 'POINT (10 10)'
144
+
145
+ simple_bang_tester(:snap_to_grid, expected, wkt, 1)
146
+ end
147
+
148
+ def test_snap_to_grid_empty
149
+ assert(read('POINT EMPTY').snap_to_grid!.empty?, 'Expected an empty Point')
150
+ end
151
+
152
+ def test_snap_to_grid_with_srid
153
+ wkt = 'POINT (10.12 10.12)'
154
+ expected = 'POINT (10 10)'
155
+
156
+ srid_copy_tester(:snap_to_grid, expected, 0, :zero, wkt, 1)
157
+ srid_copy_tester(:snap_to_grid, expected, 4326, :lenient, wkt, 1)
158
+ srid_copy_tester(:snap_to_grid, expected, 4326, :strict, wkt, 1)
159
+ end
160
+
161
+ def test_rotate
162
+ writer.rounding_precision = 3
163
+
164
+ wkt = 'POINT (1 1)'
165
+
166
+ affine_tester(:rotate, 'POINT (29 11)', wkt, Math::PI / 2, [10.0, 20.0])
167
+ affine_tester(:rotate, 'POINT (-2 0)', wkt, -Math::PI / 2, [-1.0, 2.0])
168
+ affine_tester(:rotate, 'POINT (19 1)', wkt, Math::PI / 2, read('POINT(10 10)'))
169
+ affine_tester(:rotate, 'POINT (-0.5 0.5)', wkt, Math::PI / 2, read('LINESTRING(0 0, 1 0)'))
170
+ end
171
+
172
+ def test_rotate_x
173
+ writer.rounding_precision = 0
174
+ writer.output_dimensions = 3
175
+
176
+ wkt = 'POINT Z (1 1 1)'
177
+
178
+ affine_tester(:rotate_x, 'POINT Z (1 -1 -1)', wkt, Math::PI)
179
+ affine_tester(:rotate_x, 'POINT Z (1 -1 1)', wkt, Math::PI / 2)
180
+ affine_tester(:rotate_x, 'POINT Z (1 1 -1)', wkt, Math::PI + Math::PI / 2)
181
+ affine_tester(:rotate_x, wkt, wkt, Math::PI * 2)
182
+ end
183
+
184
+ def test_rotate_y
185
+ writer.rounding_precision = 0
186
+ writer.output_dimensions = 3
187
+
188
+ wkt = 'POINT Z (1 1 1)'
189
+
190
+ affine_tester(:rotate_y, 'POINT Z (-1 1 -1)', wkt, Math::PI)
191
+ affine_tester(:rotate_y, 'POINT Z (1 1 -1)', wkt, Math::PI / 2)
192
+ affine_tester(:rotate_y, 'POINT Z (-1 1 1)', wkt, Math::PI + Math::PI / 2)
193
+ affine_tester(:rotate_y, wkt, wkt, Math::PI * 2)
194
+ end
195
+
196
+ def test_rotate_z
197
+ writer.rounding_precision = 0
198
+
199
+ wkt = 'POINT (1 1)'
200
+
201
+ affine_tester(:rotate_z, 'POINT (-1 -1)', wkt, Math::PI)
202
+ affine_tester(:rotate_z, 'POINT (-1 1)', wkt, Math::PI / 2)
203
+ affine_tester(:rotate_z, 'POINT (1 -1)', wkt, Math::PI + Math::PI / 2)
204
+ affine_tester(:rotate_z, wkt, wkt, Math::PI * 2)
205
+ end
206
+
207
+ def test_scale
208
+ affine_tester(:scale, 'POINT (5 5)', 'POINT (1 1)', 5, 5)
209
+ affine_tester(:scale, 'POINT (3 2)', 'POINT (1 1)', 3, 2)
210
+
211
+ writer.output_dimensions = 3
212
+ affine_tester(:scale, 'POINT Z (40 40 40)', 'POINT Z (10 20 -5)', 4, 2, -8)
213
+ end
214
+
215
+ def test_scale_hash
216
+ affine_tester(:scale, 'POINT (5 5)', 'POINT (1 1)', x: 5, y: 5)
217
+ affine_tester(:scale, 'POINT (3 2)', 'POINT (1 1)', x: 3, y: 2)
218
+
219
+ writer.output_dimensions = 3
220
+ affine_tester(:scale, 'POINT Z (40 40 40)', 'POINT Z (10 20 -5)', x: 4, y: 2, z: -8)
221
+ end
222
+
223
+ def test_trans_scale
224
+ affine_tester(:trans_scale, 'POINT (2 2)', 'POINT (1 1)', 1, 1, 1, 1)
225
+ affine_tester(:trans_scale, 'POINT (3 3)', 'POINT (2 2)', 1, 1, 1, 1)
226
+ affine_tester(:trans_scale, 'POINT (0 0)', 'POINT (1 1)', -1, -1, -1, -1)
227
+ affine_tester(:trans_scale, 'POINT (1 2)', 'POINT (1 1)', 0, 1, 1, 1)
228
+ affine_tester(:trans_scale, 'POINT (2 1)', 'POINT (1 1)', 1, 0, 1, 1)
229
+ affine_tester(:trans_scale, 'POINT (0 2)', 'POINT (1 1)', 1, 1, 0, 1)
230
+ affine_tester(:trans_scale, 'POINT (2 0)', 'POINT (1 1)', 1, 1, 1, 0)
231
+ affine_tester(:trans_scale, 'POINT (3 2)', 'POINT (1 1)', 2, 1, 1, 1)
232
+ affine_tester(:trans_scale, 'POINT (2 3)', 'POINT (1 1)', 1, 2, 1, 1)
233
+ affine_tester(:trans_scale, 'POINT (4 2)', 'POINT (1 1)', 1, 1, 2, 1)
234
+ affine_tester(:trans_scale, 'POINT (2 4)', 'POINT (1 1)', 1, 1, 1, 2)
235
+ affine_tester(:trans_scale, 'POINT (15 28)', 'POINT (1 1)', 2, 3, 5, 7)
236
+
237
+ writer.output_dimensions = 3
238
+ affine_tester(:trans_scale, 'POINT Z (15 28 1)', 'POINT Z (1 1 1)', 2, 3, 5, 7)
239
+ end
240
+
241
+ def test_trans_scale_hash
242
+ affine_tester(:trans_scale, 'POINT (2 2)', 'POINT (1 1)', delta_x: 1, delta_y: 1, x_factor: 1, y_factor: 1)
243
+
244
+ writer.output_dimensions = 3
245
+ affine_tester(:trans_scale, 'POINT Z (15 28 1)', 'POINT Z (1 1 1)', delta_x: 2, delta_y: 3, x_factor: 5, y_factor: 7)
246
+ affine_tester(:trans_scale, 'POINT Z (3 1 1)', 'POINT Z (1 1 1)', delta_x: 2, z_factor: 2)
247
+ end
248
+
249
+ def test_translate
250
+ affine_tester(:translate, 'POINT (5 12)', 'POINT (0 0)', 5, 12)
251
+
252
+ writer.output_dimensions = 3
253
+ affine_tester(:translate, 'POINT Z (-3 -7 3)', 'POINT Z (0 0 0)', -3, -7, 3)
254
+ end
255
+
256
+ def test_translate_hash
257
+ affine_tester(:translate, 'POINT (5 12)', 'POINT (0 0)', x: 5, y: 12)
258
+
259
+ writer.output_dimensions = 3
260
+ affine_tester(:translate, 'POINT Z (-3 -7 3)', 'POINT Z (0 0 0)', x: -3, y: -7, z: 3)
261
+ end
106
262
  end
@@ -1,7 +1,5 @@
1
- # encoding: UTF-8
2
1
  # frozen_string_literal: true
3
2
 
4
- $: << File.dirname(__FILE__)
5
3
  require 'test_helper'
6
4
 
7
5
  class PolygonTests < Minitest::Test
@@ -35,4 +33,287 @@ class PolygonTests < Minitest::Test
35
33
  geom = read('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))')
36
34
  assert_equal(1, geom.num_geometries)
37
35
  end
36
+
37
+ def test_x_max
38
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
39
+ assert_equal(8, geom.x_max)
40
+ end
41
+
42
+ def test_x_min
43
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
44
+ assert_equal(-10, geom.x_min)
45
+ end
46
+
47
+ def test_y_max
48
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
49
+ assert_equal(9, geom.y_max)
50
+ end
51
+
52
+ def test_y_min
53
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
54
+ assert_equal(0, geom.y_min)
55
+ end
56
+
57
+ def test_z_max
58
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
59
+ assert_equal(0, geom.z_min)
60
+
61
+ geom = read('POLYGON Z ((0 0 0, 5 0 3, 8 9 4, -10 5 3, 0 0 0))')
62
+ assert_equal(4, geom.z_max)
63
+ end
64
+
65
+ def test_z_min
66
+ geom = read('POLYGON ((0 0, 5 0, 8 9, -10 5, 0 0))')
67
+ assert_equal(0, geom.z_min)
68
+
69
+ geom = read('POLYGON Z ((0 0 0, 5 0 3, 8 9 4, -10 5 3, 0 0 0))')
70
+ assert_equal(0, geom.z_min)
71
+ end
72
+
73
+ def test_snap_to_grid
74
+ wkt = 'POLYGON ((-10.12 0, -10.12 5, -10.12 5, -10.12 6, -10.12 6, -10.12 6, -10.12 7, -10.12 7, -10.12 7, -10.12 8, -10.12 8, -9 8, -9 9, -10.12 0))'
75
+ expected = 'POLYGON ((-10 0, -10 5, -10 6, -10 7, -10 8, -9 8, -9 9, -10 0))'
76
+
77
+ simple_bang_tester(:snap_to_grid, expected, wkt, 1)
78
+ end
79
+
80
+ def test_snap_to_grid_with_illegal_result
81
+ assert_raises(Geos::InvalidGeometryError) do
82
+ read('POLYGON ((1 1, 10 10, 10 10, 1 1))').snap_to_grid
83
+ end
84
+ end
85
+
86
+ def test_snap_to_grid_empty
87
+ assert(read('POLYGON EMPTY').snap_to_grid!.empty?, 'Expected an empty Polygon')
88
+ end
89
+
90
+ def test_snap_to_grid_collapse_holes
91
+ wkt = 'POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0), (2.6 2.6, 2.7 2.6, 2.7 2.7, 2.6 2.7, 2.6 2.6))'
92
+
93
+ assert_equal('POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))', write(read(wkt).snap_to_grid(1)))
94
+ end
95
+
96
+ def test_snap_to_grid_with_srid
97
+ wkt = 'POLYGON ((0.1 0.1, 0.1 5.1, 5.1 5.1, 5.1 0.1, 0.1 0.1))'
98
+ expected = 'POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))'
99
+
100
+ srid_copy_tester(:snap_to_grid, expected, 0, :zero, wkt, 1)
101
+ srid_copy_tester(:snap_to_grid, expected, 4326, :lenient, wkt, 1)
102
+ srid_copy_tester(:snap_to_grid, expected, 4326, :strict, wkt, 1)
103
+ end
104
+
105
+ def test_rotate
106
+ wkt = 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'
107
+
108
+ affine_tester(:rotate,
109
+ 'POLYGON ((30 10, 30 15, 25 15, 25 10, 30 10))',
110
+ wkt,
111
+ Math::PI / 2,
112
+ [10.0, 20.0])
113
+
114
+ affine_tester(:rotate,
115
+ 'POLYGON ((-3 1, -3 -4, 2 -4, 2 1, -3 1))',
116
+ wkt,
117
+ -Math::PI / 2,
118
+ [-1.0, 2.0])
119
+
120
+ affine_tester(:rotate,
121
+ 'POLYGON ((2 2, -3 2, -3 -3, 2 -3, 2 2))',
122
+ wkt,
123
+ Math::PI, read('POINT(1 1)'))
124
+
125
+ affine_tester(:rotate,
126
+ 'POLYGON ((0.5 -0.5, 0.5 4.5, -4.5 4.5, -4.5 -0.5, 0.5 -0.5))',
127
+ wkt,
128
+ Math::PI / 2,
129
+ read('LINESTRING(0 0, 1 0)'))
130
+ end
131
+
132
+ def test_rotate_x
133
+ writer.output_dimensions = 3
134
+
135
+ wkt = 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 0))'
136
+
137
+ affine_tester(:rotate_x,
138
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 -5 0, 0 -5 0, 0 0 0))',
139
+ wkt,
140
+ Math::PI)
141
+
142
+ affine_tester(:rotate_x,
143
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 0 5, 0 0 5, 0 0 0))',
144
+ wkt,
145
+ Math::PI / 2)
146
+
147
+ affine_tester(:rotate_x,
148
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 0 -5, 0 0 -5, 0 0 0))',
149
+ wkt,
150
+ Math::PI + Math::PI / 2)
151
+
152
+ affine_tester(:rotate_x,
153
+ wkt,
154
+ wkt,
155
+ Math::PI * 2)
156
+ end
157
+
158
+ def test_rotate_y
159
+ writer.output_dimensions = 3
160
+
161
+ wkt = 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 0))'
162
+
163
+ affine_tester(:rotate_y,
164
+ 'POLYGON Z ((0 0 0, -5 0 0, -5 5 0, 0 5 0, 0 0 0))',
165
+ wkt,
166
+ Math::PI)
167
+
168
+ affine_tester(:rotate_y,
169
+ 'POLYGON Z ((0 0 0, 0 0 -5, 0 5 -5, 0 5 0, 0 0 0))',
170
+ wkt,
171
+ Math::PI / 2)
172
+
173
+ affine_tester(:rotate_y,
174
+ 'POLYGON Z ((0 0 0, 0 0 5, 0 5 5, 0 5 0, 0 0 0))',
175
+ wkt,
176
+ Math::PI + Math::PI / 2)
177
+
178
+ affine_tester(:rotate_y,
179
+ wkt,
180
+ wkt,
181
+ Math::PI * 2)
182
+ end
183
+
184
+ def test_rotate_z
185
+ affine_tester(:rotate_z,
186
+ 'POLYGON ((0 0, -5 0, -5 -5, 0 -5, 0 0))',
187
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
188
+ Math::PI)
189
+
190
+ affine_tester(:rotate_z,
191
+ 'POLYGON ((0 0, 0 5, -5 5, -5 0, 0 0))',
192
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
193
+ Math::PI / 2)
194
+
195
+ affine_tester(:rotate_z,
196
+ 'POLYGON ((0 0, 0 -5, 5 -5, 5 0, 0 0))',
197
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
198
+ Math::PI + Math::PI / 2)
199
+
200
+ affine_tester(:rotate_z,
201
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
202
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
203
+ Math::PI * 2)
204
+ end
205
+
206
+ def test_scale
207
+ affine_tester(:scale,
208
+ 'POLYGON ((0 0, 25 0, 25 25, 0 25, 0 0))',
209
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
210
+ 5,
211
+ 5)
212
+
213
+ affine_tester(:scale,
214
+ 'POLYGON ((0 0, 15 0, 15 10, 0 10, 0 0))',
215
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
216
+ 3,
217
+ 2)
218
+
219
+ writer.output_dimensions = 3
220
+
221
+ affine_tester(:scale,
222
+ 'POLYGON Z ((0 0 0, 20 0 0, 20 10 0, 0 10 0, 0 0 0))',
223
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 0))',
224
+ 4,
225
+ 2,
226
+ -8)
227
+ end
228
+
229
+ def test_scale_hash
230
+ affine_tester(:scale,
231
+ 'POLYGON ((0 0, 25 0, 25 25, 0 25, 0 0))',
232
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
233
+ x: 5,
234
+ y: 5)
235
+
236
+ affine_tester(:scale,
237
+ 'POLYGON ((0 0, 15 0, 15 10, 0 10, 0 0))',
238
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
239
+ x: 3,
240
+ y: 2)
241
+
242
+ writer.output_dimensions = 3
243
+
244
+ affine_tester(:scale,
245
+ 'POLYGON Z ((0 0 0, 20 0 0, 20 10 0, 0 10 0, 0 0 -80))',
246
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 10))',
247
+ x: 4,
248
+ y: 2,
249
+ z: -8)
250
+ end
251
+
252
+ def test_trans_scale
253
+ affine_tester(:trans_scale, 'POLYGON ((2 2, 11 11, 21 2, 2 2))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 1, 1, 1)
254
+ affine_tester(:trans_scale, 'POLYGON ((3 3, 12 12, 22 3, 3 3))', 'POLYGON ((2 2, 11 11, 21 2, 2 2))', 1, 1, 1, 1)
255
+ affine_tester(:trans_scale, 'POLYGON ((0 0, -9 -9, -19 0, 0 0))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', -1, -1, -1, -1)
256
+ affine_tester(:trans_scale, 'POLYGON ((1 2, 10 11, 20 2, 1 2))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 0, 1, 1, 1)
257
+ affine_tester(:trans_scale, 'POLYGON ((2 1, 11 10, 21 1, 2 1))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 0, 1, 1)
258
+ affine_tester(:trans_scale, 'POLYGON ((2 0, 11 0, 21 0, 2 0))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 1, 1, 0)
259
+ affine_tester(:trans_scale, 'POLYGON ((3 2, 12 11, 22 2, 3 2))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 2, 1, 1, 1)
260
+ affine_tester(:trans_scale, 'POLYGON ((2 3, 11 12, 21 3, 2 3))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 2, 1, 1)
261
+ affine_tester(:trans_scale, 'POLYGON ((4 2, 22 11, 42 2, 4 2))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 1, 2, 1)
262
+ affine_tester(:trans_scale, 'POLYGON ((2 4, 11 22, 21 4, 2 4))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 1, 1, 1, 2)
263
+ affine_tester(:trans_scale, 'POLYGON ((15 28, 60 91, 110 28, 15 28))', 'POLYGON ((1 1, 10 10, 20 1, 1 1))', 2, 3, 5, 7)
264
+
265
+ writer.output_dimensions = 3
266
+ affine_tester(:trans_scale, 'POLYGON Z ((15 28 1, 60 91 10, 110 28 1, 15 28 1))', 'POLYGON Z ((1 1 1, 10 10 10, 20 1 1, 1 1 1))', 2, 3, 5, 7)
267
+ end
268
+
269
+ def test_trans_scale_hash
270
+ affine_tester(:trans_scale,
271
+ 'POLYGON ((2 2, 11 11, 21 2, 2 2))',
272
+ 'POLYGON ((1 1, 10 10, 20 1, 1 1))',
273
+ delta_x: 1, delta_y: 1, x_factor: 1, y_factor: 1)
274
+
275
+ writer.output_dimensions = 3
276
+
277
+ affine_tester(:trans_scale, 'POLYGON Z ((15 28 1, 60 91 10, 110 28 1, 15 28 1))',
278
+ 'POLYGON Z ((1 1 1, 10 10 10, 20 1 1, 1 1 1))',
279
+ delta_x: 2, delta_y: 3, x_factor: 5, y_factor: 7)
280
+
281
+ affine_tester(:trans_scale, 'POLYGON Z ((3 1 1, 12 10 10, 22 1 1, 3 1 1))',
282
+ 'POLYGON Z ((1 1 1, 10 10 10, 20 1 1, 1 1 1))',
283
+ delta_x: 2, z_factor: 2)
284
+ end
285
+
286
+ def test_translate
287
+ affine_tester(:translate,
288
+ 'POLYGON ((5 12, 10 12, 10 17, 5 17, 5 12))',
289
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
290
+ 5,
291
+ 12)
292
+
293
+ writer.output_dimensions = 3
294
+
295
+ affine_tester(:translate,
296
+ 'POLYGON Z ((-3 -7 3, 2 -7 3, 2 -2 3, -3 -2 3, -3 -7 3))',
297
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 0))',
298
+ -3,
299
+ -7,
300
+ 3)
301
+ end
302
+
303
+ def test_translate_hash
304
+ affine_tester(:translate,
305
+ 'POLYGON ((5 12, 10 12, 10 17, 5 17, 5 12))',
306
+ 'POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))',
307
+ x: 5,
308
+ y: 12)
309
+
310
+ writer.output_dimensions = 3
311
+
312
+ affine_tester(:translate,
313
+ 'POLYGON Z ((-3 -7 3, 2 -7 3, 2 -2 3, -3 -2 3, -3 -7 3))',
314
+ 'POLYGON Z ((0 0 0, 5 0 0, 5 5 0, 0 5 0, 0 0 0))',
315
+ x: -3,
316
+ y: -7,
317
+ z: 3)
318
+ end
38
319
  end