From 380b41f6950435e9381e9300febe51773a9de507 Mon Sep 17 00:00:00 2001 From: Eli Ribble Date: Mon, 6 Apr 2026 15:36:17 +0000 Subject: [PATCH] Add ability to query for a place by gid(s) --- .gitignore | 1 + stadia/cmd/geocode-bygid/main.go | 62 ++++++++++++++++++++++++++++++++ stadia/geocode_bygid.go | 41 +++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 stadia/cmd/geocode-bygid/main.go create mode 100644 stadia/geocode_bygid.go diff --git a/.gitignore b/.gitignore index 23fca0ef..7e9602a8 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ postgrid/cmd/send-pdf/send-pdf result stadia/cmd/bulk-geocode/bulk-geocode stadia/cmd/geocode-autocomplete/geocode-autocomplete +stadia/cmd/geocode-bygid/geocode-bygid stadia/cmd/reverse-geocode/reverse-geocode stadia/cmd/structured-geocode/structured-geocode static/gen/ diff --git a/stadia/cmd/geocode-bygid/main.go b/stadia/cmd/geocode-bygid/main.go new file mode 100644 index 00000000..bb402c4e --- /dev/null +++ b/stadia/cmd/geocode-bygid/main.go @@ -0,0 +1,62 @@ +package main + +import ( + "context" + "flag" + "log" + "os" + + "github.com/Gleipnir-Technology/nidus-sync/stadia" +) + +func main() { + // Define command-line flags + gid := flag.String("gid", "", "The GID to query") + + // Parse the flags + flag.Parse() + + // Validate required arguments + if *gid == "" { + log.Println("Error: -gid is required") + flag.Usage() + os.Exit(1) + } + + key := os.Getenv("STADIA_MAPS_API_KEY") + if key == "" { + log.Println("STADIA_MAPS_API_KEY is empty") + os.Exit(1) + } + + client := stadia.NewStadiaMaps(key) + ctx := context.Background() + req := stadia.RequestGeocodeByGID{ + GIDs: []string{*gid}, + } + resp, err := client.GeocodeByGID(ctx, req) + if err != nil { + log.Printf("err: %v\n", err) + os.Exit(2) + } + log.Printf("type: %s, features: %d\n", resp.Type, len(resp.Features)) + for i, feature := range resp.Features { + log.Printf("feature %d: type %s\n", i, feature.Type) + if feature.Geometry == nil { + log.Printf("\tno geometry") + } else { + log.Printf("\tgeometry %s\n", feature.Geometry.Type) //, feature.Geometry.Coordinates[0], feature.Geometry.Coordinates[1]) + } + log.Printf("\tproperties %s\n", feature.Properties.Layer) + switch feature.Properties.Layer { + case "address": + log.Printf("\t\t%s", feature.Properties.Name) + if feature.Properties.CoarseLocation != nil { + log.Printf("\t\t%s", *feature.Properties.CoarseLocation) + } + log.Printf("\t\t%s", feature.Properties.Precision) + log.Printf("\t\t%s", feature.Properties.Layer) + log.Printf("\t\t%s", feature.Properties.GID) + } + } +} diff --git a/stadia/geocode_bygid.go b/stadia/geocode_bygid.go new file mode 100644 index 00000000..49943ae1 --- /dev/null +++ b/stadia/geocode_bygid.go @@ -0,0 +1,41 @@ +package stadia + +import ( + "context" + "fmt" + + "github.com/google/go-querystring/query" +) + +type RequestGeocodeByGID struct { + GIDs []string `url:"ids,comma"` + + // Other parameters + Lang *string `url:"lang,omitempty" json:"lang,omitempty"` +} + +func (s *StadiaMaps) GeocodeByGID(ctx context.Context, req RequestGeocodeByGID) (*GeocodeResponse, error) { + // https://docs.stadiamaps.com/geocoding-search-autocomplete/place-details/ + var result GeocodeResponse + + query, err := query.Values(req) + if err != nil { + return nil, fmt.Errorf("structured geocode query: %w", err) + } + //var api_error Error + resp, err := s.client.R(). + SetQueryParamsFromValues(query). + SetContext(ctx). + SetResult(&result). + SetPathParam("urlBase", s.urlBase). + SetQueryParam("api_key", s.APIKey). + Get("https://{urlBase}/geocoding/v2/place_details") + if err != nil { + return nil, fmt.Errorf("autocomplete get: %w", err) + } + + if !resp.IsSuccess() { + return nil, parseError(resp) + } + return &result, nil +}