ffi-gdal 1.0.0.beta5 → 1.0.0.beta6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (237) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -3
  3. data/.rubocop.yml +7 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +1 -1
  6. data/History.md +143 -1
  7. data/README.md +5 -11
  8. data/Rakefile +2 -60
  9. data/TODO.md +10 -0
  10. data/examples/geometries.rb +4 -6
  11. data/examples/gridding.rb +99 -98
  12. data/examples/ogr_layer_to_layer.rb +0 -2
  13. data/examples/raster_erasing.rb +47 -0
  14. data/examples/remove_small_polygons.rb +62 -0
  15. data/examples/testing_gdal.rb +0 -3
  16. data/examples/warping.rb +140 -0
  17. data/ffi-gdal.gemspec +5 -2
  18. data/lib/ext/error_symbols.rb +1 -1
  19. data/lib/ext/ffi_library_function_checks.rb +3 -2
  20. data/lib/ext/float_ext.rb +2 -2
  21. data/lib/ext/narray_ext.rb +1 -1
  22. data/lib/ext/numeric_as_data_type.rb +1 -1
  23. data/lib/ext/to_bool.rb +2 -2
  24. data/lib/ffi/cpl/conv.rb +1 -3
  25. data/lib/ffi/cpl/error.rb +0 -3
  26. data/lib/ffi/cpl/minixml.rb +17 -21
  27. data/lib/ffi/cpl/progress.rb +27 -0
  28. data/lib/ffi/cpl/string.rb +0 -8
  29. data/lib/ffi/cpl/vsi.rb +0 -1
  30. data/lib/ffi/cpl/xml_node.rb +0 -1
  31. data/lib/ffi/cpl.rb +15 -0
  32. data/lib/ffi/gdal/alg.rb +72 -54
  33. data/lib/ffi/gdal/gdal.rb +669 -672
  34. data/lib/ffi/gdal/grid.rb +141 -24
  35. data/lib/ffi/gdal/grid_data_metrics_options.rb +1 -1
  36. data/lib/ffi/gdal/grid_moving_average_options.rb +1 -1
  37. data/lib/ffi/gdal/matching.rb +0 -2
  38. data/lib/ffi/gdal/transformer_info.rb +1 -1
  39. data/lib/ffi/gdal/version.rb +1 -1
  40. data/lib/ffi/gdal/vrt.rb +0 -2
  41. data/lib/ffi/gdal/warp_options.rb +12 -14
  42. data/lib/ffi/gdal/warper.rb +61 -6
  43. data/lib/ffi/gdal.rb +18 -3
  44. data/lib/ffi/ogr/api.rb +10 -21
  45. data/lib/ffi/ogr/core.rb +9 -12
  46. data/lib/ffi/ogr/featurestyle.rb +0 -5
  47. data/lib/ffi/ogr/geocoding.rb +0 -1
  48. data/lib/ffi/ogr/srs_api.rb +0 -4
  49. data/lib/ffi/ogr/style_value.rb +1 -2
  50. data/lib/ffi/ogr.rb +15 -12
  51. data/lib/ffi-gdal.rb +5 -3
  52. data/lib/gdal/color_entry.rb +1 -0
  53. data/lib/gdal/color_interpretation.rb +2 -2
  54. data/lib/gdal/color_table.rb +14 -14
  55. data/lib/gdal/color_table_mixins/extensions.rb +4 -4
  56. data/lib/gdal/cpl_error_handler.rb +12 -14
  57. data/lib/gdal/data_type.rb +13 -12
  58. data/lib/gdal/dataset.rb +170 -94
  59. data/lib/gdal/dataset_mixins/algorithm_methods.rb +47 -21
  60. data/lib/gdal/dataset_mixins/extensions.rb +32 -61
  61. data/lib/gdal/dataset_mixins/matching.rb +0 -2
  62. data/lib/gdal/dataset_mixins/warp_methods.rb +42 -0
  63. data/lib/gdal/driver.rb +62 -47
  64. data/lib/gdal/driver_mixins/extensions.rb +2 -7
  65. data/lib/gdal/environment_methods.rb +13 -10
  66. data/lib/gdal/exceptions.rb +24 -2
  67. data/lib/gdal/geo_transform.rb +10 -16
  68. data/lib/gdal/geo_transform_mixins/extensions.rb +58 -3
  69. data/lib/gdal/grid.rb +62 -109
  70. data/lib/gdal/{grid_types → grid_algorithms}/data_metrics_base.rb +1 -3
  71. data/lib/gdal/{grid_types → grid_algorithms}/inverse_distance_to_a_power.rb +2 -4
  72. data/lib/gdal/{grid_types → grid_algorithms}/metric_average_distance.rb +2 -2
  73. data/lib/gdal/{grid_types → grid_algorithms}/metric_average_distance_pts.rb +2 -2
  74. data/lib/gdal/{grid_types → grid_algorithms}/metric_count.rb +2 -2
  75. data/lib/gdal/{grid_types → grid_algorithms}/metric_maximum.rb +2 -2
  76. data/lib/gdal/{grid_types → grid_algorithms}/metric_minimum.rb +2 -2
  77. data/lib/gdal/{grid_types → grid_algorithms}/metric_range.rb +2 -2
  78. data/lib/gdal/{grid_types → grid_algorithms}/moving_average.rb +2 -4
  79. data/lib/gdal/{grid_types → grid_algorithms}/nearest_neighbor.rb +2 -4
  80. data/lib/gdal/grid_algorithms.rb +22 -0
  81. data/lib/gdal/gridder/point_extracting.rb +89 -0
  82. data/lib/gdal/gridder.rb +294 -0
  83. data/lib/gdal/gridder_options.rb +273 -0
  84. data/lib/gdal/internal_helpers.rb +132 -23
  85. data/lib/gdal/major_object.rb +13 -10
  86. data/lib/gdal/merger.rb +130 -0
  87. data/lib/gdal/options.rb +3 -2
  88. data/lib/gdal/raster_attribute_table.rb +74 -51
  89. data/lib/gdal/raster_attribute_table_mixins/extensions.rb +21 -3
  90. data/lib/gdal/raster_band.rb +139 -167
  91. data/lib/gdal/raster_band_classifier.rb +19 -18
  92. data/lib/gdal/raster_band_mixins/algorithm_extensions.rb +107 -0
  93. data/lib/gdal/raster_band_mixins/algorithm_methods.rb +79 -40
  94. data/lib/gdal/raster_band_mixins/coloring_extensions.rb +84 -0
  95. data/lib/gdal/raster_band_mixins/extensions.rb +34 -169
  96. data/lib/gdal/raster_band_mixins/io_extensions.rb +180 -0
  97. data/lib/gdal/rpc_info.rb +1 -2
  98. data/lib/gdal/transformer.rb +1 -6
  99. data/lib/gdal/transformers/approximate_transformer.rb +0 -4
  100. data/lib/gdal/transformers/base_general_image_projection_transformer.rb +0 -6
  101. data/lib/gdal/transformers/gcp_transformer.rb +2 -6
  102. data/lib/gdal/transformers/general_image_projection_transformer.rb +8 -7
  103. data/lib/gdal/transformers/general_image_projection_transformer2.rb +1 -1
  104. data/lib/gdal/transformers/geolocation_transformer.rb +0 -4
  105. data/lib/gdal/transformers/reprojection_transformer.rb +0 -8
  106. data/lib/gdal/transformers/rpc_transformer.rb +0 -4
  107. data/lib/gdal/transformers/tps_transformer.rb +1 -3
  108. data/lib/gdal/version_info.rb +7 -8
  109. data/lib/gdal/virtual_dataset.rb +2 -4
  110. data/lib/gdal/warp_operation.rb +17 -14
  111. data/lib/gdal/warp_options.rb +132 -0
  112. data/lib/gdal.rb +41 -2
  113. data/lib/ogr/coordinate_transformation.rb +79 -32
  114. data/lib/ogr/data_source.rb +17 -14
  115. data/lib/ogr/data_source_extensions.rb +1 -5
  116. data/lib/ogr/driver.rb +11 -14
  117. data/lib/ogr/envelope.rb +1 -1
  118. data/lib/ogr/envelope_extensions.rb +23 -6
  119. data/lib/ogr/error_handling.rb +3 -3
  120. data/lib/ogr/exceptions.rb +6 -0
  121. data/lib/ogr/feature.rb +25 -38
  122. data/lib/ogr/feature_definition.rb +6 -8
  123. data/lib/ogr/feature_definition_extensions.rb +2 -6
  124. data/lib/ogr/feature_extensions.rb +71 -41
  125. data/lib/ogr/field.rb +16 -15
  126. data/lib/ogr/field_definition.rb +4 -4
  127. data/lib/ogr/geocoder.rb +5 -5
  128. data/lib/ogr/geometries/geometry_collection.rb +4 -1
  129. data/lib/ogr/geometries/geometry_collection_25d.rb +12 -0
  130. data/lib/ogr/geometries/line_string.rb +30 -8
  131. data/lib/ogr/geometries/line_string_25d.rb +21 -0
  132. data/lib/ogr/geometries/linear_ring.rb +10 -1
  133. data/lib/ogr/geometries/multi_line_string.rb +2 -1
  134. data/lib/ogr/geometries/multi_line_string_25d.rb +13 -0
  135. data/lib/ogr/geometries/multi_point.rb +2 -1
  136. data/lib/ogr/geometries/multi_point_25d.rb +14 -0
  137. data/lib/ogr/geometries/multi_polygon.rb +3 -2
  138. data/lib/ogr/geometries/multi_polygon_25d.rb +13 -0
  139. data/lib/ogr/geometries/point.rb +20 -23
  140. data/lib/ogr/geometries/point_25d.rb +48 -0
  141. data/lib/ogr/geometries/polygon.rb +4 -1
  142. data/lib/ogr/geometries/polygon_25d.rb +14 -0
  143. data/lib/ogr/geometry.rb +125 -93
  144. data/lib/ogr/geometry_field_definition.rb +7 -5
  145. data/lib/ogr/geometry_mixins/container_mixins.rb +23 -0
  146. data/lib/ogr/geometry_mixins/extensions.rb +111 -0
  147. data/lib/ogr/geometry_types/container.rb +10 -3
  148. data/lib/ogr/geometry_types/curve.rb +68 -23
  149. data/lib/ogr/geometry_types/surface.rb +0 -9
  150. data/lib/ogr/internal_helpers.rb +3 -3
  151. data/lib/ogr/layer.rb +4 -5
  152. data/lib/ogr/layer_mixins/extensions.rb +242 -17
  153. data/lib/ogr/layer_mixins/ogr_feature_methods.rb +11 -11
  154. data/lib/ogr/layer_mixins/ogr_field_methods.rb +6 -11
  155. data/lib/ogr/layer_mixins/ogr_layer_method_methods.rb +18 -18
  156. data/lib/ogr/layer_mixins/ogr_query_filter_methods.rb +0 -2
  157. data/lib/ogr/layer_mixins/ogr_sql_methods.rb +1 -1
  158. data/lib/ogr/spatial_reference.rb +12 -37
  159. data/lib/ogr/spatial_reference_mixins/coordinate_system_getter_setters.rb +53 -55
  160. data/lib/ogr/spatial_reference_mixins/exporters.rb +18 -49
  161. data/lib/ogr/spatial_reference_mixins/parameter_getter_setters.rb +10 -29
  162. data/lib/ogr/style_table.rb +2 -2
  163. data/lib/ogr/style_table_extensions.rb +3 -1
  164. data/lib/ogr/style_tool.rb +8 -14
  165. data/lib/ogr.rb +39 -1
  166. data/spec/ffi-gdal_spec.rb +18 -1
  167. data/spec/integration/gdal/color_table_info_spec.rb +49 -33
  168. data/spec/integration/gdal/dataset_info_spec.rb +294 -45
  169. data/spec/integration/gdal/driver_info_spec.rb +139 -31
  170. data/spec/integration/gdal/geo_transform_info_spec.rb +197 -26
  171. data/spec/integration/gdal/gridder_spec.rb +329 -0
  172. data/spec/integration/gdal/raster_attribute_table_info_spec.rb +216 -11
  173. data/spec/integration/gdal/raster_band_algorithms_spec.rb +33 -0
  174. data/spec/integration/gdal/raster_band_info_spec.rb +240 -271
  175. data/spec/integration/ogr/layer_spec.rb +3 -1
  176. data/spec/spec_helper.rb +15 -6
  177. data/spec/support/images/osgeo/gdal/data/hfa/float-rle.img +0 -0
  178. data/spec/support/images/osgeo/geotiff/GeogToWGS84GeoKey/GeogToWGS84GeoKey5.lgo +31 -0
  179. data/spec/support/images/osgeo/geotiff/GeogToWGS84GeoKey/GeogToWGS84GeoKey5.tif +0 -0
  180. data/spec/support/images/osgeo/geotiff/GeogToWGS84GeoKey/GeogToWGS84GeoKey5.tif.msk +0 -0
  181. data/spec/support/images/osgeo/geotiff/GeogToWGS84GeoKey/GeogToWGS84GeoKey5.txt +10 -0
  182. data/spec/support/images/osgeo/geotiff/gdal_eg/cea.tif +0 -0
  183. data/spec/support/images/osgeo/geotiff/gdal_eg/cea.txt +84 -0
  184. data/spec/support/images/osgeo/geotiff/zi_imaging/image0.lgo +45 -0
  185. data/spec/support/images/osgeo/geotiff/zi_imaging/image0.tif +0 -0
  186. data/spec/support/integration_help.rb +32 -2
  187. data/spec/support/shared_examples/gdal/major_object_examples.rb +0 -6
  188. data/spec/support/shared_examples/ogr/a_geometry.rb +1 -1
  189. data/spec/unit/ffi/gdal_spec.rb +1 -1
  190. data/spec/unit/gdal/color_entry_spec.rb +1 -0
  191. data/spec/unit/gdal/color_interpretation_spec.rb +1 -0
  192. data/spec/unit/gdal/dataset_spec.rb +53 -2
  193. data/spec/unit/gdal/geo_transform_mixins/extensions_spec.rb +67 -0
  194. data/spec/unit/gdal/geo_transform_spec.rb +1 -1
  195. data/spec/unit/gdal/grid_spec.rb +83 -0
  196. data/spec/unit/gdal/gridder/point_extracting_spec.rb +99 -0
  197. data/spec/unit/gdal/gridder_options_spec.rb +183 -0
  198. data/spec/unit/gdal/gridder_spec.rb +140 -0
  199. data/spec/unit/gdal/internal_helpers_spec.rb +166 -2
  200. data/spec/unit/gdal/major_object_spec.rb +2 -0
  201. data/spec/unit/gdal/options_spec.rb +1 -0
  202. data/spec/unit/gdal/raster_band_classifier_spec.rb +70 -12
  203. data/spec/unit/gdal/raster_band_mixins/extensions_spec.rb +71 -0
  204. data/spec/unit/gdal/raster_band_mixins/io_extensions_spec.rb +133 -0
  205. data/spec/unit/gdal/raster_band_spec.rb +1 -0
  206. data/spec/unit/gdal/rpc_info_spec.rb +1 -0
  207. data/spec/unit/gdal/version_info_spec.rb +2 -0
  208. data/spec/unit/gdal/warp_operation_spec.rb +1 -0
  209. data/spec/unit/ogr/coordinate_transformation_spec.rb +102 -0
  210. data/spec/unit/ogr/data_source_spec.rb +12 -0
  211. data/spec/unit/ogr/feature_extensions_spec.rb +88 -0
  212. data/spec/unit/ogr/feature_spec.rb +30 -46
  213. data/spec/unit/ogr/geometries/geometry_collection_25d_spec.rb +23 -0
  214. data/spec/unit/ogr/geometries/geometry_collection_spec.rb +3 -3
  215. data/spec/unit/ogr/geometries/line_string_25d_spec.rb +23 -0
  216. data/spec/unit/ogr/geometries/line_string_spec.rb +2 -2
  217. data/spec/unit/ogr/geometries/linear_ring_spec.rb +2 -2
  218. data/spec/unit/ogr/geometries/multi_line_string_25d_spec.rb +23 -0
  219. data/spec/unit/ogr/geometries/multi_point_25d_spec.rb +23 -0
  220. data/spec/unit/ogr/geometries/multi_polygon_25d_spec.rb +23 -0
  221. data/spec/unit/ogr/geometries/point_25d_spec.rb +23 -0
  222. data/spec/unit/ogr/geometries/point_spec.rb +14 -24
  223. data/spec/unit/ogr/geometries/polygon_25d_spec.rb +23 -0
  224. data/spec/unit/ogr/geometries/polygon_spec.rb +1 -1
  225. data/spec/unit/ogr/geometry_field_definition_spec.rb +1 -1
  226. data/spec/unit/ogr/geometry_spec.rb +196 -30
  227. data/spec/unit/ogr/internal_helpers_spec.rb +20 -9
  228. data/spec/unit/ogr/layer_mixins/ogr_feature_methods_spec.rb +14 -6
  229. data/spec/unit/ogr/spatial_reference_mixins/exporters_spec.rb +9 -1
  230. data/spec/unit/ogr/spatial_reference_mixins/parameter_getter_setters_spec.rb +2 -1
  231. data/spec/unit/ogr/style_table_spec.rb +1 -1
  232. data/tmp/.keep +0 -0
  233. metadata +121 -19
  234. data/examples/points.txt +0 -127
  235. data/lib/gdal/grid_types.rb +0 -22
  236. data/lib/ogr/geometries/point_extensions.rb +0 -32
  237. data/lib/ogr/geometry_extensions.rb +0 -59
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'ogr'
3
+
4
+ RSpec.describe OGR::MultiLineString25D do
5
+ describe '#type' do
6
+ context 'when created with data' do
7
+ subject { OGR::Geometry.create_from_wkt(wkt) }
8
+ let(:wkt) { 'MULTILINESTRING((1 2 3, 2 2 3),(9 9 9, 10 10 10))' }
9
+
10
+ it 'returns :wkbMultiLineString25D' do
11
+ expect(subject.type).to eq :wkbMultiLineString25D
12
+ end
13
+ end
14
+
15
+ context 'when created without data' do
16
+ subject { described_class.new }
17
+
18
+ it 'returns :wkbMultiLineString' do
19
+ expect(subject.type).to eq :wkbMultiLineString
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'ogr'
3
+
4
+ RSpec.describe OGR::MultiPoint25D do
5
+ describe '#type' do
6
+ context 'when created with data' do
7
+ subject { OGR::Geometry.create_from_wkt(wkt) }
8
+ let(:wkt) { 'MULTIPOINT((1 2 3),(2 2 3))' }
9
+
10
+ it 'returns :wkbPoint25D' do
11
+ expect(subject.type).to eq :wkbMultiPoint25D
12
+ end
13
+ end
14
+
15
+ context 'when created without data' do
16
+ subject { described_class.new }
17
+
18
+ it 'returns :wkbPoint' do
19
+ expect(subject.type).to eq :wkbMultiPoint
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'ogr'
3
+
4
+ RSpec.describe OGR::MultiPolygon25D do
5
+ describe '#type' do
6
+ context 'when created with data' do
7
+ subject { OGR::Geometry.create_from_wkt(wkt) }
8
+ let(:wkt) { 'MULTIPOLYGON(((0 0 1,0 1 1,1 1 1,0 0 1)),((0 0 5,1 1 5,1 0 5,0 0 5)))' }
9
+
10
+ it 'returns :wkbMultiPolygon25D' do
11
+ expect(subject.type).to eq :wkbMultiPolygon25D
12
+ end
13
+ end
14
+
15
+ context 'when created without data' do
16
+ subject { described_class.new }
17
+
18
+ it 'returns :wkbMultiPolygon' do
19
+ expect(subject.type).to eq :wkbMultiPolygon
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'ogr'
3
+
4
+ RSpec.describe OGR::Point25D do
5
+ describe '#type' do
6
+ context 'when created with data' do
7
+ subject { OGR::Geometry.create_from_wkt(wkt) }
8
+ let(:wkt) { 'POINT(1 2 3)' }
9
+
10
+ it 'returns :wkbPoint25D' do
11
+ expect(subject.type).to eq :wkbPoint25D
12
+ end
13
+ end
14
+
15
+ context 'when created without data' do
16
+ subject { described_class.new }
17
+
18
+ it 'returns :wkbPoint' do
19
+ expect(subject.type).to eq :wkbPoint
20
+ end
21
+ end
22
+ end
23
+ end
@@ -203,36 +203,30 @@ RSpec.describe OGR::Point do
203
203
  end
