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个,如果中间没有市,就选不了区了