mirror of https://github.com/tidwall/tile38.git
fix: distance if point and object have the same coordinates
This commit is contained in:
parent
53af1e2306
commit
2a8b98778b
|
@ -164,9 +164,12 @@ func fenceMatch(
|
|||
break
|
||||
}
|
||||
sw.mu.Lock()
|
||||
var distance float64
|
||||
var meters float64
|
||||
distance := Distance{false, meters}
|
||||
if fence.distance && fence.obj != nil {
|
||||
distance = details.obj.Distance(fence.obj)
|
||||
meters = details.obj.Distance(fence.obj)
|
||||
distance.ready = true
|
||||
distance.meters = meters
|
||||
}
|
||||
sw.fmap = details.fmap
|
||||
sw.fullFields = true
|
||||
|
|
|
@ -60,12 +60,18 @@ type scanWriter struct {
|
|||
respOut resp.Value
|
||||
}
|
||||
|
||||
// Distance ...
|
||||
type Distance struct {
|
||||
ready bool
|
||||
meters float64
|
||||
}
|
||||
|
||||
// ScanWriterParams ...
|
||||
type ScanWriterParams struct {
|
||||
id string
|
||||
o geojson.Object
|
||||
fields []float64
|
||||
distance float64
|
||||
distance Distance
|
||||
noLock bool
|
||||
ignoreGlobMatch bool
|
||||
clip geojson.Object
|
||||
|
@ -433,8 +439,8 @@ func (sw *scanWriter) writeObject(opts ScanWriterParams) bool {
|
|||
|
||||
wr.WriteString(jsfields)
|
||||
|
||||
if opts.distance > 0 {
|
||||
wr.WriteString(`,"distance":` + strconv.FormatFloat(opts.distance, 'f', -1, 64))
|
||||
if opts.distance.ready {
|
||||
wr.WriteString(`,"distance":` + strconv.FormatFloat(opts.distance.meters, 'f', -1, 64))
|
||||
}
|
||||
|
||||
wr.WriteString(`}`)
|
||||
|
@ -496,8 +502,8 @@ func (sw *scanWriter) writeObject(opts ScanWriterParams) bool {
|
|||
vals = append(vals, resp.ArrayValue(fvals))
|
||||
}
|
||||
}
|
||||
if opts.distance > 0 {
|
||||
vals = append(vals, resp.FloatValue(opts.distance))
|
||||
if opts.distance.ready {
|
||||
vals = append(vals, resp.FloatValue(opts.distance.meters))
|
||||
}
|
||||
|
||||
sw.values = append(sw.values, resp.ArrayValue(vals))
|
||||
|
|
|
@ -372,14 +372,18 @@ func (server *Server) cmdNearby(msg *Message) (res resp.Value, err error) {
|
|||
if sw.col != nil {
|
||||
iter := func(id string, o geojson.Object, fields []float64, dist float64) bool {
|
||||
meters := 0.0
|
||||
distance := Distance{false, meters}
|
||||
|
||||
if s.distance {
|
||||
meters = geo.DistanceFromHaversine(dist)
|
||||
distance.ready = true
|
||||
distance.meters = meters
|
||||
}
|
||||
return sw.writeObject(ScanWriterParams{
|
||||
id: id,
|
||||
o: o,
|
||||
fields: fields,
|
||||
distance: meters,
|
||||
distance: distance,
|
||||
noLock: true,
|
||||
ignoreGlobMatch: true,
|
||||
skipTesting: true,
|
||||
|
|
|
@ -28,10 +28,13 @@ func keys_KNN_test(mc *mockServer) error {
|
|||
{"SET", "mykey", "3", "POINT", 12, 19}, {"OK"},
|
||||
{"SET", "mykey", "4", "POINT", -5, 5}, {"OK"},
|
||||
{"SET", "mykey", "5", "POINT", 33, 21}, {"OK"},
|
||||
{"SET", "mykey", "6", "POINT", 52, 13}, {"OK"},
|
||||
{"NEARBY", "mykey", "LIMIT", 10, "POINTS", "POINT", 20, 20}, {
|
||||
"[0 [[2 [19 19]] [3 [12 19]] [5 [33 21]] [1 [5 5]] [4 [-5 5]]]]"},
|
||||
{"NEARBY", "mykey", "LIMIT", 10, "IDS", "POINT", 20, 20, 4000000}, {"[0 [2 3 5 1 4]]"},
|
||||
"[0 [[2 [19 19]] [3 [12 19]] [5 [33 21]] [1 [5 5]] [4 [-5 5]] [6 [52 13]]]]"},
|
||||
{"NEARBY", "mykey", "LIMIT", 10, "IDS", "POINT", 20, 20, 4000000}, {"[0 [2 3 5 1 4 6]]"},
|
||||
{"NEARBY", "mykey", "LIMIT", 10, "IDS", "POINT", 20, 20, 1500000}, {"[0 [2 3 5]]"},
|
||||
{"NEARBY", "mykey", "LIMIT", 10, "DISTANCE", "POINT", 52, 13, 100}, {`[0 [[6 {"type":"Point","coordinates":[13,52]} 0]]]`},
|
||||
{"NEARBY", "mykey", "LIMIT", 10, "DISTANCE", "POINT", 52.1, 13.1, 100000}, {`[0 [[6 {"type":"Point","coordinates":[13,52]} 13053.885940801563]]]`},
|
||||
})
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue