From 8ecfd93781dcd5888cefc71ae6d11ba8c267d12b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Wed, 31 Jul 2024 13:14:24 +0800 Subject: [PATCH] 1 --- platformapi/autonavi/autonavi.go | 765 +++++++++++++------------- platformapi/autonavi/autonavi_page.go | 3 +- platformapi/autonavi/gaode_api.go | 9 +- platformapi/baidunavi/baidunavi.go | 17 +- 4 files changed, 404 insertions(+), 390 deletions(-) diff --git a/platformapi/autonavi/autonavi.go b/platformapi/autonavi/autonavi.go index 2d39801c..d9dd89e9 100644 --- a/platformapi/autonavi/autonavi.go +++ b/platformapi/autonavi/autonavi.go @@ -1,385 +1,385 @@ package autonavi -// -//import ( -// "bytes" -// "crypto/md5" -// "fmt" -// "git.rosy.net.cn/baseapi/platformapi" -// "git.rosy.net.cn/baseapi/utils" -// "net/http" -// "sort" -//) -// -//const ( -// signKey = "sig" -// prodURL = "https://restapi.amap.com" -// prodURLv3 = "/v3" -// prodURLFullv3 = prodURL + prodURLv3 -// -// batchAPIStr = "batch" -//) -// -//const ( -// StatusCodeFailed = "0" -// StatusCodeSuccess = "1" -//) -// -//const ( -// InfoCode_OK = "10000" -// InfoCode_ACCESS_TOO_FREQUENT = "10004" -// InfoCode_QPS_HAS_EXCEEDED_THE_LIMIT = "10014" -// InfoCode_SERVER_IS_BUSY = "10016" -// InfoCode_RESOURCE_UNAVAILABLE = "10017" -// InfoCode_CQPS_HAS_EXCEEDED_THE_LIMIT = "10019" -// InfoCode_CKQPS_HAS_EXCEEDED_THE_LIMIT = "10020" -// InfoCode_CIQPS_HAS_EXCEEDED_THE_LIMIT = "10021" -// InfoCode_CIKQPS_HAS_EXCEEDED_THE_LIMIT = "10022" -// InfoCode_KQPS_HAS_EXCEEDED_THE_LIMIT = "10023" -//) -// -//const ( -// CoordSysAutonavi = "autonavi" -// CoordSysGPS = "gps" -// CoordSysMapbar = "mapbar" -// CoordSysBaidu = "baidu" -//) -// -//const ( -// FakeDistrictPadding = 9000000 -// MaxConvertCount = 40 -//) -// -//var ( -// exceedLimitCodes = map[string]int{ -// InfoCode_ACCESS_TOO_FREQUENT: 1, -// InfoCode_QPS_HAS_EXCEEDED_THE_LIMIT: 1, -// InfoCode_CQPS_HAS_EXCEEDED_THE_LIMIT: 1, -// InfoCode_CKQPS_HAS_EXCEEDED_THE_LIMIT: 1, -// InfoCode_CIQPS_HAS_EXCEEDED_THE_LIMIT: 1, -// InfoCode_CIKQPS_HAS_EXCEEDED_THE_LIMIT: 1, -// InfoCode_KQPS_HAS_EXCEEDED_THE_LIMIT: 1, -// } -// -// canRetryCodes = map[string]int{ -// InfoCode_SERVER_IS_BUSY: 1, -// } -//) -// -//const ( -// DistrictLevelCountry = 0 -// DistrictLevelProvince = 1 -// DistrictLevelCity = 2 -// DistrictLevelDistrict = 3 -// DistrictLevelStreet = 4 -//) -// -//const ( -// RoadLevelAll = 0 // 显示所有道路 -// RoadLevelMain = 1 // 过滤非主干道路,仅输出主干道路数据 -// -// HomeOrCorpDef = 0 // 不对召回的排序策略进行干扰。 -// HomeOrCorpPreferHome = 1 // 综合大数据分析将居家相关的 POI 内容优先返回,即优化返回结果中 pois 字段的poi顺序。 -// HomeOrCorpPreferCorp = 2 // 综合大数据分析将公司相关的 POI 内容优先返回,即优化返回结果中 pois 字段的poi顺序。 -//) -// -//var ( -// levelStr2IntMap = map[string]int{ -// "country": DistrictLevelCountry, -// "province": DistrictLevelProvince, -// "city": DistrictLevelCity, -// "district": DistrictLevelDistrict, -// "street": DistrictLevelStreet, -// } -//) -// -//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"` -//} -// -//type Coordinate struct { -// Lng float64 `json:"lng"` -// Lat float64 `json:"lat"` -//} -// -//type ResponseResult map[string]interface{} -// -//type API struct { -// platformapi.APICookie -// -// client *http.Client -// config *platformapi.APIConfig -// key string -//} -// -//func (a *API) SetKey(key string) { -// a.key = key -//} -// -//type BuildingOrNeighborInfo struct { -// Name string `json:"name"` -// Type string `json:"type"` -//} -// -//type BusinessAreaInfo struct { -// ID string `json:"id"` -// Location string `json:"location"` -// Name string `json:"name"` -//} -// -//type StreetNumberInfo struct { -// Direction string `json:"direction"` -// Distance string `json:"distance"` -// Location string `json:"location"` -// Number string `json:"number"` -// Street string `json:"street"` -//} -// -//type AoiInfo struct { -// Adcode string `json:"adcode"` -// Area string `json:"area"` -// Distance string `json:"distance"` -// ID string `json:"id"` -// Location string `json:"location"` -// Name string `json:"name"` -// Type string `json:"type"` -//} -// -//type PoiInfo struct { -// Address string `json:"address"` -// Businessarea string `json:"businessarea"` -// Direction string `json:"direction"` -// Distance string `json:"distance"` -// ID string `json:"id"` -// Location string `json:"location"` -// Name string `json:"name"` -// Poiweight string `json:"poiweight"` -// Tel string `json:"tel"` -// Type string `json:"type"` -//} -// -//type RoadinterInfo struct { -// Direction string `json:"direction"` -// Distance string `json:"distance"` -// FirstID string `json:"first_id"` -// FirstName string `json:"first_name"` -// Location string `json:"location"` -// SecondID string `json:"second_id"` -// SecondName string `json:"second_name"` -//} -// -//type RoadInfo struct { -// Direction string `json:"direction"` -// Distance string `json:"distance"` -// ID string `json:"id"` -// Location string `json:"location"` -// Name string `json:"name"` -//} -// -//type AddressComponentInfo struct { -// Adcode string `json:"adcode"` -// Building *BuildingOrNeighborInfo `json:"building"` -// // BusinessAreas []*BusinessAreaInfo `json:"businessAreas"` -// City string `json:"city"` -// Citycode string `json:"citycode"` -// Country string `json:"country"` -// District string `json:"district"` -// Neighborhood *BuildingOrNeighborInfo `json:"neighborhood"` -// Province string `json:"province"` -// StreetNumber *StreetNumberInfo `json:"streetNumber"` -// Towncode string `json:"towncode"` -// Township string `json:"township"` -//} -// -//type RegeoCodeInfo struct { -// AddressComponent *AddressComponentInfo `json:"addressComponent"` -// Aois []*AoiInfo `json:"aois"` -// FormattedAddress string `json:"formatted_address"` -// Pois []*PoiInfo `json:"pois"` -// Roadinters []*RoadinterInfo `json:"roadinters"` -// Roads []*RoadInfo `json:"roads"` -//} -// -//type tBatchAPIParams struct { -// APIStr string -// APIParams map[string]interface{} -//} -// -//type tBatchAPIResponse struct { -// Result ResponseResult -// Err error -//} -// -//func New(key string, config ...*platformapi.APIConfig) *API { -// curConfig := platformapi.DefAPIConfig -// if len(config) > 0 { -// curConfig = *config[0] -// } -// return &API{ -// key: key, -// client: &http.Client{Timeout: curConfig.ClientTimeout}, -// config: &curConfig, -// } -//} -// -//func (a *API) signParams(mapData map[string]interface{}) string { -// keys := make([]string, 0) -// for k := range mapData { -// if k != signKey { -// keys = append(keys, k) -// } -// } -// sort.Strings(keys) -// -// finalStr := "" -// for _, k := range keys { -// finalStr += k + "=" + fmt.Sprint(mapData[k]) -// } -// -// return fmt.Sprintf("%X", md5.Sum([]byte(finalStr))) -//} -// -//func coordinate2String(lng, lat float64) (str string) { -// return fmt.Sprintf("%.6f,%.6f", lng, lat) -//} -// -//func (a *API) AccessAPI(apiStr string, params map[string]interface{}) (retVal ResponseResult, err error) { -// params2 := utils.MergeMaps(utils.Params2Map("key", a.key, "output", "json"), params) -// params2[signKey] = a.signParams(params2) -// -// err = platformapi.AccessPlatformAPIWithRetry(a.client, -// func() *http.Request { -// request, _ := http.NewRequest(http.MethodGet, utils.GenerateGetURL(prodURLFullv3, 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 := jsonResult1["status"].(string) -// if status == StatusCodeSuccess { -// retVal = jsonResult1 -// return platformapi.ErrLevelSuccess, nil -// } -// infoCode := jsonResult1["infocode"].(string) -// newErr := utils.NewErrorCode(jsonResult1["info"].(string), infoCode) -// if _, ok := exceedLimitCodes[infoCode]; ok { -// return platformapi.ErrLevelExceedLimit, newErr -// } else if _, ok := canRetryCodes[infoCode]; ok { -// return platformapi.ErrLevelRecoverableErr, newErr -// } else { -// return platformapi.ErrLevelCodeIsNotOK, newErr -// } -// }) -// return retVal, err -//} -// -//func (a *API) AccessAPI3(apiStr string, params map[string]interface{}) (retVal ResponseResult, err error) { -// err = platformapi.AccessPlatformAPIWithRetry(a.client, -// func() *http.Request { -// request, _ := http.NewRequest(http.MethodGet, utils.GenerateGetURL(BaseUrl, apiStr, params), 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 := jsonResult1["status"].(string) -// if status == StatusCodeSuccess { -// retVal = jsonResult1 -// return platformapi.ErrLevelSuccess, nil -// } -// infoCode := jsonResult1["infocode"].(string) -// newErr := utils.NewErrorCode(jsonResult1["info"].(string), infoCode) -// if _, ok := exceedLimitCodes[infoCode]; ok { -// return platformapi.ErrLevelExceedLimit, newErr -// } else if _, ok := canRetryCodes[infoCode]; ok { -// return platformapi.ErrLevelRecoverableErr, newErr -// } else { -// return platformapi.ErrLevelCodeIsNotOK, newErr -// } -// }) -// return retVal, err -//} -// -//func (a *API) BatchAccessAPI(apiList []*tBatchAPIParams) (retVal []*tBatchAPIResponse, err error) { -// if len(apiList) == 0 { -// return nil, nil -// } -// -// var ops []map[string]interface{} -// for _, v := range apiList { -// params2 := utils.MergeMaps(utils.Params2Map("key", a.key, "output", "json"), v.APIParams) -// params2[signKey] = a.signParams(params2) -// op := make(map[string]interface{}) -// op["url"] = utils.GenerateGetURL(prodURLv3, v.APIStr, params2) -// ops = append(ops, op) -// } -// params2 := map[string]interface{}{ -// "ops": ops, -// } -// -// err = platformapi.AccessPlatformAPIWithRetry(a.client, -// func() *http.Request { -// request, _ := http.NewRequest(http.MethodGet, utils.GenerateGetURL(prodURLFullv3, batchAPIStr, utils.Params2Map("key", a.key)), -// bytes.NewReader(utils.MustMarshal(params2))) -// request.Header.Set("charset", "UTF-8") -// request.Header.Set("Content-Type", "application/json") -// 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") -// } -// if resultList, ok := jsonResult1[platformapi.KeyData].([]interface{}); ok { -// for _, v := range resultList { -// jsonResult1 := v.(map[string]interface{}) -// status := int(utils.ForceInterface2Int64(jsonResult1["status"])) -// if status == http.StatusOK { -// jsonResult1 := v.(map[string]interface{})["body"].(map[string]interface{}) -// var retVal2 map[string]interface{} -// var err2 error -// status := jsonResult1["status"].(string) -// if status == StatusCodeSuccess { -// retVal2 = jsonResult1 -// } else { -// infoCode := jsonResult1["infocode"].(string) -// err2 = utils.NewErrorCode(jsonResult1["info"].(string), infoCode) -// } -// retVal = append(retVal, &tBatchAPIResponse{ -// Result: retVal2, -// Err: err2, -// }) -// } -// } -// errLevel = platformapi.ErrLevelSuccess -// } else { -// infoCode := jsonResult1["infocode"].(string) -// err = utils.NewErrorCode(jsonResult1["info"].(string), infoCode) -// if _, ok := exceedLimitCodes[infoCode]; ok { -// errLevel = platformapi.ErrLevelExceedLimit -// } else if _, ok := canRetryCodes[infoCode]; ok { -// errLevel = platformapi.ErrLevelRecoverableErr -// } else { -// errLevel = platformapi.ErrLevelCodeIsNotOK -// } -// } -// return errLevel, err -// }) -// return retVal, err -//} +import ( + "bytes" + "crypto/md5" + "fmt" + "git.rosy.net.cn/baseapi/platformapi" + "git.rosy.net.cn/baseapi/utils" + "net/http" + "sort" + "strings" +) + +const ( + signKey = "sig" + prodURL = "https://restapi.amap.com" + prodURLv3 = "/v3" + prodURLFullv3 = prodURL + prodURLv3 + + batchAPIStr = "batch" +) + +const ( + StatusCodeFailed = "0" + StatusCodeSuccess = "1" +) + +const ( + InfoCode_OK = "10000" + InfoCode_ACCESS_TOO_FREQUENT = "10004" + InfoCode_QPS_HAS_EXCEEDED_THE_LIMIT = "10014" + InfoCode_SERVER_IS_BUSY = "10016" + InfoCode_RESOURCE_UNAVAILABLE = "10017" + InfoCode_CQPS_HAS_EXCEEDED_THE_LIMIT = "10019" + InfoCode_CKQPS_HAS_EXCEEDED_THE_LIMIT = "10020" + InfoCode_CIQPS_HAS_EXCEEDED_THE_LIMIT = "10021" + InfoCode_CIKQPS_HAS_EXCEEDED_THE_LIMIT = "10022" + InfoCode_KQPS_HAS_EXCEEDED_THE_LIMIT = "10023" +) + +const ( + CoordSysAutonavi = "autonavi" + CoordSysGPS = "gps" + CoordSysMapbar = "mapbar" + CoordSysBaidu = "baidu" +) + +const ( + FakeDistrictPadding = 9000000 + MaxConvertCount = 40 +) + +var ( + exceedLimitCodes = map[string]int{ + InfoCode_ACCESS_TOO_FREQUENT: 1, + InfoCode_QPS_HAS_EXCEEDED_THE_LIMIT: 1, + InfoCode_CQPS_HAS_EXCEEDED_THE_LIMIT: 1, + InfoCode_CKQPS_HAS_EXCEEDED_THE_LIMIT: 1, + InfoCode_CIQPS_HAS_EXCEEDED_THE_LIMIT: 1, + InfoCode_CIKQPS_HAS_EXCEEDED_THE_LIMIT: 1, + InfoCode_KQPS_HAS_EXCEEDED_THE_LIMIT: 1, + } + + canRetryCodes = map[string]int{ + InfoCode_SERVER_IS_BUSY: 1, + } +) + +const ( + DistrictLevelCountry = 0 + DistrictLevelProvince = 1 + DistrictLevelCity = 2 + DistrictLevelDistrict = 3 + DistrictLevelStreet = 4 +) + +const ( + RoadLevelAll = 0 // 显示所有道路 + RoadLevelMain = 1 // 过滤非主干道路,仅输出主干道路数据 + + HomeOrCorpDef = 0 // 不对召回的排序策略进行干扰。 + HomeOrCorpPreferHome = 1 // 综合大数据分析将居家相关的 POI 内容优先返回,即优化返回结果中 pois 字段的poi顺序。 + HomeOrCorpPreferCorp = 2 // 综合大数据分析将公司相关的 POI 内容优先返回,即优化返回结果中 pois 字段的poi顺序。 +) + +var ( + levelStr2IntMap = map[string]int{ + "country": DistrictLevelCountry, + "province": DistrictLevelProvince, + "city": DistrictLevelCity, + "district": DistrictLevelDistrict, + "street": DistrictLevelStreet, + } +) + +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"` +} + +type Coordinate struct { + Lng float64 `json:"lng"` + Lat float64 `json:"lat"` +} + +type ResponseResult map[string]interface{} + +type API struct { + platformapi.APICookie + + client *http.Client + config *platformapi.APIConfig + key string +} + +func (a *API) SetKey(key string) { + a.key = key +} + +type BuildingOrNeighborInfo struct { + Name string `json:"name"` + Type string `json:"type"` +} + +type BusinessAreaInfo struct { + ID string `json:"id"` + Location string `json:"location"` + Name string `json:"name"` +} + +type StreetNumberInfo struct { + Direction string `json:"direction"` + Distance string `json:"distance"` + Location string `json:"location"` + Number string `json:"number"` + Street string `json:"street"` +} + +type AoiInfo struct { + Adcode string `json:"adcode"` + Area string `json:"area"` + Distance string `json:"distance"` + ID string `json:"id"` + Location string `json:"location"` + Name string `json:"name"` + Type string `json:"type"` +} + +type PoiInfo struct { + Address string `json:"address"` + Businessarea string `json:"businessarea"` + Direction string `json:"direction"` + Distance string `json:"distance"` + ID string `json:"id"` + Location string `json:"location"` + Name string `json:"name"` + Poiweight string `json:"poiweight"` + Tel string `json:"tel"` + Type string `json:"type"` +} + +type RoadinterInfo struct { + Direction string `json:"direction"` + Distance string `json:"distance"` + FirstID string `json:"first_id"` + FirstName string `json:"first_name"` + Location string `json:"location"` + SecondID string `json:"second_id"` + SecondName string `json:"second_name"` +} + +type RoadInfo struct { + Direction string `json:"direction"` + Distance string `json:"distance"` + ID string `json:"id"` + Location string `json:"location"` + Name string `json:"name"` +} + +type AddressComponentInfo struct { + Adcode string `json:"adcode"` + Building *BuildingOrNeighborInfo `json:"building"` + // BusinessAreas []*BusinessAreaInfo `json:"businessAreas"` + City string `json:"city"` + Citycode string `json:"citycode"` + Country string `json:"country"` + District string `json:"district"` + Neighborhood *BuildingOrNeighborInfo `json:"neighborhood"` + Province string `json:"province"` + StreetNumber *StreetNumberInfo `json:"streetNumber"` + Towncode string `json:"towncode"` + Township string `json:"township"` +} + +type RegeoCodeInfo struct { + AddressComponent *AddressComponentInfo `json:"addressComponent"` + Aois []*AoiInfo `json:"aois"` + FormattedAddress string `json:"formatted_address"` + Pois []*PoiInfo `json:"pois"` + Roadinters []*RoadinterInfo `json:"roadinters"` + Roads []*RoadInfo `json:"roads"` +} + +type tBatchAPIParams struct { + APIStr string + APIParams map[string]interface{} +} + +type tBatchAPIResponse struct { + Result ResponseResult + Err error +} + +func New(key string, config ...*platformapi.APIConfig) *API { + curConfig := platformapi.DefAPIConfig + if len(config) > 0 { + curConfig = *config[0] + } + return &API{ + key: key, + client: &http.Client{Timeout: curConfig.ClientTimeout}, + config: &curConfig, + } +} + +func (a *API) signParams(mapData map[string]interface{}) string { + keys := make([]string, 0) + for k := range mapData { + if k != signKey { + keys = append(keys, k) + } + } + sort.Strings(keys) + + finalStr := "" + for _, k := range keys { + finalStr += k + "=" + fmt.Sprint(mapData[k]) + } + + return fmt.Sprintf("%X", md5.Sum([]byte(finalStr))) +} + +func coordinate2String(lng, lat float64) (str string) { + return fmt.Sprintf("%.6f,%.6f", lng, lat) +} + +func (a *API) AccessAPI(apiStr string, params map[string]interface{}) (retVal ResponseResult, err error) { + params2 := utils.MergeMaps(utils.Params2Map("key", a.key, "output", "json"), params) + params2[signKey] = a.signParams(params2) + + err = platformapi.AccessPlatformAPIWithRetry(a.client, + func() *http.Request { + request, _ := http.NewRequest(http.MethodGet, utils.GenerateGetURL(prodURLFullv3, 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 := jsonResult1["status"].(string) + if status == StatusCodeSuccess { + retVal = jsonResult1 + return platformapi.ErrLevelSuccess, nil + } + infoCode := jsonResult1["infocode"].(string) + newErr := utils.NewErrorCode(jsonResult1["info"].(string), infoCode) + if _, ok := exceedLimitCodes[infoCode]; ok { + return platformapi.ErrLevelExceedLimit, newErr + } else if _, ok := canRetryCodes[infoCode]; ok { + return platformapi.ErrLevelRecoverableErr, newErr + } else { + return platformapi.ErrLevelCodeIsNotOK, newErr + } + }) + return retVal, err +} + +func (a *API) AccessAPI3(apiStr string, params map[string]interface{}) (retVal ResponseResult, err error) { + err = platformapi.AccessPlatformAPIWithRetry(a.client, + func() *http.Request { + request, _ := http.NewRequest(http.MethodGet, utils.GenerateGetURL(BaseUrl, apiStr, params), 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 := jsonResult1["status"].(string) + if status == StatusCodeSuccess { + retVal = jsonResult1 + return platformapi.ErrLevelSuccess, nil + } + infoCode := jsonResult1["infocode"].(string) + newErr := utils.NewErrorCode(jsonResult1["info"].(string), infoCode) + if _, ok := exceedLimitCodes[infoCode]; ok { + return platformapi.ErrLevelExceedLimit, newErr + } else if _, ok := canRetryCodes[infoCode]; ok { + return platformapi.ErrLevelRecoverableErr, newErr + } else { + return platformapi.ErrLevelCodeIsNotOK, newErr + } + }) + return retVal, err +} + +func (a *API) BatchAccessAPI(apiList []*tBatchAPIParams) (retVal []*tBatchAPIResponse, err error) { + if len(apiList) == 0 { + return nil, nil + } + + var ops []map[string]interface{} + for _, v := range apiList { + params2 := utils.MergeMaps(utils.Params2Map("key", a.key, "output", "json"), v.APIParams) + params2[signKey] = a.signParams(params2) + op := make(map[string]interface{}) + op["url"] = utils.GenerateGetURL(prodURLv3, v.APIStr, params2) + ops = append(ops, op) + } + params2 := map[string]interface{}{ + "ops": ops, + } + + err = platformapi.AccessPlatformAPIWithRetry(a.client, + func() *http.Request { + request, _ := http.NewRequest(http.MethodGet, utils.GenerateGetURL(prodURLFullv3, batchAPIStr, utils.Params2Map("key", a.key)), + bytes.NewReader(utils.MustMarshal(params2))) + request.Header.Set("charset", "UTF-8") + request.Header.Set("Content-Type", "application/json") + 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") + } + if resultList, ok := jsonResult1[platformapi.KeyData].([]interface{}); ok { + for _, v := range resultList { + jsonResult1 := v.(map[string]interface{}) + status := int(utils.ForceInterface2Int64(jsonResult1["status"])) + if status == http.StatusOK { + jsonResult1 := v.(map[string]interface{})["body"].(map[string]interface{}) + var retVal2 map[string]interface{} + var err2 error + status := jsonResult1["status"].(string) + if status == StatusCodeSuccess { + retVal2 = jsonResult1 + } else { + infoCode := jsonResult1["infocode"].(string) + err2 = utils.NewErrorCode(jsonResult1["info"].(string), infoCode) + } + retVal = append(retVal, &tBatchAPIResponse{ + Result: retVal2, + Err: err2, + }) + } + } + errLevel = platformapi.ErrLevelSuccess + } else { + infoCode := jsonResult1["infocode"].(string) + err = utils.NewErrorCode(jsonResult1["info"].(string), infoCode) + if _, ok := exceedLimitCodes[infoCode]; ok { + errLevel = platformapi.ErrLevelExceedLimit + } else if _, ok := canRetryCodes[infoCode]; ok { + errLevel = platformapi.ErrLevelRecoverableErr + } else { + errLevel = platformapi.ErrLevelCodeIsNotOK + } + } + return errLevel, err + }) + return retVal, err +} // 为了方便调用者编码,如果失败,也会返回未转换的原始值 -/*func (a *API) CoordinateConvert(lng, lat float64, coordsys string) (retLng, retLat float64, err error) { +func (a *API) CoordinateConvert(lng, lat float64, coordsys string) (retLng, retLat float64, err error) { // outCoords, err := a.BatchCoordinateConvert([]*Coordinate{ // &Coordinate{ // Lng: lng, @@ -552,9 +552,9 @@ func (a *API) getDistrictsFromInterface(districts interface{}) (districtList []* func GetDistrictLevel(levelName string) (level int) { return levelStr2IntMap[levelName] } -*/ + // 两点之间的步行距离,单位为米 -/*func (a *API) WalkingDistance(lng1, lat1, lng2, lat2 float64) (distance float64) { +func (a *API) WalkingDistance(lng1, lat1, lng2, lat2 float64) (distance float64) { params := map[string]interface{}{ "origin": coordinate2String(lng1, lat1), "destination": coordinate2String(lng2, lat2), @@ -593,11 +593,9 @@ func (a *API) BatchWalkingDistance(srcLng, srcLat float64, destCoords []*Coordin } return distanceList, err } -*/ -/*-----------------------------------------------------*/ // 这里的District指的是实际的District,有些市是没有区的,比如东莞,这种情况下返回的区码是一个假的区域,即市的编码加上9000000 -/*func (a *API) GetCoordinateDistrictCode(lng, lat float64) (districtCode int) { +func (a *API) GetCoordinateDistrictCode(lng, lat float64) (districtCode int) { result, err := a.GetCoordinateAreaInfo(lng, lat) if err == nil { addressComponent := result["regeocode"].(map[string]interface{})["addressComponent"].(map[string]interface{}) @@ -651,4 +649,3 @@ func (a *API) GetCoordinateCityInfo(lng, lat float64) (cityName, cityCode string } return cityName, cityCode } -*/ diff --git a/platformapi/autonavi/autonavi_page.go b/platformapi/autonavi/autonavi_page.go index 3cfc132c..2c23b8eb 100644 --- a/platformapi/autonavi/autonavi_page.go +++ b/platformapi/autonavi/autonavi_page.go @@ -1,6 +1,6 @@ package autonavi -/*import ( +import ( "fmt" "net/http" "strings" @@ -120,4 +120,3 @@ func (a *API) GetCoordinateFromAddressByPageAll(address string, cityCode int) (g } return getCoordinateFromAddressByPageAllResult, err } -*/ diff --git a/platformapi/autonavi/gaode_api.go b/platformapi/autonavi/gaode_api.go index ea7ad2dd..35331147 100644 --- a/platformapi/autonavi/gaode_api.go +++ b/platformapi/autonavi/gaode_api.go @@ -1,7 +1,13 @@ package autonavi +import ( + "fmt" + "git.rosy.net.cn/baseapi/utils" + "strings" +) + // 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{}{ "key": a.key, "origin": origin, @@ -39,4 +45,3 @@ package autonavi return polyLineList, distance, duration, nil } -*/ diff --git a/platformapi/baidunavi/baidunavi.go b/platformapi/baidunavi/baidunavi.go index 5149200c..bca757f1 100644 --- a/platformapi/baidunavi/baidunavi.go +++ b/platformapi/baidunavi/baidunavi.go @@ -1,5 +1,20 @@ 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 ( signKey = "sn" resultKey = "result" @@ -32,7 +47,6 @@ const ( CoordSysBaidu2Gaode = "5" // 百度坐标转高德坐标 ) -/* const ( MaxCoordsConvBatchSize = 100 ) @@ -230,4 +244,3 @@ func (a *API) DirectionLiteRide(coords []*Coordinate) (retVal interface{}, err e return nil, nil } -*/