Compare commits

..

3 Commits

Author SHA1 Message Date
Bel LaPointe
7f379e9d90 macro searches 2026-03-14 23:20:56 -06:00
Bel LaPointe
68f7ad68c6 accept flags and -d for a box 2026-03-14 22:40:20 -06:00
Bel LaPointe
ab4c577825 param 2026-03-14 22:19:46 -06:00
3 changed files with 39 additions and 18 deletions

View File

@@ -39,7 +39,7 @@ type Location struct {
} }
func (m *Maps) textSearchOne(ctx context.Context, query string) (Location, error) { func (m *Maps) textSearchOne(ctx context.Context, query string) (Location, error) {
results, err := m.Search(ctx, query) results, err := m.Search(ctx, query, 1.0)
if err != nil { if err != nil {
return Location{}, err return Location{}, err
} else if len(results) < 1 { } else if len(results) < 1 {
@@ -48,16 +48,17 @@ func (m *Maps) textSearchOne(ctx context.Context, query string) (Location, error
return results[0], nil return results[0], nil
} }
func (m *Maps) Search(ctx context.Context, query string) ([]Location, error) { var convertToMiles = 69.0
func (m *Maps) Search(ctx context.Context, query string, radius_miles float64) ([]Location, error) {
results, err := m.search(ctx, query) results, err := m.search(ctx, query)
for i := len(results) - 1; i >= 0; i-- { for i := len(results) - 1; i >= 0; i-- {
shouldKeep := true shouldKeep := true
if m.around != (Location{}) { if m.around != (Location{}) {
convertToMiles := 69.0
a := m.around.Lat - results[i].Lat a := m.around.Lat - results[i].Lat
b := m.around.Lng - results[i].Lng b := m.around.Lng - results[i].Lng
dist := math.Sqrt(a*a + b*b) dist := math.Sqrt(a*a + b*b)
shouldKeep = dist*convertToMiles < 5.0 shouldKeep = dist*convertToMiles < radius_miles
} }
if !shouldKeep { if !shouldKeep {
results = append(results[:i], results[i+1:]...) results = append(results[:i], results[i+1:]...)

View File

@@ -3,18 +3,30 @@ package cmd
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"flag"
"fmt" "fmt"
"os" "os"
"path" "path"
) )
func Run(ctx context.Context) error { func Run(ctx context.Context) error {
m, err := NewMapsOf(ctx, os.Args[1]) fs := flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
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")
if err := fs.Parse(os.Args[1:]); err != nil {
panic(err)
}
radius := *area / convertToMiles
radiusX := radius / 2
radiusY := radius / 3
m, err := NewMapsOf(ctx, fs.Args()[0])
if err != nil { if err != nil {
return err return err
} }
results, err := m.Search(ctx, os.Args[2]) results, err := m.Search(ctx, fs.Args()[1], *searchRadius)
if err != nil { if err != nil {
return err return err
} }
@@ -26,15 +38,26 @@ func Run(ctx context.Context) error {
} `json:"properties"` } `json:"properties"`
Geometry struct { Geometry struct {
Type string `json:"type"` Type string `json:"type"`
Coordinates []float64 `json:"coordinates"` Coordinates []any `json:"coordinates"`
} `json:"geometry"` } `json:"geometry"`
} }
geoJsons := make([]geoJson, len(results)) geoJsons := make([]geoJson, len(results))
for i := range results { for i := range results {
geoJsons[i].Type = "Feature" geoJsons[i].Type = "Feature"
geoJsons[i].Properties.Name = path.Join(os.Args[2], results[i].Name) geoJsons[i].Properties.Name = path.Join(fs.Args()[1], results[i].Name)
geoJsons[i].Geometry.Type = "Point" geoJsons[i].Geometry.Type = "Point"
geoJsons[i].Geometry.Coordinates = []float64{results[i].Lng, results[i].Lat} geoJsons[i].Geometry.Coordinates = []any{results[i].Lng, results[i].Lat}
if *doArea {
geoJsons[i].Geometry.Type = "Polygon"
x, y := results[i].Lng, results[i].Lat
geoJsons[i].Geometry.Coordinates = []any{[]any{
[2]float64{x - radiusX, y + radiusY}, // top left
[2]float64{x + radiusX, y + radiusY}, // top righ
[2]float64{x + radiusX, y - radiusY}, // bot righ
[2]float64{x - radiusX, y - radiusY}, // bot left
[2]float64{x - radiusX, y + radiusY}, // top left
}}
}
} }
b, _ := json.Marshal(map[string]any{ b, _ := json.Marshal(map[string]any{
"features": geoJsons, "features": geoJsons,

View File

@@ -2,14 +2,11 @@
GOOGLE_PLACES_API_KEY = "AIzaSyBkACm-LQkoSfsTO5_XAzBVZE9-JQzcNkg" GOOGLE_PLACES_API_KEY = "AIzaSyBkACm-LQkoSfsTO5_XAzBVZE9-JQzcNkg"
CATEGORIES = "schools,dump,prison,water treatment,police department,college,trailer park,coffee roaster,board game store,costco,organic grocery store" CATEGORIES = "schools,dump,prison,water treatment,police department,college,trailer park,coffee roaster,board game store,costco,organic grocery store"
[tasks.default] [tasks.sammy]
run = "mise run olympia -- \"schools\"" run = "mise run search -- {sammamish,duvall,'cottage lake',issaquah,snohomish}', wa'"
[tasks.olympia] [tasks.olympia]
run = "mise run search -- \"olympia, wa\"" run = "mise run search -- {olympia,lacey,tumwater}', wa'"
[tasks.duvall] [tasks.bellingham]
run = "mise run search -- \"duvall, wa\"" run = "mise run search -- {burlington,sedro-wooley,'mt vernon',bellingham,ferndale}', wa'"
[tasks.search]
run = "cd \"${MISE_PROJECT_ROOT}\"; go run ./ "