From 73e935590314205602a9580f76ded1c1aa10837b Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 25 Jun 2019 15:47:50 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E9=87=8D=E6=9E=84GetCityCoordinateList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxutils/ditu/ditu.go | 84 ++++++++++++++++-------------- business/jxutils/ditu/ditu_test.go | 4 +- business/netspider/netspider.go | 2 +- controllers/net_spider.go | 2 +- 4 files changed, 49 insertions(+), 43 deletions(-) diff --git a/business/jxutils/ditu/ditu.go b/business/jxutils/ditu/ditu.go index 82c0dee7b..48ad29cb8 100644 --- a/business/jxutils/ditu/ditu.go +++ b/business/jxutils/ditu/ditu.go @@ -2,7 +2,9 @@ package ditu import ( "math" + "strings" + "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/globals/api" @@ -35,66 +37,70 @@ func GetRound4Radius(lng, lat float64, gridWith int) (roundLng, roundLat int) { } func GetGridsFromCoordinate(lng, lat float64, radius int, roundLng, roundLat int) (coordList []*Coordinate) { - beginLng, _ := jxutils.ConvertDistanceToLogLat(lng, lat, float64(radius), 270) - _, beginLat := jxutils.ConvertDistanceToLogLat(lng, lat, float64(radius), 180) - intBeginLng, intBeginLat := roundCoordinate(beginLng, beginLat, roundLng, roundLat) + if lng != 0 && lat != 0 { + beginLng, _ := jxutils.ConvertDistanceToLogLat(lng, lat, float64(radius), 270) + _, beginLat := jxutils.ConvertDistanceToLogLat(lng, lat, float64(radius), 180) + intBeginLng, intBeginLat := roundCoordinate(beginLng, beginLat, roundLng, roundLat) - endLng, _ := jxutils.ConvertDistanceToLogLat(lng, lat, float64(radius), 90) - _, endLat := jxutils.ConvertDistanceToLogLat(lng, lat, float64(radius), 0) - intEndLng, intEndLat := roundCoordinate(endLng, endLat, roundLng, roundLat) + endLng, _ := jxutils.ConvertDistanceToLogLat(lng, lat, float64(radius), 90) + _, endLat := jxutils.ConvertDistanceToLogLat(lng, lat, float64(radius), 0) + intEndLng, intEndLat := roundCoordinate(endLng, endLat, roundLng, roundLat) - for intLng := intBeginLng; intLng <= intEndLng; intLng += roundLng { - for intLat := intBeginLat; intLat <= intEndLat; intLat += roundLat { - coordList = append(coordList, &Coordinate{ - Lng: jxutils.IntCoordinate2Standard(intLng), - Lat: jxutils.IntCoordinate2Standard(intLat), - }) + for intLng := intBeginLng; intLng <= intEndLng; intLng += roundLng { + for intLat := intBeginLat; intLat <= intEndLat; intLat += roundLat { + coordList = append(coordList, &Coordinate{ + Lng: jxutils.IntCoordinate2Standard(intLng), + Lat: jxutils.IntCoordinate2Standard(intLat), + }) + } } } return coordList } func GetDistrictCoordinateList(districtCode int, radius, gridWith int) (coordList []*Coordinate) { - districts, err := api.AutonaviAPI.GetDistricts(0, utils.Int2Str(districtCode)) + districts, err := api.AutonaviAPI.GetDistricts(1, utils.Int2Str(districtCode)) if err == nil { if len(districts) > 0 { roundLng, roundLat := GetRound4Radius(districts[0].Lng, districts[0].Lat, gridWith) - for _, district := range districts { - coordList = append(coordList, GetGridsFromCoordinate(district.Lng, district.Lat, radius, roundLng, roundLat)...) - } + coordList = getDistrictCoordinateList(districts, radius, gridWith, roundLng, roundLat) } } return coordList } func GetCityCoordinateList(cityCode int, radius, gridWith int) (coordList []*Coordinate) { - districts, err := api.AutonaviAPI.GetDistricts(1, utils.Int2Str(cityCode)) + districts, err := api.AutonaviAPI.GetDistricts(2, utils.Int2Str(cityCode)) if err == nil { - coordMap := make(map[int64]*Coordinate) if len(districts) > 0 { roundLng, roundLat := GetRound4Radius(districts[0].Lng, districts[0].Lat, gridWith) - for _, district := range districts { - nextLevelAllFailed := true // 表示下级行政区的中心坐标都拿不到 - for _, v := range district.Districts { - if v.Lng > 0 && v.Lat > 0 { - // nextLevelAllFailed = false - coordList := GetGridsFromCoordinate(v.Lng, v.Lat, radius, roundLng, roundLat) - for _, coord := range coordList { - coordMap[coord.GetMapKey()] = coord - } - } - } - if nextLevelAllFailed { - coordList := GetGridsFromCoordinate(district.Lng, district.Lat, radius*3, roundLng, roundLat) - for _, coord := range coordList { - coordMap[coord.GetMapKey()] = coord - } - } - } - } - for _, coord := range coordMap { - coordList = append(coordList, coord) + coordList = getDistrictCoordinateList(districts, radius, gridWith, roundLng, roundLat) } } return coordList } + +func getDistrictCoordinateList(districtList []*autonavi.District, radius, gridWith, roundLng, roundLat int) (coordList []*Coordinate) { + coordMap := make(map[int64]*Coordinate) + for _, v := range districtList { + if (v.Level <= 3 || (v.Level == 4 && strings.Index(v.Name, "街道") >= 0)) && v.Lng != 0 && v.Lat != 0 { + realRadius := radius + if v.Level == 2 { + realRadius = 2 * radius + } else if v.Level == 2 { + realRadius = radius / 2 + } + tmpCoordList := GetGridsFromCoordinate(v.Lng, v.Lat, realRadius, roundLng, roundLat) + if v.Level <= 3 { + tmpCoordList = append(tmpCoordList, getDistrictCoordinateList(v.Districts, radius, gridWith, roundLng, roundLat)...) + } + for _, coord := range tmpCoordList { + coordMap[coord.GetMapKey()] = coord + } + } + } + for _, coord := range coordMap { + coordList = append(coordList, coord) + } + return coordList +} diff --git a/business/jxutils/ditu/ditu_test.go b/business/jxutils/ditu/ditu_test.go index 0a1dc4e95..66bff07be 100644 --- a/business/jxutils/ditu/ditu_test.go +++ b/business/jxutils/ditu/ditu_test.go @@ -12,8 +12,8 @@ func init() { } func TestGetCityCoordinateLists(t *testing.T) { - coords := GetCityCoordinateList(110100, 5*1000, 2*1000) - // coords := GetDistrictCoordinateLists(510105, 10*1000, 2*1000) + // coords := GetDistrictCoordinateList(510116, 5*1000, 3*1000) + coords := GetCityCoordinateList(510100, 10*1000, 3*1000) t.Log(len(coords)) // t.Log(utils.Format4Output(coords, false)) var list []map[string]interface{} diff --git a/business/netspider/netspider.go b/business/netspider/netspider.go index 2e5cbc87b..9b29b540f 100644 --- a/business/netspider/netspider.go +++ b/business/netspider/netspider.go @@ -13,7 +13,7 @@ import ( ) const ( - DefRadius = 8000 + DefRadius = 5000 DefGridWith = 3000 ) diff --git a/controllers/net_spider.go b/controllers/net_spider.go index 198f7f727..a8378fa31 100644 --- a/controllers/net_spider.go +++ b/controllers/net_spider.go @@ -16,7 +16,7 @@ type NetSpiderController struct { // @Param token header string true "认证token" // @Param vendorIDs formData string false "厂商ID列表" // @Param cityCodes formData string false "城市列表,缺省为后台启用了的城市" -// @Param radius formData int false "区域半径,单位为米,缺省8000米" +// @Param radius formData int false "区域半径(市或街道的半径会自动增加或缩小),单位为米,缺省5000米" // @Param gridWith formData int false "网格大小,单位为米,缺省为3000米" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult