ffi-gdal 1.0.0.beta16 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (324) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +17 -0
  3. data/.github/workflows/codacy.yml +61 -0
  4. data/.github/workflows/codeql.yml +74 -0
  5. data/.github/workflows/continuous-integration.yml +36 -0
  6. data/.github/workflows/dependency-review.yml +20 -0
  7. data/.github/workflows/specs-in-docker.yml +27 -0
  8. data/.gitignore +3 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +10 -80
  11. data/.rubocop_todo.yml +23 -40
  12. data/.ruby-version +1 -1
  13. data/Changelog-0.x.md +512 -0
  14. data/Changelog.md +12 -0
  15. data/Dockerfile.gdal2 +110 -0
  16. data/Dockerfile.gdal3 +73 -0
  17. data/README.md +25 -14
  18. data/Rakefile +0 -8
  19. data/Tiltfile +91 -0
  20. data/bin/bundle +123 -0
  21. data/bin/docker-clean +8 -0
  22. data/bin/rake +29 -0
  23. data/bin/rspec +29 -0
  24. data/bin/rubocop +29 -0
  25. data/docker-compose.yml +25 -0
  26. data/examples/extract_and_colorize.rb +0 -13
  27. data/examples/geometries.rb +14 -14
  28. data/examples/ogr_layer_to_layer.rb +1 -3
  29. data/examples/raster_erasing.rb +1 -0
  30. data/examples/remove_small_polygons.rb +1 -1
  31. data/examples/testing_gdal.rb +20 -17
  32. data/examples/warping.rb +9 -7
  33. data/ffi-gdal.gemspec +12 -6
  34. data/lib/ext/ffi_library_function_checks.rb +2 -2
  35. data/lib/ext/to_bool.rb +5 -3
  36. data/lib/ffi/cpl/conv.rb +27 -25
  37. data/lib/ffi/cpl/error.rb +19 -20
  38. data/lib/ffi/cpl/hash_set.rb +4 -4
  39. data/lib/ffi/cpl/http.rb +3 -3
  40. data/lib/ffi/cpl/http_result.rb +8 -8
  41. data/lib/ffi/cpl/list.rb +1 -1
  42. data/lib/ffi/cpl/mime_part.rb +2 -2
  43. data/lib/ffi/cpl/minixml.rb +7 -7
  44. data/lib/ffi/cpl/progress.rb +8 -8
  45. data/lib/ffi/cpl/quad_tree.rb +14 -14
  46. data/lib/ffi/cpl/rect_obj.rb +3 -3
  47. data/lib/ffi/cpl/string.rb +17 -20
  48. data/lib/ffi/cpl/vsi.rb +13 -13
  49. data/lib/ffi/cpl/xml_node.rb +3 -3
  50. data/lib/ffi/extensions/gdal/extensions/all.rb +4 -0
  51. data/lib/ffi/extensions/gdal/extensions/version.rb +9 -0
  52. data/lib/ffi/extensions/gdal/extensions.rb +12 -0
  53. data/lib/ffi/extensions/rttopo/gbox.rb +19 -0
  54. data/lib/ffi/extensions/rttopo/geom.rb +16 -0
  55. data/lib/ffi/extensions/rttopo.rb +41 -0
  56. data/lib/ffi/gdal/alg.rb +277 -277
  57. data/lib/ffi/gdal/color_entry.rb +3 -3
  58. data/lib/ffi/gdal/gcp.rb +6 -6
  59. data/lib/ffi/gdal/gdal.rb +349 -349
  60. data/lib/ffi/gdal/grid.rb +134 -134
  61. data/lib/ffi/gdal/grid_data_metrics_options.rb +4 -4
  62. data/lib/ffi/gdal/grid_inverse_distance_to_a_power_options.rb +9 -9
  63. data/lib/ffi/gdal/grid_moving_average_options.rb +4 -4
  64. data/lib/ffi/gdal/grid_nearest_neighbor_options.rb +3 -3
  65. data/lib/ffi/gdal/matching.rb +3 -3
  66. data/lib/ffi/gdal/rpc_info.rb +17 -17
  67. data/lib/ffi/gdal/transformer_info.rb +4 -4
  68. data/lib/ffi/gdal/version.rb +1 -1
  69. data/lib/ffi/gdal/vrt.rb +39 -39
  70. data/lib/ffi/gdal/warp_options.rb +34 -34
  71. data/lib/ffi/gdal/warper.rb +90 -90
  72. data/lib/ffi/gdal.rb +2 -31
  73. data/lib/ffi/ogr/api.rb +175 -167
  74. data/lib/ffi/ogr/contour_writer_info.rb +4 -4
  75. data/lib/ffi/ogr/core.rb +107 -107
  76. data/lib/ffi/ogr/envelope.rb +3 -3
  77. data/lib/ffi/ogr/envelope_3d.rb +5 -5
  78. data/lib/ffi/ogr/featurestyle.rb +3 -3
  79. data/lib/ffi/ogr/field.rb +22 -22
  80. data/lib/ffi/ogr/geocoding.rb +4 -4
  81. data/lib/ffi/ogr/srs_api.rb +154 -155
  82. data/lib/ffi/ogr/style_param.rb +3 -3
  83. data/lib/ffi/ogr/style_value.rb +4 -4
  84. data/lib/gdal/color_entry.rb +1 -5
  85. data/lib/gdal/color_interpretation.rb +7 -3
  86. data/lib/gdal/color_table.rb +46 -27
  87. data/lib/gdal/cpl_error_handler.rb +26 -6
  88. data/lib/gdal/data_type.rb +10 -3
  89. data/lib/gdal/dataset.rb +171 -85
  90. data/lib/gdal/dataset_mixins/algorithm_methods.rb +44 -44
  91. data/lib/gdal/dataset_mixins/matching.rb +1 -1
  92. data/lib/gdal/dataset_mixins/warp_methods.rb +4 -2
  93. data/lib/gdal/driver.rb +38 -21
  94. data/lib/gdal/environment_methods.rb +6 -6
  95. data/lib/gdal/extensions/all.rb +3 -0
  96. data/lib/gdal/{color_entry_mixins → extensions/color_entry}/extensions.rb +4 -1
  97. data/lib/gdal/{color_table_mixins → extensions/color_table}/extensions.rb +3 -0
  98. data/lib/gdal/extensions/dataset/extensions.rb +205 -0
  99. data/lib/gdal/{driver_mixins → extensions/driver}/extensions.rb +6 -2
  100. data/lib/gdal/{geo_transform_mixins → extensions/geo_transform}/extensions.rb +10 -8
  101. data/lib/gdal/{gridder → extensions/gridder}/point_extracting.rb +7 -5
  102. data/lib/gdal/{gridder.rb → extensions/gridder.rb} +33 -33
  103. data/lib/gdal/{gridder_options.rb → extensions/gridder_options.rb} +13 -14
  104. data/lib/gdal/{raster_attribute_table_mixins → extensions/raster_attribute_table}/extensions.rb +8 -6
  105. data/lib/gdal/{raster_band_mixins → extensions/raster_band}/algorithm_extensions.rb +8 -6
  106. data/lib/gdal/{raster_band_mixins → extensions/raster_band}/coloring_extensions.rb +6 -4
  107. data/lib/gdal/{raster_band_mixins → extensions/raster_band}/extensions.rb +9 -5
  108. data/lib/gdal/{raster_band_mixins → extensions/raster_band}/io_extensions.rb +18 -14
  109. data/lib/gdal/{raster_band_classifier.rb → extensions/raster_band_classifier.rb} +3 -5
  110. data/lib/gdal/geo_transform.rb +1 -6
  111. data/lib/gdal/grid.rb +3 -2
  112. data/lib/gdal/grid_algorithms.rb +9 -9
  113. data/lib/gdal/internal_helpers.rb +46 -9
  114. data/lib/gdal/major_object.rb +11 -3
  115. data/lib/gdal/options.rb +26 -32
  116. data/lib/gdal/raster_attribute_table.rb +63 -37
  117. data/lib/gdal/raster_band.rb +164 -116
  118. data/lib/gdal/raster_band_mixins/algorithm_methods.rb +26 -25
  119. data/lib/gdal/rpc_info.rb +3 -2
  120. data/lib/gdal/transformers/approximate_transformer.rb +12 -3
  121. data/lib/gdal/transformers/base_general_image_projection_transformer.rb +15 -2
  122. data/lib/gdal/transformers/gcp_transformer.rb +27 -19
  123. data/lib/gdal/transformers/general_image_projection_transformer.rb +8 -6
  124. data/lib/gdal/transformers/general_image_projection_transformer2.rb +9 -6
  125. data/lib/gdal/transformers/general_image_projection_transformer3.rb +6 -2
  126. data/lib/gdal/transformers/geolocation_transformer.rb +12 -4
  127. data/lib/gdal/transformers/reprojection_transformer.rb +11 -3
  128. data/lib/gdal/transformers/rpc_transformer.rb +11 -2
  129. data/lib/gdal/transformers/tps_transformer.rb +12 -4
  130. data/lib/gdal/version_info.rb +2 -2
  131. data/lib/gdal/virtual_dataset.rb +2 -0
  132. data/lib/gdal/warp_operation.rb +65 -54
  133. data/lib/gdal/warp_options.rb +9 -11
  134. data/lib/ogr/coordinate_transformation.rb +23 -9
  135. data/lib/ogr/data_source.rb +68 -37
  136. data/lib/ogr/driver.rb +18 -17
  137. data/lib/ogr/envelope.rb +0 -3
  138. data/lib/ogr/error_handling.rb +22 -24
  139. data/lib/ogr/extensions/all.rb +3 -0
  140. data/lib/ogr/{data_source_mixins → extensions/data_source}/capability_methods.rb +2 -0
  141. data/lib/ogr/extensions/data_source/data_source_extensions.rb +16 -0
  142. data/lib/ogr/{driver_mixins → extensions/driver}/capability_methods.rb +5 -1
  143. data/lib/ogr/extensions/envelope/extensions.rb +114 -0
  144. data/lib/ogr/extensions/feature/extensions.rb +87 -0
  145. data/lib/ogr/extensions/feature_definition/extensions.rb +43 -0
  146. data/lib/ogr/extensions/geometries/point/extensions.rb +19 -0
  147. data/lib/ogr/extensions/geometry/container_mixins.rb +56 -0
  148. data/lib/ogr/extensions/geometry/ewkb_io_extensions.rb +44 -0
  149. data/lib/ogr/extensions/geometry/ewkb_record.rb +94 -0
  150. data/lib/ogr/{geometry_mixins → extensions/geometry}/extensions.rb +16 -9
  151. data/lib/ogr/extensions/geometry/rttopo_extensions.rb +48 -0
  152. data/lib/ogr/extensions/geometry/wkb_record.rb +63 -0
  153. data/lib/ogr/extensions/geometry_types/curve/extensions.rb +68 -0
  154. data/lib/ogr/{layer_mixins → extensions/layer}/capability_methods.rb +4 -0
  155. data/lib/ogr/{layer_mixins → extensions/layer}/extensions.rb +11 -6
  156. data/lib/ogr/extensions/spatial_reference/extensions.rb +38 -0
  157. data/lib/ogr/extensions/spatial_reference/initializers.rb +138 -0
  158. data/lib/ogr/extensions/style_table/extensions.rb +31 -0
  159. data/lib/ogr/feature.rb +173 -88
  160. data/lib/ogr/feature_definition.rb +53 -45
  161. data/lib/ogr/field.rb +17 -19
  162. data/lib/ogr/field_definition.rb +30 -18
  163. data/lib/ogr/geocoder.rb +11 -4
  164. data/lib/ogr/geometries/line_string.rb +1 -0
  165. data/lib/ogr/geometries/line_string_25d.rb +0 -9
  166. data/lib/ogr/geometries/linear_ring.rb +2 -2
  167. data/lib/ogr/geometries/point.rb +0 -9
  168. data/lib/ogr/geometry.rb +116 -49
  169. data/lib/ogr/geometry_field_definition.rb +31 -15
  170. data/lib/ogr/geometry_types/container.rb +26 -28
  171. data/lib/ogr/geometry_types/curve.rb +5 -61
  172. data/lib/ogr/geometry_types/surface.rb +1 -1
  173. data/lib/ogr/internal_helpers.rb +2 -2
  174. data/lib/ogr/layer.rb +12 -10
  175. data/lib/ogr/layer_mixins/ogr_feature_methods.rb +39 -27
  176. data/lib/ogr/layer_mixins/ogr_field_methods.rb +66 -50
  177. data/lib/ogr/layer_mixins/ogr_layer_method_methods.rb +17 -8
  178. data/lib/ogr/layer_mixins/ogr_query_filter_methods.rb +7 -6
  179. data/lib/ogr/layer_mixins/ogr_sql_methods.rb +15 -7
  180. data/lib/ogr/spatial_reference.rb +79 -42
  181. data/lib/ogr/spatial_reference_mixins/coordinate_system_getter_setters.rb +149 -118
  182. data/lib/ogr/spatial_reference_mixins/exporters.rb +87 -51
  183. data/lib/ogr/spatial_reference_mixins/importers.rb +88 -43
  184. data/lib/ogr/spatial_reference_mixins/morphers.rb +12 -8
  185. data/lib/ogr/spatial_reference_mixins/parameter_getter_setters.rb +27 -13
  186. data/lib/ogr/style_table.rb +15 -5
  187. data/lib/ogr/style_tool.rb +29 -15
  188. data/lib/ogr.rb +1 -0
  189. data/rakelib/docker.rake +10 -0
  190. data/sorbet/rbi/hidden-definitions/errors.txt +21790 -0
  191. data/tilt/gdal2.yml +22 -0
  192. data/tilt/gdal3.yml +22 -0
  193. metadata +116 -280
  194. data/History.md +0 -360
  195. data/lib/ext/error_symbols.rb +0 -7
  196. data/lib/gdal/dataset_mixins/extensions.rb +0 -380
  197. data/lib/gdal/merger.rb +0 -132
  198. data/lib/ogr/data_source_extensions.rb +0 -10
  199. data/lib/ogr/envelope_extensions.rb +0 -110
  200. data/lib/ogr/feature_definition_extensions.rb +0 -39
  201. data/lib/ogr/feature_extensions.rb +0 -87
  202. data/lib/ogr/geometry_mixins/container_mixins.rb +0 -25
  203. data/lib/ogr/spatial_reference_extensions.rb +0 -34
  204. data/lib/ogr/style_table_extensions.rb +0 -26
  205. data/spec/ffi-gdal_spec.rb +0 -24
  206. data/spec/integration/gdal/color_table_info_spec.rb +0 -78
  207. data/spec/integration/gdal/dataset_info_spec.rb +0 -342
  208. data/spec/integration/gdal/driver_info_spec.rb +0 -170
  209. data/spec/integration/gdal/geo_transform_info_spec.rb +0 -226
  210. data/spec/integration/gdal/gridder_spec.rb +0 -331
  211. data/spec/integration/gdal/raster_attribute_table_info_spec.rb +0 -229
  212. data/spec/integration/gdal/raster_band_algorithms_spec.rb +0 -35
  213. data/spec/integration/gdal/raster_band_info_spec.rb +0 -320
  214. data/spec/integration/ogr/layer_spec.rb +0 -95
  215. data/spec/spec_helper.rb +0 -116
  216. data/spec/support/images/123.tiff +0 -0
  217. data/spec/support/images/osgeo/gdal/data/hfa/float-rle.img +0 -0
  218. data/spec/support/images/osgeo/geotiff/GeogToWGS84GeoKey/GeogToWGS84GeoKey5.lgo +0 -31
  219. data/spec/support/images/osgeo/geotiff/GeogToWGS84GeoKey/GeogToWGS84GeoKey5.tif +0 -0
  220. data/spec/support/images/osgeo/geotiff/GeogToWGS84GeoKey/GeogToWGS84GeoKey5.tif.msk +0 -0
  221. data/spec/support/images/osgeo/geotiff/GeogToWGS84GeoKey/GeogToWGS84GeoKey5.txt +0 -10
  222. data/spec/support/images/osgeo/geotiff/gdal_eg/cea.tif +0 -0
  223. data/spec/support/images/osgeo/geotiff/gdal_eg/cea.txt +0 -84
  224. data/spec/support/images/osgeo/geotiff/zi_imaging/image0.lgo +0 -45
  225. data/spec/support/images/osgeo/geotiff/zi_imaging/image0.tif +0 -0
  226. data/spec/support/integration_help.rb +0 -34
  227. data/spec/support/shapefiles/states_21basic/states.dbf +0 -0
  228. data/spec/support/shapefiles/states_21basic/states.prj +0 -1
  229. data/spec/support/shapefiles/states_21basic/states.sbn +0 -0
  230. data/spec/support/shapefiles/states_21basic/states.sbx +0 -0
  231. data/spec/support/shapefiles/states_21basic/states.shp +0 -0
  232. data/spec/support/shapefiles/states_21basic/states.shp.xml +0 -3
  233. data/spec/support/shapefiles/states_21basic/states.shx +0 -0
  234. data/spec/support/shared_contexts.rb +0 -28
  235. data/spec/support/shared_examples/gdal/major_object_examples.rb +0 -55
  236. data/spec/support/shared_examples/ogr/a_25d_geometry.rb +0 -9
  237. data/spec/support/shared_examples/ogr/a_container_geometry.rb +0 -49
  238. data/spec/support/shared_examples/ogr/a_geometry.rb +0 -406
  239. data/spec/support/shared_examples/ogr/a_line_string.rb +0 -18
  240. data/spec/support/test_style_table.txt +0 -3
  241. data/spec/support/worldfiles/SR_50M/SR_50M.VERSION.txt +0 -1
  242. data/spec/support/worldfiles/SR_50M/SR_50M.prj +0 -1
  243. data/spec/support/worldfiles/SR_50M/SR_50M.tfw +0 -6
  244. data/spec/support/worldfiles/SR_50M/SR_50M.tif +0 -0
  245. data/spec/unit/ext/error_symbols_spec.rb +0 -69
  246. data/spec/unit/ext/numeric_as_data_type_spec.rb +0 -115
  247. data/spec/unit/ffi/gdal_spec.rb +0 -73
  248. data/spec/unit/gdal/color_entry_spec.rb +0 -8
  249. data/spec/unit/gdal/color_interpretation_spec.rb +0 -8
  250. data/spec/unit/gdal/color_table_mixins/extensions_spec.rb +0 -62
  251. data/spec/unit/gdal/color_table_spec.rb +0 -146
  252. data/spec/unit/gdal/data_type_spec.rb +0 -74
  253. data/spec/unit/gdal/dataset_mixins/warp_methods_spec.rb +0 -55
  254. data/spec/unit/gdal/dataset_spec.rb +0 -148
  255. data/spec/unit/gdal/driver_mixins/extensions_spec.rb +0 -24
  256. data/spec/unit/gdal/driver_spec.rb +0 -51
  257. data/spec/unit/gdal/environment_methods_spec.rb +0 -8
  258. data/spec/unit/gdal/geo_transform_mixins/extensions_spec.rb +0 -69
  259. data/spec/unit/gdal/geo_transform_spec.rb +0 -265
  260. data/spec/unit/gdal/grid_spec.rb +0 -98
  261. data/spec/unit/gdal/gridder/point_extracting_spec.rb +0 -101
  262. data/spec/unit/gdal/gridder_options_spec.rb +0 -185
  263. data/spec/unit/gdal/gridder_spec.rb +0 -182
  264. data/spec/unit/gdal/internal_helpers_spec.rb +0 -278
  265. data/spec/unit/gdal/major_object_spec.rb +0 -10
  266. data/spec/unit/gdal/options_spec.rb +0 -33
  267. data/spec/unit/gdal/raster_attribute_table_spec.rb +0 -7
  268. data/spec/unit/gdal/raster_band_classifier_spec.rb +0 -260
  269. data/spec/unit/gdal/raster_band_mixins/extensions_spec.rb +0 -73
  270. data/spec/unit/gdal/raster_band_mixins/io_extensions_spec.rb +0 -135
  271. data/spec/unit/gdal/raster_band_spec.rb +0 -8
  272. data/spec/unit/gdal/rpc_info_spec.rb +0 -8
  273. data/spec/unit/gdal/version_info_spec.rb +0 -10
  274. data/spec/unit/gdal/virtual_dataset_spec.rb +0 -34
  275. data/spec/unit/gdal/warp_operation_spec.rb +0 -8
  276. data/spec/unit/gdal/warp_options_spec.rb +0 -338
  277. data/spec/unit/ogr/coordinate_transformation_spec.rb +0 -104
  278. data/spec/unit/ogr/data_source_mixins/capability_methods_spec.rb +0 -32
  279. data/spec/unit/ogr/data_source_spec.rb +0 -223
  280. data/spec/unit/ogr/driver_mixins/capability_methods_spec.rb +0 -20
  281. data/spec/unit/ogr/driver_spec.rb +0 -152
  282. data/spec/unit/ogr/envelope_spec.rb +0 -324
  283. data/spec/unit/ogr/feature_definition_spec.rb +0 -296
  284. data/spec/unit/ogr/feature_extensions_spec.rb +0 -90
  285. data/spec/unit/ogr/feature_spec.rb +0 -363
  286. data/spec/unit/ogr/field_definition_spec.rb +0 -118
  287. data/spec/unit/ogr/field_spec.rb +0 -195
  288. data/spec/unit/ogr/geometries/geometry_collection_25d_spec.rb +0 -25
  289. data/spec/unit/ogr/geometries/geometry_collection_spec.rb +0 -188
  290. data/spec/unit/ogr/geometries/line_string_25d_spec.rb +0 -25
  291. data/spec/unit/ogr/geometries/line_string_spec.rb +0 -107
  292. data/spec/unit/ogr/geometries/linear_ring_spec.rb +0 -92
  293. data/spec/unit/ogr/geometries/multi_line_string_25d_spec.rb +0 -25
  294. data/spec/unit/ogr/geometries/multi_line_string_spec.rb +0 -16
  295. data/spec/unit/ogr/geometries/multi_point_25d_spec.rb +0 -25
  296. data/spec/unit/ogr/geometries/multi_point_spec.rb +0 -16
  297. data/spec/unit/ogr/geometries/multi_polygon_25d_spec.rb +0 -25
  298. data/spec/unit/ogr/geometries/multi_polygon_spec.rb +0 -43
  299. data/spec/unit/ogr/geometries/none_geometry_spec.rb +0 -14
  300. data/spec/unit/ogr/geometries/point_25d_spec.rb +0 -25
  301. data/spec/unit/ogr/geometries/point_spec.rb +0 -307
  302. data/spec/unit/ogr/geometries/polygon_25d_spec.rb +0 -25
  303. data/spec/unit/ogr/geometries/polygon_spec.rb +0 -19
  304. data/spec/unit/ogr/geometries/unknown_geometry_spec.rb +0 -12
  305. data/spec/unit/ogr/geometry_field_definition_spec.rb +0 -73
  306. data/spec/unit/ogr/geometry_spec.rb +0 -711
  307. data/spec/unit/ogr/internal_helpers_spec.rb +0 -70
  308. data/spec/unit/ogr/layer_mixins/capability_methods_spec.rb +0 -90
  309. data/spec/unit/ogr/layer_mixins/ogr_feature_methods_spec.rb +0 -155
  310. data/spec/unit/ogr/layer_mixins/ogr_field_methods_spec.rb +0 -434
  311. data/spec/unit/ogr/layer_mixins/ogr_layer_method_methods_spec.rb +0 -22
  312. data/spec/unit/ogr/layer_mixins/ogr_query_filter_methods_spec.rb +0 -44
  313. data/spec/unit/ogr/layer_mixins/ogr_sql_methods_spec.rb +0 -14
  314. data/spec/unit/ogr/layer_spec.rb +0 -98
  315. data/spec/unit/ogr/spatial_reference_mixins/coordinate_system_getter_setters_spec.rb +0 -48
  316. data/spec/unit/ogr/spatial_reference_mixins/exporters_spec.rb +0 -151
  317. data/spec/unit/ogr/spatial_reference_mixins/importers_spec.rb +0 -40
  318. data/spec/unit/ogr/spatial_reference_mixins/morphers_spec.rb +0 -38
  319. data/spec/unit/ogr/spatial_reference_mixins/parameter_getter_setters_spec.rb +0 -105
  320. data/spec/unit/ogr/spatial_reference_mixins/type_checks_spec.rb +0 -159
  321. data/spec/unit/ogr/spatial_reference_spec.rb +0 -44
  322. data/spec/unit/ogr/style_table_spec.rb +0 -108
  323. data/spec/unit/ogr/style_tool_spec.rb +0 -159
  324. data/spec/unit/version_info_spec.rb +0 -50
@@ -10,38 +10,36 @@ module OGR
10
10
  # Unlike the OGR API, ffi-gdal defines an Enum for the OGRERR types, which
11
11
  # in turns causes OGR to return Symbols on errors (the #defines for those can
12
12
  # be found here: http://www.gdal.org/ogr__core_8h.html). This maps those
13
- # Symbols to Ruby exceptions (or lack thereof). The sad part of this
14
- # solution is that any function that returns an OGRErr needs to assign that
15
- # Symbol to a variable, then call #handle_result to get that
16
- # Symbol-to-Exception mapping to take place.
13
+ # Symbols to Ruby exceptions (or lack thereof).
17
14
  module ErrorHandling
18
- def handle_result(msg = nil)
19
- error_class_map(self).call(msg)
20
- end
15
+ ERROR_CLASS_MAP = {
16
+ OGRERR_NONE: nil,
17
+ OGRERR_NOT_ENOUGH_DATA: OGR::NotEnoughData,
18
+ OGRERR_NOT_ENOUGH_MEMORY: ::NoMemoryError,
19
+ OGRERR_UNSUPPORTED_GEOMETRY_TYPE: OGR::UnsupportedGeometryType,
20
+ OGRERR_UNSUPPORTED_OPERATION: OGR::UnsupportedOperation,
21
+ OGRERR_CORRUPT_DATA: OGR::CorruptData,
22
+ OGRERR_FAILURE: OGR::Failure,
23
+ OGRERR_UNSUPPORTED_SRS: OGR::UnsupportedSRS,
24
+ OGRERR_INVALID_HANDLE: OGR::InvalidHandle
25
+ }.freeze
26
+
27
+ # Yields, then expects the result to be a Symbol from FFI::OGR::Core::Err.
28
+ #
29
+ # @param msg [String]
30
+ def self.handle_ogr_err(msg)
31
+ ogr_err_symbol = yield
21
32
 
22
- private
33
+ klass = ERROR_CLASS_MAP.fetch(ogr_err_symbol) { raise "Unknown OGRERR type: #{self}" }
23
34
 
24
- # @param [Symbol] error_class
25
- # @return [Proc]
26
- def error_class_map(error_class)
27
- {
28
- OGRERR_NONE: ->(_msg) { true },
29
- OGRERR_NOT_ENOUGH_DATA: ->(msg) { raise_exception(OGR::NotEnoughData, msg) },
30
- OGRERR_NOT_ENOUGH_MEMORY: ->(msg) { raise_exception(::NoMemoryError, msg) },
31
- OGRERR_UNSUPPORTED_GEOMETRY_TYPE: ->(msg) { raise_exception(OGR::UnsupportedGeometryType, msg) },
32
- OGRERR_UNSUPPORTED_OPERATION: ->(msg) { raise_exception(OGR::UnsupportedOperation, msg) },
33
- OGRERR_CORRUPT_DATA: ->(msg) { raise_exception(OGR::CorruptData, msg) },
34
- OGRERR_FAILURE: ->(msg) { raise_exception(OGR::Failure, msg) },
35
- OGRERR_UNSUPPORTED_SRS: ->(msg) { raise_exception(OGR::UnsupportedSRS, msg) },
36
- OGRERR_INVALID_HANDLE: ->(msg) { raise_exception(OGR::InvalidHandle, msg) }
37
- }.fetch(error_class) { raise "Unknown OGRERR type: #{self}" }
35
+ raise_exception(klass, msg) if klass
38
36
  end
39
37
 
40
38
  # Exists solely to strip off the top 4 lines of the backtrace so it doesn't
41
39
  # look like the problem is coming from here.
42
- def raise_exception(exception, message)
40
+ def self.raise_exception(exception, message)
43
41
  e = exception.new(message)
44
- e.set_backtrace(caller(4))
42
+ e.set_backtrace(caller(2))
45
43
  raise(e)
46
44
  end
47
45
  end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ Dir[File.join(__dir__, '**/extensions/**/*.rb')].sort.each { |f| require f }
@@ -27,3 +27,5 @@ module OGR
27
27
  end
28
28
  end
29
29
  end
30
+
31
+ OGR::DataSource.include(OGR::DataSourceMixins::CapabilityMethods)
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ogr/data_source'
4
+
5
+ module OGR
6
+ class DataSource
7
+ module Extensions
8
+ # @return [Array<OGR::Layer>]
9
+ def layers
10
+ @layers = Array.new(layer_count) { |i| layer(i) }
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ OGR::DataSource.include(OGR::DataSource::Extensions)
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'ogr/driver'
4
+
3
5
  module OGR
4
6
  module DriverMixins
5
7
  # Helper methods for testing capabilities of the current driver.
@@ -11,8 +13,10 @@ module OGR
11
13
 
12
14
  # @return [Boolean] +true+ if this driver supports deleting data sources.
13
15
  def can_delete_data_source?
14
- test_capability('DataDataSource')
16
+ test_capability('DeleteDataSource')
15
17
  end
16
18
  end
17
19
  end
18
20
  end
21
+
22
+ OGR::Driver.include(OGR::DriverMixins::CapabilityMethods)
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ogr/envelope'
4
+
5
+ module OGR
6
+ class Envelope
7
+ module Extensions
8
+ # @return [Float] x_max - x_min
9
+ def x_size
10
+ x_max - x_min
11
+ end
12
+
13
+ # @return [Float] y_max - y_min
14
+ def y_size
15
+ y_max - y_min
16
+ end
17
+
18
+ # @return [Float] z_max - z_min
19
+ def z_size
20
+ return unless z_max && z_min
21
+
22
+ z_max - z_min
23
+ end
24
+
25
+ # Adapted from "Advanced Geospatial Python Modeling". Calculates the
26
+ # pixel locations of these geospatial coordinates according to the given
27
+ # GeoTransform.
28
+ #
29
+ # @param geo_transform [GDAL::GeoTransform]
30
+ # @return [Hash{x_min => Integer, y_min => Integer, x_max => Integer, y_max => Integer}]
31
+ def world_to_pixels(geo_transform)
32
+ min_values = geo_transform.world_to_pixel(x_min, y_max)
33
+ max_values = geo_transform.world_to_pixel(x_max, y_min)
34
+
35
+ {
36
+ x_min: min_values[:pixel].round.to_i,
37
+ y_min: min_values[:line].round.to_i,
38
+ x_max: max_values[:pixel].round.to_i,
39
+ y_max: max_values[:line].round.to_i
40
+ }
41
+ end
42
+
43
+ # Compares min/max X and min/max Y to the other envelope. The envelopes are
44
+ # considered equal if those values are the same.
45
+ #
46
+ # @param other [OGR::Envelope]
47
+ # @return [Boolean]
48
+ def ==(other)
49
+ x_min == other.x_min && y_min == other.y_min &&
50
+ x_max == other.x_max && y_max == other.y_max
51
+ end
52
+
53
+ # Stolen from http://www.gdal.org/ogr__core_8h_source.html.
54
+ #
55
+ # @param other_envelope [OGR::Envelope] The Envelope to merge self with.
56
+ # @return [OGR::Envelope]
57
+ def merge(other_envelope)
58
+ new_envelope = OGR::Envelope.new
59
+ new_envelope.x_min = [x_min, other_envelope.x_min].min
60
+ new_envelope.x_max = [x_max, other_envelope.x_max].max
61
+ new_envelope.y_min = [y_min, other_envelope.y_min].min
62
+ new_envelope.y_max = [y_max, other_envelope.y_max].max
63
+
64
+ new_envelope
65
+ end
66
+
67
+ # Stolen from http://www.gdal.org/ogr__core_8h_source.html.
68
+ #
69
+ # @param other_envelope [OGR::Envelope] The Envelope to check intersection
70
+ # with.
71
+ # @return [Boolean]
72
+ def intersects?(other_envelope)
73
+ x_min <= other_envelope.x_max &&
74
+ x_max >= other_envelope.x_min &&
75
+ y_min <= other_envelope.y_max &&
76
+ y_max >= other_envelope.y_min
77
+ end
78
+
79
+ # Stolen from http://www.gdal.org/ogr__core_8h_source.html.
80
+ #
81
+ # @param other_envelope [OGR::Envelope] The Envelope to check containment
82
+ # with.
83
+ # @return [Boolean]
84
+ def contains?(other_envelope)
85
+ x_min <= other_envelope.x_min &&
86
+ y_min <= other_envelope.y_min &&
87
+ x_max >= other_envelope.x_max &&
88
+ y_max >= other_envelope.y_max
89
+ end
90
+
91
+ # @return [OGR::Polygon]
92
+ def to_polygon
93
+ ring = OGR::LinearRing.new
94
+ ring.point_count = 5
95
+ ring.set_point(0, x_min, y_max)
96
+ ring.set_point(1, x_max, y_max)
97
+ ring.set_point(2, x_max, y_min)
98
+ ring.set_point(3, x_min, y_min)
99
+ ring.set_point(4, x_min, y_max)
100
+
101
+ polygon = OGR::Polygon.new
102
+ polygon.add_geometry(ring)
103
+
104
+ polygon
105
+ end
106
+
107
+ def to_a
108
+ [x_min, y_min, x_max, y_max]
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ OGR::Envelope.include(OGR::Envelope::Extensions)
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ogr/feature'
4
+
5
+ module OGR
6
+ class Feature
7
+ module Extensions
8
+ # Retrieves the value for each field and yields it.
9
+ #
10
+ # @return [Enumerator]
11
+ # @yieldparam [Number, String, Array]
12
+ def each_field
13
+ return enum_for(:each_field) unless block_given?
14
+
15
+ field_count.times do |i|
16
+ yield field(i)
17
+ end
18
+ end
19
+
20
+ # @return [Array] Uses each FieldDefinition to determine the field type at
21
+ # each index and returns maps the field as that value type.
22
+ def fields
23
+ each_field.to_a
24
+ end
25
+
26
+ # Retrieves a field using +index+, but uses its type from the associated
27
+ # {OGR::FieldDefinition} to determine it's core type to return as. This
28
+ # saves from having to find out the type then call the associated
29
+ # +field_as_[type]+ method if you just want the data in it's originally
30
+ # intended form.
31
+ #
32
+ # @param index [Integer] Index of the field to retrieve the data for.
33
+ # @return [Number, String, Array]
34
+ # @raise [OGR::UnsupportedFieldType] if the associated FieldDefinition's
35
+ # type has not yet been mapped here (to know how to return the value).
36
+ def field(index)
37
+ field_type = field_definition(index).type
38
+
39
+ case field_type
40
+ when :OFTInteger, :OFTInteger64 then field_as_integer(index)
41
+ when :OFTIntegerList, :OFTInteger64List then field_as_integer_list(index)
42
+ when :OFTReal then field_as_double(index)
43
+ when :OFTRealList then field_as_double_list(index)
44
+ when :OFTString, :OFTWideString then field_as_string(index)
45
+ when :OFTStringList, :OFTWideStringList then field_as_string_list(index)
46
+ when :OFTBinary then field_as_binary(index)
47
+ when :OFTDate, :OFTTime, :OFTDateTime, :OFTMaxType then field_as_date_time(index)
48
+ else
49
+ raise OGR::UnsupportedFieldType,
50
+ "Don't know how to fetch field for field type: #{field_type}"
51
+ end
52
+ end
53
+
54
+ # @return [Enumerator]
55
+ # @yieldparam [OGR::GeometryFieldDefinition]
56
+ def each_geometry_field_definition
57
+ return enum_for(:each_geometry_field_definition) unless block_given?
58
+
59
+ geometry_field_count.times do |i|
60
+ yield geometry_field_definition(i)
61
+ end
62
+ end
63
+
64
+ # @return [Array<OGR::GeometryFieldDefinition>]
65
+ def geometry_field_definitions
66
+ each_geometry_field_definition.to_a
67
+ end
68
+
69
+ # @return [Enumerator]
70
+ # @yieldparam [OGR::Geometry]
71
+ def each_geometry_field
72
+ return enum_for(:each_geometry_field) unless block_given?
73
+
74
+ geometry_field_count.times do |i|
75
+ yield geometry_field(i)
76
+ end
77
+ end
78
+
79
+ # @return [Array<OGR::Geometry>]
80
+ def geometry_fields
81
+ each_geometry_field.to_a
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ OGR::Feature.include(OGR::Feature::Extensions)
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ogr/feature_definition'
4
+
5
+ module OGR
6
+ class FeatureDefinition
7
+ module Extensions
8
+ # @return [Array<OGR::FieldDefinition>]
9
+ def field_definitions
10
+ return [] if field_count.zero?
11
+
12
+ Array.new(field_count) { |i| field_definition(i) }
13
+ end
14
+
15
+ # @return [Array<OGR::GeometryFieldDefinition>]
16
+ def geometry_field_definitions
17
+ return [] if geometry_field_count.zero?
18
+
19
+ Array.new(geometry_field_count) { |i| geometry_field_definition(i) }
20
+ end
21
+
22
+ # @param name [String]
23
+ # @return [OGR::FieldDefinition]
24
+ def field_definition_by_name(name)
25
+ i = field_index(name)
26
+ return unless i
27
+
28
+ field_definition(i)
29
+ end
30
+
31
+ # @param name [String]
32
+ # @return [OGR::GeometryFieldDefinition]
33
+ def geometry_field_definition_by_name(name)
34
+ g = geometry_field_index(name)
35
+ return unless g
36
+
37
+ geometry_field_definition(g)
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ OGR::FeatureDefinition.include(OGR::FeatureDefinition::Extensions)
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ogr/geometry'
4
+
5
+ module OGR
6
+ class Point
7
+ module Extensions
8
+ # Wrapper around {#point_value} to provide API parity with other geometries
9
+ # that can have multiple points.
10
+ #
11
+ # @return [Array<Array<Float, Float>>]
12
+ def point_values
13
+ [point]
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ OGR::Point.include(OGR::Point::Extensions)
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ogr/geometries/geometry_collection'
4
+ require 'ogr/geometries/geometry_collection_25d'
5
+ require 'ogr/geometries/multi_line_string'
6
+ require 'ogr/geometries/multi_line_string_25d'
7
+ require 'ogr/geometries/multi_point'
8
+ require 'ogr/geometries/multi_point_25d'
9
+ require 'ogr/geometries/multi_polygon'
10
+ require 'ogr/geometries/multi_polygon_25d'
11
+ require 'ogr/geometries/polygon'
12
+ require 'ogr/geometries/polygon_25d'
13
+
14
+ module OGR
15
+ module GeometryMixins
16
+ module ContainerMixins
17
+ include Enumerable
18
+
19
+ def collection?
20
+ true
21
+ end
22
+
23
+ # Iterates over each geometry in the container geometry. Per `OGR` docs, the
24
+ # yielded geometry should not be modified; if you need to do something to
25
+ # that geometry, you should {{#clone}} it. Additionally, the yielded
26
+ # geometry is only valid until the container changes.
27
+ #
28
+ # @yieldparam [OGR::Geometry]
29
+ # @return [Enumerator]
30
+ # @see http://gdal.org/1.11/ogr/ogr__api_8h.html#a6bac93150529a5c98811db29e289dd66
31
+ def each
32
+ return enum_for(:each) unless block_given?
33
+
34
+ geometry_count.times do |i|
35
+ yield geometry_at(i)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ # Using prepend here to override the `#collection?` method that's already defined on Geometry.
43
+ OGR::GeometryCollection.prepend(OGR::GeometryMixins::ContainerMixins)
44
+ OGR::GeometryCollection25D.prepend(OGR::GeometryMixins::ContainerMixins)
45
+
46
+ OGR::MultiPolygon.prepend(OGR::GeometryMixins::ContainerMixins)
47
+ OGR::MultiPolygon25D.prepend(OGR::GeometryMixins::ContainerMixins)
48
+
49
+ OGR::MultiLineString.prepend(OGR::GeometryMixins::ContainerMixins)
50
+ OGR::MultiLineString25D.prepend(OGR::GeometryMixins::ContainerMixins)
51
+
52
+ OGR::MultiPoint.prepend(OGR::GeometryMixins::ContainerMixins)
53
+ OGR::MultiPoint25D.prepend(OGR::GeometryMixins::ContainerMixins)
54
+
55
+ OGR::Polygon.prepend(OGR::GeometryMixins::ContainerMixins)
56
+ OGR::Polygon25D.prepend(OGR::GeometryMixins::ContainerMixins)
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ogr/spatial_reference'
4
+ require_relative 'ewkb_record'
5
+ require_relative 'wkb_record'
6
+
7
+ module OGR
8
+ module Geometry
9
+ # Extends OGR::Geometry with methods that allow creating a Geometry from
10
+ # EKWB or outputting a Geometry as EWKB (EWKB is the WKB format that PostGIS
11
+ # uses).
12
+ module EWKBIOExtensions
13
+ # Methods to extend OGR::Geometry with.
14
+ module ClassMethods
15
+ # @param ewkb_data [String] Binary EWKB string.
16
+ # @return [OGR::Geometry]
17
+ def create_from_ewkb(ewkb_data)
18
+ e = EWKBRecord.read(ewkb_data)
19
+
20
+ if e.srid?
21
+ spatial_ref = OGR::SpatialReference.new.import_from_epsg(e.srid)
22
+ create_from_wkb(e.to_wkb, spatial_ref)
23
+ else
24
+ create_from_wkb(e.to_wkb)
25
+ end
26
+ end
27
+ end
28
+
29
+ def self.included(base)
30
+ base.extend(ClassMethods)
31
+ end
32
+
33
+ # @return [String] Binary string representative of EWKB.
34
+ def to_ewkb
35
+ wkb_record = WKBRecord.read(to_wkb)
36
+ srid = spatial_reference ? spatial_reference.authority_code.to_i : 0
37
+
38
+ EWKBRecord.from_wkb_record(wkb_record, srid).to_binary_s
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ OGR::Geometry.include OGR::Geometry::EWKBIOExtensions
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bindata'
4
+ require 'ffi-gdal'
5
+ require 'ogr'
6
+ require_relative 'wkb_record'
7
+
8
+ # rubocop:disable Naming/PredicateName
9
+ module OGR
10
+ module Geometry
11
+ # Parses raw EWKB and turns into a data structure. Only really exists for
12
+ # converting to and from EWKB.
13
+ #
14
+ # @see http://trac.osgeo.org/postgis/browser/trunk/doc/ZMSgeoms.txt
15
+ # @see OGR::Geometry::EWKBRecord
16
+ class EWKBRecord < BinData::Record
17
+ uint8 :endianness, assert: -> { [0, 1].include?(value) }
18
+
19
+ # Choose the type based on the endianness.
20
+ choice :wkb_type, selection: :endianness do
21
+ uint32be 0
22
+ uint32le 1
23
+ end
24
+
25
+ # Make sure the geometry_type is one OGR knows about.
26
+ virtual assert: -> { FFI::OGR::Core::WKBGeometryType.symbol_map.value?(geometry_type) }
27
+
28
+ # If the wkb_type has the SRID flag set, there's an SRID.
29
+ choice :srid, onlyif: :has_srid?, selection: :endianness do
30
+ uint32be 0
31
+ uint32le 1
32
+ end
33
+
34
+ # The #geometry attribute is just the rest of the data. We don't care what
35
+ # kind of geom it actually is; that doesn't matter for building EWKB.
36
+ rest :geometry
37
+
38
+ WKB_Z = 0x8000_0000
39
+ WKB_M = 0x4000_0000
40
+ WKB_SRID = 0x2000_0000
41
+
42
+ # @param wkb_record [OGR::Geometry::WKBRecord]
43
+ # @param srid [Fixnum]
44
+ # @return [OGR::Geometry::EWKBRecord]
45
+ def self.from_wkb_record(wkb_record, srid = 0)
46
+ ewkb_type_flag = if srid.zero?
47
+ wkb_record.wkb_type
48
+ else
49
+ (wkb_record.wkb_type | WKB_SRID)
50
+ end
51
+
52
+ ewkb_type_flag |= WKB_Z if wkb_record.has_z?
53
+
54
+ new(endianness: wkb_record.endianness,
55
+ wkb_type: ewkb_type_flag,
56
+ srid: srid,
57
+ geometry: wkb_record.geometry)
58
+ end
59
+
60
+ # @return [Boolean] Is the Z flag set?
61
+ def has_z?
62
+ wkb_type & WKB_Z != 0
63
+ end
64
+
65
+ # @return [Boolean] Is the M flag set?
66
+ def has_m?
67
+ wkb_type & WKB_M != 0
68
+ end
69
+
70
+ # @return [Boolean] Is the SRID flag set?
71
+ def has_srid?
72
+ wkb_type & WKB_SRID != 0
73
+ end
74
+
75
+ # @return [Fixnum] Enum number that matches the FFI::OGR::Core::WKBGeometryType.
76
+ def geometry_type
77
+ type = wkb_type & 0x0fff_ffff
78
+
79
+ has_z? ? (type | WKB_Z) : type
80
+ end
81
+
82
+ # @return [OGR::Geometry::WKBRecord]
83
+ def to_wkb_record
84
+ WKBRecord.from_ewkb_record(self)
85
+ end
86
+
87
+ # @return [String] WKB binary string.
88
+ def to_wkb
89
+ to_wkb_record.to_binary_s
90
+ end
91
+ end
92
+ end
93
+ end
94
+ # rubocop:enable Naming/PredicateName
@@ -1,22 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'json'
3
+ require 'ogr/geometry'
4
4
 
5
5
  module OGR
6
6
  module GeometryMixins
7
7
  module Extensions
8
- # @return [Fixnum] The number of the UTM zone this geometry belongs to.
8
+ # @return [Integer] The number of the UTM zone this geometry belongs to.
9
9
  def utm_zone
10
10
  return unless spatial_reference
11
11
 
12
- if spatial_reference.authority_code == '4326'
13
- self_as4326 = self
14
- else
15
- self_as4326 = dup
16
- self_as4326.transform_to!(OGR::SpatialReference.new_from_epsg(4326))
17
- end
12
+ self_as4326 =
13
+ if spatial_reference.authority_code == '4326'
14
+ self
15
+ else
16
+ # NOTE: #clone here has overriden Ruby's clone and calls OGR_G_Clone;
17
+ # it's important to do this and
18
+ as4326 = clone
19
+ return unless as4326.transform_to!(OGR::SpatialReference.new.import_from_epsg(4326))
18
20
 
19
- self_as4326 = self_as4326.buffer(0) unless self_as4326.valid?
21
+ as4326
22
+ end
23
+
24
+ self_as4326.self_as4326.buffer!(0) unless valid?
20
25
 
21
26
  return unless self_as4326.point_on_surface.x
22
27
 
@@ -80,3 +85,5 @@ module OGR
80
85
  end
81
86
  end
82
87
  end
88
+
89
+ OGR::Geometry.include(OGR::GeometryMixins::Extensions)
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ogr'
4
+ require 'ffi/extensions/rttopo'
5
+
6
+ module OGR
7
+ module Geometry
8
+ # Methods for {{OGR::Geometry}}s that use rttopo to operate on
9
+ # themselves.
10
+ #
11
+ # @see http://postgis.net/docs/doxygen/2.1/da/de7/librttopo_8h_af8d208cf4c0bb7c9f96c75bddc6c498a.html#af8d208cf4c0bb7c9f96c75bddc6c498a
12
+ module RttopoExtensions
13
+ # Uses rttopo's make_valid to make the current geometry valid.
14
+ #
15
+ # @return [OGR::Geometry] Returns a new geometry, based on the
16
+ # rttopo_make_valid call.
17
+ def make_valid
18
+ ctx = FFI::Rttopo.rtgeom_init FFI::MemoryPointer::NULL, FFI::MemoryPointer::NULL, FFI::MemoryPointer::NULL
19
+ geom = FFI::Rttopo.rtgeom_from_wkb(ctx, to_wkb, wkb_size, false)
20
+ valid_geom = FFI::Rttopo.rtgeom_make_valid(ctx, geom)
21
+ valid_wkb_size = FFI::MemoryPointer.new(:size_t)
22
+ valid_wkb_ptr = FFI::Rttopo.rtgeom_to_wkb(ctx, valid_geom, FFI::Rttopo::RTWKB_EXTENDED, valid_wkb_size)
23
+ valid_wkb = valid_wkb_ptr.read_bytes(valid_wkb_size.read_int)
24
+
25
+ FFI::Rttopo.rtfree ctx, geom
26
+ FFI::Rttopo.rtfree ctx, valid_geom
27
+ FFI::Rttopo.rtfree ctx, valid_wkb_ptr
28
+ FFI::Rttopo.rtgeom_finish ctx
29
+ OGR::Geometry.create_from_wkb(valid_wkb)
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ OGR::GeometryCollection25D.include(OGR::Geometry::RttopoExtensions)
36
+ OGR::LineString.include(OGR::Geometry::RttopoExtensions)
37
+ OGR::LineString25D.include(OGR::Geometry::RttopoExtensions)
38
+ OGR::LinearRing.include(OGR::Geometry::RttopoExtensions)
39
+ OGR::MultiLineString.include(OGR::Geometry::RttopoExtensions)
40
+ OGR::MultiLineString25D.include(OGR::Geometry::RttopoExtensions)
41
+ OGR::MultiPoint.include(OGR::Geometry::RttopoExtensions)
42
+ OGR::MultiPoint25D.include(OGR::Geometry::RttopoExtensions)
43
+ OGR::MultiPolygon.include(OGR::Geometry::RttopoExtensions)
44
+ OGR::MultiPolygon25D.include(OGR::Geometry::RttopoExtensions)
45
+ OGR::Point.include(OGR::Geometry::RttopoExtensions)
46
+ OGR::Point25D.include(OGR::Geometry::RttopoExtensions)
47
+ OGR::Polygon.include(OGR::Geometry::RttopoExtensions)
48
+ OGR::Polygon25D.include(OGR::Geometry::RttopoExtensions)