accept multi search too

This commit is contained in:
Bel LaPointe
2026-03-15 00:22:28 -06:00
parent cc74cc60f2
commit 5101525607

View File

@@ -15,16 +15,14 @@ import (
func Run(ctx context.Context) error { func Run(ctx context.Context) error {
fs := flag.NewFlagSet(os.Args[0], flag.ContinueOnError) fs := flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
searchRadius := fs.Float64("r", 5.0, "search radius in miles") searchRadius := fs.Float64("r", 5.0, "search radius in miles")
area := fs.Float64("a", 0.5, "result radius in miles")
doArea := fs.Bool("d", false, "do result radius in miles") doArea := fs.Bool("d", false, "do result radius in miles")
var towns FlagStringArray var towns FlagStringArray
fs.Var(&towns, "t", "list of towns to search around") fs.Var(&towns, "t", "list of towns to search around")
searches := StringToFloat64{}
fs.Var(&searches, "s", "list of things to search for around each town")
if err := fs.Parse(os.Args[1:]); err != nil { if err := fs.Parse(os.Args[1:]); err != nil {
panic(err) panic(err)
} }
radius := *area / convertToMiles
radiusX := 2 * radius / 2
radiusY := 2 * radius / 3
type geoJson struct { type geoJson struct {
Type string `json:"type"` Type string `json:"type"`
@@ -38,34 +36,39 @@ func Run(ctx context.Context) error {
} }
geoJsons := []geoJson{} geoJsons := []geoJson{}
for _, town := range towns { for _, town := range towns {
m, err := NewMapsOf(ctx, town) for search, area := range searches {
if err != nil { radius := area / convertToMiles
return err radiusX := 2 * radius / 2
} radiusY := 2 * radius / 3
m, err := NewMapsOf(ctx, town)
results, err := m.Search(ctx, fs.Args()[0], *searchRadius) if err != nil {
if err != nil { return err
return err }
}
results, err := m.Search(ctx, search, *searchRadius)
for i := range results { if err != nil {
var a geoJson return err
a.Type = "Feature" }
a.Properties.Name = path.Join(fs.Args()[0], results[i].Name)
a.Geometry.Type = "Point" for i := range results {
a.Geometry.Coordinates = []any{results[i].Lng, results[i].Lat} var a geoJson
if *doArea { a.Type = "Feature"
a.Geometry.Type = "Polygon" a.Properties.Name = path.Join(search, results[i].Name)
x, y := results[i].Lng, results[i].Lat a.Geometry.Type = "Point"
a.Geometry.Coordinates = []any{[]any{ a.Geometry.Coordinates = []any{results[i].Lng, results[i].Lat}
[2]float64{x, y + radiusY}, // top if *doArea {
[2]float64{x + radiusX, y}, // right a.Geometry.Type = "Polygon"
[2]float64{x, y - radiusY}, // bot x, y := results[i].Lng, results[i].Lat
[2]float64{x - radiusX, y}, // left a.Geometry.Coordinates = []any{[]any{
[2]float64{x, y + radiusY}, // top [2]float64{x, y + radiusY}, // top
}} [2]float64{x + radiusX, y}, // right
[2]float64{x, y - radiusY}, // bot
[2]float64{x - radiusX, y}, // left
[2]float64{x, y + radiusY}, // top
}}
}
geoJsons = append(geoJsons, a)
} }
geoJsons = append(geoJsons, a)
} }
} }
log.Println(len(geoJsons)) log.Println(len(geoJsons))
@@ -95,3 +98,24 @@ func (array *FlagStringArray) Set(s string) error {
*array = append(*array, s) *array = append(*array, s)
return nil return nil
} }
type StringToFloat64 map[string]float64
func (array *StringToFloat64) String() string {
return fmt.Sprintf("%+v", (*map[string]float64)(array))
}
func (array *StringToFloat64) Set(s string) error {
idx := strings.Index(s, "=")
if idx < 0 {
return fmt.Errorf("should be formatted as k=v")
}
k := s[:idx]
v := s[idx+1:]
var n float64
if err := json.Unmarshal([]byte(v), &n); err != nil {
return err
}
(*array)[k] = n
return nil
}