见鬼了,百度接口查询行政区划查出3个澳门了!!!

发布时间:2024年01月11日

https://api.map.baidu.com/api_region_search/v1/?keyword=山东&sub_admin=2&ak=您的ak
//GET请求

需求,调用百度行政区划接口,获取到最新版本的行政区划,如果最新版本的行政区划和本地存储的行政区划不一致,则更新数据库中的行政区划数据

// 同步行政区域
func syncSystemRegion() {
	beginTime := time.Now().UTC().UnixNano() / 1000000 //记录开始时间点
	getRegionData()
	endTime := time.Now().UTC().UnixNano() / 1000000 //请求处理结束时间点
	sbjlog.Printf("syncSystemRegion  同步行政区域数据 耗时:%d ms", endTime-beginTime)
}

func getRegionData() {
	keyword := "全国"
	subAdmin := "3"
	regionData, err := GetRegionData(keyword, subAdmin)
	if err != nil {
		sbjlog.Debug("getRegionData 获取行政区域数据失败 Error:%v", err)
		return
	}
	if regionData.Status != 0 {
		sbjlog.Debug("getRegionData 获取行政区域数据失败 regionData.Status:%v", regionData.Status)
		return
	}
	//首次写入时,存在文件找不到情况,这种情况,继续写入
	oldVersion, err := readRegionVersion()
	if err != nil && !isFirstSyncSystemRegion {
		sbjlog.Printf("readRegionVersion 读取行政区划版本失败:%v", regionData.Status)
		return
	}
	//如果版本一致,则不更新
	if regionData.DataVersion == oldVersion {
		sbjlog.Printf("getRegionData  行政区域数据版本未更新,暂不同步 :%v", regionData.DataVersion)
		return
	}
	//先删除掉所有表数据
	err = clearRegion()
	if err != nil {
		return
	}
	//因为澳门会返回3个澳门
	err = addRegion(0, regionData.Districts)
	if err != nil {
		sbjlog.Printf("addRegion  同步行政区域失败 :%v", regionData.DataVersion)
		return
	}
	// 写入版本号到txt文件
	err = writeRegionVersionToTxt(regionData.DataVersion)
	if err != nil {
		sbjlog.Printf("writeRegionVersionToTxt  写入行政区划版本号到版本文件失败 :%v", regionData.DataVersion)
		return
	}
	isFirstSyncSystemRegion = false //不是第一次同步行政区划了
	return
}

// 写入版本号到txt文件
func writeRegionVersionToTxt(versionStr string) error {
	err := ioutil.WriteFile("region_version.txt", []byte(versionStr), 0644)
	if err != nil {
		sbjlog.Debug("writeVersionToTxt 写入行政区划版本号时发生错误 Error:%v", err)
		return err
	}
	return nil
}

func readRegionVersion() (string, error) {
	data, err := ioutil.ReadFile("region_version.txt")
	if err != nil {
		sbjlog.Debug("writeVersionToTxt 读取行政区划版本号时发生错误 Error:%v", err)
		return "", err
	}
	return string(data), nil
}

// 清除行政区划
func clearRegion() error {
	_, err := xsql.ExecSQL(IotCloudCMData, ` DELETE FROM SYSTEM_REGION_TREE`)
	if err != nil {
		sbjlog.Debug("clearRegion 删除行政区域失败 Error:%v", err)
		return err
	}
	return nil
}

// 添加行政区划
func addRegion(parentid int, districts []xbaidumap.Districts) error {
	var item systemdb.SystemRegionTree
	for _, v := range districts {
		item = systemdb.SystemRegionTree{}
		item.Code = v.Code
		item.Name = v.Name
		item.Level = v.Level
		item.ParentID = parentid
		item.ParentPath = fmt.Sprintf("%v", parentid)
		newParentid, err := addSystemRegionTree(item)
		if err != nil {
			sbjlog.Debug("addRegion 添加行政区域失败 Error:%v", err)
			return err
		}
		if len(v.Districts) > 0 {
			err = addRegion(newParentid, v.Districts)
			if err != nil {
				sbjlog.Debug("addRegion 添加行政区域失败 Error:%v", err)
				return err
			}
		}
	}
	return nil
}
func addSystemRegionTree(item systemdb.SystemRegionTree) (int, error) {
	sqlStr := `
					INSERT  INTO SYSTEM_REGION_TREE
									( srt_code ,
										srt_name ,
										srt_level ,
										srt_parent_id ,
										srt_parent_path ,
										srt_update_time ,
										srt_update_userid
									)
					VALUES  ( ? ,
										? ,
										? ,
										? ,
										? ,
										GETDATE() ,
										0
									)
									select @@identity				
`
	srtID, err := xsql.GetCount(IotCloudCMData, sqlStr, item.Code, item.Name, item.Level, item.ParentID, item.ParentPath)
	if err != nil {
		sbjlog.Debug("addSystemRegionTree 添加行政区域失败 Error:%v", err)
		return 0, err
	}

	return srtID, nil
}
调用百度接口获取行政区划数据方法:
// 行政区域结构体
type regionData struct {
	Status      int         `json:"status"`
	DataVersion string      `json:"data_version"`
	ResultSize  int         `json:"result_size"`
	Districts   []Districts `json:"districts"`
}
type Districts struct {
	Code      string      `json:"code"`
	Name      string      `json:"name"`
	Level     int         `json:"level"`
	Districts []Districts `json:"districts"`
}

// 文档:https://lbsyun.baidu.com/faq/api?title=webapi/district-search/base#%E5%9C%A8%E7%BA%BF%E8%BF%90%E8%A1%8C
// 获取行政区域
// GetRegionData
// keyword:
// 若sub_admin=2
// 检索关键字搜索省份(例如河北),能够显示市(例如石家庄市),区(例如桥西区)
// subAdmin
// 显示下级行政区划级数
// 可填入:0、1、2、3等数字,并以此类推
// 0:不返回下级行政区;
// 1:返回下一级行政区;
// 2:返回下两级行政区;
// 3:返回下三级行政区;
func GetRegionData(keyword, subAdmin string) (regionData, error) {
	var item regionData
	args := "keyword=" + url.QueryEscape(keyword) + "&sub_admin=" + subAdmin + "&extensions_code=1&ak=" + mapConfig.Ak
	resp, err := xhttp.SendGET("https://api.map.baidu.com/api_region_search/v1/", args, 5)
	if err != nil {
		return item, err
	}
	err = json.Unmarshal([]byte(resp), &item)
	if err != nil {
		return item, err
	}
	return item, nil
}
遇到问题:

出现了3个相同code 的澳门!!!


解决方案:

先删除数据库中的省市区数据,然后再次写入
原因:省市区下拉框一般有3个,如果中间没有市,就选不了区了

文章来源:https://blog.csdn.net/lmy_loveF/article/details/135529430
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。