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
|