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

package crontab

import (
	. "domain/model"
	"encoding/json"
	"infrastructure/log"
	"io/ioutil"
	"net/http"
	"strconv"
	"strings"
	"time"

	"infrastructure/gopkg.in/mgo.v2/bson"
)

type Coordinate struct {
	X float32
	Y float32
}

type StrConvRest struct {
	Status int
	Result []Coordinate
}

func (this *Crontab) ConvertCoordinate(dbname string) (isAccess bool) {
	isAccess = true
	queryMap := 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 string
	eNbLocationRecord, _ := this.GetMultiRecord(dbname, COLLECTION_ENB_LOCATION_INFO, queryMap, bson.M{"_id": 0})
	length := len(eNbLocationRecord)
	if 0 == length {
		return
	}
	log.Error("正在操作的数据库:", dbname)
	var allConvResult []Coordinate
	for i := 0; i < length; i += 100 {
		strCoords = ""
		count := 0
		var coordX, coordY string
		for 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 = false
			return
		}
		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 = 4
		log.Fatal(err.Error())
		return
	}
	resp, err := client.Do(req)
	if err != nil {
		strmap.Status = 4
		log.Fatal(err.Error())
		return
	}
	defer resp.Body.Close()

	if resp.StatusCode == 200 {
		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			strmap.Status = 4
			log.Fatal(err.Error())
			return
		}
		err = json.Unmarshal(body, &strmap)
		if err != nil {
			strmap.Status = 4
			log.Error(err)
			return
		}
		return strmap
	} else {
		strmap.Status = 4
		log.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值