Files
2025-01-22 10:36:28 +08:00

118 lines
2.6 KiB
Go

package gao_map
import (
"github.com/duke-git/lancet/v2/convertor"
"github.com/duke-git/lancet/v2/netutil"
"github.com/duke-git/lancet/v2/strutil"
"net/url"
"strings"
)
const drivingUrl = "https://restapi.amap.com/v5/direction/driving" //驾车
type Direction struct {
client *AmapClient
}
type DrivingRequest struct {
Origin string
Destination string
Strategy int
Waypoints []string
ShowFields string
}
type BicyclingRequest struct {
Origin string
Destination string
ShowFields string
}
type Route struct {
Origin string `json:"origin"`
Destination string `json:"destination"`
Paths []struct {
Distance float64 `json:"distance,string"`
Steps []struct {
Cost struct {
Duration float64 `json:"duration,string"`
Tolls float64 `json:"tolls,string"`
TollsDistance float64 `json:"tolls_distance,string"`
} `json:"cost"`
Cities []struct {
Adcode string `json:"adcode"`
Citycode string `json:"citycode"`
City string `json:"city"`
} `json:"cities"`
Polyline string `json:"polyline"`
} `json:"steps"`
} `json:"paths"`
}
type DrivingResponse struct {
Response
Count int `json:"count,string"`
Route Route `json:"route"`
}
type BicyclingResponse struct {
Response
Count int `json:"count,string"`
Route Route `json:"route"`
}
func (d *Direction) Bicycling(request *BicyclingRequest) (*BicyclingResponse, error) {
val := url.Values{}
val.Set("origin", request.Origin)
val.Set("destination", request.Destination)
if !strutil.IsBlank(request.ShowFields) {
val.Set("show_fields", request.ShowFields)
}
resp, err := d.client.DoRequest(drivingUrl, "POST", val)
if err != nil {
return nil, err
}
var data BicyclingResponse
if err = netutil.ParseHttpResponse(resp, &data); err != nil {
return nil, err
} else if err = checkResponse(data.Response); err != nil {
return nil, err
}
return &data, err
}
func (d *Direction) Driving(request *DrivingRequest) (*DrivingResponse, error) {
val := url.Values{}
val.Set("origin", request.Origin)
val.Set("destination", request.Destination)
val.Set("strategy", convertor.ToString(request.Strategy))
if len(request.Waypoints) > 0 {
val.Set("waypoints", strings.Join(request.Waypoints, ";"))
}
if !strutil.IsBlank(request.ShowFields) {
val.Set("show_fields", request.ShowFields)
}
resp, err := d.client.DoRequest(drivingUrl, "POST", val)
if err != nil {
return nil, err
}
var data DrivingResponse
if err = netutil.ParseHttpResponse(resp, &data); err != nil {
return nil, err
} else if err = checkResponse(data.Response); err != nil {
return nil, err
}
return &data, err
}