Module: GeoDelta::Region

Defined in:
lib/geodelta/region.rb

Class Method Summary collapse

Class Method Details

.get_delta_ids_in_region(x1, y1, x2, y2, level) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/geodelta/region.rb', line 7

def self.get_delta_ids_in_region(x1, y1, x2, y2, level)
  ids = []

  if x1 > x2
    ids += self.get_delta_ids_in_region(x1, y1, +12.0, y2, level)
    ids += self.get_delta_ids_in_region(x2, y1,  +0.0, y2, level)
  else
    unit = 12.0 / (2 ** (level - 1))
    u1   = unit
    u2   = unit / 2

    nw = GeoDelta::DeltaGeometry.get_delta_ids(x1, y1, level)
    ne = GeoDelta::DeltaGeometry.get_delta_ids(x2, y1, level)
    sw = GeoDelta::DeltaGeometry.get_delta_ids(x1, y2, level)
    se = GeoDelta::DeltaGeometry.get_delta_ids(x2, y2, level)

    proc {
      sx, y = GeoDelta::DeltaGeometry.get_center(nw)
      ex, _ = GeoDelta::DeltaGeometry.get_center(ne)

      sx -= 24.0  if sx > ex

      sxi  = (sx / u2).floor
      exi  = (ex / u2).ceil
      sxi -= 1 if !GeoDelta::DeltaGeometry.upper_delta?(nw) && x1 < sx && nw != sw
      exi += 1 if !GeoDelta::DeltaGeometry.upper_delta?(ne) && x2 > ex && ne != se

      (sxi..exi).each { |xi|
        xx = xi * u2
        ids << GeoDelta::DeltaGeometry.get_delta_ids(xx, y, level)
      }
    }.call

    proc {
      sx, y = GeoDelta::DeltaGeometry.get_center(sw)
      ex, _ = GeoDelta::DeltaGeometry.get_center(se)

      sx -= 24.0  if sx > ex

      sxi  = (sx / u2).floor
      exi  = (ex / u2).ceil
      sxi -= 1 if GeoDelta::DeltaGeometry.upper_delta?(sw) && x1 < sx && nw != sw
      exi += 1 if GeoDelta::DeltaGeometry.upper_delta?(se) && x2 > ex && ne != se

      (sxi..exi).each { |xi|
        xx = xi * u2
        ids << GeoDelta::DeltaGeometry.get_delta_ids(xx, y, level)
      }
    }.call

    proc {
      syi = (y1 / u1).floor
      eyi = (y2 / u1).ceil + 1
      sxi = (x1 / u2).floor
      exi = (x2 / u2).ceil
      (eyi..syi).each { |yi|
        yy = yi * unit - u2
        (sxi..exi).each { |xi|
          xx = xi * u2
          ids << GeoDelta::DeltaGeometry.get_delta_ids(xx, yy, level)
        }
      }
    }.call
  end

  ids.sort!
  ids.uniq!

  return ids
end