ffi-gdal 1.0.0.beta6 → 1.0.0.beta11

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 (303) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +54 -19
  3. data/.rubocop_todo.yml +65 -0
  4. data/.ruby-version +1 -1
  5. data/Gemfile +2 -0
  6. data/History.md +74 -0
  7. data/README.md +5 -0
  8. data/Rakefile +11 -1
  9. data/bitbucket-pipelines.yml +16 -0
  10. data/examples/extract_and_colorize.rb +7 -10
  11. data/examples/geometries.rb +68 -1
  12. data/examples/gridding.rb +2 -0
  13. data/examples/ogr_layer_to_layer.rb +2 -0
  14. data/examples/raster_erasing.rb +15 -8
  15. data/examples/remove_small_polygons.rb +2 -0
  16. data/examples/testing_gdal.rb +9 -2
  17. data/examples/warping.rb +23 -5
  18. data/ffi-gdal.gemspec +7 -4
  19. data/lib/ext/error_symbols.rb +2 -0
  20. data/lib/ext/ffi_library_function_checks.rb +2 -0
  21. data/lib/ext/float_ext.rb +2 -0
  22. data/lib/ext/narray_ext.rb +2 -0
  23. data/lib/ext/numeric_as_data_type.rb +2 -0
  24. data/lib/ext/to_bool.rb +5 -3
  25. data/lib/ffi-gdal.rb +2 -0
  26. data/lib/ffi/cpl.rb +2 -0
  27. data/lib/ffi/cpl/conv.rb +4 -2
  28. data/lib/ffi/cpl/error.rb +2 -0
  29. data/lib/ffi/cpl/hash_set.rb +2 -0
  30. data/lib/ffi/cpl/http.rb +2 -0
  31. data/lib/ffi/cpl/http_result.rb +2 -0
  32. data/lib/ffi/cpl/list.rb +2 -0
  33. data/lib/ffi/cpl/mime_part.rb +2 -0
  34. data/lib/ffi/cpl/minixml.rb +2 -0
  35. data/lib/ffi/cpl/port.rb +2 -0
  36. data/lib/ffi/cpl/progress.rb +2 -0
  37. data/lib/ffi/cpl/quad_tree.rb +2 -0
  38. data/lib/ffi/cpl/rect_obj.rb +2 -0
  39. data/lib/ffi/cpl/string.rb +2 -0
  40. data/lib/ffi/cpl/vsi.rb +2 -0
  41. data/lib/ffi/cpl/xml_node.rb +2 -0
  42. data/lib/ffi/gdal.rb +3 -3
  43. data/lib/ffi/gdal/alg.rb +2 -0
  44. data/lib/ffi/gdal/color_entry.rb +2 -0
  45. data/lib/ffi/gdal/exceptions.rb +2 -0
  46. data/lib/ffi/gdal/gcp.rb +2 -0
  47. data/lib/ffi/gdal/gdal.rb +2 -0
  48. data/lib/ffi/gdal/grid.rb +2 -0
  49. data/lib/ffi/gdal/grid_data_metrics_options.rb +2 -0
  50. data/lib/ffi/gdal/grid_inverse_distance_to_a_power_options.rb +2 -0
  51. data/lib/ffi/gdal/grid_moving_average_options.rb +2 -0
  52. data/lib/ffi/gdal/grid_nearest_neighbor_options.rb +2 -0
  53. data/lib/ffi/gdal/matching.rb +2 -0
  54. data/lib/ffi/gdal/rpc_info.rb +2 -0
  55. data/lib/ffi/gdal/transformer_info.rb +2 -0
  56. data/lib/ffi/gdal/version.rb +3 -1
  57. data/lib/ffi/gdal/vrt.rb +2 -0
  58. data/lib/ffi/gdal/warp_options.rb +9 -4
  59. data/lib/ffi/gdal/warper.rb +19 -1
  60. data/lib/ffi/ogr.rb +2 -0
  61. data/lib/ffi/ogr/api.rb +2 -0
  62. data/lib/ffi/ogr/contour_writer_info.rb +2 -0
  63. data/lib/ffi/ogr/core.rb +2 -0
  64. data/lib/ffi/ogr/envelope.rb +2 -0
  65. data/lib/ffi/ogr/envelope_3d.rb +2 -0
  66. data/lib/ffi/ogr/featurestyle.rb +2 -0
  67. data/lib/ffi/ogr/field.rb +2 -0
  68. data/lib/ffi/ogr/geocoding.rb +2 -0
  69. data/lib/ffi/ogr/srs_api.rb +3 -0
  70. data/lib/ffi/ogr/style_param.rb +2 -0
  71. data/lib/ffi/ogr/style_value.rb +2 -0
  72. data/lib/gdal.rb +3 -0
  73. data/lib/gdal/color_entry.rb +2 -0
  74. data/lib/gdal/color_entry_mixins/extensions.rb +2 -14
  75. data/lib/gdal/color_interpretation.rb +2 -0
  76. data/lib/gdal/color_table.rb +2 -0
  77. data/lib/gdal/color_table_mixins/extensions.rb +3 -17
  78. data/lib/gdal/color_table_types/cmyk.rb +2 -0
  79. data/lib/gdal/color_table_types/gray.rb +2 -0
  80. data/lib/gdal/color_table_types/hls.rb +2 -0
  81. data/lib/gdal/color_table_types/rgb.rb +2 -0
  82. data/lib/gdal/cpl_error_handler.rb +2 -0
  83. data/lib/gdal/data_type.rb +2 -0
  84. data/lib/gdal/dataset.rb +11 -7
  85. data/lib/gdal/dataset_mixins/algorithm_methods.rb +7 -4
  86. data/lib/gdal/dataset_mixins/extensions.rb +7 -47
  87. data/lib/gdal/dataset_mixins/matching.rb +4 -1
  88. data/lib/gdal/dataset_mixins/warp_methods.rb +52 -11
  89. data/lib/gdal/driver.rb +6 -8
  90. data/lib/gdal/driver_mixins/extensions.rb +2 -0
  91. data/lib/gdal/environment_methods.rb +2 -0
  92. data/lib/gdal/exceptions.rb +2 -0
  93. data/lib/gdal/geo_transform.rb +3 -3
  94. data/lib/gdal/geo_transform_mixins/extensions.rb +2 -17
  95. data/lib/gdal/grid.rb +4 -1
  96. data/lib/gdal/grid_algorithms.rb +2 -0
  97. data/lib/gdal/grid_algorithms/data_metrics_base.rb +2 -0
  98. data/lib/gdal/grid_algorithms/inverse_distance_to_a_power.rb +2 -0
  99. data/lib/gdal/grid_algorithms/metric_average_distance.rb +2 -0
  100. data/lib/gdal/grid_algorithms/metric_average_distance_pts.rb +2 -0
  101. data/lib/gdal/grid_algorithms/metric_count.rb +2 -0
  102. data/lib/gdal/grid_algorithms/metric_maximum.rb +2 -0
  103. data/lib/gdal/grid_algorithms/metric_minimum.rb +2 -0
  104. data/lib/gdal/grid_algorithms/metric_range.rb +2 -0
  105. data/lib/gdal/grid_algorithms/moving_average.rb +2 -0
  106. data/lib/gdal/grid_algorithms/nearest_neighbor.rb +2 -0
  107. data/lib/gdal/gridder.rb +11 -3
  108. data/lib/gdal/gridder/point_extracting.rb +3 -2
  109. data/lib/gdal/gridder_options.rb +2 -0
  110. data/lib/gdal/internal_helpers.rb +3 -4
  111. data/lib/gdal/logger.rb +2 -0
  112. data/lib/gdal/major_object.rb +2 -0
  113. data/lib/gdal/merger.rb +2 -0
  114. data/lib/gdal/options.rb +16 -13
  115. data/lib/gdal/raster_attribute_table.rb +2 -0
  116. data/lib/gdal/raster_attribute_table_mixins/extensions.rb +3 -16
  117. data/lib/gdal/raster_band.rb +11 -6
  118. data/lib/gdal/raster_band_classifier.rb +52 -19
  119. data/lib/gdal/raster_band_mixins/algorithm_extensions.rb +2 -0
  120. data/lib/gdal/raster_band_mixins/algorithm_methods.rb +12 -5
  121. data/lib/gdal/raster_band_mixins/coloring_extensions.rb +3 -1
  122. data/lib/gdal/raster_band_mixins/extensions.rb +6 -35
  123. data/lib/gdal/raster_band_mixins/io_extensions.rb +7 -4
  124. data/lib/gdal/rpc_info.rb +2 -0
  125. data/lib/gdal/transformer.rb +2 -0
  126. data/lib/gdal/transformers/approximate_transformer.rb +4 -1
  127. data/lib/gdal/transformers/base_general_image_projection_transformer.rb +4 -1
  128. data/lib/gdal/transformers/gcp_transformer.rb +6 -2
  129. data/lib/gdal/transformers/general_image_projection_transformer.rb +2 -0
  130. data/lib/gdal/transformers/general_image_projection_transformer2.rb +4 -1
  131. data/lib/gdal/transformers/general_image_projection_transformer3.rb +4 -1
  132. data/lib/gdal/transformers/geolocation_transformer.rb +4 -1
  133. data/lib/gdal/transformers/reprojection_transformer.rb +2 -0
  134. data/lib/gdal/transformers/rpc_transformer.rb +4 -1
  135. data/lib/gdal/transformers/tps_transformer.rb +2 -0
  136. data/lib/gdal/version_info.rb +9 -7
  137. data/lib/gdal/virtual_dataset.rb +2 -0
  138. data/lib/gdal/warp_operation.rb +2 -0
  139. data/lib/gdal/warp_options.rb +105 -35
  140. data/lib/ogr.rb +2 -0
  141. data/lib/ogr/coordinate_transformation.rb +2 -0
  142. data/lib/ogr/data_source.rb +5 -9
  143. data/lib/ogr/data_source_extensions.rb +2 -19
  144. data/lib/ogr/data_source_mixins/capability_methods.rb +2 -0
  145. data/lib/ogr/driver.rb +4 -6
  146. data/lib/ogr/driver_mixins/capability_methods.rb +2 -0
  147. data/lib/ogr/envelope.rb +4 -2
  148. data/lib/ogr/envelope_extensions.rb +2 -22
  149. data/lib/ogr/error_handling.rb +3 -1
  150. data/lib/ogr/exceptions.rb +3 -1
  151. data/lib/ogr/feature.rb +17 -9
  152. data/lib/ogr/feature_definition.rb +7 -4
  153. data/lib/ogr/feature_definition_extensions.rb +2 -18
  154. data/lib/ogr/feature_extensions.rb +2 -27
  155. data/lib/ogr/field.rb +5 -1
  156. data/lib/ogr/field_definition.rb +5 -6
  157. data/lib/ogr/geocoder.rb +2 -0
  158. data/lib/ogr/geometries/geometry_collection.rb +2 -0
  159. data/lib/ogr/geometries/geometry_collection_25d.rb +2 -0
  160. data/lib/ogr/geometries/line_string.rb +2 -1
  161. data/lib/ogr/geometries/line_string_25d.rb +2 -0
  162. data/lib/ogr/geometries/linear_ring.rb +2 -0
  163. data/lib/ogr/geometries/multi_line_string.rb +2 -0
  164. data/lib/ogr/geometries/multi_line_string_25d.rb +2 -0
  165. data/lib/ogr/geometries/multi_point.rb +2 -0
  166. data/lib/ogr/geometries/multi_point_25d.rb +2 -0
  167. data/lib/ogr/geometries/multi_polygon.rb +2 -0
  168. data/lib/ogr/geometries/multi_polygon_25d.rb +2 -0
  169. data/lib/ogr/geometries/none_geometry.rb +2 -0
  170. data/lib/ogr/geometries/point.rb +2 -0
  171. data/lib/ogr/geometries/point_25d.rb +2 -0
  172. data/lib/ogr/geometries/polygon.rb +2 -0
  173. data/lib/ogr/geometries/polygon_25d.rb +2 -0
  174. data/lib/ogr/geometries/unknown_geometry.rb +2 -0
  175. data/lib/ogr/geometry.rb +3 -4
  176. data/lib/ogr/geometry_field_definition.rb +3 -4
  177. data/lib/ogr/geometry_mixins/container_mixins.rb +2 -0
  178. data/lib/ogr/geometry_mixins/extensions.rb +10 -39
  179. data/lib/ogr/geometry_types/container.rb +2 -0
  180. data/lib/ogr/geometry_types/curve.rb +3 -1
  181. data/lib/ogr/geometry_types/surface.rb +2 -0
  182. data/lib/ogr/internal_helpers.rb +2 -0
  183. data/lib/ogr/layer.rb +5 -1
  184. data/lib/ogr/layer_mixins/capability_methods.rb +2 -0
  185. data/lib/ogr/layer_mixins/extensions.rb +9 -27
  186. data/lib/ogr/layer_mixins/ogr_feature_methods.rb +6 -12
  187. data/lib/ogr/layer_mixins/ogr_field_methods.rb +10 -14
  188. data/lib/ogr/layer_mixins/ogr_layer_method_methods.rb +2 -0
  189. data/lib/ogr/layer_mixins/ogr_query_filter_methods.rb +8 -3
  190. data/lib/ogr/layer_mixins/ogr_sql_methods.rb +3 -3
  191. data/lib/ogr/spatial_reference.rb +12 -2
  192. data/lib/ogr/spatial_reference_extensions.rb +2 -26
  193. data/lib/ogr/spatial_reference_mixins/coordinate_system_getter_setters.rb +12 -5
  194. data/lib/ogr/spatial_reference_mixins/exporters.rb +2 -0
  195. data/lib/ogr/spatial_reference_mixins/importers.rb +6 -2
  196. data/lib/ogr/spatial_reference_mixins/morphers.rb +2 -0
  197. data/lib/ogr/spatial_reference_mixins/parameter_getter_setters.rb +2 -0
  198. data/lib/ogr/spatial_reference_mixins/type_checks.rb +2 -0
  199. data/lib/ogr/style_table.rb +2 -0
  200. data/lib/ogr/style_table_extensions.rb +2 -10
  201. data/lib/ogr/style_tool.rb +2 -0
  202. data/spec/ffi-gdal_spec.rb +2 -0
  203. data/spec/integration/gdal/color_table_info_spec.rb +2 -0
  204. data/spec/integration/gdal/dataset_info_spec.rb +15 -13
  205. data/spec/integration/gdal/driver_info_spec.rb +3 -1
  206. data/spec/integration/gdal/geo_transform_info_spec.rb +2 -0
  207. data/spec/integration/gdal/gridder_spec.rb +2 -0
  208. data/spec/integration/gdal/raster_attribute_table_info_spec.rb +2 -0
  209. data/spec/integration/gdal/raster_band_algorithms_spec.rb +2 -0
  210. data/spec/integration/gdal/raster_band_info_spec.rb +37 -15
  211. data/spec/integration/ogr/layer_spec.rb +2 -6
  212. data/spec/spec_helper.rb +3 -1
  213. data/spec/support/images/123.tiff +0 -0
  214. data/spec/support/integration_help.rb +2 -0
  215. data/spec/support/shared_contexts.rb +2 -0
  216. data/spec/support/shared_examples/gdal/major_object_examples.rb +2 -0
  217. data/spec/support/shared_examples/ogr/{a_25D_geometry.rb → a_25d_geometry.rb} +2 -0
  218. data/spec/support/shared_examples/ogr/a_container_geometry.rb +2 -0
  219. data/spec/support/shared_examples/ogr/a_geometry.rb +3 -1
  220. data/spec/support/shared_examples/ogr/a_line_string.rb +2 -0
  221. data/spec/unit/ext/error_symbols_spec.rb +2 -0
  222. data/spec/unit/ext/numeric_as_data_type_spec.rb +2 -0
  223. data/spec/unit/ffi/gdal_spec.rb +3 -0
  224. data/spec/unit/gdal/color_entry_spec.rb +2 -0
  225. data/spec/unit/gdal/color_interpretation_spec.rb +2 -0
  226. data/spec/unit/gdal/color_table_mixins/extensions_spec.rb +2 -0
  227. data/spec/unit/gdal/color_table_spec.rb +2 -0
  228. data/spec/unit/gdal/data_type_spec.rb +2 -0
  229. data/spec/unit/gdal/dataset_mixins/warp_methods_spec.rb +55 -0
  230. data/spec/unit/gdal/dataset_spec.rb +2 -0
  231. data/spec/unit/gdal/driver_mixins/extensions_spec.rb +2 -0
  232. data/spec/unit/gdal/driver_spec.rb +2 -0
  233. data/spec/unit/gdal/environment_methods_spec.rb +2 -0
  234. data/spec/unit/gdal/geo_transform_mixins/extensions_spec.rb +2 -0
  235. data/spec/unit/gdal/geo_transform_spec.rb +2 -13
  236. data/spec/unit/gdal/grid_spec.rb +10 -0
  237. data/spec/unit/gdal/gridder/point_extracting_spec.rb +2 -0
  238. data/spec/unit/gdal/gridder_options_spec.rb +2 -0
  239. data/spec/unit/gdal/gridder_spec.rb +42 -0
  240. data/spec/unit/gdal/internal_helpers_spec.rb +2 -0
  241. data/spec/unit/gdal/major_object_spec.rb +2 -0
  242. data/spec/unit/gdal/options_spec.rb +28 -1
  243. data/spec/unit/gdal/raster_attribute_table_spec.rb +2 -0
  244. data/spec/unit/gdal/raster_band_classifier_spec.rb +43 -5
  245. data/spec/unit/gdal/raster_band_mixins/extensions_spec.rb +2 -0
  246. data/spec/unit/gdal/raster_band_mixins/io_extensions_spec.rb +2 -0
  247. data/spec/unit/gdal/raster_band_spec.rb +2 -0
  248. data/spec/unit/gdal/rpc_info_spec.rb +2 -0
  249. data/spec/unit/gdal/version_info_spec.rb +2 -0
  250. data/spec/unit/gdal/virtual_dataset_spec.rb +2 -0
  251. data/spec/unit/gdal/warp_operation_spec.rb +2 -0
  252. data/spec/unit/gdal/warp_options_spec.rb +338 -0
  253. data/spec/unit/ogr/coordinate_transformation_spec.rb +2 -0
  254. data/spec/unit/ogr/data_source_mixins/capability_methods_spec.rb +2 -0
  255. data/spec/unit/ogr/data_source_spec.rb +2 -0
  256. data/spec/unit/ogr/driver_mixins/capability_methods_spec.rb +2 -0
  257. data/spec/unit/ogr/driver_spec.rb +3 -1
  258. data/spec/unit/ogr/envelope_spec.rb +2 -0
  259. data/spec/unit/ogr/feature_definition_spec.rb +2 -19
  260. data/spec/unit/ogr/feature_extensions_spec.rb +3 -1
  261. data/spec/unit/ogr/feature_spec.rb +3 -3
  262. data/spec/unit/ogr/field_definition_spec.rb +2 -19
  263. data/spec/unit/ogr/field_spec.rb +3 -1
  264. data/spec/unit/ogr/geometries/geometry_collection_25d_spec.rb +2 -0
  265. data/spec/unit/ogr/geometries/geometry_collection_spec.rb +2 -0
  266. data/spec/unit/ogr/geometries/line_string_25d_spec.rb +2 -0
  267. data/spec/unit/ogr/geometries/line_string_spec.rb +2 -0
  268. data/spec/unit/ogr/geometries/linear_ring_spec.rb +2 -0
  269. data/spec/unit/ogr/geometries/multi_line_string_25d_spec.rb +2 -0
  270. data/spec/unit/ogr/geometries/multi_line_string_spec.rb +2 -0
  271. data/spec/unit/ogr/geometries/multi_point_25d_spec.rb +2 -0
  272. data/spec/unit/ogr/geometries/multi_point_spec.rb +2 -0
  273. data/spec/unit/ogr/geometries/multi_polygon_25d_spec.rb +2 -0
  274. data/spec/unit/ogr/geometries/multi_polygon_spec.rb +2 -0
  275. data/spec/unit/ogr/geometries/none_geometry_spec.rb +2 -0
  276. data/spec/unit/ogr/geometries/point_25d_spec.rb +2 -0
  277. data/spec/unit/ogr/geometries/point_spec.rb +2 -0
  278. data/spec/unit/ogr/geometries/polygon_25d_spec.rb +2 -0
  279. data/spec/unit/ogr/geometries/polygon_spec.rb +2 -0
  280. data/spec/unit/ogr/geometries/unknown_geometry_spec.rb +2 -0
  281. data/spec/unit/ogr/geometry_field_definition_spec.rb +2 -16
  282. data/spec/unit/ogr/geometry_spec.rb +2 -0
  283. data/spec/unit/ogr/internal_helpers_spec.rb +2 -0
  284. data/spec/unit/ogr/layer_mixins/capability_methods_spec.rb +2 -0
  285. data/spec/unit/ogr/layer_mixins/ogr_feature_methods_spec.rb +2 -0
  286. data/spec/unit/ogr/layer_mixins/ogr_field_methods_spec.rb +2 -0
  287. data/spec/unit/ogr/layer_mixins/ogr_layer_method_methods_spec.rb +2 -0
  288. data/spec/unit/ogr/layer_mixins/ogr_query_filter_methods_spec.rb +2 -0
  289. data/spec/unit/ogr/layer_mixins/ogr_sql_methods_spec.rb +2 -0
  290. data/spec/unit/ogr/layer_spec.rb +2 -0
  291. data/spec/unit/ogr/spatial_reference_mixins/coordinate_system_getter_setters_spec.rb +2 -0
  292. data/spec/unit/ogr/spatial_reference_mixins/exporters_spec.rb +19 -15
  293. data/spec/unit/ogr/spatial_reference_mixins/importers_spec.rb +2 -0
  294. data/spec/unit/ogr/spatial_reference_mixins/morphers_spec.rb +9 -7
  295. data/spec/unit/ogr/spatial_reference_mixins/parameter_getter_setters_spec.rb +2 -0
  296. data/spec/unit/ogr/spatial_reference_mixins/type_checks_spec.rb +2 -0
  297. data/spec/unit/ogr/spatial_reference_spec.rb +4 -2
  298. data/spec/unit/ogr/style_table_spec.rb +2 -26
  299. data/spec/unit/ogr/style_tool_spec.rb +2 -0
  300. data/spec/unit/version_info_spec.rb +2 -0
  301. metadata +47 -15
  302. data/lib/ogr/field_definition_extensions.rb +0 -22
  303. data/lib/ogr/geometry_field_definition_extensions.rb +0 -19
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../gdal'
2
4
  require_relative 'raster_attribute_table_mixins/extensions'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
 
3
5
  module GDAL
@@ -10,7 +12,7 @@ module GDAL
10
12
  case value.class
11
13
  when String then set_value_as_string(row, field, value)
12
14
  when Float then set_value_as_double(row, field, value)
13
- when Fixnum then set_value_as_integer(row, field, value)
15
+ when Integer then set_value_as_integer(row, field, value)
14
16
  else raise GDAL::UnknownRasterAttributeTableType, "Unknown value type for value '#{value}'"
15
17
  end
16
18
  end
@@ -39,21 +41,6 @@ module GDAL
39
41
 
40
42
  column_count.times { |i| yield column(i) }
41
43
  end
42
-
43
- # @return [Hash]
44
- def as_json(_options = nil)
45
- {
46
- column_count: column_count,
47
- columns: columns,
48
- linear_binning: linear_binning,
49
- row_count: row_count
50
- }
51
- end
52
-
53
- # @return [String]
54
- def to_json(options = nil)
55
- as_json(options).to_json
56
- end
57
44
  end
58
45
  end
59
46
  end
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'narray'
4
+ require 'numo/narray'
2
5
  require_relative '../gdal'
3
6
  require_relative 'raster_band_mixins/algorithm_extensions'
4
7
  require_relative 'raster_band_mixins/algorithm_methods'
