nidus-sync/stadia/structured_geocode.go

77 lines
3 KiB
Go
Raw Normal View History

2026-02-14 15:40:12 +00:00
package stadia
import (
2026-02-25 02:44:35 +00:00
"context"
2026-02-14 15:40:12 +00:00
"fmt"
"github.com/google/go-querystring/query"
)
// StructuredGeocodeRequest represents the query parameters for structured geocoding
type StructuredGeocodeRequest struct {
// Address components
Address *string `url:"address,omitempty" json:"address,omitempty"`
Neighbourhood *string `url:"neighbourhood,omitempty" json:"neighbourhood,omitempty"`
Borough *string `url:"borough,omitempty" json:"borough,omitempty"`
Locality *string `url:"locality,omitempty" json:"locality,omitempty"`
County *string `url:"county,omitempty" json:"county,omitempty"`
Region *string `url:"region,omitempty" json:"region,omitempty"`
PostalCode *string `url:"postalcode,omitempty" json:"postalcode,omitempty"`
Country *string `url:"country,omitempty" json:"country,omitempty"`
// Boundary circle parameters
BoundaryCircleLat *float64 `url:"boundary.circle.lat,omitempty"`
BoundaryCircleLon *float64 `url:"boundary.circle.lon,omitempty"`
BoundaryCircleRadius *float64 `url:"boundary.circle.radius,omitempty"`
BoundaryCountry []string `url:"boundary.country,omitempty,comma" json:"boundary.country,omitempty,comma"`
2026-02-14 15:40:12 +00:00
BoundaryGid *string `url:"boundary.gid,omitempty" json:"boundary.gid,omitempty"`
2026-02-14 15:40:12 +00:00
// Boundary parameters
BoundaryRectMaxLat *float64 `url:"boundary.rect.max_lat,omitempty"`
BoundaryRectMinLat *float64 `url:"boundary.rect.min_lat,omitempty"`
BoundaryRectMaxLon *float64 `url:"boundary.rect.max_lon,omitempty"`
BoundaryRectMinLon *float64 `url:"boundary.rect.min_lon,omitempty"`
// Focus point
FocusPointLat *float64 `url:"focus.point.lat,omitempty" json:",omitempty"`
FocusPointLng *float64 `url:"focus.point.lon,omitempty" json:",omitempty"`
2026-02-14 15:40:12 +00:00
// Other parameters
Layers []string `url:"layers,omitempty,comma" json:"layers,omitempty,comma"`
Sources []string `url:"sources,omitempty,comma" json:"sources,omitempty,comma"`
Size *int `url:"size,omitempty" json:"size,omitempty"`
Lang *string `url:"lang,omitempty" json:"lang,omitempty"`
}
2026-02-25 02:44:35 +00:00
func (s *StadiaMaps) StructuredGeocode(ctx context.Context, req StructuredGeocodeRequest) (*GeocodeResponse, error) {
2026-02-14 15:40:12 +00:00
// https://docs.stadiamaps.com/geocoding-search-autocomplete/structured-search/
// curl "https://api.stadiamaps.com/geocoding/v1/search/structured?address=P%C3%B5hja%20pst%2027a&region=Harju&country=EE&api_key=YOUR-API-KEY"
var result GeocodeResponse
2026-02-25 02:44:35 +00:00
query, err := query.Values(req)
2026-02-14 15:40:12 +00:00
if err != nil {
return nil, fmt.Errorf("structured geocode query: %w", err)
}
2026-02-25 02:44:35 +00:00
//var api_error Error
2026-02-14 15:40:12 +00:00
resp, err := s.client.R().
SetQueryParamsFromValues(query).
2026-02-25 02:44:35 +00:00
SetContext(ctx).
2026-02-14 15:40:12 +00:00
SetResult(&result).
SetPathParam("urlBase", s.urlBase).
SetQueryParam("api_key", s.APIKey).
Get("https://{urlBase}/geocoding/v1/search/structured")
if err != nil {
return nil, fmt.Errorf("structured geocoding get: %w", err)
}
if !resp.IsSuccess() {
return nil, parseError(resp)
2026-02-14 15:40:12 +00:00
}
return &result, nil
}
func (sgr StructuredGeocodeRequest) endpoint() string {
return "/v1/search/structured"
}