ffi-gdal 1.0.0.beta12 → 1.0.0.beta15

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc64c019c4788ab096e473970c65eb1b029766810a9383d8790d55ea12aa83b0
4
- data.tar.gz: 7b20ce76aed3a133996e1c7fcd72dc1b6285ce9dbba37041710ee6f25e63eb8a
3
+ metadata.gz: 27ce3bb913f0b8635ea76cbf5c4630815f1ac669b96d8d4b9106d51e724b88e7
4
+ data.tar.gz: 82959d4f4e6c2ebe35aaed9d37ec87c4520b17a96afd4a4ce7fa0ca72542915e
5
5
  SHA512:
6
- metadata.gz: 2aa9515c30fe4ce19a8776b8347265bef5d308a705c8bbe944b1a3cc1c9972b895c14ce108d3337f8e874566b12a153d732e41c3994108d5f2429166ce1cc06f
7
- data.tar.gz: 283356042e8bc70d17caa1a59f2fe5238c9884e1d007a21729f5961111d122ac966c0c6e9f8f08e0df298cf9c43fdf79ece7617ee02dc175a050dd1b9e80d3e0
6
+ metadata.gz: 305f98803b8e7568a43ac5e5a108283b5a3c16d9c87c440207a48227f1d3c833961ecc278994ab70830f976ac3d3f94d80e79059e9c3335964010ada30a02603
7
+ data.tar.gz: eb5b7863342eb29246bf892387ad591364fe98b3bc654dc63854d995a75d22ad4143dddebcacdb880ee6c22d8d0bcb1d8db2f6a230a9f4266b013ab4db8d2581
data/History.md CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  Format for this file derived from [http://keepachangelog.com](http://keepachangelog.com).
4
4
 
5
+ ## 1.0.0.beta15 / 2022-05-12
6
+
7
+ ### Improvements
8
+
9
+ * [DEV-20059] Ensure `GDAL::RasterBandClassifier#equal_count_ranges` has a minimum spacing between breakpoints.
10
+
11
+ ## 1.0.0.beta14 / 2022-05-06
12
+
13
+ ### Bug Fixes
14
+
15
+ * [DEV-34133] Don't URI.parse path in `GDAL::Dataset#initialize` and `OGR::DataSource#initialize`.
16
+
17
+ ## 1.0.0.beta13 / 2022-04-20
18
+
19
+ ### Bug Fixes
20
+
21
+ * [DEV-20247] Fix return value for `OGR::LayerMixins::Extensions#point_values` when no features are found.
22
+
5
23
  ## 1.0.0.beta12 / 2021-06-07
6
24
 
7
25
  ### Removed
@@ -2,6 +2,6 @@
2
2
 
3
3
  module FFI
4
4
  module GDAL
5
- VERSION = '1.0.0.beta12'
5
+ VERSION = '1.0.0.beta15'
6
6
  end
7
7
  end
data/lib/gdal/dataset.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'uri'
4
3
  require_relative '../gdal'
5
4
  require_relative '../ogr'
6
5
  require_relative 'major_object'
@@ -60,17 +59,10 @@ module GDAL
60
59
  def initialize(path_or_pointer, access_flag, shared_open = true)
61
60
  @c_pointer =
62
61
  if path_or_pointer.is_a? String
63
- file_path = begin
64
- uri = URI.parse(path_or_pointer)
65
- uri.scheme.nil? ? ::File.expand_path(path_or_pointer) : path_or_pointer
66
- rescue URI::InvalidURIError
67
- path_or_pointer
68
- end
69
-
70
62
  if shared_open
71
- FFI::GDAL::GDAL.GDALOpenShared(file_path, ACCESS_FLAGS[access_flag])
63
+ FFI::GDAL::GDAL.GDALOpenShared(path_or_pointer, ACCESS_FLAGS[access_flag])
72
64
  else
73
- FFI::GDAL::GDAL.GDALOpen(file_path, ACCESS_FLAGS[access_flag])
65
+ FFI::GDAL::GDAL.GDALOpen(path_or_pointer, ACCESS_FLAGS[access_flag])
74
66
  end
75
67
  else
76
68
  path_or_pointer
@@ -19,6 +19,8 @@ module GDAL
19
19
  #
20
20
  # @param ranges [Array<Hash{range => Range, map_to => Number}>]
21
21
  class RasterBandClassifier
22
+ MIN_GAP_PERCENTAGE = 0.005
23
+
22
24
  include GDAL::Logger
23
25
 
24
26
  attr_reader :ranges
@@ -64,14 +66,16 @@ module GDAL
64
66
  log "Max pixel value: #{sorted_and_masked_pixels.max}"
65
67
  log "Range size: #{range_size}"
66
68
 
67
- break_values = Array.new(range_count) { |i| sorted_and_masked_pixels[range_size * i] }.uniq
69
+ break_values = [*Array.new(range_count) { |i| sorted_and_masked_pixels[range_size * i] }.uniq,
70
+ sorted_and_masked_pixels.max]
71
+ ensure_min_gap(break_values)
68
72
  log "Break values: #{break_values}"
69
73
 
70
- return if break_values.uniq.size != range_count
74
+ return if break_values.uniq.size - 1 != range_count
71
75
 
72
76
  breakpoint_calculator = lambda do |range_number|
73
77
  min = break_values[range_number]
74
- max = break_values[range_number + 1] || sorted_and_masked_pixels.max
78
+ max = break_values[range_number + 1]
75
79
 
76
80
  range_for_type(min, max)
77
81
  end
@@ -131,6 +135,23 @@ module GDAL
131
135
  end
132
136
  end
133
137
 
138
+ # @param break_values [Array<Numeric>]
139
+ def ensure_min_gap(break_values)
140
+ min_gap = (break_values.last - break_values.first) * MIN_GAP_PERCENTAGE
141
+
142
+ (1...break_values.size).each do |index|
143
+ left, right = break_values[index - 1, 2]
144
+ diff = right - left
145
+ adjustment = (min_gap / 2) - (diff / 2)
146
+
147
+ next unless diff < min_gap
148
+
149
+ log "Index #{index} diff #{diff} smaller than min_gap #{min_gap}, adjusting by #{adjustment}"
150
+ break_values.fill(0...index) { |x| break_values[x] - adjustment }
151
+ break_values.fill(index..) { |x| break_values[x] + adjustment }
152
+ end
153
+ end
154
+
134
155
  def range_for_type(min, max)
135
156
  min.to_data_type(@raster_band.data_type)..max.to_data_type(@raster_band.data_type)
136
157
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'uri'
4
3
  require 'json'
5
4
  require_relative '../gdal'
6
5
  require_relative '../ogr'
@@ -41,14 +40,12 @@ module OGR
41
40
  def initialize(path_or_pointer, access_flag)
42
41
  @c_pointer =
43
42
  if path_or_pointer.is_a?(String)
44
- uri = URI.parse(path_or_pointer)
45
- file_path = uri.scheme.nil? ? ::File.expand_path(path_or_pointer) : path_or_pointer
46
- FFI::OGR::API.OGROpen(file_path, OGR._boolean_access_flag(access_flag), nil)
43
+ FFI::OGR::API.OGROpen(path_or_pointer, OGR._boolean_access_flag(access_flag), nil)
47
44
  else
48
45
  path_or_pointer
49
46
  end
50
47
 
51
- raise OGR::OpenFailure, file_path if @c_pointer.null?
48
+ raise OGR::OpenFailure, path_or_pointer if @c_pointer.null?
52
49
 
53
50
  @layers = []
54
51
  end
@@ -112,7 +112,7 @@ module OGR
112
112
  # encountered that the method doesn't know how to extract point values
113
113
  # from.
114
114
  def point_values(with_attributes = {})
115
- return [[]] if feature_count.zero?
115
+ return [] if feature_count.zero?
116
116
 
117
117
  field_indices = with_attributes.keys.map { |field_name| find_field_index(field_name) }
118
118
  values = Array.new(feature_count) { Array.new(2 + with_attributes.size) }
@@ -107,6 +107,22 @@ RSpec.describe GDAL::RasterBandClassifier do
107
107
  end
108
108
  end
109
109
 
110
+ describe '#ensure_min_gap' do
111
+ let(:break_values) do
112
+ [29_491.177616329518, 34_999.999999999985, 34_999.99999999999, 35_000.0, 35_000.01582852495, 36_499.9508667737]
113
+ end
114
+
115
+ let(:expected_values) do
116
+ [29_438.61973121367, 34_947.44211488414, 34_982.48598113636, 35_017.52984738857, 35_052.57371364079,
117
+ 36_552.508751889545]
118
+ end
119
+
120
+ it 'ensures breakpoints have a gap between them of 0.5% of the total range' do
121
+ subject.send(:ensure_min_gap, break_values)
122
+ expect(break_values).to eq expected_values
123
+ end
124
+ end
125
+
110
126
  describe '#classify!' do
111
127
  before do
112
128
  ranges = subject.equal_count_ranges(10)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-gdal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta12
4
+ version: 1.0.0.beta15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Loveless
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-07 00:00:00.000000000 Z
11
+ date: 2022-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -543,7 +543,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
543
543
  - !ruby/object:Gem::Version
544
544
  version: 1.3.1
545
545
  requirements: []
546
- rubygems_version: 3.1.6
546
+ rubygems_version: 3.0.9
547
547
  signing_key:
548
548
  specification_version: 4
549
549
  summary: FFI wrapper for GDAL/OGR.