fix no admin issue
This commit is contained in:
parent
06d78317f9
commit
0285c94946
|
@ -117,7 +117,7 @@ func (b *AdminBleveIndex) Store(layer string, feature *geojson.Feature) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *AdminBleveIndex) GeoSearch(f *geojson.Feature) (map[string][]*geojson.Feature, error) {
|
func (b *AdminBleveIndex) GeoSearch(f *geojson.Feature) (map[string]*geojson.Feature, error) {
|
||||||
coordinates := []float64{f.Point().Lon(), f.Point().Lat()}
|
coordinates := []float64{f.Point().Lon(), f.Point().Lat()}
|
||||||
query, err := bleve.NewGeoShapeQuery(
|
query, err := bleve.NewGeoShapeQuery(
|
||||||
[][][][]float64{{{coordinates}}},
|
[][][][]float64{{{coordinates}}},
|
||||||
|
@ -140,7 +140,7 @@ func (b *AdminBleveIndex) GeoSearch(f *geojson.Feature) (map[string][]*geojson.F
|
||||||
log.Debug().Any("region", b.Data[r.ID].Properties.MustString("nom")).Str("type", b.Data[r.ID].Geometry.GeoJSONType()).Msg("hit")
|
log.Debug().Any("region", b.Data[r.ID].Properties.MustString("nom")).Str("type", b.Data[r.ID].Geometry.GeoJSONType()).Msg("hit")
|
||||||
}
|
}
|
||||||
|
|
||||||
return map[string][]*geojson.Feature{}, nil
|
return map[string]*geojson.Feature{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *AdminBleveIndex) Find(layer, id string) (*geojson.Feature, error) {
|
func (s *AdminBleveIndex) Find(layer, id string) (*geojson.Feature, error) {
|
||||||
|
|
|
@ -27,10 +27,18 @@ func NewAdminMemoryRTreeIndex(cfg *viper.Viper) (*AdminMemoryRTreeIndex, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
layers := cfg.GetStringMapString("data.layers")
|
layers := cfg.GetStringMapString("data.layers")
|
||||||
|
|
||||||
|
// var wg sync.WaitGroup
|
||||||
for layer, url := range layers {
|
for layer, url := range layers {
|
||||||
|
// wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
// defer wg.Done()
|
||||||
storage.IndexLayer(layer, url)
|
storage.IndexLayer(layer, url)
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wg.Wait()
|
||||||
|
|
||||||
return storage, nil
|
return storage, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,32 +70,33 @@ func (s *AdminMemoryRTreeIndex) IndexLayer(layer, url string) error {
|
||||||
s.Indexes[layer].Insert(bound.Min, bound.Max, id)
|
s.Indexes[layer].Insert(bound.Min, bound.Max, id)
|
||||||
s.Documents[layer][id] = feature
|
s.Documents[layer][id] = feature
|
||||||
}
|
}
|
||||||
|
log.Info().Str("layer", layer).Msg("finished indexing")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *AdminMemoryRTreeIndex) GeoSearch(feature *geojson.Feature) (map[string][]*geojson.Feature, error) {
|
func (s *AdminMemoryRTreeIndex) GeoSearch(feature *geojson.Feature) (map[string]*geojson.Feature, error) {
|
||||||
results := map[string][]*geojson.Feature{}
|
results := map[string]*geojson.Feature{}
|
||||||
point := feature.Point()
|
point := feature.Point()
|
||||||
for _, layer := range s.Layers {
|
for _, layer := range s.Layers {
|
||||||
results[layer] = []*geojson.Feature{}
|
|
||||||
rt := s.Indexes[layer]
|
rt := s.Indexes[layer]
|
||||||
rt.Search([2]float64{point.Lon(), point.Lat()}, [2]float64{point.Lon(), point.Lat()}, func(min, max [2]float64, id any) bool {
|
rt.Search([2]float64{point.Lon(), point.Lat()}, [2]float64{point.Lon(), point.Lat()}, func(min, max [2]float64, id any) bool {
|
||||||
resp, found := s.Documents[layer][id.(string)]
|
resp, found := s.Documents[layer][id.(string)]
|
||||||
if !found {
|
if !found {
|
||||||
return false
|
log.Error().Msg("document not found")
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
if poly, ok := resp.Geometry.(orb.Polygon); ok {
|
if poly, ok := resp.Geometry.(orb.Polygon); ok {
|
||||||
if planar.PolygonContains(poly, point) {
|
if planar.PolygonContains(poly, point) {
|
||||||
results[layer] = append(results[layer], resp)
|
results[layer] = resp
|
||||||
return true
|
return false
|
||||||
}
|
}
|
||||||
} else if multipoly, ok := resp.Geometry.(orb.MultiPolygon); ok {
|
} else if multipoly, ok := resp.Geometry.(orb.MultiPolygon); ok {
|
||||||
if planar.MultiPolygonContains(multipoly, point) {
|
if planar.MultiPolygonContains(multipoly, point) {
|
||||||
results[layer] = append(results[layer], resp)
|
results[layer] = resp
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return results, nil
|
return results, nil
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type AdminIndex interface {
|
type AdminIndex interface {
|
||||||
GeoSearch(*geojson.Feature) (map[string][]*geojson.Feature, error)
|
GeoSearch(*geojson.Feature) (map[string]*geojson.Feature, error)
|
||||||
Find(layer, id string) (*geojson.Feature, error)
|
Find(layer, id string) (*geojson.Feature, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
main.go
4
main.go
|
@ -31,9 +31,7 @@ func main() {
|
||||||
geo := geojson.NewFeature(orb.Point{7.11667, 43.583328})
|
geo := geojson.NewFeature(orb.Point{7.11667, 43.583328})
|
||||||
res, err := adminIdx.GeoSearch(geo)
|
res, err := adminIdx.GeoSearch(geo)
|
||||||
|
|
||||||
for layer, features := range res {
|
for layer, f := range res {
|
||||||
for _, f := range features {
|
|
||||||
log.Info().Str("layer", layer).Str("code", f.Properties.MustString("code")).Str("nom", f.Properties.MustString("nom")).Msg("result")
|
log.Info().Str("layer", layer).Str("code", f.Properties.MustString("code")).Str("nom", f.Properties.MustString("nom")).Msg("result")
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue