- normalize autonavi.GetDistricts

This commit is contained in:
gazebo
2018-12-06 10:31:33 +08:00
parent 0ff1f61fe3
commit 4a1037f88f
2 changed files with 30 additions and 25 deletions

View File

@@ -7,6 +7,7 @@ import (
"sort" "sort"
"strings" "strings"
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/baseapi/platformapi" "git.rosy.net.cn/baseapi/platformapi"
"git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils"
) )
@@ -168,13 +169,13 @@ func (a *API) CoordinateConvert(lng, lat float64, coordsys string) (retLng, retL
return lng, lat, err return lng, lat, err
} }
// 有些市是没有区的比如东莞这种情况下返回的区码是一个假的区域即市的编码加上9000000 // 这里的District指的是实际的District有些市是没有区的比如东莞这种情况下返回的区码是一个假的区域即市的编码加上9000000
func (a *API) GetCoordinateDistrictCode(lng, lat float64) (districtCode int) { func (a *API) GetCoordinateDistrictCode(lng, lat float64) (districtCode int) {
params := map[string]interface{}{ params := map[string]interface{}{
"location": fmt.Sprintf("%.6f,%.6f", lng, lat), "location": fmt.Sprintf("%.6f,%.6f", lng, lat),
} }
result, err := a.AccessAPI("geocode/regeo", params) result, err := a.AccessAPI("geocode/regeo", params)
// baseapi.SugarLogger.Debug(utils.Format4Output(result, false)) baseapi.SugarLogger.Debug(utils.Format4Output(result, false))
if err == nil { if err == nil {
addressComponent := result["regeocode"].(map[string]interface{})["addressComponent"].(map[string]interface{}) addressComponent := result["regeocode"].(map[string]interface{})["addressComponent"].(map[string]interface{})
if strAdcode, ok := addressComponent["adcode"].(string); ok { if strAdcode, ok := addressComponent["adcode"].(string); ok {
@@ -187,6 +188,8 @@ func (a *API) GetCoordinateDistrictCode(lng, lat float64) (districtCode int) {
return districtCode return districtCode
} }
// 这里的District指的是地点不是实际上的区具体级别看level
// 这个函数返回的可能不是同级别的地点
func (a *API) GetDistricts(subDistrict int, keywords string) (districtList []*District, err error) { func (a *API) GetDistricts(subDistrict int, keywords string) (districtList []*District, err error) {
params := map[string]interface{}{ params := map[string]interface{}{
"subdistrict": subDistrict, "subdistrict": subDistrict,
@@ -198,32 +201,34 @@ func (a *API) GetDistricts(subDistrict int, keywords string) (districtList []*Di
result, err := a.AccessAPI("config/district", params) result, err := a.AccessAPI("config/district", params)
// baseapi.SugarLogger.Debug(utils.Format4Output(result, false)) // baseapi.SugarLogger.Debug(utils.Format4Output(result, false))
if err == nil { if err == nil {
return a.GetDistrictsFromInterface(result["districts"].([]interface{})[0].(map[string]interface{})["districts"]), nil return a.getDistrictsFromInterface(result["districts"]), nil
} }
return nil, err return nil, err
} }
func (a *API) GetDistrictsFromInterface(districts interface{}) (districtList []*District) { func (a *API) getDistrictsFromInterface(districts interface{}) (districtList []*District) {
districts2 := districts.([]interface{}) if districts != nil {
districtList = make([]*District, len(districts2)) districts2 := districts.([]interface{})
for k, v := range districts2 { districtList = make([]*District, len(districts2))
v2 := v.(map[string]interface{}) for k, v := range districts2 {
districtList[k] = &District{ v2 := v.(map[string]interface{})
Adcode: utils.Interface2String(v2["adcode"]), districtList[k] = &District{
Name: utils.Interface2String(v2["name"]), Adcode: utils.Interface2String(v2["adcode"]),
Level: GetDistrictLevel(utils.Interface2String(v2["level"])), 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])
} }
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"])
} }
if cityCodeStr, ok := v2["citycode"].(string); ok {
districtList[k].Citycode = cityCodeStr
}
districtList[k].Districts = a.GetDistrictsFromInterface(v2["districts"])
} }
return districtList return districtList
} }

View File

@@ -36,7 +36,7 @@ func TestCoordinateConvert(t *testing.T) {
} }
} }
func TestGetCoordinateCodes(t *testing.T) { func TestGetCoordinateDistrictCode(t *testing.T) {
dongguanLng := 113.703870 dongguanLng := 113.703870
dongguanLat := 22.833210 dongguanLat := 22.833210
districtCode := autonaviAPI.GetCoordinateDistrictCode(dongguanLng, dongguanLat) districtCode := autonaviAPI.GetCoordinateDistrictCode(dongguanLng, dongguanLat)
@@ -63,8 +63,8 @@ func TestGetCoordinateCodes(t *testing.T) {
} }
} }
func TestGetDistrict(t *testing.T) { func TestGetDistricts(t *testing.T) {
districtList, err := autonaviAPI.GetDistricts(4, "东莞") districtList, err := autonaviAPI.GetDistricts(1, "东莞")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }