nidus-sync/stadia/response_type.go

205 lines
7.8 KiB
Go

package stadia
/*
"address_components": {
"number": "3397",
"postal_code": "84065",
"street": "West Chatel Drive"
},
*/
type AddressComponents struct {
Number string `json:"number"`
PostalCode string `json:"postal_code"`
Street string `json:"street"`
}
type Country struct {
Abbreviation string `json:"abbreviation"`
GID string `json:"gid"`
Name string `json:"name"`
}
type County struct {
Abbreviation string `json:"abbreviation"`
GID string `json:"gid"`
Name string `json:"name"`
}
type Locality struct {
GID string `json:"gid"`
Name string `json:"name"`
}
type Region struct {
Abbreviation string `json:"abbreviation"`
GID string `json:"gid"`
Name string `json:"name"`
}
/*
"country": {
"abbreviation": "USA",
"gid": "whosonfirst:country:85633793",
"name": "United States"
},
"county": {
"abbreviation": "SL",
"gid": "whosonfirst:county:102082877",
"name": "Salt Lake County"
},
"locality": {
"gid": "whosonfirst:locality:101728073",
"name": "Riverton"
},
"region": {
"abbreviation": "UT",
"gid": "whosonfirst:region:85688567",
"name": "Utah"
}
*/
type ContextWhosOnFirst struct {
Country Country `json:"country"`
County County `json:"county"`
Locality Locality `json:"locality"`
Region Region `json:"region"`
}
/*
"context": {
"iso_3166_a2": "US",
"iso_3166_a3": "USA",
"whosonfirst": {...}
}
}
*/
type Context struct {
ISO3166A2 string `json:"iso_3166_a2"`
ISO3166A3 string `json:"iso_3166_a3"`
WhosOnFirst ContextWhosOnFirst `json:"whosonfirst,omitempty"`
}
// GeocodeResponse represents the top-level response from the geocoding API
type GeocodeResponse struct {
BBox []float64 `json:"bbox"` // [W, S, E, N]
ErrorMessage string `json:"error,omitempty"`
Features []GeocodeFeature `json:"features"`
Geocode GeocodeMeta `json:"geocoding"`
Type string `json:"type"` // Should be "FeatureCollection"
}
// GeocodeMeta contains metadata about the geocoding request
type GeocodeMeta struct {
Attribution string `json:"attribution"`
Error string `json:"error,omitempty"` // v2
Errors []string `json:"errors,omitempty"` // v1
Query map[string]interface{} `json:"query,omitempty"`
Warnings []string `json:"warnings,omitempty"`
}
// GeocodeFeature represents a GeoJSON feature in the response
type GeocodeFeature struct {
Type string `json:"type"` // Should be "Feature"
Geometry *GeocodeGeometry `json:"geometry"`
Properties GeocodeProperties `json:"properties"`
}
// GeocodeGeometry represents the GeoJSON geometry
type GeocodeGeometry struct {
Type string `json:"type"` // "Point", "Polygon", etc.
Coordinates []float64 `json:"coordinates"`
}
// GeocodeProperties contains the properties of a geocoding result
type GeocodeProperties struct {
Addendum map[string]interface{} `json:"addendum,omitempty"`
AddressComponents AddressComponents `json:"address_components,omitempty"`
Accuracy string `json:"accuracy"` // 'point'
CoarseLocation *string `json:"coarse_location"` // 'Riverton, UT, USA'
Confidence float64 `json:"confidence"` // 1
Context Context `json:"context,omitempty"` // bunch of stuff
Country string `json:"country"` // 'United States'
CountryA string `json:"country_a"` // 'USA'
CountryCode string `json:"country_code"` // 'US'
CountryGID string `json:"country_gid"` // 'whosonfirst:country:85633793'
County string `json:"county"` // "Tulare County"
CountyA string `json:"county_a"` // 'TL'
CountyGID string `json:"county_gid"` // 'whosonfirst:county:102082895'
FormattedAddressLine string `json:"formatted_address_line"` // '123 Main Street, Riverton, Utah 84065, United States of America'
FormattedAddressLines []string `json:"formatted_address_lines"` // '123 Main Street', 'Riverton, Utah 84065', 'United States of America'
GID string `json:"gid"` // 'openaddresses:address:us/ca/tulare-addresses-county:fe9dfab3d45c4550'
HouseNumber string `json:"housenumber"` // '1234'
ID string `json:"id"` // us/ca/tulare-addresses-county:fe9dfab3d45c4550
Label string `json:"label"` // 1234 Main St, Dinuba, CA, USA
Layer string `json:"layer"` // 'address'
Locality string `json:"locality"` // 'Dinuba'
LocalityGID string `json:"locality_gid"` // 'whosonfirst:locality:85922491'
MatchType string `json:"match_type"` // 'exact'
Name string `json:"name"` // '1234 Main St'
PostalCode string `json:"postalcode"` // '93618'
Precision string `json:"precision"` // 'centroid'
Region string `json:"region"` // 'California'
RegionA string `json:"region_a"` // 'CA'
RegionGID string `json:"region_gid"` // 'whosonfirst:region:85688637'
Source string `json:"source"` // 'openaddresses'
Sources []GeocodeSource `json:"sources"`
SourceID string `json:"source_id"` // 'us/ca/tulare-addresses-county:fe9dfab3d45c4550'
Street string `json:"street"` // 'Main Street'
}
// GeocodeSource represents a source of geocoding data
type GeocodeSource struct {
FixitURL string `json:"fixit_url"`
Source string `json:"source"`
SourceID string `json:"source_id"`
}
func (gf GeocodeFeature) CountryCode() string {
if gf.Properties.CountryCode != "" {
return gf.Properties.CountryCode
}
if gf.Properties.Context.ISO3166A3 != "" {
return gf.Properties.Context.ISO3166A3
}
if gf.Properties.Context.WhosOnFirst.Country.Abbreviation != "" {
return gf.Properties.Context.WhosOnFirst.Country.Abbreviation
}
return ""
}
func (gf GeocodeFeature) Locality() string {
if gf.Properties.Locality != "" {
return gf.Properties.Locality
}
if gf.Properties.Context.WhosOnFirst.Locality.Name != "" {
return gf.Properties.Context.WhosOnFirst.Locality.Name
}
return ""
}
func (gf GeocodeFeature) Number() string {
return gf.Properties.AddressComponents.Number
}
func (gf GeocodeFeature) PostalCode() string {
if gf.Properties.PostalCode != "" {
return gf.Properties.PostalCode
}
if gf.Properties.AddressComponents.PostalCode != "" {
return gf.Properties.AddressComponents.PostalCode
}
return ""
}
func (gf GeocodeFeature) Region() string {
if gf.Properties.Region != "" {
return gf.Properties.Region
}
if gf.Properties.Context.WhosOnFirst.Region.Name != "" {
return gf.Properties.Context.WhosOnFirst.Region.Name
}
return ""
}
func (gf GeocodeFeature) Street() string {
if gf.Properties.Street != "" {
return gf.Properties.Street
}
if gf.Properties.AddressComponents.Street != "" {
return gf.Properties.AddressComponents.Street
}
return ""
}