mirror of
https://github.com/imjasonh/staticmaps
synced 2026-07-08 02:45:10 +00:00
75 lines
2 KiB
Go
75 lines
2 KiB
Go
package maps
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
// StreetView requests a static StreetView image of the requested size.
|
|
func StreetView(ctx context.Context, s Size, opts *StreetViewOpts) (io.ReadCloser, error) {
|
|
resp, err := do(ctx, baseURL+streetview(s, opts))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if resp.StatusCode != http.StatusOK {
|
|
return nil, HTTPError{resp}
|
|
}
|
|
return resp.Body, nil
|
|
}
|
|
|
|
func streetview(s Size, opts *StreetViewOpts) string {
|
|
p := url.Values{}
|
|
p.Set("size", s.String())
|
|
opts.update(p)
|
|
return "streetview?" + p.Encode()
|
|
}
|
|
|
|
// StreetViewOpts defines options for StreetView requests.
|
|
type StreetViewOpts struct {
|
|
// Location specifies the location where the image should be snapped from.
|
|
Location Location
|
|
|
|
// Pano specifies a specific Panoramio ID.
|
|
Pano string
|
|
|
|
// Heading specifies the compass heading (between 0 and 360) of the camera.
|
|
//
|
|
// Both 0 and 360 indicate North, 90 indicates East, 180 indicates South, and so on.
|
|
//
|
|
// If no heading is specified, a value will be calculated that directs the camera towards the specified Location, from a point at which the closest photograph was taken.
|
|
Heading *float64
|
|
|
|
// FOV specifies the field of view of the image.
|
|
//
|
|
// Accepted values are between 0 and 120, and if no value is given, a field of view of 90 degrees will be used.
|
|
FOV *float64
|
|
|
|
// Pitch specifies the up or down angle of the camera relative to the Street View vehicle.
|
|
//
|
|
// This is often, but not always, flat horizontal. Positive values angle the camera up (90 degrees indicating straight up); negative values angle the camera down (-90 indicates straight down).
|
|
Pitch float64
|
|
}
|
|
|
|
func (s *StreetViewOpts) update(p url.Values) {
|
|
if s == nil {
|
|
return
|
|
}
|
|
if s.Location != nil {
|
|
p.Set("location", s.Location.Location())
|
|
}
|
|
if s.Pano != "" {
|
|
p.Set("pano", s.Pano)
|
|
}
|
|
if s.Heading != nil {
|
|
p.Set("heading", fmt.Sprintf("%f", *s.Heading))
|
|
}
|
|
if s.FOV != nil {
|
|
p.Set("fov", fmt.Sprintf("%f", *s.FOV))
|
|
}
|
|
if s.Pitch != 0 {
|
|
p.Set("pitch", fmt.Sprintf("%f", s.Pitch))
|
|
}
|
|
}
|