go通过代理访问百度地图api实现GPS角坐标转换

来源:互联网 发布:js视频教程 编辑:程序博客网 时间:2024/06/05 08:08
package crontabimport (. "domain/model""encoding/json""infrastructure/log""io/ioutil""net/http""strconv""strings""time""infrastructure/gopkg.in/mgo.v2/bson")type Coordinate struct {X float32Y float32}type StrConvRest struct {Status intResult []Coordinate}func (this *Crontab) ConvertCoordinate(dbname string) (isAccess bool) {isAccess = truequeryMap := bson.M{}tmp := []float32{0, 60, 90, 180, -90, -180, -60}queryMap["经度"] = bson.M{"$exists": true, "$nin": tmp}queryMap["纬度"] = bson.M{"$exists": true, "$nin": tmp}var strCoords stringeNbLocationRecord, _ := this.GetMultiRecord(dbname, COLLECTION_ENB_LOCATION_INFO, queryMap, bson.M{"_id": 0})length := len(eNbLocationRecord)if 0 == length {return}log.Error("正在操作的数据库:", dbname)var allConvResult []Coordinatefor i := 0; i < length; i += 100 {strCoords = ""count := 0var coordX, coordY stringfor j := i; j < length && count < 100; j++ {switch eNbLocationRecord[j]["经度"].(type) {case float64:coordX = strconv.FormatFloat(eNbLocationRecord[j]["经度"].(float64), 'f', 6, 64)case int:coordX = strconv.FormatFloat((float64)(eNbLocationRecord[j]["经度"].(int)), 'f', 6, 64)}switch eNbLocationRecord[j]["纬度"].(type) {case float64:coordY = strconv.FormatFloat(eNbLocationRecord[j]["纬度"].(float64), 'f', 6, 64)case int:coordY = strconv.FormatFloat((float64)(eNbLocationRecord[j]["纬度"].(int)), 'f', 6, 64)}strCoords += coordX + "," + coordY + ";"count++}strCoords = strings.TrimRight(strCoords, ";")url := "http://api.map.baidu.com/geoconv/v1/?coords=" + strCoords + "&from=1&to=5&ak=*****************&output=json"convResult := this.fetch(&url, &Proxy_addr)for retry := 1; 0 != convResult.Status && retry < Retry; retry++ {time.Sleep(time.Second * 3)convResult = this.fetch(&url, &Proxy_addr)}if 0 != convResult.Status {log.Error("重试4次转换失败!")isAccess = falsereturn}allConvResult = append(allConvResult, convResult.Result...)}log.Error("站点个数:", length)log.Error("转换记录个数:", len(allConvResult))for index, oneLocationRecord := range eNbLocationRecord {if index >= len(allConvResult) {break}updateActionMap := bson.M{"$set": bson.M{"longitude": allConvResult[index].X, "latitude": allConvResult[index].Y}}this.UpdateOne(dbname, COLLECTION_ENB_LOCATION_INFO, oneLocationRecord, updateActionMap)}this.UpdateLegality(dbname)log.Error("GPS设备获取的角度坐标到百度地图坐标的转换完成")return}func (this *Crontab) fetch(url, proxy_addr *string) (strmap StrConvRest) {transport := GetTransportFieldURL(proxy_addr)client := &http.Client{Transport: transport}req, err := http.NewRequest("GET", *url, nil)if err != nil {strmap.Status = 4log.Fatal(err.Error())return}resp, err := client.Do(req)if err != nil {strmap.Status = 4log.Fatal(err.Error())return}defer resp.Body.Close()if resp.StatusCode == 200 {body, err := ioutil.ReadAll(resp.Body)if err != nil {strmap.Status = 4log.Fatal(err.Error())return}err = json.Unmarshal(body, &strmap)if err != nil {strmap.Status = 4log.Error(err)return}return strmap} else {strmap.Status = 4log.Fatal("get from http://api.map.baidu.com/geoconv/v1/ error")}return strmap}func (this *Crontab) UpdateLegality(dbname string) {log.Error("更新站点经纬度合法性!")queryMap := bson.M{}queryMap["longitude"] = bson.M{"$exists": false}queryMap["latitude"] = bson.M{"$exists": false}updateActionMap := bson.M{"$set": bson.M{"经纬度合法": "否"}}this.UpdateAll(dbname, COLLECTION_ENB_LOCATION_INFO, queryMap, updateActionMap)log.Error("更新站点经纬度合法性!完成")}

阅读全文
0 0
原创粉丝点击