@@ -138,7 +141,7 @@ module GDAL
138
141
  def category_names=(names)
139
142
  names_pointer = GDAL._string_array_to_pointer(names)
140
143
 
141
- !!FFI::GDAL::GDAL.GDALSetRasterCategoryNames(@c_pointer, names_pointer)
144
+ FFI::GDAL::GDAL.GDALSetRasterCategoryNames(@c_pointer, names_pointer)
142
145
  end
143
146
 
144
147
  # The no data value for a band is generally a special marker value used to
@@ -149,16 +152,18 @@ module GDAL
149
152
  def no_data_value
150
153
  associated = FFI::MemoryPointer.new(:bool)
151
154
  value = FFI::GDAL::GDAL.GDALGetRasterNoDataValue(@c_pointer, associated)
155
+ value = nil if value == -10_000_000_000.0
152
156
 
153
157
  { value: value, is_associated: associated.read_bytes(1).to_bool }
154
158
  end
155
159
 
156
- # Sets the no data value for this band.
160
+ # Sets the no data value for this band. Do nothing if attempting to set to nil, because removing a no data value
161
+ # is impossible until GDAL 2.1.
157
162
  #
158
- # @param value [Float]
163
+ # @param value [Float, nil]
159
164
  # @return [Boolean]
160
165
  def no_data_value=(value)
161
- !!FFI::GDAL::GDAL.GDALSetRasterNoDataValue(@c_pointer, value)
166
+ !!FFI::GDAL::GDAL.GDALSetRasterNoDataValue(@c_pointer, value) if value
162
167
  end
163
168
 
164
169
  # @return [Fixnum]
@@ -214,7 +219,7 @@ module GDAL
214
219
  flag_list.reverse_each.with_index do |flag, i|
215
220
  flag = flag.to_i
216
221
 
217
- if i == 0 && flag == 1
222
+ if i.zero? && flag == 1
218
223
  flags << :GMF_ALL_VALID
219
224
  elsif i == 1 && flag == 1
220
225
  flags << :GMF_PER_DATASET
@@ -271,7 +276,7 @@ module GDAL
271
276
  standard_deviation = FFI::MemoryPointer.new(:double)
272
277
 
273
278
  handler = GDAL::CPLErrorHandler.new
274
- handler.on_warning = proc { Hash.new }
279
+ handler.on_warning = proc { {} }
275
280
  handler.on_none = proc do
276
281
  {
277
282
  minimum: min.read_double,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../gdal'
2
4
 
3
5
  module GDAL
@@ -49,19 +51,22 @@ module GDAL
49
51
  # @param range_count [Fixnum] The number of ranges to create.
50
52
  # @return [Array<Hash>, nil]
51
53
  def equal_count_ranges(range_count)
52
- sorted_pixels = @raster_band.to_na.sort
53
- sorted_and_masked_pixels = sorted_pixels[sorted_pixels.ne(@raster_band.no_data_value[:value])]
54
- return [] if sorted_and_masked_pixels.empty?
54
+ pixels = @raster_band.to_nna
55
+ masked_pixels = masked_pixels(pixels)
56
+
57
+ return [] if masked_pixels.empty?
55
58
 
59
+ sorted_and_masked_pixels = masked_pixels.to_a.sort
56
60
  range_size = (sorted_and_masked_pixels.size / range_count).to_i
57
61
 
58
- log "Masked pixel count/total pixel count: #{sorted_and_masked_pixels.size}/#{sorted_pixels.size}"
62
+ log "Masked pixel count/total pixel count: #{sorted_and_masked_pixels.size}/#{pixels.size}"
59
63
  log "Min pixel value: #{sorted_and_masked_pixels.min}"
60
64
  log "Max pixel value: #{sorted_and_masked_pixels.max}"
61
65
  log "Range size: #{range_size}"
62
66
 
63
67
  break_values = Array.new(range_count) { |i| sorted_and_masked_pixels[range_size * i] }.uniq
64
68
  log "Break values: #{break_values}"
69
+
65
70
  return if break_values.uniq.size != range_count
66
71
 
67
72
  breakpoint_calculator = lambda do |range_number|
@@ -71,13 +76,9 @@ module GDAL
71
76
  range_for_type(min, max)
72
77
  end
73
78
 
74
- range_count.times.each_with_object([]) do |i, ranges|
79
+ Array.new(range_count) do |i|
75
80
  range = breakpoint_calculator.call(i)
76
-
77
- ranges << {
78
- range: range,
79
- map_to: (i + 1).to_data_type(@raster_band.data_type)
80
- }
81
+ { range: range, map_to: (i + 1).to_data_type(@raster_band.data_type) }
81
82
  end
82
83
  end
83
84
 
@@ -86,26 +87,58 @@ module GDAL
86
87
  # values, so if you don't want to overwrite the Dataset you're working with,
87
88
  # you should copy it first.
88
89
  def classify!
89
- nodata_value = @raster_band.no_data_value[:value]
90
- band_pixels = @raster_band.to_na
91
- new_band_pixels = GDAL._narray_from_data_type(@raster_band.data_type, @raster_band.x_size, @raster_band.y_size)
92
- new_band_pixels[band_pixels.eq(nodata_value)] = nodata_value
90
+ band_pixels = @raster_band.to_nna
91
+ new_band_pixels = band_pixels.clone
92
+ data_pixels = if nodata_value
93
+ nodata_is_nan? ? ~band_pixels.isnan : band_pixels.ne(nodata_value)
94
+ else
95
+ Numo::Bit.cast(band_pixels.new_ones)
96
+ end
93
97
 
94
98
  @ranges.each do |r|
95
- new_band_pixels[
96
- band_pixels.ne(nodata_value).
97
- and(band_pixels.le(r[:range].max)).
98
- and(band_pixels.ge(r[:range].min))
99
- ] = r[:map_to]
99
+ new_band_pixels[data_pixels & band_pixels.le(r[:range].max) & band_pixels.ge(r[:range].min)] = r[:map_to]
100
100
  end
101
101
 
102
+ mask_nan(new_band_pixels, data_pixels) if nodata_is_nan?
102
103
  @raster_band.write_xy_narray(new_band_pixels)
103
104
  end
104
105
 
106
+ # @return [Numeric] NODATA value for the @raster_band.
107
+ def nodata_value
108
+ @raster_band.no_data_value[:value]
109
+ end
110
+
111
+ # @return [Boolean] True if NODATA is NaN.
112
+ def nodata_is_nan?
113
+ nodata_value.is_a?(Float) && nodata_value.nan?
114
+ end
115
+
105
116
  private
106
117
 
118
+ # @param pixels [Numo::NArray]
119
+ # @return [Numo::NArray]
120
+ def masked_pixels(pixels)
121
+ no_data = @raster_band.no_data_value[:value]
122
+
123
+ if no_data
124
+ mask = no_data.is_a?(Float) && no_data.nan? ? ~pixels.isnan : pixels.ne(no_data)
125
+ pixels[mask]
126
+ else
127
+ pixels
128
+ end
129
+ end
130
+
107
131
  def range_for_type(min, max)
108
132
  min.to_data_type(@raster_band.data_type)..max.to_data_type(@raster_band.data_type)
109
133
  end
134
+
135
+ # Set nodata pixels to 0 and set the nodata value to 0.
136
+ #
137
+ # @param new_band_pixels [Numo::NArray]
138
+ # @param data_pixels [Numo::Bit]
139
+ def mask_nan(new_band_pixels, data_pixels)
140
+ new_band_pixels[~data_pixels] = 0
141
+ @raster_band.no_data_value = 0
142
+ end
110
143
  end
111
144
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../ogr'
2
4
 
3
5
  module GDAL
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GDAL
2
4
  module RasterBandMixins
3
5
  module AlgorithmMethods
@@ -34,7 +36,8 @@ module GDAL
34
36
  colors,
35
37
  color_table.c_pointer,
36
38
  progress_function,
37
- progress_arg)
39
+ progress_arg
40
+ )
38
41
 
