ffi-geos 1.2.0 → 2.2.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.
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