geospatial 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/lib/geospatial/histogram.rb +83 -14
 - data/lib/geospatial/location.rb +4 -4
 - data/lib/geospatial/version.rb +1 -1
 - data/spec/geospatial/histogram_spec.rb +30 -0
 - metadata +4 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 7b9278cfa60e44d9e04909e2b6b8a7525c736a7598b19a04d33765d628b7b0ad
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 109c4077b0697a1725320a006aa3a3a2478ba0974dac557ec6be93e50e4b96be
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 86c0acee5bd439284b99d27d1ee8cb86d1d7caed9acadda62ff057f3dc7afe00d4f79685e519360ed1eae3a847360445e8ce585a58155e095a42e5aa983bb883
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 37b7366f03b68f2cca3cc28e36b5160954dfa921ec2a00613a5d8d1a862f1bfb48e52836a822d8ab04b91a1fa1f0286bd83b312e2d124774985d8dd855c5f29a
         
     | 
    
        data/lib/geospatial/histogram.rb
    CHANGED
    
    | 
         @@ -7,50 +7,61 @@ 
     | 
|
| 
       7 
7 
     | 
    
         
             
            module Geospatial
         
     | 
| 
       8 
8 
     | 
    
         
             
            	# This location is specifically relating to a WGS84 coordinate on Earth.
         
     | 
| 
       9 
9 
     | 
    
         
             
            	class Histogram
         
     | 
| 
       10 
     | 
    
         
            -
            		def initialize(min  
     | 
| 
      
 10 
     | 
    
         
            +
            		def initialize(min: 0, max: 1, scale: 0.1)
         
     | 
| 
       11 
11 
     | 
    
         
             
            			@min = min
         
     | 
| 
       12 
12 
     | 
    
         
             
            			@max = max
         
     | 
| 
       13 
13 
     | 
    
         
             
            			@scale = scale
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
            			@count =  
     | 
| 
       16 
     | 
    
         
            -
            			 
     | 
| 
      
 15 
     | 
    
         
            +
            			@count = 0
         
     | 
| 
      
 16 
     | 
    
         
            +
            			
         
     | 
| 
      
 17 
     | 
    
         
            +
            			@size = ((@max - @min) / @scale).ceil
         
     | 
| 
      
 18 
     | 
    
         
            +
            			@bins = [0] * @size
         
     | 
| 
       17 
19 
     | 
    
         
             
            			@offset = 0
         
     | 
| 
       18 
20 
     | 
    
         
             
            			@scale = scale
         
     | 
| 
       19 
21 
     | 
    
         
             
            		end
         
     | 
| 
       20 
22 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
            		 
     | 
| 
      
 23 
     | 
    
         
            +
            		attr_accessor :bins
         
     | 
| 
      
 24 
     | 
    
         
            +
            		
         
     | 
| 
      
 25 
     | 
    
         
            +
            		attr :count
         
     | 
| 
       22 
26 
     | 
    
         | 
| 
       23 
27 
     | 
    
         
             
            		attr :offset
         
     | 
| 
       24 
28 
     | 
    
         
             
            		attr :scale
         
     | 
| 
       25 
29 
     | 
    
         | 
| 
      
 30 
     | 
    
         
            +
            		def [] index
         
     | 
| 
      
 31 
     | 
    
         
            +
            			@bins[index]
         
     | 
| 
      
 32 
     | 
    
         
            +
            		end
         
     | 
| 
      
 33 
     | 
    
         
            +
            		
         
     | 
| 
      
 34 
     | 
    
         
            +
            		def size
         
     | 
| 
      
 35 
     | 
    
         
            +
            			@bins.size
         
     | 
| 
      
 36 
     | 
    
         
            +
            		end
         
     | 
| 
      
 37 
     | 
    
         
            +
            		
         
     | 
| 
       26 
38 
     | 
    
         
             
            		def map(value)
         
     | 
| 
       27 
39 
     | 
    
         
             
            			((value - @min) / @scale)
         
     | 
| 
       28 
40 
     | 
    
         
             
            		end
         
     | 
| 
       29 
41 
     | 
    
         | 
| 
       30 
42 
     | 
    
         
             
            		def unmap(index)
         
     | 
| 
       31 
     | 
    
         
            -
            			@min + ( 
     | 
| 
      
 43 
     | 
    
         
            +
            			@min + (index * @scale)
         
     | 
| 
       32 
44 
     | 
    
         
             
            		end
         
     | 
| 
       33 
45 
     | 
    
         | 
| 
       34 
46 
     | 
    
         
             
            		def add(value, amount = 1)
         
     | 
| 
       35 
     | 
    
         
            -
            			index = map(value).floor
         
     | 
| 
      
 47 
     | 
    
         
            +
            			index = map(value).floor % @size
         
     | 
| 
       36 
48 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
            			if  
     | 
| 
      
 49 
     | 
    
         
            +
            			if !block_given? or yield(index, value)
         
     | 
| 
      
 50 
     | 
    
         
            +
            				@count += 1
         
     | 
| 
       38 
51 
     | 
    
         
             
            				@bins[index] += amount
         
     | 
| 
       39 
     | 
    
         
            -
            			else
         
     | 
| 
       40 
     | 
    
         
            -
            				@bins[index] = amount
         
     | 
| 
       41 
52 
     | 
    
         
             
            			end
         
     | 
| 
       42 
53 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
            			return  
     | 
| 
      
 54 
     | 
    
         
            +
            			return index
         
     | 
| 
       44 
55 
     | 
    
         
             
            		end
         
     | 
| 
       45 
56 
     | 
    
         | 
| 
       46 
57 
     | 
    
         
             
            		def inspect
         
     | 
| 
       47 
58 
     | 
    
         
             
            			buffer = String.new("\#<#{self.class}")
         
     | 
| 
       48 
59 
     | 
    
         | 
| 
       49 
60 
     | 
    
         
             
            			@bins.each_with_index do |bin, index|
         
     | 
| 
       50 
     | 
    
         
            -
            				buffer << " 
     | 
| 
      
 61 
     | 
    
         
            +
            				buffer << " #{unmap(index)}: #{bin}"
         
     | 
| 
       51 
62 
     | 
    
         
             
            			end
         
     | 
| 
       52 
63 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
            			buffer << " 
     | 
| 
      
 64 
     | 
    
         
            +
            			buffer << ">"
         
     | 
| 
       54 
65 
     | 
    
         
             
            		end
         
     | 
| 
       55 
66 
     | 
    
         | 
| 
       56 
67 
     | 
    
         
             
            		def each
         
     | 
| 
         @@ -60,11 +71,15 @@ module Geospatial 
     | 
|
| 
       60 
71 
     | 
    
         
             
            				yield unmap(index), value
         
     | 
| 
       61 
72 
     | 
    
         
             
            			end
         
     | 
| 
       62 
73 
     | 
    
         
             
            		end
         
     | 
| 
      
 74 
     | 
    
         
            +
            		
         
     | 
| 
      
 75 
     | 
    
         
            +
            		def peaks
         
     | 
| 
      
 76 
     | 
    
         
            +
            			Peaks.new(self)
         
     | 
| 
      
 77 
     | 
    
         
            +
            		end
         
     | 
| 
       63 
78 
     | 
    
         
             
            	end
         
     | 
| 
       64 
79 
     | 
    
         | 
| 
       65 
80 
     | 
    
         
             
            	class RadialHistogram < Histogram
         
     | 
| 
       66 
     | 
    
         
            -
            		def initialize(center, min  
     | 
| 
       67 
     | 
    
         
            -
            			super(min, max, scale)
         
     | 
| 
      
 81 
     | 
    
         
            +
            		def initialize(center, min: -180, max: 180, scale: 1)
         
     | 
| 
      
 82 
     | 
    
         
            +
            			super(min: min, max: max, scale: scale)
         
     | 
| 
       68 
83 
     | 
    
         | 
| 
       69 
84 
     | 
    
         
             
            			@center = center
         
     | 
| 
       70 
85 
     | 
    
         
             
            		end
         
     | 
| 
         @@ -73,4 +88,58 @@ module Geospatial 
     | 
|
| 
       73 
88 
     | 
    
         
             
            			super(point.bearing_from(@center), value)
         
     | 
| 
       74 
89 
     | 
    
         
             
            		end
         
     | 
| 
       75 
90 
     | 
    
         
             
            	end
         
     | 
| 
      
 91 
     | 
    
         
            +
            	
         
     | 
| 
      
 92 
     | 
    
         
            +
            	class Peaks
         
     | 
| 
      
 93 
     | 
    
         
            +
            		include Enumerable
         
     | 
| 
      
 94 
     | 
    
         
            +
            		
         
     | 
| 
      
 95 
     | 
    
         
            +
            		def initialize(values)
         
     | 
| 
      
 96 
     | 
    
         
            +
            			@values = values
         
     | 
| 
      
 97 
     | 
    
         
            +
            			@derivative = []
         
     | 
| 
      
 98 
     | 
    
         
            +
            			
         
     | 
| 
      
 99 
     | 
    
         
            +
            			s = @values.size
         
     | 
| 
      
 100 
     | 
    
         
            +
            			
         
     | 
| 
      
 101 
     | 
    
         
            +
            			@values.size.times do |i|
         
     | 
| 
      
 102 
     | 
    
         
            +
            				# Apply the Laplacian of Gaussians to compute the gradient changes:
         
     | 
| 
      
 103 
     | 
    
         
            +
            				# @derivative << (@values[i-2] * -1) + (@values[i-1] * -1) + (@values[i] * 4) + (@values[i+1-s] * -1) + (@values[i+2-s] * -1)
         
     | 
| 
      
 104 
     | 
    
         
            +
            				@derivative << (2.0 * @values[i-1]) + (-2.0 * @values[i+1-s])
         
     | 
| 
      
 105 
     | 
    
         
            +
            			end
         
     | 
| 
      
 106 
     | 
    
         
            +
            		end
         
     | 
| 
      
 107 
     | 
    
         
            +
            		
         
     | 
| 
      
 108 
     | 
    
         
            +
            		attr :derivative
         
     | 
| 
      
 109 
     | 
    
         
            +
            		
         
     | 
| 
      
 110 
     | 
    
         
            +
            		def each
         
     | 
| 
      
 111 
     | 
    
         
            +
            			return to_enum unless block_given?
         
     | 
| 
      
 112 
     | 
    
         
            +
            			
         
     | 
| 
      
 113 
     | 
    
         
            +
            			@derivative.each_with_index do |y2, x2|
         
     | 
| 
      
 114 
     | 
    
         
            +
            				x1 = x2 - 1
         
     | 
| 
      
 115 
     | 
    
         
            +
            				y1 = @derivative[x1]
         
     | 
| 
      
 116 
     | 
    
         
            +
            				
         
     | 
| 
      
 117 
     | 
    
         
            +
            				if (y1 <= 0 and y2 > 0) or (y1 > 0 and y2 <= 0)
         
     | 
| 
      
 118 
     | 
    
         
            +
            					# There has been a zero crossing, so we have a peak somewhere here:
         
     | 
| 
      
 119 
     | 
    
         
            +
            					g = (y2.to_f - y1.to_f)
         
     | 
| 
      
 120 
     | 
    
         
            +
            					m = (-y1.to_f / g)
         
     | 
| 
      
 121 
     | 
    
         
            +
            					
         
     | 
| 
      
 122 
     | 
    
         
            +
            					yield x1 + m, g
         
     | 
| 
      
 123 
     | 
    
         
            +
            				end
         
     | 
| 
      
 124 
     | 
    
         
            +
            			end
         
     | 
| 
      
 125 
     | 
    
         
            +
            		end
         
     | 
| 
      
 126 
     | 
    
         
            +
            		
         
     | 
| 
      
 127 
     | 
    
         
            +
            		def segments
         
     | 
| 
      
 128 
     | 
    
         
            +
            			return to_enum(:segments) unless block_given?
         
     | 
| 
      
 129 
     | 
    
         
            +
            			
         
     | 
| 
      
 130 
     | 
    
         
            +
            			gradients = self.to_a
         
     | 
| 
      
 131 
     | 
    
         
            +
            			
         
     | 
| 
      
 132 
     | 
    
         
            +
            			return if gradients.empty?
         
     | 
| 
      
 133 
     | 
    
         
            +
            			
         
     | 
| 
      
 134 
     | 
    
         
            +
            			index, gradient = gradients.first
         
     | 
| 
      
 135 
     | 
    
         
            +
            			
         
     | 
| 
      
 136 
     | 
    
         
            +
            			if gradient < 0
         
     | 
| 
      
 137 
     | 
    
         
            +
            				gradients.push gradients.shift
         
     | 
| 
      
 138 
     | 
    
         
            +
            			end
         
     | 
| 
      
 139 
     | 
    
         
            +
            			
         
     | 
| 
      
 140 
     | 
    
         
            +
            			gradients.each_slice(2) do |up, down|
         
     | 
| 
      
 141 
     | 
    
         
            +
            				yield up, down
         
     | 
| 
      
 142 
     | 
    
         
            +
            			end
         
     | 
| 
      
 143 
     | 
    
         
            +
            		end
         
     | 
| 
      
 144 
     | 
    
         
            +
            	end
         
     | 
| 
       76 
145 
     | 
    
         
             
            end
         
     | 
    
        data/lib/geospatial/location.rb
    CHANGED
    
    | 
         @@ -158,10 +158,10 @@ module Geospatial 
     | 
|
| 
       158 
158 
     | 
    
         
             
            		# calculate distance in metres between us and something else
         
     | 
| 
       159 
159 
     | 
    
         
             
            		# ref: http://codingandweb.blogspot.co.nz/2012/04/calculating-distance-between-two-points.html
         
     | 
| 
       160 
160 
     | 
    
         
             
            		def distance_from(other)
         
     | 
| 
       161 
     | 
    
         
            -
            			rlong1 = self.longitude * D2R 
     | 
| 
       162 
     | 
    
         
            -
            			rlat1 = self.latitude * D2R 
     | 
| 
       163 
     | 
    
         
            -
            			rlong2 = other.longitude * D2R 
     | 
| 
       164 
     | 
    
         
            -
            			rlat2 = other.latitude * D2R 
     | 
| 
      
 161 
     | 
    
         
            +
            			rlong1 = self.longitude * D2R
         
     | 
| 
      
 162 
     | 
    
         
            +
            			rlat1 = self.latitude * D2R
         
     | 
| 
      
 163 
     | 
    
         
            +
            			rlong2 = other.longitude * D2R
         
     | 
| 
      
 164 
     | 
    
         
            +
            			rlat2 = other.latitude * D2R
         
     | 
| 
       165 
165 
     | 
    
         | 
| 
       166 
166 
     | 
    
         
             
            			dlon = rlong1 - rlong2
         
     | 
| 
       167 
167 
     | 
    
         
             
            			dlat = rlat1 - rlat2
         
     | 
    
        data/lib/geospatial/version.rb
    CHANGED
    
    
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            # This file is part of the "geospatial" project and is released under the MIT license.
         
     | 
| 
      
 5 
     | 
    
         
            +
            #
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            require 'geospatial/histogram'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            RSpec.describe Geospatial::Histogram do
         
     | 
| 
      
 10 
     | 
    
         
            +
            	subject do
         
     | 
| 
      
 11 
     | 
    
         
            +
            		described_class.new(min: -180, max: 180, scale: 10).tap do |histogram|
         
     | 
| 
      
 12 
     | 
    
         
            +
            			histogram.bins = [0, 80, 540, 101, 29, 1880, 41, 23, 115, 715, 362, 244, 358, 955, 50, 53, 11, 7, 151, 43, 353, 1514, 2, 2, 0, 0, 0, 0, 0, 6, 155, 1737, 959, 1482, 110, 0]
         
     | 
| 
      
 13 
     | 
    
         
            +
            		end
         
     | 
| 
      
 14 
     | 
    
         
            +
            	end
         
     | 
| 
      
 15 
     | 
    
         
            +
            	
         
     | 
| 
      
 16 
     | 
    
         
            +
            	it "should generate appropriate peaks" do
         
     | 
| 
      
 17 
     | 
    
         
            +
            		peaks = subject.peaks
         
     | 
| 
      
 18 
     | 
    
         
            +
            		
         
     | 
| 
      
 19 
     | 
    
         
            +
            		subject.bins.each_with_index do |v, i|
         
     | 
| 
      
 20 
     | 
    
         
            +
            			d = subject.peaks.derivative[i]
         
     | 
| 
      
 21 
     | 
    
         
            +
            			puts "#{i}, #{v}, #{d}"
         
     | 
| 
      
 22 
     | 
    
         
            +
            		end
         
     | 
| 
      
 23 
     | 
    
         
            +
            		
         
     | 
| 
      
 24 
     | 
    
         
            +
            		peaks.each do |x, dx|
         
     | 
| 
      
 25 
     | 
    
         
            +
            			puts "Peak at #{x}: #{dx}"
         
     | 
| 
      
 26 
     | 
    
         
            +
            		end
         
     | 
| 
      
 27 
     | 
    
         
            +
            		
         
     | 
| 
      
 28 
     | 
    
         
            +
            		puts peaks.segments.to_a.inspect
         
     | 
| 
      
 29 
     | 
    
         
            +
            	end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: geospatial
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.10.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Samuel Williams
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2018-11- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2018-11-11 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: rspec
         
     | 
| 
         @@ -92,6 +92,7 @@ files: 
     | 
|
| 
       92 
92 
     | 
    
         
             
            - spec/geospatial/filter_spec.rb
         
     | 
| 
       93 
93 
     | 
    
         
             
            - spec/geospatial/hilbert_curve_spec.rb
         
     | 
| 
       94 
94 
     | 
    
         
             
            - spec/geospatial/hilbert_traverse_spec.rb
         
     | 
| 
      
 95 
     | 
    
         
            +
            - spec/geospatial/histogram_spec.rb
         
     | 
| 
       95 
96 
     | 
    
         
             
            - spec/geospatial/index_spec.rb
         
     | 
| 
       96 
97 
     | 
    
         
             
            - spec/geospatial/location_spec.rb
         
     | 
| 
       97 
98 
     | 
    
         
             
            - spec/geospatial/map_index_spec.rb
         
     | 
| 
         @@ -134,6 +135,7 @@ test_files: 
     | 
|
| 
       134 
135 
     | 
    
         
             
            - spec/geospatial/filter_spec.rb
         
     | 
| 
       135 
136 
     | 
    
         
             
            - spec/geospatial/hilbert_curve_spec.rb
         
     | 
| 
       136 
137 
     | 
    
         
             
            - spec/geospatial/hilbert_traverse_spec.rb
         
     | 
| 
      
 138 
     | 
    
         
            +
            - spec/geospatial/histogram_spec.rb
         
     | 
| 
       137 
139 
     | 
    
         
             
            - spec/geospatial/index_spec.rb
         
     | 
| 
       138 
140 
     | 
    
         
             
            - spec/geospatial/location_spec.rb
         
     | 
| 
       139 
141 
     | 
    
         
             
            - spec/geospatial/map_index_spec.rb
         
     |