go实现访问百度地图api实现经纬度逆解析出地理位置收集
来源:互联网 发布:js视频教程 编辑:程序博客网 时间:2024/05/21 14:47
package crontabimport (. "domain/model""encoding/json""infrastructure/log""io/ioutil""net/http""regexp""strconv""strings""time""infrastructure/gopkg.in/mgo.v2/bson")type Location struct {Lng float64 //经度Lat float64 //纬度}type AddressComponent struct {country stringProvince string //省City string //市District string //区县Street string //街道Street_number string //街道门牌号adcode stringcountry_code uint64direction stringdistance string}type Result struct {Location Locationformatted_address stringbusiness stringAddressComponent AddressComponentpoiRegions []interface{}sematic_description stringcityCode uint64}type Strmap struct {Status intResult Result}var (baiduMapCityMap = map[string]string{"海东地区": "海东市","日喀则地区": "日喀则市",})func (this *Crontab) GeocodingBaidu(dbname string) (isAccess bool) {isAccess = truequeryMap := bson.M{"经纬度合法": "是", "手动": bson.M{"$exists": false}}queryMap["$or"] = []bson.M{bson.M{"地市": bson.M{"$exists": false}}, bson.M{"地市": ""}}queryMap["longitude"] = bson.M{"$exists": true}queryMap["latitude"] = bson.M{"$exists": true}mapapi := "http://api.map.baidu.com/geocoder/v2/?ak=******&output=json&location"log.Error("正在操作的数据库:", dbname)var count, countOK uint64 = 0, 0eNbLocationRecord, _ := this.GetMultiRecord(dbname, COLLECTION_ENB_LOCATION_INFO, queryMap, bson.M{"_id": 0})length := len(eNbLocationRecord)if 0 == length {return isAccess}for _, oneLocationRecord := range eNbLocationRecord {latitude := oneLocationRecord["latitude"].(float64)longitude := oneLocationRecord["longitude"].(float64)tmp1 := strconv.FormatFloat(latitude, 'f', 6, 64)tmp2 := strconv.FormatFloat(longitude, 'f', 6, 64)location := strings.Join([]string{tmp1, tmp2}, ",")url := strings.Join([]string{mapapi, location}, "=")strmap := this.fetchGeocoding(&url, &Proxy_addr)for retry := 1; 0 != strmap.Status && retry < Retry; retry++ {time.Sleep(time.Minute)strmap = this.fetchGeocoding(&url, &Proxy_addr)}if 0 != strmap.Status {log.Error("重试4次转换失败!")isAccess = falsereturn isAccess}var updateActionMap bson.Mmatch_province, _ := regexp.MatchString(DbNameToProvinceNameMap[dbname], strmap.Result.AddressComponent.Province)if !match_province {log.Error("逆解析省份与当前省份不符:", strmap.Result.AddressComponent.Province)count++continue} else {countOK++//要增加对海东地区的处理realCity := strmap.Result.AddressComponent.Cityif realName, ok := baiduMapCityMap[realCity]; ok {realCity = realName}updateActionMap = bson.M{"$set": bson.M{"地市": realCity}}}//log.Error(oneLocationRecord, updateActionMap)this.UpdateOne(dbname, COLLECTION_ENB_LOCATION_INFO, oneLocationRecord, updateActionMap)}log.Error("数据库,逆解析出省份和记录不符个数为, 逆解析成功个数为", dbname, count, countOK)return}func (this *Crontab) fetchGeocoding(url, proxy_addr *string) (strmap Strmap) {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/geocoder/v2/ error")}return strmap}//对于经纬度无法确定地市的字段,通过提取网元中文作为key去查找站点所在地市func (this *Crontab) DistinctCityLocations(dbName string) {selectMap := bson.M{"_id": 0, "地市": 1, "子网": 1, "网元名称": 1, "管理网元ID": 1, "经度": 1, "纬度": 1}result, _ := this.GetMultiRecord(dbName, COLLECTION_ENB_LOCATION_INFO, bson.M{"地市": bson.M{"$exists": false}}, selectMap)log.Error("正在操作数据库:", dbName, " 共", len(result), "个无地市站点")cout := 0if 0 == len(result) {log.Error(dbName, " 无不确定地市站点")return}for _, locations := range result {netName, ok := locations["网元名称"].(string)if !ok || netName == "" {continue}r := []rune(netName)strSlice := []string{}nwNameSlice := []string{}cnstr := ""str := ""for i := 0; i < len(r); i++ {str = str + string(r[i])nwNameSlice = append(nwNameSlice, str)if r[i] <= 40869 && r[i] >= 19968 {cnstr = cnstr + string(r[i])strSlice = append(strSlice, cnstr)}}realCityName := ""for i := len(nwNameSlice) - 1; i > 0; i-- {var networkNameslice []bson.RegExnetworkNameslice = append(networkNameslice, bson.RegEx{nwNameSlice[i], ""})queryMap := bson.M{"地市": bson.M{"$exists": true}, "网元名称": bson.M{"$in": networkNameslice}}cityName, _ := this.Distinct(dbName, COLLECTION_ENB_LOCATION_INFO, "地市", queryMap)if 1 == len(cityName) {cout++realCityName = cityName[0].(string)break}}if "" != realCityName {log.Error(locations, bson.M{"$set": bson.M{"地市": realCityName}})this.UpdateOne(dbName, COLLECTION_ENB_LOCATION_INFO, locations, bson.M{"$set": bson.M{"地市": realCityName}})continue}for i := len(strSlice) - 1; i > 0; i-- {var networkNameslice []bson.RegExnetworkNameslice = append(networkNameslice, bson.RegEx{strSlice[i], ""})queryMap := bson.M{"地市": bson.M{"$exists": true}, "网元名称": bson.M{"$in": networkNameslice}}cityName, _ := this.Distinct(dbName, COLLECTION_ENB_LOCATION_INFO, "地市", queryMap)if 1 == len(cityName) {cout++realCityName = cityName[0].(string)break}}if "" != realCityName {log.Error(locations, bson.M{"$set": bson.M{"地市": realCityName}})this.UpdateOne(dbName, COLLECTION_ENB_LOCATION_INFO, locations, bson.M{"$set": bson.M{"地市": realCityName}})}}log.Error(dbName, " 通过匹配确定了地市站点数为: ", cout)}
阅读全文
0 0
- go实现访问百度地图api实现经纬度逆解析出地理位置收集
- android 用百度地图API获取经纬度和地理位置
- java调用百度地图API根据地理位置中文获取经纬度
- java调用百度地图API根据地理位置中文获取经纬度
- go通过代理访问百度地图api实现GPS角坐标转换
- 百度地图API,根据经纬度实现车辆移动轨迹绘制
- 百度地图API,根据经纬度实现车辆移动轨迹绘制
- 百度地图API实现 地址&经纬度 互相转换
- 融云&百度地图-实现地理位置发送
- 百度地图API接口 地图标注 地址经纬度解析
- 百度地图 经纬度和地理位置的转换
- 百度地图----解析经纬度
- java调用百度地图API通过URL根据地理位置中文处理返回值获取经纬度
- 【Java】 java调用百度地图API根据地理位置中文获取经纬度 地址备忘
- 百度Javascript API实现经纬度导航
- 通过百度API,搜索地名,实现地图和经纬度的查询
- 使用百度地图api实现,圈选区域并获得端点经纬度
- 百度地图api的实现
- windows中hid操作api介绍
- go通过代理访问百度地图api实现GPS角坐标转换
- 浅谈SAP CRM开发——基本业务概念
- 值得推荐的开源C/C++框架和库
- hibernate 更新数据注意事项
- go实现访问百度地图api实现经纬度逆解析出地理位置收集
- 关于位运算-快速幂
- Intellij idea Springboot 热加载
- binder驱动源码全注释上
- 2017年6月Java面试——redis
- QGroundControl用户可以自定义飞机航点命令
- 可以读一读的推荐系统nlp相关
- Activity生命周期
- 19个JavaScript常用的简写技术