39
42
  color_table
40
43
  end
@@ -75,7 +78,8 @@ module GDAL
75
78
  output_ptr,
76
79
  color_table_ptr,
77
80
  progress_function,
78
- progress_arg)
81
+ progress_arg
82
+ )
79
83
 
80
84
  output_band
81
85
  end
@@ -97,7 +101,8 @@ module GDAL
97
101
  x_offset,
98
102
  y_offset,
99
103
  x_size,
100
- y_size)
104
+ y_size
105
+ )
101
106
  end
102
107
 
103
108
  # Computes the proximity of all pixels in the proximity_band to those in
@@ -134,7 +139,8 @@ module GDAL
134
139
  proximity_band_ptr,
135
140
  options_ptr,
136
141
  progress_function,
137
- progress_arg)
142
+ progress_arg
143
+ )
138
144
  end
139
145
 
140
146
  # Fill selected raster regions by interpolation from the edges. It
@@ -324,7 +330,8 @@ module GDAL
324
330
  connectedness,
325
331
  options_ptr,
326
332
  progress_function,
327
- progress_arg)
333
+ progress_arg
334
+ )
328
335
  end
329
336
  end
330
337
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GDAL
2
4
  module RasterBandMixins
3
5
  # RasterBand methods added for dealing with colorizing.
@@ -74,7 +76,7 @@ module GDAL
74
76
 
75
77
  # @param hex [String]
76
78
  def hex_to_rgb(hex)
77
- hex.sub!(/^#/, '')
79
+ hex = hex.sub(/^#/, '')
78
80
  matches = hex.match(/(?<red>[a-zA-Z0-9]{2})(?<green>[a-zA-Z0-9]{2})(?<blue>[a-zA-Z0-9]{2})/)
79
81
 
80
82
  [matches[:red].to_i(16), matches[:green].to_i(16), matches[:blue].to_i(16)]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
 
3
5
  module GDAL
@@ -35,6 +37,10 @@ module GDAL
35
37
  narray.to_type(narray_type)
36
38
  end
37
39
 
40
+ def to_nna
41
+ Numo::NArray[to_a]
42
+ end
43
+
38
44
  # Each pixel of the raster projected using the dataset's geo_transform.
39
45
  # The output NArray is a 3D array where the inner-most array is a the
40
46
  # lat an lon, those are contained in an array per pixel line, and finally
@@ -62,41 +68,6 @@ module GDAL
62
68
  def pixel_count
63
69
  x_size * y_size
64
70
  end
65
-
66
- # @return [Hash]
67
- def as_json(_options = nil)
68
- {
69
- raster_band: {
70
- block_size: block_size,
71
- category_names: category_names,
72
- color_interpretation: color_interpretation,
73
- color_table: color_table,
74
- data_type: data_type,
75
- default_histogram: default_histogram(true),
76
- default_raster_attribute_table: default_raster_attribute_table,
77
- has_arbitrary_overviews: arbitrary_overviews?,
78
- mask_flags: mask_flags,
79
- maximum_value: maximum_value,
80
- minimum_value: minimum_value,
81
- no_data_value: no_data_value,
82
- number: number,
83
- offset: offset,
84
- overview_count: overview_count,
85
- overviews: overviews,
86
- scale: scale,
87
- statistics: statistics,
88
- unit_type: unit_type,
89
- x_size: x_size,
90
- y_size: y_size
91
- },
92
- metadata: all_metadata
93
- }
94
- end
95
-
96
- # @return [String]
97
- def to_json(options = nil)
98
- as_json(options).to_json
99
- end
100
71
  end
101
72
  end
102
73
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GDAL
2
4
  module RasterBandMixins
3
5
  # Methods for reading & writing RasterBands that didn't come from GDAL.
@@ -24,6 +26,7 @@ module GDAL
24
26
  # @param pixel_array [NArray] The 2d list of pixels.
25
27
  def write_xy_narray(pixel_array)
26
28
  data_pointer = FFI::MemoryPointer.new(:buffer_out, block_buffer_size)
29
+ read_start = 0
27
30
 
28
31
  block_count[:y].times do |y_block_number|
29
32
  block_count[:x].times do |x_block_number|
@@ -31,14 +34,14 @@ module GDAL
31
34
  x_block_size = calculate_x_block_size(x_block_number)
32
35
 
33
36
  pixel_count_per_block = x_block_size * y_block_size
34
- read_offset = (y_block_number + 1) * (x_block_number + 1)
35
- read_range = ((read_offset - 1) * pixel_count_per_block)...(read_offset * pixel_count_per_block)
37
+ read_range = (read_start...(read_start + pixel_count_per_block))
36
38
  pixels = pixel_array[read_range]
37
39
  GDAL._write_pointer(data_pointer, data_type, pixels.to_a)
38
40
 
39
41
  write_block(x_block_number, y_block_number, data_pointer)
40
42
 
41
43
  data_pointer.clear
44
+ read_start = read_range.end
42
45
  end
43
46
  end
44
47
  end
@@ -69,7 +72,7 @@ module GDAL
69
72
  # Determines not only x and y block counts (how many blocks there are in
70
73
  # the raster band when using GDAL's suggested block size), but remainder
71
74
  # x and y counts for when the total number of pixels and lines does not
72
- # divide evently using GDAL's block count.
75
+ # divide evenly using GDAL's block count.
73
76
  #
74
77
  # @return [Hash{x => Fixnum, x_remainder => Fixnum, y => Fixnum,
75
78
  # y_remainder => Fixnum}]
@@ -135,7 +138,7 @@ module GDAL
135
138
  read_block(x_block_number, y_block_number, data_pointer)
136
139
  pixels = GDAL._read_pointer(data_pointer, data_type, block_buffer_size)
137
140
 
138
- yield(pixels, x_block_size, y_block_size)
141
+ yield(Array(pixels), x_block_size, y_block_size)
139
142
  end
140
143
  end
141
144
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
  require_relative '../gdal'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../gdal'
2
4
 
3
5
  module GDAL
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GDAL
2
4
  module Transformers
3
5
  class ApproximateTransformer
@@ -18,7 +20,8 @@ module GDAL
18
20
  @c_pointer = FFI::GDAL::Alg.GDALCreateApproxTransformer(
19
21
  base_transformer_function,
20
22
  transformer_arg_ptr,
21
- max_error)
23
+ max_error
24
+ )
22
25
  end
23
26
 
24
27
  def destroy!
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GDAL
2
4
  module Transformers
3
5
  class BaseGeneralImageProjectionTransformer
@@ -32,7 +34,8 @@ module GDAL
32
34
  geo_transform_ptr = GDAL._pointer(GDAL::GeoTransform, geo_transform)
33
35
 
34
36
  FFI::GDAL::Alg.GDALSetGenImgProjTransformerDstGeoTransform(
35
- @c_pointer, geo_transform_ptr)
37
+ @c_pointer, geo_transform_ptr
38
+ )
36
39
  end
37
40
  end
38
41
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GDAL
2
4
  module Transformers
3
5
  class GCPTransformer
@@ -25,13 +27,15 @@ module GDAL
25
27
  gcp_list.size,
26
28
  gcp_list_ptr,
27
29
  requested_polynomial_order,
28
- reversed)
30
+ reversed
31
+ )
29
32
  else
30
33
  FFI::GDAL::Alg.GDALCreateGCPTransformer(
31
34
  gcp_list.size,
32
35
  gcp_list_ptr,
33
36
  requested_polynomial_order,
34
- reversed)
37
+ reversed
38
+ )
35
39
  end
36
40
  end
37
41