Files
ssgf_utils/gps_tool/an_na_qi_client.go
2025-07-17 17:16:49 +08:00

146 lines
4.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package gps_tool
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"net/url"
"strconv"
"time"
"github.com/pkg/errors"
)
type AnNaQiGpsClient struct {
AppCode string
host string
}
func NewAnNaQiGpsClient(appCode string) *AnNaQiGpsClient {
return &AnNaQiGpsClient{
AppCode: appCode,
host: "https://jmgeocode.market.alicloudapi.com",
}
}
func (n *AnNaQiGpsClient) GetGpsInfo(longitude, latitude float64) (res *AddressComponent, err error) {
lo := strconv.FormatFloat(longitude, 'f', 6, 64)
la := strconv.FormatFloat(latitude, 'f', 6, 64)
location := lo + "," + la
// 拼接URL
var fullURL string
fullURL, err = url.JoinPath(n.host, "geocode/regeo_query")
if err != nil {
return nil, errors.Wrapf(err, "获取gps:%s信息失败拼接路径错误", location)
}
param := "location=" + location
// 创建请求
var req *http.Request
req, err = http.NewRequest(http.MethodPost, fullURL, bytes.NewBuffer([]byte(param)))
if err != nil {
return nil, errors.Wrapf(err, "获取gps:%s信息失败创建请求失败", location)
}
// 设置请求头
req.Header.Add("Authorization", "APPCODE "+n.AppCode)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
// 发送请求
// 创建HTTP客户端
client := &http.Client{}
client.Timeout = 5 * time.Second
var resp *http.Response
resp, err = client.Do(req)
if err != nil {
return nil, errors.Wrapf(err, "获取gps:%s信息失败发送请求失败", location)
}
if resp.StatusCode != http.StatusOK {
return nil, errors.New(fmt.Sprintf("获取gps:%s信息失败%+v", location, resp.Status))
}
defer func(Body io.ReadCloser) {
err = Body.Close()
if err != nil {
log.Printf("获取gps:%s信息关闭响应体失败: %+v\n", location, err)
}
}(resp.Body)
// 读取响应体
var body []byte
body, err = io.ReadAll(resp.Body)
if err != nil {
return nil, errors.Wrapf(err, "获取gps:%s信息失败读取响应体失败", location)
}
// 解析JSON响应
var apiResult ApiResult
err = json.Unmarshal(body, &apiResult)
if err != nil {
return nil, errors.Wrapf(err, "获取gps:%s信息失败解析JSON响应失败%s", location, string(body))
}
// 检查API返回状态
if apiResult.Code == 200 {
if len(apiResult.Data.Regeocodes) > 0 {
return &apiResult.Data.Regeocodes[0].AddressComponent, nil
}
}
return nil, errors.New(fmt.Sprintf("获取gps:%s信息失败%+v", location, apiResult))
}
func (n *AnNaQiGpsClient) GetLocation(city, region, address string) (res *[]Geocode, err error) {
values := url.Values{}
values.Set("city", city)
values.Set("address", region+address)
// 创建请求
var req *http.Request
req, err = http.NewRequest(http.MethodPost, n.host+"/geocode/geo/query", bytes.NewBuffer([]byte(values.Encode())))
if err != nil {
return nil, errors.Wrapf(err, "获取经纬度失败,创建请求失败")
}
// 设置请求头
req.Header.Add("Authorization", "APPCODE "+n.AppCode)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
// 发送请求
// 创建HTTP客户端
client := &http.Client{}
client.Timeout = 5 * time.Second
var resp *http.Response
resp, err = client.Do(req)
if err != nil {
return nil, errors.Wrapf(err, "获取经纬度失败,发送请求失败")
}
if resp.StatusCode != http.StatusOK {
return nil, errors.New(fmt.Sprintf("获取经纬度失败,%+v", resp.Status))
}
defer func(Body io.ReadCloser) {
err = Body.Close()
if err != nil {
log.Printf("关闭获取经纬度响应体失败: %+v\n", err)
}
}(resp.Body)
// 读取响应体
var body []byte
body, err = io.ReadAll(resp.Body)
if err != nil {
return nil, errors.Wrapf(err, "获取经纬度失败,读取响应体失败")
}
// 解析JSON响应
var locationInfo LocationInfo
err = json.Unmarshal(body, &locationInfo)
if err != nil {
return nil, errors.Wrapf(err, "获取经纬度失败解析JSON响应失败%s", string(body))
}
// 检查API返回状态
if locationInfo.Code == 200 {
if len(locationInfo.Data.Geocodes) > 0 {
return &locationInfo.Data.Geocodes, nil
}
}
return nil, errors.New(fmt.Sprintf("获取经纬度失败,%+v", locationInfo.Msg))
}