Skip to content

Commit c708aa2

Browse files
author
Sreekanth Sivasankaran
committed
adding setter methods for points only and space optimisation
1 parent 740aa86 commit c708aa2

File tree

2 files changed

+227
-1
lines changed

2 files changed

+227
-1
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
module github.com/golang/geo
1+
module github.com/sreekanth-cb/geo
22

33
go 1.12

s2/region_term_indexer.go

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
// Copyright 2020 Google Inc. All rights reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package s2
16+
17+
type TermType int
18+
19+
var marker = string('$')
20+
21+
const (
22+
ANCESTOR TermType = iota + 1
23+
COVERING
24+
)
25+
26+
var defaultMaxCells = int(8)
27+
28+
type Options struct {
29+
maxCells int
30+
minLevel int
31+
maxLevel int
32+
levelMod int
33+
pointsOnly bool
34+
optimizeSpace bool
35+
}
36+
37+
func (o *Options) MaxCells() int {
38+
return o.maxCells
39+
}
40+
41+
func (o *Options) SetMaxCells(mc int) {
42+
o.maxCells = mc
43+
}
44+
45+
func (o *Options) MinLevel() int {
46+
return o.minLevel
47+
}
48+
49+
func (o *Options) SetMinLevel(ml int) {
50+
o.minLevel = ml
51+
}
52+
53+
func (o *Options) MaxLevel() int {
54+
return o.maxLevel
55+
}
56+
57+
func (o *Options) SetMaxLevel(ml int) {
58+
o.maxLevel = ml
59+
}
60+
61+
func (o *Options) LevelMod() int {
62+
return o.levelMod
63+
}
64+
65+
func (o *Options) SetLevelMod(lm int) {
66+
o.levelMod = lm
67+
}
68+
69+
func (o *Options) SetPointsOnly(v bool) {
70+
o.pointsOnly = v
71+
}
72+
73+
func (o *Options) SetOptimizeSpace(v bool) {
74+
o.optimizeSpace = v
75+
}
76+
77+
func (o *Options) trueMaxLevel() int {
78+
trueMax := o.maxLevel
79+
if o.levelMod != 1 {
80+
trueMax = o.maxLevel - (o.maxLevel-o.minLevel)%o.levelMod
81+
}
82+
return trueMax
83+
}
84+
85+
type RegionTermIndexer struct {
86+
options Options
87+
regionCoverer RegionCoverer
88+
}
89+
90+
func NewRegionTermIndexer() *RegionTermIndexer {
91+
rv := &RegionTermIndexer{
92+
options: Options{
93+
maxCells: 8,
94+
minLevel: 4,
95+
maxLevel: 16,
96+
levelMod: 1,
97+
},
98+
}
99+
return rv
100+
}
101+
102+
func NewRegionTermIndexerWithOptions(option Options) *RegionTermIndexer {
103+
return &RegionTermIndexer{options: option}
104+
}
105+
106+
func (rti *RegionTermIndexer) GetTerm(termTyp TermType, id CellID,
107+
prefix string) string {
108+
if termTyp == ANCESTOR {
109+
return prefix + id.ToToken()
110+
}
111+
return prefix + marker + id.ToToken()
112+
}
113+
114+
func (rti *RegionTermIndexer) GetIndexTermsForPoint(p Point, prefix string) []string {
115+
cellID := cellIDFromPoint(p)
116+
var rv []string
117+
for l := rti.options.minLevel; l <= rti.options.maxLevel; l += rti.options.levelMod {
118+
rv = append(rv, rti.GetTerm(ANCESTOR, cellID.Parent(l), prefix))
119+
}
120+
return rv
121+
}
122+
123+
func (rti *RegionTermIndexer) GetIndexTermsForRegion(region Region,
124+
prefix string) []string {
125+
rti.regionCoverer.LevelMod = rti.options.levelMod
126+
rti.regionCoverer.MaxLevel = rti.options.maxLevel
127+
rti.regionCoverer.MinLevel = rti.options.minLevel
128+
rti.regionCoverer.MaxCells = rti.options.maxCells
129+
130+
covering := rti.regionCoverer.Covering(region)
131+
return rti.GetIndexTermsForCanonicalCovering(covering, prefix)
132+
}
133+
134+
func (rti *RegionTermIndexer) GetIndexTermsForCanonicalCovering(
135+
covering CellUnion, prefix string) []string {
136+
var rv []string
137+
prevID := CellID(0)
138+
tml := rti.options.trueMaxLevel()
139+
140+
for _, cellID := range covering {
141+
level := cellID.Level()
142+
if level < tml {
143+
rv = append(rv, rti.GetTerm(COVERING, cellID, prefix))
144+
}
145+
146+
if level == tml || !rti.options.optimizeSpace {
147+
rv = append(rv, rti.GetTerm(ANCESTOR, cellID.Parent(level), prefix))
148+
}
149+
150+
for (level - rti.options.levelMod) >= rti.options.minLevel {
151+
level -= rti.options.levelMod
152+
ancestorID := cellID.Parent(level)
153+
if prevID != CellID(0) && prevID.Level() > level &&
154+
prevID.Parent(level) == ancestorID {
155+
break
156+
}
157+
rv = append(rv, rti.GetTerm(ANCESTOR, ancestorID, prefix))
158+
}
159+
prevID = cellID
160+
}
161+
162+
return rv
163+
}
164+
165+
func (rti *RegionTermIndexer) GetQueryTermsForPoint(p Point, prefix string) []string {
166+
cellID := cellIDFromPoint(p)
167+
var rv []string
168+
169+
level := rti.options.trueMaxLevel()
170+
rv = append(rv, rti.GetTerm(ANCESTOR, cellID.Parent(level), prefix))
171+
if rti.options.pointsOnly {
172+
return rv
173+
}
174+
175+
for level >= rti.options.minLevel {
176+
rv = append(rv, rti.GetTerm(COVERING, cellID.Parent(level), prefix))
177+
level -= rti.options.levelMod
178+
}
179+
180+
return rv
181+
}
182+
183+
func (rti *RegionTermIndexer) GetQueryTermsForRegion(region Region,
184+
prefix string) []string {
185+
rti.regionCoverer.LevelMod = rti.options.levelMod
186+
rti.regionCoverer.MaxLevel = rti.options.maxLevel
187+
rti.regionCoverer.MinLevel = rti.options.minLevel
188+
rti.regionCoverer.MaxCells = rti.options.maxCells
189+
190+
covering := rti.regionCoverer.Covering(region)
191+
return rti.GetQueryTermsForCanonicalCovering(covering, prefix)
192+
193+
}
194+
195+
func (rti *RegionTermIndexer) GetQueryTermsForCanonicalCovering(
196+
covering CellUnion, prefix string) []string {
197+
var rv []string
198+
prevID := CellID(0)
199+
tml := rti.options.trueMaxLevel()
200+
for _, cellID := range covering {
201+
level := cellID.Level()
202+
rv = append(rv, rti.GetTerm(ANCESTOR, cellID, prefix))
203+
204+
if rti.options.pointsOnly {
205+
continue
206+
}
207+
208+
if rti.options.optimizeSpace && level < tml {
209+
rv = append(rv, rti.GetTerm(COVERING, cellID, prefix))
210+
}
211+
212+
for level-rti.options.levelMod >= rti.options.minLevel {
213+
level -= rti.options.levelMod
214+
ancestorID := cellID.Parent(level)
215+
if prevID != CellID(0) && prevID.Level() > level &&
216+
prevID.Parent(level) == ancestorID {
217+
break
218+
}
219+
rv = append(rv, rti.GetTerm(COVERING, ancestorID, prefix))
220+
}
221+
222+
prevID = cellID
223+
}
224+
225+
return rv
226+
}

0 commit comments

Comments
 (0)