将所有地图改为腾讯地图
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
package autonavi
|
package autonavi
|
||||||
|
|
||||||
import (
|
/*import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -120,3 +120,4 @@ func (a *API) GetCoordinateFromAddressByPageAll(address string, cityCode int) (g
|
|||||||
}
|
}
|
||||||
return getCoordinateFromAddressByPageAllResult, err
|
return getCoordinateFromAddressByPageAllResult, err
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package autonavi
|
package autonavi
|
||||||
|
|
||||||
|
/*
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@@ -22,3 +23,4 @@ func TestGetCoordinateFromAddressByPageAll(t *testing.T) {
|
|||||||
}
|
}
|
||||||
t.Log(utils.Format4Output(result, false))
|
t.Log(utils.Format4Output(result, false))
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|||||||
@@ -1,14 +1,6 @@
|
|||||||
package autonavi
|
package autonavi
|
||||||
|
|
||||||
import (
|
/*
|
||||||
"testing"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi"
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
|
|
||||||
"go.uber.org/zap"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
autonaviAPI *API
|
autonaviAPI *API
|
||||||
sugarLogger *zap.SugaredLogger
|
sugarLogger *zap.SugaredLogger
|
||||||
@@ -158,3 +150,4 @@ func TestAA(t *testing.T) {
|
|||||||
}
|
}
|
||||||
t.Log(utils.Format4Output(result, false))
|
t.Log(utils.Format4Output(result, false))
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|||||||
@@ -1,13 +1,7 @@
|
|||||||
package autonavi
|
package autonavi
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetCyclingPlan 获取骑手的骑行计划
|
// GetCyclingPlan 获取骑手的骑行计划
|
||||||
func (a *API) GetCyclingPlan(origin, destination string) ([]string, int64, int64, error) {
|
/*func (a *API) GetCyclingPlan(origin, destination string) ([]string, int64, int64, error) {
|
||||||
param := map[string]interface{}{
|
param := map[string]interface{}{
|
||||||
"key": a.key,
|
"key": a.key,
|
||||||
"origin": origin,
|
"origin": origin,
|
||||||
@@ -45,3 +39,4 @@ func (a *API) GetCyclingPlan(origin, destination string) ([]string, int64, int64
|
|||||||
|
|
||||||
return polyLineList, distance, duration, nil
|
return polyLineList, distance, duration, nil
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
package autonavi
|
package autonavi
|
||||||
|
|
||||||
import (
|
/*
|
||||||
"fmt"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestGetCyclingPlan(t *testing.T) {
|
func TestGetCyclingPlan(t *testing.T) {
|
||||||
key := "cb4ea3516f88c0fd8fed73f92aeddffa"
|
key := "cb4ea3516f88c0fd8fed73f92aeddffa"
|
||||||
a := New(key)
|
a := New(key)
|
||||||
@@ -19,3 +15,4 @@ func TestLng(t *testing.T) {
|
|||||||
origin := fmt.Sprintf("%f,%f", 113.854912, 22.601450)
|
origin := fmt.Sprintf("%f,%f", 113.854912, 22.601450)
|
||||||
fmt.Println(origin)
|
fmt.Println(origin)
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|||||||
@@ -1,20 +1,5 @@
|
|||||||
package baidunavi
|
package baidunavi
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/md5"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi"
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
signKey = "sn"
|
signKey = "sn"
|
||||||
resultKey = "result"
|
resultKey = "result"
|
||||||
@@ -33,6 +18,11 @@ const (
|
|||||||
StatusCodeExceedConcurrentQuota = 402 // 当前并发量已经超过约定并发配额,并且服务总并发量也已经超过设定的总并发配额,限制访问
|
StatusCodeExceedConcurrentQuota = 402 // 当前并发量已经超过约定并发配额,并且服务总并发量也已经超过设定的总并发配额,限制访问
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//bd09ll表示百度经纬度坐标,
|
||||||
|
//bd09mc表示百度墨卡托坐标,
|
||||||
|
//gcj02表示经过国测局加密的坐标,
|
||||||
|
//wgs84表示gps获取的坐标,
|
||||||
|
|
||||||
const (
|
const (
|
||||||
CoordSysWGS84 = 1 // GPS设备获取的角度坐标,WGS84坐标
|
CoordSysWGS84 = 1 // GPS设备获取的角度坐标,WGS84坐标
|
||||||
CoordSysGCJ02 = 3 // google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标,国测局(GCJ02)坐标
|
CoordSysGCJ02 = 3 // google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标,国测局(GCJ02)坐标
|
||||||
@@ -42,6 +32,7 @@ const (
|
|||||||
CoordSysBaidu2Gaode = "5" // 百度坐标转高德坐标
|
CoordSysBaidu2Gaode = "5" // 百度坐标转高德坐标
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
const (
|
const (
|
||||||
MaxCoordsConvBatchSize = 100
|
MaxCoordsConvBatchSize = 100
|
||||||
)
|
)
|
||||||
@@ -163,39 +154,6 @@ func genGetURL(baseURL, apiStr string, params map[string]interface{}) string {
|
|||||||
return baseURL + queryString
|
return baseURL + queryString
|
||||||
}
|
}
|
||||||
|
|
||||||
/*func (a *API) AccessAPI(apiStr string, params map[string]interface{}) (retVal interface{}, err error) {
|
|
||||||
apiStr += "/"
|
|
||||||
params2 := utils.MergeMaps(utils.Params2Map("ak", a.ak, "output", "json"), params)
|
|
||||||
params2[signKey] = a.signParams(apiStr, params2)
|
|
||||||
|
|
||||||
err = platformapi.AccessPlatformAPIWithRetry(a.client,
|
|
||||||
func() *http.Request {
|
|
||||||
//request, _ := http.NewRequest(http.MethodGet, genGetURL(prodURL, apiStr, params2), nil)
|
|
||||||
request, _ := http.NewRequest(http.MethodGet, genGetURL(prodURL2, apiStr, params2), nil)
|
|
||||||
return request
|
|
||||||
},
|
|
||||||
a.config,
|
|
||||||
func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) {
|
|
||||||
if jsonResult1 == nil {
|
|
||||||
return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil")
|
|
||||||
}
|
|
||||||
status := int(utils.MustInterface2Int64(jsonResult1["status"]))
|
|
||||||
if status == StatusCodeSuccess {
|
|
||||||
retVal = jsonResult1[resultKey]
|
|
||||||
return platformapi.ErrLevelSuccess, nil
|
|
||||||
}
|
|
||||||
newErr := utils.NewErrorIntCode(utils.Interface2String(jsonResult1["message"]), status)
|
|
||||||
if _, ok := exceedLimitCodes[status]; ok {
|
|
||||||
return platformapi.ErrLevelRecoverableErr, newErr
|
|
||||||
} else if _, ok := canRetryCodes[status]; ok {
|
|
||||||
return platformapi.ErrLevelRecoverableErr, newErr
|
|
||||||
} else {
|
|
||||||
return platformapi.ErrLevelCodeIsNotOK, newErr
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return retVal, err
|
|
||||||
}*/
|
|
||||||
|
|
||||||
func (a *API) AccessAPI2(apiStr string, param url.Values) (retVal map[string]interface{}, err error) {
|
func (a *API) AccessAPI2(apiStr string, param url.Values) (retVal map[string]interface{}, err error) {
|
||||||
|
|
||||||
for _, v := range BaiduAKList {
|
for _, v := range BaiduAKList {
|
||||||
@@ -229,29 +187,6 @@ func (a *API) AccessAPI2(apiStr string, param url.Values) (retVal map[string]int
|
|||||||
return nil, errors.New("所有百度应用额度均用完")
|
return nil, errors.New("所有百度应用额度均用完")
|
||||||
}
|
}
|
||||||
|
|
||||||
// BatchCoordinateConvert 坐标转换
|
|
||||||
//func (a *API) BatchCoordinateConvert(coords []*Coordinate, fromCoordSys, toCoordSys int) (outCoords []*Coordinate, err error) {
|
|
||||||
// if fromCoordSys == toCoordSys {
|
|
||||||
// return coords, nil
|
|
||||||
// }
|
|
||||||
// var coordsStrList []string
|
|
||||||
// for _, v := range coords {
|
|
||||||
// coordsStrList = append(coordsStrList, fmt.Sprintf("%.6f,%.6f", v.Lng, v.Lat))
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// params := url.Values{
|
|
||||||
// "coords": []string{strings.Join(coordsStrList, ";")},
|
|
||||||
// "from": []string{utils.Int2Str(fromCoordSys)},
|
|
||||||
// "to": []string{utils.Int2Str(toCoordSys)},
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// result, err := a.AccessAPI2("geoconv/v1/", params)
|
|
||||||
// if err == nil {
|
|
||||||
// err = utils.Map2StructByJson(result[resultKey], &outCoords, false)
|
|
||||||
// }
|
|
||||||
// return outCoords, err
|
|
||||||
//}
|
|
||||||
|
|
||||||
// BatchCoordinateConvert 坐标转换
|
// BatchCoordinateConvert 坐标转换
|
||||||
func (a *API) BatchCoordinateConvert(coords []*Coordinate, changeType string) (outCoords []*Coordinate, err error) {
|
func (a *API) BatchCoordinateConvert(coords []*Coordinate, changeType string) (outCoords []*Coordinate, err error) {
|
||||||
var coordsStrList []string
|
var coordsStrList []string
|
||||||
@@ -273,20 +208,6 @@ func (a *API) BatchCoordinateConvert(coords []*Coordinate, changeType string) (o
|
|||||||
return outCoords, err
|
return outCoords, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// BatchCoordinateConvertBai2Gao 百度转高德
|
|
||||||
func (a *API) BatchCoordinateConvertBai2Gao(coords []string, changeType string) (outCoords []*Coordinate, err error) {
|
|
||||||
params := url.Values{
|
|
||||||
"coords": []string{strings.Join(coords, ";")},
|
|
||||||
"model": []string{changeType}, // 1:高德转百度 5:百度转高德
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := a.AccessAPI2("geoconv/v2/", params)
|
|
||||||
if err == nil {
|
|
||||||
err = utils.Map2StructByJson(result[resultKey], &outCoords, false)
|
|
||||||
}
|
|
||||||
return outCoords, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// DirectionLiteRide 获取骑行距离
|
// DirectionLiteRide 获取骑行距离
|
||||||
func (a *API) DirectionLiteRide(coords []*Coordinate) (retVal interface{}, err error) {
|
func (a *API) DirectionLiteRide(coords []*Coordinate) (retVal interface{}, err error) {
|
||||||
var (
|
var (
|
||||||
@@ -309,3 +230,4 @@ func (a *API) DirectionLiteRide(coords []*Coordinate) (retVal interface{}, err e
|
|||||||
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|||||||
@@ -1,40 +1,5 @@
|
|||||||
package baidunavi
|
package baidunavi
|
||||||
|
|
||||||
// RiderPath 骑行路线
|
|
||||||
//type RiderPath struct {
|
|
||||||
// Status int `json:"status"` // 状态码 0-成功,1-服务器内部错误,2-参数无效,7-无结果返回
|
|
||||||
// Message string `json:"message"` // 状态码对应的信息
|
|
||||||
// Result struct {
|
|
||||||
// RiderResult
|
|
||||||
// Routes []struct {
|
|
||||||
// Distance int `json:"distance"` // 距离米
|
|
||||||
// Duration int `json:"duration"` // 时间秒
|
|
||||||
// Steps []struct {
|
|
||||||
// Distance int `json:"distance"`
|
|
||||||
// Duration int `json:"duration"`
|
|
||||||
// Direction int `json:"direction"`
|
|
||||||
// TurnType string `json:"turn_type"`
|
|
||||||
// Name string `json:"name"`
|
|
||||||
// Instruction string `json:"instruction"`
|
|
||||||
// RestrictionsInfo string `json:"restrictions_info"`
|
|
||||||
// Path string `json:"path"`
|
|
||||||
// StartLocation RiderCoordinate `json:"start_location"`
|
|
||||||
// EndLocation RiderCoordinate `json:"end_location"`
|
|
||||||
// } `json:"steps"`
|
|
||||||
// } `json:"routes"`
|
|
||||||
// } `json:"result"`
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//type RiderResult struct {
|
|
||||||
// Origin RiderCoordinate `json:"origin"` // 起点经纬度
|
|
||||||
// Destination RiderCoordinate `json:"destination"` // 终点经纬度
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//type RiderCoordinate struct {
|
|
||||||
// Lng float64 `json:"lng"` // 经度
|
|
||||||
// Lat float64 `json:"lat"` // 纬度
|
|
||||||
//}
|
|
||||||
|
|
||||||
type RiderPath struct {
|
type RiderPath struct {
|
||||||
Destination struct {
|
Destination struct {
|
||||||
Lat float64 `json:"lat"`
|
Lat float64 `json:"lat"`
|
||||||
|
|||||||
@@ -1354,13 +1354,6 @@ var cc []string = []string{
|
|||||||
"104.05971492107,30.624174347628",
|
"104.05971492107,30.624174347628",
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBatchCoordinateConvertBai2Gao(t *testing.T) {
|
|
||||||
fmt.Println(len(cc))
|
|
||||||
result, err := api.BatchCoordinateConvertBai2Gao(cc[0:100], "5")
|
|
||||||
fmt.Println(err)
|
|
||||||
fmt.Println(result)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1290 104.00734814129,30.660267081943
|
// 1290 104.00734814129,30.660267081943
|
||||||
func TestName(t *testing.T) {
|
func TestName(t *testing.T) {
|
||||||
var bd_lng = 104.00734814129
|
var bd_lng = 104.00734814129
|
||||||
|
|||||||
@@ -26,7 +26,9 @@ func TestShopCategoryGet(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestShopGet222(t *testing.T) {
|
func TestShopGet222(t *testing.T) {
|
||||||
api.ShopGet("669168", 0)
|
data, err := api.ShopGet("", 32267258844)
|
||||||
|
fmt.Println(data)
|
||||||
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestShopCategoryUpdate(t *testing.T) {
|
func TestShopCategoryUpdate(t *testing.T) {
|
||||||
|
|||||||
@@ -29,11 +29,11 @@ func init() {
|
|||||||
// 天天果园
|
// 天天果园
|
||||||
//api = New("c45e6510-00ba-4be2-977e-bcb9c9792cc7", "5d5577a2506f41b8b4ec520ba83490f5", "0b01b9eeb15b41dab1c3d05d95c17a26")
|
//api = New("c45e6510-00ba-4be2-977e-bcb9c9792cc7", "5d5577a2506f41b8b4ec520ba83490f5", "0b01b9eeb15b41dab1c3d05d95c17a26")
|
||||||
// 京东果园 320406
|
// 京东果园 320406
|
||||||
//api = New("c454ef86-2213-4860-9a31-f2ef7e883386", "1dba76d40cac446ca500c0391a0b6c9d", "a88d031a1e7b462cb1579f12e97fe7f4")
|
api = New("1e87595b-e850-4ba4-9ee0-53bcfe383a4f", "1dba76d40cac446ca500c0391a0b6c9d", "a88d031a1e7b462cb1579f12e97fe7f4")
|
||||||
// 果切 379599
|
// 果切 379599
|
||||||
//api = New("ad4061a1-6a5c-43f9-bf51-b1232fd9499d", "f2ed33075faf4773a47e065acd79532b", "aed14cbbecac4456843570e90c5f46ec")
|
//api = New("ad4061a1-6a5c-43f9-bf51-b1232fd9499d", "f2ed33075faf4773a47e065acd79532b", "aed14cbbecac4456843570e90c5f46ec")
|
||||||
// 381564
|
// 381564
|
||||||
api = New("8d9e4443-3536-41ae-b6c7-677f90f1978b", "d2d1e2e3213d4320bc2712a684307831", "1750f5b9848d4a6492c1c20b487074da")
|
//api = New("8d9e4443-3536-41ae-b6c7-677f90f1978b", "d2d1e2e3213d4320bc2712a684307831", "1750f5b9848d4a6492c1c20b487074da")
|
||||||
// 384633
|
// 384633
|
||||||
///api = New("02a3f772-89f3-46f1-bbd5-74be346cba54", "e496a0f9b88a407297fea283b8dc9e29", "9bb82ffbec144c4b8fc8d627e5ca6a35")
|
///api = New("02a3f772-89f3-46f1-bbd5-74be346cba54", "e496a0f9b88a407297fea283b8dc9e29", "9bb82ffbec144c4b8fc8d627e5ca6a35")
|
||||||
|
|
||||||
|
|||||||
@@ -133,9 +133,9 @@ func TestOrderAddTips(t *testing.T) {
|
|||||||
|
|
||||||
func TestOrderQuery2(t *testing.T) {
|
func TestOrderQuery2(t *testing.T) {
|
||||||
orderList, _, err := api.OrderQuery2(&OrderQueryParam{
|
orderList, _, err := api.OrderQuery2(&OrderQueryParam{
|
||||||
OrderPurchaseTimeBegin: "2024-04-09 00:00:00",
|
OrderPurchaseTimeBegin: "2024-07-20 00:00:00",
|
||||||
OrderPurchaseTimeEnd: "2024-04-09 23:59:59",
|
OrderPurchaseTimeEnd: "2024-07-29 23:59:59",
|
||||||
DeliveryStationNo: "12781207",
|
DeliveryStationNo: "12297793",
|
||||||
PageNo: 1,
|
PageNo: 1,
|
||||||
PageSize: 99999,
|
PageSize: 99999,
|
||||||
})
|
})
|
||||||
|
|||||||
146
platformapi/tencent_map/tencent.go
Normal file
146
platformapi/tencent_map/tencent.go
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
package tencent_map
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi"
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
"net/http"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
signKey = "sig"
|
||||||
|
BaseUrl = `https://apis.map.qq.com` // 基础访问链接
|
||||||
|
TencentCoordinateApi = "/ws/coord/v1/translate" // 坐标转换API
|
||||||
|
TencentCyclingPlanning = "/ws/direction/v1/ebicycling" // 电动骑行车规划API
|
||||||
|
TencentWalkingPlanning = "/ws/direction/v1/walking" // 步行规划API
|
||||||
|
TencentGeoAddress2Code = "/ws/geocoder/v1" // 地址解析,地址逆转坐标 // https://lbs.qq.com/service/webService/webServiceGuide/address/Geocoder
|
||||||
|
TencentCoder2Address = "/ws/geocoder/v1" // 地址逆解析,坐标转地址 // https://lbs.qq.com/service/webService/webServiceGuide/address/Gcoder
|
||||||
|
TencentGetDistrictList = "/ws/district/v1/list" // 本接口用于获取全部省市区三级行政区划列表。
|
||||||
|
TencentGetChildrenList = "/ws/district/v1/getchildren" // 根据父级code获取行政区划
|
||||||
|
|
||||||
|
// 坐标转换类型(输入类型)
|
||||||
|
CoordinateChangeTypeGPS = 1 // GPS坐标
|
||||||
|
CoordinateChangeTypeSoGou = 2 // 搜狗坐标
|
||||||
|
CoordinateChangeTypeBaidu = 3 // 百度坐标
|
||||||
|
CoordinateChangeTypeMapbar = 4 // mapbar
|
||||||
|
CoordinateChangeTypeGaoDe = 5 // [默认]腾讯、google、高德坐标
|
||||||
|
CoordinateChangeTypeSoGouMt = 6 // 搜狗墨脱
|
||||||
|
|
||||||
|
DistrictLevelCountry = 0 // 国家
|
||||||
|
DistrictLevelProvince = 1 // 省
|
||||||
|
DistrictLevelCity = 2 // 市
|
||||||
|
DistrictLevelDistrict = 3 // 县
|
||||||
|
DistrictLevelStreet = 4 // 街道
|
||||||
|
|
||||||
|
MaxConvertCount = 40
|
||||||
|
)
|
||||||
|
|
||||||
|
type API struct {
|
||||||
|
platformapi.APICookie
|
||||||
|
|
||||||
|
client *http.Client
|
||||||
|
config *platformapi.APIConfig
|
||||||
|
key string
|
||||||
|
sk string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) SetKey(key string) {
|
||||||
|
a.key = key
|
||||||
|
}
|
||||||
|
func (a *API) GetKey() string {
|
||||||
|
return a.key
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) SetSK(sk string) {
|
||||||
|
a.sk = sk
|
||||||
|
}
|
||||||
|
func (a *API) GetSK() string {
|
||||||
|
return a.sk
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(key, sk string, config ...*platformapi.APIConfig) *API {
|
||||||
|
curConfig := platformapi.DefAPIConfig
|
||||||
|
if len(config) > 0 {
|
||||||
|
curConfig = *config[0]
|
||||||
|
}
|
||||||
|
return &API{
|
||||||
|
key: key,
|
||||||
|
sk: sk,
|
||||||
|
client: &http.Client{Timeout: curConfig.ClientTimeout},
|
||||||
|
config: &curConfig,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) signParams(params map[string]interface{}, url string) string {
|
||||||
|
if params["key"] == nil || params["key"].(string) == "" {
|
||||||
|
params["key"] = a.GetKey()
|
||||||
|
}
|
||||||
|
params2 := utils.Map2URLValues(params)
|
||||||
|
|
||||||
|
keys := make([]string, 0)
|
||||||
|
for k := range params2 {
|
||||||
|
if k != signKey {
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort.Strings(keys)
|
||||||
|
finalStr := ""
|
||||||
|
for index, key := range keys {
|
||||||
|
valStr := strings.Join(params2[key], "")
|
||||||
|
if valStr != "" {
|
||||||
|
finalStr += key + "=" + valStr
|
||||||
|
if index+1 != len(keys) {
|
||||||
|
finalStr += "&"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sign := url + "?" + finalStr + a.GetSK()
|
||||||
|
return fmt.Sprintf("%x", md5.Sum([]byte(sign)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) AccessAPI(baseUrl, actionApi, method string, bizParams map[string]interface{}) (retVal map[string]interface{}, err error) {
|
||||||
|
if bizParams["key"] == nil || bizParams["key"].(string) == "" {
|
||||||
|
bizParams["key"] = a.GetKey()
|
||||||
|
}
|
||||||
|
// 序列化
|
||||||
|
data, err := json.Marshal(bizParams)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送请求
|
||||||
|
sendUrl := func() *http.Request {
|
||||||
|
var request *http.Request
|
||||||
|
if http.MethodPost == method {
|
||||||
|
request, _ = http.NewRequest(http.MethodPost, utils.GenerateGetURL(baseUrl, actionApi, nil), strings.NewReader(string(data)))
|
||||||
|
} else {
|
||||||
|
request, _ = http.NewRequest(http.MethodGet, utils.GenerateGetURL(baseUrl, actionApi, bizParams), nil)
|
||||||
|
}
|
||||||
|
request.Header.Set("Content-Type", "application/json")
|
||||||
|
return request
|
||||||
|
}
|
||||||
|
|
||||||
|
// 数据解析
|
||||||
|
dataMarshal := func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) {
|
||||||
|
if jsonResult1 == nil {
|
||||||
|
return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil")
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if utils.MustInterface2Int64(jsonResult1["status"]) != 0 {
|
||||||
|
errLevel = platformapi.ErrLevelGeneralFail
|
||||||
|
err = utils.NewErrorCode(jsonResult1["message"].(string), utils.Int64ToStr(utils.MustInterface2Int64(jsonResult1["status"])))
|
||||||
|
}
|
||||||
|
retVal = jsonResult1
|
||||||
|
return errLevel, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = platformapi.AccessPlatformAPIWithRetry(a.client, sendUrl, a.config, dataMarshal)
|
||||||
|
return retVal, err
|
||||||
|
}
|
||||||
314
platformapi/tencent_map/tencent_api.go
Normal file
314
platformapi/tencent_map/tencent_api.go
Normal file
@@ -0,0 +1,314 @@
|
|||||||
|
package tencent_map
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TencentCoordinateChange 腾讯坐标转换(其他坐标转换为腾讯坐标)
|
||||||
|
func (a *API) TencentCoordinateChange(param *TencentCoordinateChangeReq) ([]*LocationsCoordinateObj, error) {
|
||||||
|
requestParam := utils.Struct2Map(param, "", false)
|
||||||
|
requestParam["sig"] = a.signParams(requestParam, TencentCoordinateApi)
|
||||||
|
result, err := a.AccessAPI(BaseUrl, TencentCoordinateApi, http.MethodGet, requestParam)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resultByte, err := json.Marshal(result)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
data := &TencentCoordinateChangeRes{}
|
||||||
|
if err = json.Unmarshal(resultByte, data); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Status != 0 {
|
||||||
|
return nil, fmt.Errorf("%s", data.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
locations := make([]*LocationsCoordinateObj, 0, 0)
|
||||||
|
for _, v := range data.Locations {
|
||||||
|
locations = append(locations, &LocationsCoordinateObj{
|
||||||
|
Lat: v.Lat.String(),
|
||||||
|
Lng: v.Lng.String(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return locations, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TencentCyclingPlanning 腾讯电动车骑行规划
|
||||||
|
func (a *API) TencentCyclingPlanning(param *TencentCyclingPlanningReq) (distance int64, duration int64, coordinatePoint []string, err error) {
|
||||||
|
requestParam := utils.Struct2Map(param, "", false)
|
||||||
|
requestParam["sig"] = a.signParams(requestParam, TencentCyclingPlanning)
|
||||||
|
result, err := a.AccessAPI(BaseUrl, TencentCyclingPlanning, http.MethodGet, requestParam)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, nil, err
|
||||||
|
}
|
||||||
|
resultByte, err := json.Marshal(result)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, nil, err
|
||||||
|
}
|
||||||
|
data := &TencentCyclingPlanningRes{}
|
||||||
|
if err = json.Unmarshal(resultByte, data); err != nil {
|
||||||
|
return 0, 0, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Status != 0 {
|
||||||
|
return 0, 0, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range data.Result["routes"] {
|
||||||
|
distance = v.Distance
|
||||||
|
duration = v.Duration
|
||||||
|
|
||||||
|
pointList := make([]string, 0, len(v.Polyline))
|
||||||
|
pointList = append(pointList, v.Polyline[0].String())
|
||||||
|
pointList = append(pointList, v.Polyline[1].String())
|
||||||
|
for i := 2; i < len(v.Polyline); i++ {
|
||||||
|
point1 := utils.Str2Float64(pointList[i-2])
|
||||||
|
point2, _ := v.Polyline[i].Float64()
|
||||||
|
pointList = append(pointList, fmt.Sprintf("%.6f", point1+point2/float64(1000000)))
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < len(pointList); i += 2 {
|
||||||
|
coordinatePoint = append(coordinatePoint, fmt.Sprintf("%s,%s", pointList[i+1], pointList[i]))
|
||||||
|
}
|
||||||
|
globals.SugarLogger.Debugf("调换后 : %s", utils.Format4Output(coordinatePoint, false))
|
||||||
|
|
||||||
|
return distance, duration, coordinatePoint, nil
|
||||||
|
}
|
||||||
|
return 0, 0, nil, fmt.Errorf("骑行计划获取异常")
|
||||||
|
}
|
||||||
|
|
||||||
|
// WalkingDistance 获取两点之间的步行距离
|
||||||
|
func (a *API) WalkingDistance(param *TencentCyclingPlanningReq) (distance int64, err error) {
|
||||||
|
requestParam := utils.Struct2Map(param, "", false)
|
||||||
|
requestParam["sig"] = a.signParams(requestParam, TencentWalkingPlanning)
|
||||||
|
result, err := a.AccessAPI(BaseUrl, TencentWalkingPlanning, http.MethodGet, requestParam)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
resultByte, err := json.Marshal(result)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
data := &TencentCyclingPlanningRes{}
|
||||||
|
if err = json.Unmarshal(resultByte, data); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Status != 0 {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range data.Result["routes"] {
|
||||||
|
return v.Distance, nil
|
||||||
|
//duration = v.Duration
|
||||||
|
//
|
||||||
|
//pointList := make([]string, 0, len(v.Polyline))
|
||||||
|
//pointList = append(pointList, v.Polyline[0].String())
|
||||||
|
//pointList = append(pointList, v.Polyline[1].String())
|
||||||
|
//for i := 2; i < len(v.Polyline); i++ {
|
||||||
|
// point1 := utils.Str2Float64(pointList[i-2])
|
||||||
|
// point2, _ := v.Polyline[i].Float64()
|
||||||
|
// pointList = append(pointList, fmt.Sprintf("%.6f", point1+point2/float64(1000000)))
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//for i := 0; i < len(pointList); i += 2 {
|
||||||
|
// coordinatePoint = append(coordinatePoint, fmt.Sprintf("%s,%s", pointList[i+1], pointList[i]))
|
||||||
|
//}
|
||||||
|
//globals.SugarLogger.Debugf("调换后 : %s", utils.Format4Output(coordinatePoint, false))
|
||||||
|
//
|
||||||
|
//return distance, duration, coordinatePoint, nil
|
||||||
|
}
|
||||||
|
return 0, fmt.Errorf("步行计划获取异常")
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCoordinateFromAddress 根据地址或者城市code获取坐标已经城市编码
|
||||||
|
func (a *API) GetCoordinateFromAddress(address string, cityInfo string) (lng, lat float64, districtCode int, districtName string, err error) {
|
||||||
|
if address == "" {
|
||||||
|
return 0, 0, 0, "", fmt.Errorf("地址信息不能为空")
|
||||||
|
}
|
||||||
|
|
||||||
|
requestParam := map[string]interface{}{
|
||||||
|
"address": address,
|
||||||
|
"key": a.key,
|
||||||
|
}
|
||||||
|
requestParam["sig"] = a.signParams(requestParam, TencentGeoAddress2Code)
|
||||||
|
result, err := a.AccessAPI(BaseUrl, TencentGeoAddress2Code, http.MethodGet, requestParam)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, 0, "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
data := &AddressGeoCoderChangeRes{}
|
||||||
|
if err := utils.Map2StructByJson(result, data, false); err != nil {
|
||||||
|
return 0, 0, 0, "", err
|
||||||
|
}
|
||||||
|
lng, _ = data.Result.Location.Lng.Float64()
|
||||||
|
lat, _ = data.Result.Location.Lat.Float64()
|
||||||
|
|
||||||
|
return lng, lat, utils.Str2Int(data.Result.AdInfo.AdCode), data.Result.AddressComponents.District, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GeoCodeRegeoSingle 根据坐标获取地址信息
|
||||||
|
func (a *API) GeoCodeRegeoSingle(lng, lat float64, radius int, isExt bool, poiTypes []string, roadLevel, homeOrCorp int) (coordInfo *Codes2AddressRes, err error) {
|
||||||
|
param := map[string]interface{}{
|
||||||
|
"location": utils.Float64ToStr(lat) + "," + utils.Float64ToStr(lng),
|
||||||
|
"key": a.key,
|
||||||
|
}
|
||||||
|
param["sig"] = a.signParams(param, TencentCoder2Address)
|
||||||
|
result, err := a.AccessAPI(BaseUrl, TencentCoder2Address, http.MethodGet, param)
|
||||||
|
|
||||||
|
resultByte, err := json.Marshal(result)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = json.Unmarshal(resultByte, &coordInfo); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return coordInfo, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDistricts 行政区划查询 subdistrict子级行政区 keywords 关键字
|
||||||
|
func (a *API) GetDistricts(subDistrict int, keywords string, level int) (districtList []*District, err error) {
|
||||||
|
// 之前是使用的高德地图更新的,高德更新的地图在直辖市的时候,比腾讯地图多了一行数据
|
||||||
|
// 行政区划长时间不会改变,所以不在更新本地存储的行政区划直接跳过
|
||||||
|
// 110000 北京市 0 1 010 100001 131 1 0 1 0
|
||||||
|
// 110100 北京市 110000 2 010 1 0 1 730 0 0
|
||||||
|
if subDistrict == 3 && keywords == "" {
|
||||||
|
return nil, fmt.Errorf("高德转腾讯,暂时不做修改")
|
||||||
|
/*param := map[string]interface{}{
|
||||||
|
"struct_type": 1,
|
||||||
|
"key": a.key,
|
||||||
|
}
|
||||||
|
param["sig"] = a.signParams(param, TencentGetDistrictList)
|
||||||
|
result, err := a.AccessAPI(BaseUrl, TencentGetDistrictList, http.MethodGet, param)
|
||||||
|
|
||||||
|
resultByte, err := json.Marshal(result)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
administrativeDivision := &AdministrativeDivision{}
|
||||||
|
if err = json.Unmarshal(resultByte, administrativeDivision); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return administrativeDivision.Result, err*/
|
||||||
|
}
|
||||||
|
|
||||||
|
if keywords != "" {
|
||||||
|
return a.GetSecondaryDivision(subDistrict, keywords, level)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("参数异常")
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSecondaryDivision 获取二级行政区划 keywords 是父级code
|
||||||
|
func (a *API) GetSecondaryDivision(number int, keywords string, level int) ([]*District, error) {
|
||||||
|
param := map[string]interface{}{
|
||||||
|
"key": a.key,
|
||||||
|
"id": keywords,
|
||||||
|
}
|
||||||
|
param["sig"] = a.signParams(param, TencentGetChildrenList)
|
||||||
|
result, err := a.AccessAPI(BaseUrl, TencentGetChildrenList, http.MethodGet, param)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
resultByte, err := json.Marshal(result)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
districtGetChildren := &DistrictGetChildren{}
|
||||||
|
if err = json.Unmarshal(resultByte, districtGetChildren); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if districtGetChildren.Status != 0 {
|
||||||
|
return nil, fmt.Errorf("%s", districtGetChildren.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
resultData := make([]*District, 0, 0)
|
||||||
|
for _, v := range districtGetChildren.Result[0] {
|
||||||
|
parentCode := &District{
|
||||||
|
Adcode: v.Id,
|
||||||
|
Lng: 0.0,
|
||||||
|
Lat: 0.0,
|
||||||
|
CityCode: "",
|
||||||
|
Level: level,
|
||||||
|
Name: v.Fullname,
|
||||||
|
Districts: nil,
|
||||||
|
}
|
||||||
|
parentCode.Lng, _ = v.Location.Lng.Float64()
|
||||||
|
parentCode.Lat, _ = v.Location.Lat.Float64()
|
||||||
|
if number == 2 {
|
||||||
|
parentCode.Districts, _ = a.GetSecondaryDivision(1, v.Id, level+1)
|
||||||
|
}
|
||||||
|
resultData = append(resultData, parentCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultData, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// BatchWalkingDistance 批量获取两点之间的步行距离
|
||||||
|
func (a *API) BatchWalkingDistance(srcLng, srcLat float64, destCoords []*Coordinate) (distanceList []float64, err error) {
|
||||||
|
for _, v := range destCoords {
|
||||||
|
distance, err := a.WalkingDistance(&TencentCyclingPlanningReq{
|
||||||
|
Key: a.key,
|
||||||
|
From: fmt.Sprintf("%f,%f", srcLat, srcLng),
|
||||||
|
To: fmt.Sprintf("%f,%f", v.Lat, v.Lng),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
distanceList = append(distanceList, utils.Int64ToFloat64(distance))
|
||||||
|
}
|
||||||
|
|
||||||
|
return distanceList, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCoordinateDistrictCode 获取坐标点所在行政区划
|
||||||
|
func (a *API) GetCoordinateDistrictCode(lng, lat float64) (districtCode int) {
|
||||||
|
result, err := a.GeoCodeRegeoSingle(lng, lat, 0, false, nil, 0, 0)
|
||||||
|
if err == nil {
|
||||||
|
districtCode = utils.Str2Int(result.Result.AdInfo.Adcode)
|
||||||
|
// 这个是因为老代码使用搞的地图获取这两个市的时候没有分区,place表做了一个假的分区,这边为了统一
|
||||||
|
if result.Result.AdInfo.District == "东莞市" || result.Result.AdInfo.District == "中山市" {
|
||||||
|
districtCode += 9000000 // FakeDistrictPadding
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCoordinateTownInfo 根据坐标获取城市名称和坐标
|
||||||
|
func (a *API) GetCoordinateTownInfo(lng, lat float64) (townName, townCode string) {
|
||||||
|
result, err := a.GeoCodeRegeoSingle(lng, lat, 0, false, nil, 0, 0)
|
||||||
|
if err == nil {
|
||||||
|
if name, ok := result.Result.AddressReference.(map[string]interface{})["town"].(map[string]interface{})["title"]; ok {
|
||||||
|
townName = name.(string)
|
||||||
|
}
|
||||||
|
if name, ok := result.Result.AddressReference.(map[string]interface{})["town"].(map[string]interface{})["id"]; ok {
|
||||||
|
townCode = name.(string) + "000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCoordinateCityInfo 根据坐标获取
|
||||||
|
func (a *API) GetCoordinateCityInfo(lng, lat float64) (cityName, cityCode string) {
|
||||||
|
result, err := a.GeoCodeRegeoSingle(lng, lat, 0, false, nil, 0, 0)
|
||||||
|
if err == nil {
|
||||||
|
cityName = result.Result.AdInfo.City
|
||||||
|
// cityCode 老版本高德地图获取到的是电话的区号,但是这个返回值没有使用,暂时不做处理
|
||||||
|
cityCode = result.Result.AdInfo.CityCode
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
202
platformapi/tencent_map/tencent_model.go
Normal file
202
platformapi/tencent_map/tencent_model.go
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
package tencent_map
|
||||||
|
|
||||||
|
import "encoding/json"
|
||||||
|
|
||||||
|
//#region 坐标转换参数
|
||||||
|
|
||||||
|
// TencentCoordinateChangeReq 坐标转换请求参数
|
||||||
|
type TencentCoordinateChangeReq struct {
|
||||||
|
Key string `json:"key" binding:"required"` // 开发秘钥
|
||||||
|
Locations string `json:"locations" binding:"required"` // 预转换的坐标,支持批量转换, 格式:纬度前,经度后,纬度和经度之间用",“分隔,每组坐标之间使用”;"分隔; 批量支持坐标个数以HTTP GET方法请求上限为准
|
||||||
|
Type int `json:"type" binding:"required"` // 输入的locations的坐标类型,可选值: 1 GPS坐标2 sogou经纬度3 baidu经纬度4 mapbar经纬度6 sogou墨卡托
|
||||||
|
//Output string `json:"output"` // 返回格式:支持JSON/JSONP,默认JSON
|
||||||
|
}
|
||||||
|
|
||||||
|
// TencentCoordinateChangeRes 坐标转换返回参数
|
||||||
|
type TencentCoordinateChangeRes struct {
|
||||||
|
Status int64 `json:"status"` //状态码,0为正常,其它为异常,详细请参阅状态码说明
|
||||||
|
Message string `json:"message"` // 对status的描述
|
||||||
|
Locations []*LocationsCoordinate `json:"locations"` // 坐标列
|
||||||
|
}
|
||||||
|
|
||||||
|
type LocationsCoordinate struct {
|
||||||
|
Lat json.Number `json:"lat"` // 纬度
|
||||||
|
Lng json.Number `json:"lng"` // 经度
|
||||||
|
}
|
||||||
|
|
||||||
|
type LocationsCoordinateObj struct {
|
||||||
|
Lat string `json:"lat"` // 纬度
|
||||||
|
Lng string `json:"lng"` // 经度
|
||||||
|
}
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region 获取腾讯骑行计划
|
||||||
|
|
||||||
|
// TencentCyclingPlanningReq 获取骑行计划参数
|
||||||
|
type TencentCyclingPlanningReq struct {
|
||||||
|
Key string `json:"key" binding:"required"` // 开发秘钥
|
||||||
|
From string `json:"from" binding:"required"` // 起点位置坐标,纬度在前,经度在后 from=39.915285,116.403857
|
||||||
|
To string `json:"to" binding:"required"` // 终点位置坐标,纬度在前,经度在后 from=39.915285,116.403857
|
||||||
|
}
|
||||||
|
|
||||||
|
// TencentCyclingPlanningRes 获取骑行计划返回值
|
||||||
|
type TencentCyclingPlanningRes struct {
|
||||||
|
Status int64 `json:"status"` //状态码,0为正常,其它为异常,详细请参阅状态码说明
|
||||||
|
Message string `json:"message"` // 对status的描述
|
||||||
|
Result map[string][]*Routers `json:"result"` // 搜索结果
|
||||||
|
}
|
||||||
|
|
||||||
|
// Routers 骑行计划详细返回值
|
||||||
|
type Routers struct {
|
||||||
|
Mode string `json:"mode"` // 方案交通方式,固定值:“EBICYCLING”
|
||||||
|
Distance int64 `json:"distance"` // 方案整体距离,单位:米
|
||||||
|
Duration int64 `json:"duration"` // 方案估算时间,单位:分钟
|
||||||
|
Direction string `json:"direction"` // 方案整体方向
|
||||||
|
Polyline []json.Number `json:"polyline"` // 方案路线坐标点串
|
||||||
|
Steps interface{} `json:"steps"` // 路线步骤
|
||||||
|
}
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region 地址转坐标解析
|
||||||
|
|
||||||
|
// AddressGeoCoderChangeRes 地址转坐标解析返回参数
|
||||||
|
type AddressGeoCoderChangeRes struct {
|
||||||
|
Status int64 `json:"status"` //状态码,0为正常,其它为异常,详细请参阅状态码说明
|
||||||
|
Message string `json:"message"` // 对status的描述
|
||||||
|
Result *ResultDetail `json:"result"` // 搜索结果
|
||||||
|
}
|
||||||
|
|
||||||
|
type ResultDetail struct {
|
||||||
|
Title string `json:"title"` // 废弃
|
||||||
|
Location LocationsCoordinate `json:"location"` // 解析到的坐标
|
||||||
|
AddressComponents struct {
|
||||||
|
Province string `json:"province"` // 省
|
||||||
|
City string `json:"city"` // 市
|
||||||
|
District string `json:"district"` // 区
|
||||||
|
Street string `json:"street"` // 街道
|
||||||
|
StreetNumber string `json:"street_number"` // 门派
|
||||||
|
} `json:"address_components"` // 解析后地址部件
|
||||||
|
AdInfo struct {
|
||||||
|
AdCode string `json:"adcode"` // 行政区划代码
|
||||||
|
} `json:"ad_info"` // 行政区划
|
||||||
|
Similarity json.Number `json:"similarity"` // 下线
|
||||||
|
Deviation json.Number `json:"deviation"` // 下线
|
||||||
|
Reliability json.Number `json:"reliability"` // 可信度参考:值范围 1 <低可信> - 10 <高可信>我们根据用户输入地址的准确程度,在解析过程中,将解析结果的可信度(质量),由低到高,分为1 - 10级,该值>=7时,解析结果较为准确,<7时,会存各类不可靠因
|
||||||
|
Level json.Number `json:"level"` // 解析精度级别,分为11个级别,一般>=9即可采用(定位到点,精度较高) 也可根据实际业务需求自行调
|
||||||
|
}
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region 坐标转地址
|
||||||
|
|
||||||
|
type Codes2AddressRes struct {
|
||||||
|
Status int `json:"status"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
RequestId string `json:"request_id"`
|
||||||
|
Result Code2AddressResultDetail `json:"result"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Code2AddressResultDetail struct {
|
||||||
|
Address string `json:"address"` // 以行政区划+道路+门牌号等信息组成的标准格式化地址
|
||||||
|
FormattedAddresses struct {
|
||||||
|
Recommend string `json:"recommend"` // 推荐使用的地址描述,描述精确性较高
|
||||||
|
Rough string `json:"rough"` // 粗略位置描述
|
||||||
|
StandardAddress string `json:"standard_address"` // address
|
||||||
|
} `json:"formatted_addresses"` // 结合知名地点形成的描述性地址,更具人性化特点
|
||||||
|
AddressComponent struct {
|
||||||
|
Nation string `json:"nation"` // 国家
|
||||||
|
Province string `json:"province"` // 省
|
||||||
|
City string `json:"city"` // 市,如果当前城市为省直辖县级区划,city与district字段均会返回此城市
|
||||||
|
District string `json:"district"` // 区
|
||||||
|
Street string `json:"street"` // 道路
|
||||||
|
StreetNumber string `json:"street_number"` // 门牌
|
||||||
|
} `json:"address_component"` // 地址部件,address不满足需求时可自行拼接
|
||||||
|
AdInfo struct {
|
||||||
|
NationCode string `json:"nation_code"` // 国家代码
|
||||||
|
Adcode string `json:"adcode"` // 行政区划代码
|
||||||
|
PhoneAreaCode string `json:"phone_area_code"` //
|
||||||
|
CityCode string `json:"city_code"` // 城市代码
|
||||||
|
Name string `json:"name"` // 行政区划名称
|
||||||
|
Location LocationsCoordinate `json:"location"` //
|
||||||
|
Nation string `json:"nation"` // 国家
|
||||||
|
Province string `json:"province"` // 省 / 直辖市
|
||||||
|
City string `json:"city"` // 市
|
||||||
|
District string `json:"district"` // 区
|
||||||
|
Distance int `json:"_distance"`
|
||||||
|
} `json:"ad_info"` // 行政区划信息
|
||||||
|
AddressReference interface{} `json:"address_reference"` // 坐标相对位置参考,暂时忽略掉
|
||||||
|
PoiCount int `json:"poi_count"` // 查询的周边poi的总数,仅在传入参数get_poi=1时返回
|
||||||
|
Pois []struct {
|
||||||
|
Id string `json:"id"` // 地点(POI)唯一标识
|
||||||
|
Title string `json:"title"` // 名称
|
||||||
|
Address string `json:"address"` // 地址
|
||||||
|
Category string `json:"category"` // 地点信息分类
|
||||||
|
Location LocationsCoordinate `json:"location"`
|
||||||
|
AdInfo struct {
|
||||||
|
Adcode string `json:"adcode"` // 行政区划代码
|
||||||
|
Province string `json:"province"` // 省
|
||||||
|
City string `json:"city"` //市
|
||||||
|
District string `json:"district"` // 区
|
||||||
|
} `json:"ad_info"` // 行政区划信息
|
||||||
|
Distance float64 `json:"_distance"` // 该POI/AOI到逆地址解析传入的坐标的直线距离
|
||||||
|
DirDesc string `json:"_dir_desc,omitempty"` // 该POI/AOI在逆地址解析传入的坐标的相对方位描述,包括:东、东南、南、西南、西、西北、北、东北、内(输入经纬度在AOI范围内)
|
||||||
|
} `json:"pois"`
|
||||||
|
Location LocationsCoordinate `json:"location"`
|
||||||
|
}
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region 行政区划获取
|
||||||
|
|
||||||
|
// AdministrativeDivision 获取全国的行政区划
|
||||||
|
//type AdministrativeDivision struct {
|
||||||
|
// Status int `json:"status"`
|
||||||
|
// Message string `json:"message"`
|
||||||
|
// RequestId string `json:"request_id"`
|
||||||
|
// DataVersion string `json:"data_version"` // 行政区划数据版本,便于您判断更新
|
||||||
|
// Result []*DistrictsList `json:"result"` // 全国行政区划
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//type DistrictsList struct {
|
||||||
|
// Id string `json:"id"` // 行政区划唯一标识(adcode)
|
||||||
|
// Name string `json:"name"` // 简称
|
||||||
|
// Level int `json:"level"` // 行政区划级别
|
||||||
|
// FullMame string `json:"fullname"` // 全称
|
||||||
|
// Pinyin []string `json:"pinyin"` // 拼音
|
||||||
|
// Location LocationsCoordinate `json:"location"` // 坐标
|
||||||
|
// DistrictsList []*DistrictsList `json:"districts"`
|
||||||
|
//}
|
||||||
|
|
||||||
|
// DistrictGetChildren 获取指定城市行政区划
|
||||||
|
type DistrictGetChildren struct {
|
||||||
|
Status int `json:"status"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
RequestId string `json:"request_id"`
|
||||||
|
DataVersion string `json:"data_version"`
|
||||||
|
Result [][]struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Fullname string `json:"fullname"`
|
||||||
|
Pinyin []string `json:"pinyin"`
|
||||||
|
Location LocationsCoordinate `json:"location"`
|
||||||
|
} `json:"result"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type District struct {
|
||||||
|
Adcode string `json:"adcode"` // 国家行政编码
|
||||||
|
Lng float64 `json:"lng"`
|
||||||
|
Lat float64 `json:"lat"`
|
||||||
|
CityCode string `json:"citycode"` // 电话区号
|
||||||
|
Level int `json:"level"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Districts []*District `json:"districts"`
|
||||||
|
}
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
type Coordinate struct {
|
||||||
|
Lng float64 `json:"lng"`
|
||||||
|
Lat float64 `json:"lat"`
|
||||||
|
}
|
||||||
111
platformapi/tencent_map/tencent_test.go
Normal file
111
platformapi/tencent_map/tencent_test.go
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
package tencent_map
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.rosy.net.cn/baseapi"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
tencent *API
|
||||||
|
sugarLogger *zap.SugaredLogger
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
logger, _ := zap.NewDevelopment()
|
||||||
|
sugarLogger = logger.Sugar()
|
||||||
|
baseapi.Init(sugarLogger)
|
||||||
|
|
||||||
|
tencent = New("Q2KBZ-YXFLN-LEVFD-STWQY-6RBBE-A4FLF", "vIO9yPPnp4pWmIywsR1DHCu0OFpQONeW")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 坐标转换
|
||||||
|
func TestCoordinateChange(t *testing.T) {
|
||||||
|
result, err := tencent.TencentCoordinateChange(&TencentCoordinateChangeReq{
|
||||||
|
Locations: "34.260369,117.138444",
|
||||||
|
Type: CoordinateChangeTypeGaoDe,
|
||||||
|
//Output: "json",
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
t.Log(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 骑行规划
|
||||||
|
func TestTencentCyclingPlanning(t *testing.T) {
|
||||||
|
distance, duration, point, err := tencent.TencentCyclingPlanning(&TencentCyclingPlanningReq{
|
||||||
|
Key: tencent.key,
|
||||||
|
From: "30.637486,103.919896",
|
||||||
|
To: "30.604708,103.913647",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
t.Log(distance)
|
||||||
|
t.Log(duration)
|
||||||
|
t.Log(point)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 地址解析坐标
|
||||||
|
func TestGetCoordinateFromAddress(t *testing.T) {
|
||||||
|
lng, lat, code, name, err := tencent.GetCoordinateFromAddress("四川省成都市双流区九江街道中国浩森国际装饰建材城-13幢", "")
|
||||||
|
if err != nil {
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
t.Log(lng)
|
||||||
|
t.Log(lat)
|
||||||
|
t.Log(code)
|
||||||
|
t.Log(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 坐标解析地址
|
||||||
|
func TestGeoCodeRegeoSingle(t *testing.T) {
|
||||||
|
tencent.GeoCodeRegeoSingle(116.307490, 39.984154, 0, false, nil, 0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取全国行政区划 List
|
||||||
|
func TestGetDistricts(t *testing.T) {
|
||||||
|
result, err := tencent.GetDistricts(2, "510000", 2)
|
||||||
|
if err != nil {
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
t.Log(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据ID获取部分行政区划
|
||||||
|
func TestGetSecondaryDivision(t *testing.T) {
|
||||||
|
data, err := tencent.GetSecondaryDivision(2, "511300", 2)
|
||||||
|
if err != nil {
|
||||||
|
t.Log(err)
|
||||||
|
} else {
|
||||||
|
t.Log(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 批量获取距离
|
||||||
|
func TestBatchWalkingDistance(t *testing.T) {
|
||||||
|
tencent.BatchWalkingDistance(103.913647, 30.604708, append([]*Coordinate{}, &Coordinate{
|
||||||
|
Lng: 103.914001,
|
||||||
|
Lat: 30.611431,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据坐标获取地址和区域代买
|
||||||
|
func TestGetCoordinateTownInfo(t *testing.T) {
|
||||||
|
name, code := tencent.GetCoordinateTownInfo(113.756791, 23.041187)
|
||||||
|
t.Log(name)
|
||||||
|
t.Log(code)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取定位市区坐标
|
||||||
|
func TestGetCoordinateCityInfo(t *testing.T) {
|
||||||
|
name, code := tencent.GetCoordinateCityInfo(113.756791, 23.041187)
|
||||||
|
t.Log(name)
|
||||||
|
t.Log(code)
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"git.rosy.net.cn/baseapi"
|
"git.rosy.net.cn/baseapi"
|
||||||
uuid "github.com/satori/go.uuid"
|
uuid "github.com/satori/go.uuid"
|
||||||
"math"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -264,24 +263,6 @@ func FilterEmoji(content string) string {
|
|||||||
return newContent.String()
|
return newContent.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
// BaiDuCoord2Gaode2 将百度坐标转换为高德坐标
|
|
||||||
func BaiDuCoord2Gaode2(baiduCoordinat []string) []string {
|
|
||||||
gaoCoordinat := make([]string, 0, 0)
|
|
||||||
|
|
||||||
for _, v := range baiduCoordinat {
|
|
||||||
var XPI = math.Pi * 3000.0 / 180.0
|
|
||||||
coords := strings.Split(v, ",")
|
|
||||||
var x = Str2Float64(coords[0]) - 0.0065
|
|
||||||
var y = Str2Float64(coords[1]) - 0.006
|
|
||||||
var z = math.Sqrt(x*x+y*y) - 0.00002*math.Sin(y*XPI)
|
|
||||||
var theta = math.Atan2(y, x) - 0.000003*math.Cos(x*XPI)
|
|
||||||
var gg_lng = z * math.Cos(theta)
|
|
||||||
var gg_lat = z * math.Sin(theta)
|
|
||||||
gaoCoordinat = append(gaoCoordinat, fmt.Sprintf("%.6f,%.6f", gg_lng, gg_lat))
|
|
||||||
}
|
|
||||||
return gaoCoordinat
|
|
||||||
}
|
|
||||||
|
|
||||||
func TrimBlankChar(str string) string {
|
func TrimBlankChar(str string) string {
|
||||||
return strings.Trim(str, "\u202C\n\r\t ")
|
return strings.Trim(str, "\u202C\n\r\t ")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user