204
204
  end
205
205
 
206
- describe '#point' do
206
+ describe '#point_value' do
207
207
  it 'returns x & y as an array' do
208
- expect(subject.point).to eq([1, 2])
208
+ expect(subject.point_value).to eq([1.0, 2.0])
209
209
  end
210
210
  end
211
211
 
212
212
  describe '#set_point' do
213
213
  it 'changes the x & y values' do
214
- expect do
215
- subject.set_point(5, 6)
216
- end.to change { subject.points }.
217
- from([[1, 2]]).to([[5.0, 6.0, 0.0]])
214
+ expect { subject.set_point(5, 6) }.to change { subject.point_value }.
215
+ from([1.0, 2.0]).to([5.0, 6.0])
218
216
  end
219
217
  end
220
218
 
221
219
  describe '#add_point' do
222
220
  it 'changes the x & y values' do
223
- expect do
224
- subject.add_point(5, 6)
225
- end.to change { subject.points }.
226
- from([[1, 2]]).to([[5.0, 6.0, 0.0]])
221
+ expect { subject.add_point(5, 6) }.to change { subject.point_value }.
222
+ from([1.0, 2.0]).to([5.0, 6.0])
227
223
  end
228
224
  end
229
225
 
230
226
  describe '#empty!' do
231
227
  it 'clears the point' do
232
- expect do
233
- subject.empty!
234
- end.to change { subject.points }.
235
- from([[1, 2]]).to([[]])
228
+ expect { subject.empty! }.to change { subject.point_value }.
229
+ from([1.0, 2.0]).to([])
236
230
  end
237
231
  end
238
232
  end
@@ -282,27 +276,23 @@ RSpec.describe OGR::Point do
282
276
  end
283
277
  end
284
278
 
285
- describe '#point' do
279
+ describe '#point_value' do
286
280
  it 'returns an empty array' do
287
- expect(subject.point).to eq([])
281
+ expect(subject.point_value).to eq([])
288
282
  end
289
283
  end
290
284
 
291
285
  describe '#set_point' do
292
286
  it 'changes the x & y values' do
293
- expect do
294
- subject.set_point(5, 6)
295
- end.to change { subject.points }.
296
- from([[]]).to([[5.0, 6.0, 0.0]])
287
+ expect { subject.set_point(5, 6) }.to change { subject.point_value }.
288
+ from([]).to([5.0, 6.0])
297
289
  end
298
290
  end
299
291
 
300
292
  describe '#add_point' do
301
293
  it 'changes the x & y values' do
302
- expect do
303
- subject.add_point(5, 6)
304
- end.to change { subject.points }.
305
- from([[]]).to([[5.0, 6.0, 0.0]])
294
+ expect { subject.add_point(5, 6) }.to change { subject.point_value }.
295
+ from([]).to([5.0, 6.0])
306
296
  end
307
297
  end
308
298
 
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'ogr'
3
+
4
+ RSpec.describe OGR::Polygon25D do
5
+ describe '#type' do
6
+ context 'when created with data' do
7
+ subject { OGR::Geometry.create_from_wkt(wkt) }
8
+ let(:wkt) { 'POLYGON((0 0 1,0 1 1,1 1 1,0 0 1))' }
9
+
10
+ it 'returns :wkbPolygon25D' do
11
+ expect(subject.type).to eq :wkbPolygon25D
12
+ end
13
+ end
14
+
15
+ context 'when created without data' do
16
+ subject { described_class.new }
17
+
18
+ it 'returns :wkbPolygon' do
19
+ expect(subject.type).to eq :wkbPolygon
20
+ end
21
+ end
22
+ end
23
+ end
@@ -3,7 +3,7 @@ require 'ogr/geometry'
3
3
 
4
4
  RSpec.describe OGR::Polygon do
5
5
  subject(:polygon) { OGR::Geometry.create_from_wkt(wkt) }
6
- let(:wkt) { 'POLYGON((100 100, 200 200, 300 300))' }
6
+ let(:wkt) { 'POLYGON((10 10, 20 20, 30 30))' }
7
7
 
8
8
  it_behaves_like 'a geometry' do
9
9
  let(:geometry) { polygon }
@@ -8,7 +8,7 @@ RSpec.describe OGR::GeometryFieldDefinition do
8
8
  describe '#destroy!' do
9
9
  it 'sets the c_pointer to nil' do
10
10
  subject.destroy!
11
- expect(subject.instance_variable_get(:@geometry_field_definition_pointer)).
11
+ expect(subject.instance_variable_get(:@c_pointer)).
12
12
  to be_nil
13
13
  end
14
14
  end
@@ -12,7 +12,7 @@ RSpec.describe OGR::Geometry do
12
12
 
13
13
  context 'a 2.5D Point' do
14
14
  let(:wkt) { 'POINT(1 32 100)' }
15
- it { is_expected.to be_a OGR::Point }
15
+ it { is_expected.to be_a OGR::Point25D }
16
16
  end
17
17
 
18
18
  context 'a 2D LineString' do
@@ -22,7 +22,7 @@ RSpec.describe OGR::Geometry do
22
22
 
23
23
  context 'a 2.5D LineString' do
24
24
  let(:wkt) { 'LINESTRING(3 4 19,12 23 20)' }
25
- it { is_expected.to be_a OGR::LineString }
25
+ it { is_expected.to be_a OGR::LineString25D }
26
26
  end
27
27
 
28
28
  context 'a 2D Polygon' do
@@ -32,7 +32,7 @@ RSpec.describe OGR::Geometry do
32
32
 
33
33
  context 'a 2.5D Polygon' do
34
34
  let(:wkt) { 'POLYGON((1 1 1,2 2 2,3 3 3))' }
35
- it { is_expected.to be_a OGR::Polygon }
35
+ it { is_expected.to be_a OGR::Polygon25D }
36
36
  end
37
37
 
38
38
  context 'a 2D MultiPoint' do
@@ -40,24 +40,24 @@ RSpec.describe OGR::Geometry do
40
40
  it { is_expected.to be_a OGR::MultiPoint }
41
41
  end
42
42
 
43
- context 'a 2D MultiPoint' do
43
+ context 'a 2.5D MultiPoint' do
44
44
  let(:wkt) { 'MULTIPOINT((1 1 1),(2 2 2))' }
45
- it { is_expected.to be_a OGR::MultiPoint }
45
+ it { is_expected.to be_a OGR::MultiPoint25D }
46
46
  end
47
47
 
48
48
  context 'a 2D MultiLineString' do
49
- let(:wkt) { 'MULTILINESTRING((3 4),(100 200))' }
49
+ let(:wkt) { 'MULTILINESTRING((3 4),(100 20))' }
50
50
  it { is_expected.to be_a OGR::MultiLineString }
51
51
  end
52
52
 
53
53
  context 'a 2.5D MultiLineString' do
54
- let(:wkt) { 'MULTILINESTRING((3 4 19),(100 200 400))' }
55
- it { is_expected.to be_a OGR::MultiLineString }
54
+ let(:wkt) { 'MULTILINESTRING((3 4 19),(100 20 40))' }
55
+ it { is_expected.to be_a OGR::MultiLineString25D }
56
56
  end
57
57
 
58
58
  context 'a 2D MultiPolygon' do
59
59
  let(:wkt) do
60
- 'MULTIPOLYGON(((1 1,2 2,3 3)),((100 100, 200 200, 300 300)))'
60
+ 'MULTIPOLYGON(((1 1,2 2,3 3)),((100 100, 20 20, 30 30)))'
61
61
  end
62
62
 
63
63
  it { is_expected.to be_a OGR::MultiPolygon }
@@ -65,10 +65,10 @@ RSpec.describe OGR::Geometry do
65
65
 
66
66
  context 'a 2.5D MultiPolygon' do
67
67
  let(:wkt) do
68
- 'MULTIPOLYGON(((1 1 1,2 2 2,3 3 3)),((100 100 100, 200 200 200, 300 300 300)))'
68
+ 'MULTIPOLYGON(((1 1 1,2 2 2,3 3 3)),((100 100 100, 20 20 20, 30 30 30)))'
69
69
  end
70
70
 
71
- it { is_expected.to be_a OGR::MultiPolygon }
71
+ it { is_expected.to be_a OGR::MultiPolygon25D }
72
72
  end
73
73
  end
74
74
 
@@ -88,7 +88,7 @@ RSpec.describe OGR::Geometry do
88
88
  { type: :Point, coordinates: [1.0, 2.0, 3.0] }.to_json
89
89
  end
90
90
 
91
- it { is_expected.to be_a OGR::Point }
91
+ it { is_expected.to be_a OGR::Point25D }
92
92
  end
93
93
 
94
94
  context 'a 2D LineString' do
@@ -114,7 +114,7 @@ RSpec.describe OGR::Geometry do
114
114
  }.to_json
115
115
  end
116
116
 
117
- it { is_expected.to be_a OGR::LineString }
117
+ it { is_expected.to be_a OGR::LineString25D }
118
118
  end
119
119
 
120
120
  context 'a 2D Polygon' do
@@ -144,7 +144,7 @@ RSpec.describe OGR::Geometry do
144
144
  }.to_json
145
145
  end
146
146
 
147
- it { is_expected.to be_a OGR::Polygon }
147
+ it { is_expected.to be_a OGR::Polygon25D }
148
148
  end
149
149
 
150
150
  context 'a 2D MultiPoint' do
@@ -170,7 +170,7 @@ RSpec.describe OGR::Geometry do
170
170
  }.to_json
171
171
  end
172
172
 
173
- it { is_expected.to be_a OGR::MultiPoint }
173
+ it { is_expected.to be_a OGR::MultiPoint25D }
174
174
  end
175
175
 
176
176
  context 'a 2D MultiLineString' do
@@ -181,7 +181,7 @@ RSpec.describe OGR::Geometry do
181
181
  [
182
182
  [3.0, 4.0], [21.0, 27.0], [2.0, 5.0]
183
183
  ], [
184
- [100.0, 200.0], [982.0, 6.0]
184
+ [100.0, 20.0], [982.0, 6.0]
185
185
  ]
186
186
  ]
187
187
  }.to_json
@@ -198,13 +198,13 @@ RSpec.describe OGR::Geometry do
198
198
  [
199
199
  [3.0, 4.0, 19.0], [21.0, 27.0, 30.0]
200
200
  ], [
201
- [100.0, 200.0, 400.0], [982.0, 6.0, 47.1]
201
+ [100.0, 20.0, 400.0], [92.0, 6.0, 47.1]
202
202
  ]
203
203
  ]
204
204
  }.to_json
205
205
  end
206
206
 
207
- it { is_expected.to be_a OGR::MultiLineString }
207
+ it { is_expected.to be_a OGR::MultiLineString25D }
208
208
  end
209
209
 
210
210
  context 'a 2D MultiPolygon' do
@@ -220,7 +220,7 @@ RSpec.describe OGR::Geometry do
220
220
  ]
221
221
  ], [
222
222
  [
223
- [100.0, 100.0], [200.0, 200.0], [300.0, 300.0]
223
+ [100.0, 100.0], [20.0, 20.0], [30.0, 30.0]
224
224
  ], [
225
225
  [10.0, 10.0], [20.0, 20.0], [30.0, 30.0]
226
226
  ]
@@ -245,7 +245,7 @@ RSpec.describe OGR::Geometry do
245
245
  ]
246
246
  ], [
247
247
  [
248
- [100.0, 100.0, 100.0], [200.0, 200.0, 200.0], [300.0, 300.0, 300.0]
248
+ [100.0, 100.0, 100.0], [20.0, 20.0, 20.0], [30.0, 30.0, 30.0]
249
249
  ], [
250
250
  [10.0, 10.0, 10.0], [20.0, 20.0, 20.0], [30.0, 30.0, 30.0]
251
251
  ]
@@ -254,7 +254,7 @@ RSpec.describe OGR::Geometry do
254
254
  }.to_json
255
255
  end
256
256
 
257
- it { is_expected.to be_a OGR::MultiPolygon }
257
+ it { is_expected.to be_a OGR::MultiPolygon25D }
258
258
  end
259
259
  end
260
260
 
@@ -274,7 +274,7 @@ RSpec.describe OGR::Geometry do
274
274
  '<gml:Point><gml:coordinates>1,7,25</gml:coordinates></gml:Point>'
275
275
  end
276
276
 
277
- it { is_expected.to be_a OGR::Point }
277
+ it { is_expected.to be_a OGR::Point25D }
278
278
  end
279
279
 
280
280
  context 'a 2D LineString' do
@@ -290,7 +290,7 @@ RSpec.describe OGR::Geometry do
290
290
  '<gml:LineString><gml:coordinates>3,4,19</gml:coordinates></gml:LineString>'
291
291
  end
292
292
 
293
- it { is_expected.to be_a OGR::LineString }
293
+ it { is_expected.to be_a OGR::LineString25D }
294
294
  end
295
295
 
296
296
  context 'a 2D Polygon' do
@@ -322,7 +322,7 @@ RSpec.describe OGR::Geometry do
322
322
  GML
323
323
  end
324
324
 
325
- it { is_expected.to be_a OGR::Polygon }
325
+ it { is_expected.to be_a OGR::Polygon25D }
326
326
  end
327
327
 
328
328
  context 'a 2D MultiPoint' do
@@ -384,7 +384,7 @@ RSpec.describe OGR::Geometry do
384
384
  GML
385
385
  end
386
386
 
387
- it { is_expected.to be_a OGR::MultiPoint }
387
+ it { is_expected.to be_a OGR::MultiPoint25D }
388
388
  end
389
389
 
390
390
  context 'a 2D MultiLineString' do
@@ -398,7 +398,7 @@ RSpec.describe OGR::Geometry do
398
398
  </gml:lineStringMember>
399
399
  <gml:lineStringMember>
400
400
  <gml:LineString>
401
- <gml:coordinates>100,200</gml:coordinates>
401
+ <gml:coordinates>100,20</gml:coordinates>
402
402
  </gml:LineString>
403
403
  </gml:lineStringMember>
404
404
  </gml:MultiLineString>
@@ -419,14 +419,14 @@ RSpec.describe OGR::Geometry do
419
419
  </gml:lineStringMember>
420
420
  <gml:lineStringMember>
421
421
  <gml:LineString>
422
- <gml:coordinates>100,200,400</gml:coordinates>
422
+ <gml:coordinates>100,20,40</gml:coordinates>
423
423
  </gml:LineString>
424
424
  </gml:lineStringMember>
425
425
  </gml:MultiLineString>
426
426
  GML
427
427
  end
428
428
 
429
- it { is_expected.to be_a OGR::MultiLineString }
429
+ it { is_expected.to be_a OGR::MultiLineString25D }
430
430
  end
431
431
 
432
432
  context 'a 2D MultiPolygon' do
@@ -446,7 +446,7 @@ RSpec.describe OGR::Geometry do
446
446
  <gml:Polygon>
447
447
  <gml:outerBoundaryIs>
448
448
  <gml:LinearRing>
449
- <gml:coordinates>100,100 200,200 300,300</gml:coordinates>
449
+ <gml:coordinates>100,100 20,20 30,30</gml:coordinates>
450
450
  </gml:LinearRing>
451
451
  </gml:outerBoundaryIs>
452
452
  </gml:Polygon>
@@ -475,7 +475,7 @@ RSpec.describe OGR::Geometry do
475
475
  <gml:Polygon>
476
476
  <gml:outerBoundaryIs>
477
477
  <gml:LinearRing>
478
- <gml:coordinates>100,100,9 200,200,9 300,300,9</gml:coordinates>
478
+ <gml:coordinates>100,100,9 20,20,9 30,30,9</gml:coordinates>
479
479
  </gml:LinearRing>
480
480
  </gml:outerBoundaryIs>
481
481
  </gml:Polygon>
@@ -484,8 +484,143 @@ RSpec.describe OGR::Geometry do
484
484
  GML
485
485
  end
486
486
 
487
+ it { is_expected.to be_a OGR::MultiPolygon25D }
488
+ end
489
+ end
490
+
491
+ describe '.create_from_wkb' do
492
+ subject { OGR::Geometry.create_from_wkb(wkb) }
493
+
494
+ context 'a 2D Point' do
495
+ # POINT(1 32)
496
+ let(:wkb) { ['0101000000000000000000f03f0000000000004040'].pack('H*') }
497
+ it { is_expected.to be_a OGR::Point }
498
+ end
499
+
500
+ context 'a 2.5D Point' do
501
+ # POINT(1 32 100)
502
+ let(:wkb) { ['01e9030000000000000000f03f00000000000040400000000000005940'].pack('H*') }
503
+ it { is_expected.to be_a OGR::Point }
504
+ end
505
+
506
+ context 'a 2D LineString' do
507
+ # LINESTRING(3 19,12 20)
508
+ let(:wkb) do
509
+ ['0102000000020000000000000000000840000000000000334000000000000028400000000000003440'].pack('H*')
510
+ end
511
+ it { is_expected.to be_a OGR::LineString }
512
+ end
513
+
514
+ context 'a 2.5D LineString' do
515
+ # LINESTRING(3 4 19,12 13 20)
516
+ let(:wkb) do
517
+ hex = '01ea030000020000000000000000000840000000000000104000000000000' \
518
+ '03340000000000000284000000000000037400000000000003440'
519
+ [hex].pack('H*')
520
+ end
521
+
522
+ it { is_expected.to be_a OGR::LineString25D }
523
+ end
524
+
525
+ context 'a 2D Polygon' do
526
+ # 'POLYGON((1 1,2 1,3 0,1 1))'
527
+ let(:wkb) do
528
+ hex = '01030000000100000004000000000000000000f03f000000000000f03f0000' \
529
+ '000000000040000000000000f03f00000000000008400000000000000000000000' \
530
+ '000000f03f000000000000f03f'
531
+ [hex].pack('H*')
532
+ end
533
+
534
+ it { is_expected.to be_a OGR::Polygon }
535
+ end
536
+
537
+ context 'a 2.5D Polygon' do
538
+ let(:wkb) do
539
+ # 'POLYGON((1 1 1,2 1 1,2 0 1,1 1 1))'
540
+ hex = '01eb0300000100000004000000000000000000f03f000000000000f03f0000' \
541
+ '00000000f03f0000000000000040000000000000f03f000000000000f03f000000' \
542
+ '00000000400000000000000000000000000000f03f000000000000f03f00000000' \
543
+ '0000f03f000000000000f03f'
544
+ [hex].pack('H*')
545
+ end
546
+ it { is_expected.to be_a OGR::Polygon25D }
547
+ end
548
+
549
+ context 'a 2D MultiPoint' do
550
+ let(:wkb) do
551
+ # 'MULTIPOINT((0 0),(1 1))'
552
+ hex = '01040000000200000001010000000000000000000000000000000000000001' \
553
+ '01000000000000000000f03f000000000000f03f'
554
+ [hex].pack('H*')
555
+ end
556
+ it { is_expected.to be_a OGR::MultiPoint }
557
+ end
558
+
559
+ context 'a 2.5D MultiPoint' do
560
+ let(:wkb) do
561
+ # 'MULTIPOINT((0 0 0),(1 1 1))'
562
+ hex = '01ec0300000200000001e90300000000000000000000000000000000000000' \
563
+ '0000000000000001e9030000000000000000f03f000000000000f03f0000000000' \
564
+ '00f03f'
565
+ [hex].pack('H*')
566
+ end
567
+ it { is_expected.to be_a OGR::MultiPoint25D }
568
+ end
569
+
570
+ context 'a 2D MultiLineString' do
571
+ let(:wkb) do
572
+ # 'MULTILINESTRING((1 1,2 2, 3 3),(10 10,20 20,30 30))'
573
+ hex = '010500000002000000010200000003000000000000000000f03f0000000000' \
574
+ '00f03f000000000000004000000000000000400000000000000840000000000000' \
575
+ '084001020000000300000000000000000024400000000000002440000000000000' \
576
+ '344000000000000034400000000000003e400000000000003e40'
577
+ [hex].pack('H*')
578
+ end
579
+ it { is_expected.to be_a OGR::MultiLineString }
580
+ end
581
+
582
+ context 'a 2.5D MultiLineString' do
583
+ let(:wkb) do
584
+ # MULTILINESTRING((3 4 19,100 20 40),(5 5 5,6 6 6,7 7 7))
585
+ hex = '01ed0300000200000001ea0300000200000000000000000008400000000000' \
586
+ '001040000000000000334000000000000059400000000000003440000000000000' \
587
+ '444001ea0300000300000000000000000014400000000000001440000000000000' \
588
+ '14400000000000001840000000000000184000000000000018400000000000001c' \
589
+ '400000000000001c400000000000001c40'
590
+ [hex].pack('H*')
591
+ end
592
+ it { is_expected.to be_a OGR::MultiLineString25D }
593
+ end
594
+
595
+ context 'a 2D MultiPolygon' do
596
+ # 'MULTIPOLYGON(((1 1,2 1,2 0,1 1)),((100 100,20 20,30 30,100 100)))'
597
+ let(:wkb) do
598
+ hex = '01060000000200000001030000000100000004000000000000000000f03f00' \
599
+ '0000000000f03f0000000000000040000000000000f03f00000000000000400000' \
600
+ '000000000000000000000000f03f000000000000f03f0103000000010000000400' \
601
+ '000000000000000059400000000000005940000000000000344000000000000034' \
602
+ '400000000000003e400000000000003e4000000000000059400000000000005940'
603
+ [hex].pack('H*')
604
+ end
605
+
487
606
  it { is_expected.to be_a OGR::MultiPolygon }
488
607
  end
608
+
609
+ context 'a 2.5D MultiPolygon' do
610
+ # 'MULTIPOLYGON(((1 1 1,2 1 2,2 0 3,1 1 1)),((100 100 100,20 20 20,30 30 30,100 100 100)))'
611
+ let(:wkb) do
612
+ hex = '01ee0300000200000001eb0300000100000004000000000000000000f03f00' \
613
+ '0000000000f03f000000000000f03f0000000000000040000000000000f03f0000' \
614
+ '000000000040000000000000004000000000000000000000000000000840000000' \
615
+ '000000f03f000000000000f03f000000000000f03f01eb03000001000000040000' \
616
+ '000000000000005940000000000000594000000000000059400000000000003440' \
617
+ '000000000000344000000000000034400000000000003e400000000000003e4000' \
618
+ '00000000003e40000000000000594000000000000059400000000000005940'
619
+ [hex].pack('H*')
620
+ end
621
+
622
+ it { is_expected.to be_a OGR::MultiPolygon25D }
623
+ end
489
624
  end
490
625
 
491
626
  describe '.type_to_name' do
@@ -539,4 +674,35 @@ RSpec.describe OGR::Geometry do
539
674
  it { is_expected.to eq 'Unrecognised: 101' }
540
675
  end
541
676
  end
677
+
678
+ describe '#utm_zone' do
679
+ let(:geom) { OGR::Geometry.create_from_wkt(wkt) }
680
+
681
+ let(:wkt) do
682
+ 'LINESTRING(100 100, 20 20, 30 30, 100 100)'
683
+ end
684
+
685
+ context 'no spatial_reference' do
686
+ subject { geom.utm_zone }
687
+ it { is_expected.to be_nil }
688
+ end
689
+
690
+ context 'SRID is 4326' do
691
+ subject { geom.utm_zone }
692
+ before { geom.spatial_reference = OGR::SpatialReference.new_from_epsg(4326) }
693
+ it { is_expected.to eq(36) }
694
+ end
695
+
696
+ context 'SRID is not 4326' do
697
+ before { geom.spatial_reference = OGR::SpatialReference.new_from_epsg(3857) }
698
+
699
+ it 'transforms to 4326 then figures out the zone' do
700
+ duped_subject = geom.dup
701
+ expect(geom).to receive(:dup).and_return(duped_subject)
702
+ expect(duped_subject).to receive(:transform_to!).and_call_original
703
+
704
+ geom.utm_zone
705
+ end
706
+ end
707
+ end
542
708
  end