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("更新站点经纬度合法性!完成")
}
go通过代理访问百度地图api实现GPS角坐标转换
最新推荐文章于 2021-08-05 14:33:12 发布