diff --git a/platformapi/autonavi/autonavi.go b/platformapi/autonavi/autonavi.go index f21284de..291a2aca 100644 --- a/platformapi/autonavi/autonavi.go +++ b/platformapi/autonavi/autonavi.go @@ -57,6 +57,24 @@ var ( } ) +const ( + DistrictLevelCountry = 0 + DistrictLevelProvince = 1 + DistrictLevelCity = 2 + DistrictLevelDistrict = 3 + DistrictLevelStreet = 4 +) + +type District struct { + Adcode string `json:"adcode"` // 国家行政编码 + Lng float64 `json:"lng"` + Lat float64 `json:"lat"` + Citycode string `json:"citycode"` // 电话区号 + Level int `json:"level"` + Name string `json:"name"` + Districts []*District `json:"districts"` +} + type ResponseResult map[string]interface{} type API struct { @@ -160,3 +178,60 @@ func (a *API) GetCoordinateDistrictCode(lng, lat float64) (districtCode int) { } return districtCode } + +func (a *API) GetDistricts(subDistrict int, keywords string) (districtList []*District, err error) { + params := map[string]interface{}{ + "subdistrict": subDistrict, + } + if keywords != "" { + params["keywords"] = keywords + } + + result, err := a.AccessAPI("config/district", params) + // baseapi.SugarLogger.Debug(utils.Format4Output(result, false)) + if err == nil { + return a.GetDistrictsFromInterface(result["districts"].([]interface{})[0].(map[string]interface{})["districts"]), nil + } + return nil, err +} + +func (a *API) GetDistrictsFromInterface(districts interface{}) (districtList []*District) { + districts2 := districts.([]interface{}) + districtList = make([]*District, len(districts2)) + for k, v := range districts2 { + v2 := v.(map[string]interface{}) + districtList[k] = &District{ + Adcode: utils.Interface2String(v2["adcode"]), + Name: utils.Interface2String(v2["name"]), + Level: GetDistrictLevel(utils.Interface2String(v2["level"])), + } + coordStrNodes := strings.Split(utils.Interface2String(v2["center"]), ",") + if len(coordStrNodes) == 2 { + if coordStrNodes[0] != "" && coordStrNodes[1] != "" { + districtList[k].Lng = utils.Str2Float64(coordStrNodes[0]) + districtList[k].Lat = utils.Str2Float64(coordStrNodes[1]) + } + } + if cityCodeStr, ok := v2["citycode"].(string); ok { + districtList[k].Citycode = cityCodeStr + } + districtList[k].Districts = a.GetDistrictsFromInterface(v2["districts"]) + } + return districtList +} + +func GetDistrictLevel(levelName string) (level int) { + switch levelName { + case "country": + level = 0 + case "province": + level = 1 + case "city": + level = 2 + case "district": + level = 3 + case "street": + level = 4 + } + return level +} diff --git a/platformapi/autonavi/autonavi_test.go b/platformapi/autonavi/autonavi_test.go index cae4d9c5..03ef5a37 100644 --- a/platformapi/autonavi/autonavi_test.go +++ b/platformapi/autonavi/autonavi_test.go @@ -51,3 +51,14 @@ func TestGetCoordinateCodes(t *testing.T) { t.Log(districtCode) } } + +func TestGetDistrict(t *testing.T) { + districtList, err := autonaviAPI.GetDistricts(4, "东莞") + if err != nil { + t.Fatal(err) + } + if len(districtList) == 0 { + t.Fatal("should have ditrict") + } + // t.Log(utils.Format4Output(districtList, false)) +}