6 Commits

Author SHA1 Message Date
yuguojian
9d348523e6 删除其它参数,保留省市 2025-05-25 17:44:31 +08:00
yuguojian
225efe116d init 2025-05-14 18:18:34 +08:00
yuguojian
af1abd701e init 2025-05-14 14:08:42 +08:00
yuguojian
ccb2ae442a init 2025-05-14 14:08:21 +08:00
yuguojian
68c47e1023 init 2025-05-12 23:25:58 +08:00
yuguojian
c3a65f89c6 init 2025-05-12 23:24:18 +08:00
4 changed files with 369 additions and 6 deletions

142
gps_tool/an_na_qi_client.go Normal file
View File

@@ -0,0 +1,142 @@
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)
}
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 {
return nil, errors.New(fmt.Sprintf("获取gps:%s信息失败%+v", location, apiResult))
}
if len(apiResult.Data.Regeocodes) > 0 {
return &apiResult.Data.Regeocodes[0].AddressComponent, nil
}
return nil, errors.New(fmt.Sprintf("获取gps:%s信息失败%+v", location, apiResult))
}
type ApiResult struct {
Data Data `json:"data"`
Msg string `json:"msg"`
Success bool `json:"success"`
Code int `json:"code"`
TaskNo string `json:"taskNo"`
}
type Data struct {
Regeocodes []Regeocode `json:"regeocodes"`
}
type Regeocode struct {
FormattedAddress string `json:"formatted_address"`
AddressComponent AddressComponent `json:"addressComponent"`
}
type AddressComponent struct {
// BusinessAreas []interface{} `json:"businessAreas"`
Country string `json:"country"`
Province string `json:"province"`
Citycode string `json:"citycode"`
City string `json:"city"`
Adcode string `json:"adcode"`
// StreetNumber StreetNumber `json:"streetNumber"`
// Towncode string `json:"towncode"`
// District string `json:"district"`
// Neighborhood Neighborhood `json:"neighborhood"`
// Township string `json:"township"`
// Building Building `json:"building"`
}
type BusinessArea struct {
Name string `json:"name"`
Location string `json:"location"`
Id string `json:"id"`
}
type StreetNumber struct {
Number string `json:"number"`
Distance string `json:"distance"`
Street string `json:"street"`
Location string `json:"location"`
Direction string `json:"direction"`
}
type Neighborhood struct {
Name interface{} `json:"name"`
Type interface{} `json:"type"`
}
type Building struct {
Name interface{} `json:"name"`
Type interface{} `json:"type"`
}

View File

@@ -0,0 +1,177 @@
package gps_tool
import (
"log"
"testing"
)
func TestAnNaQiGpsClient_GetGpsInfo(t *testing.T) {
type fields struct {
AppCode string
Host string
}
type args struct {
longitude float64
latitude float64
}
tests := []struct {
name string
fields fields
args args
wantRes interface{}
wantErr bool
}{
{
name: "test1",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 113.419152,
latitude: 23.186899,
},
},
{
name: "test2",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 110.165223,
latitude: 25.258515,
},
},
{
name: "test2",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 115.928973,
latitude: 28.625388,
},
},
// 107.397284,40.739490
{
name: "test3",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 107.397284,
latitude: 40.739490,
},
},
// 115.929015,28.625383
{
name: "test4",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 115.929015,
latitude: 28.625383,
},
},
// 115.929100,28.625452
{
name: "test5",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 115.929100,
latitude: 28.625452,
},
},
// 126.587051,45.739880
{
name: "test6",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 126.587051,
latitude: 45.739880,
},
},
// 126.587051,45.739880
{
name: "test7",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 126.595051,
latitude: 45.740537,
},
},
// 126.595051,45.740537
{
name: "test8",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 125.342693,
latitude: 43.879634,
},
},
// 125.342693,43.879634
{
name: "test9",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 112.485550,
latitude: 23.061314,
},
},
// 112.485550,23.061314
{
name: "test10",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 115.928821,
latitude: 28.625069,
},
},
// 115.928821,28.625069
{
name: "test11",
fields: fields{
AppCode: "",
Host: "https://jmgeocode.market.alicloudapi.com",
},
args: args{
longitude: 115.928821,
latitude: 28.625069,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
n := &AnNaQiGpsClient{
AppCode: tt.fields.AppCode,
Host: tt.fields.Host,
}
gotRes, err := n.GetGpsInfo(tt.args.longitude, tt.args.latitude)
log.Println(gotRes, err)
})
}
}

View File

@@ -1,4 +1,4 @@
package ip_client
package ip_tool
import (
"encoding/json"
@@ -12,19 +12,19 @@ import (
"github.com/pkg/errors"
)
type HuaChenIpInfo struct {
type HuaChenIpClient struct {
AppCode string
Host string
}
func NewHuaChenIpInfo(appCode string) *HuaChenIpInfo {
return &HuaChenIpInfo{
func NewHuaChenIpClient(appCode string) *HuaChenIpClient {
return &HuaChenIpClient{
AppCode: appCode,
Host: "https://c2ba.api.huachen.cn",
}
}
func (h *HuaChenIpInfo) GetIpInfo(ip string) (res *ApiResult, err error) {
func (h *HuaChenIpClient) GetIpInfo(ip string) (res *ApiResult, err error) {
if ip == "" {
return nil, errors.New("请输入ip地址")
}
@@ -43,7 +43,7 @@ func (h *HuaChenIpInfo) GetIpInfo(ip string) (res *ApiResult, err error) {
client := &http.Client{}
// 创建请求
var req *http.Request
req, err = http.NewRequest("GET", fullURL, nil)
req, err = http.NewRequest(http.MethodGet, fullURL, nil)
if err != nil {
return nil, errors.Wrapf(err, "获取ip:%s信息失败创建请求失败", ip)
}

View File

@@ -0,0 +1,44 @@
package ip_tool
import (
"log"
"testing"
)
func TestHuaChenIpClient_GetIpInfo(t *testing.T) {
type fields struct {
AppCode string
Host string
}
type args struct {
ip string
}
tests := []struct {
name string
fields fields
args args
wantRes *ApiResult
wantErr bool
}{
{
name: "test1",
fields: fields{
AppCode: "",
Host: "https://c2ba.api.huachen.cn",
},
args: args{
ip: "8.138.116.112",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
h := &HuaChenIpClient{
AppCode: tt.fields.AppCode,
Host: tt.fields.Host,
}
gotRes, err := h.GetIpInfo(tt.args.ip)
log.Println(gotRes, err)
})
}
}