- 重构GetCityCoordinateList

This commit is contained in:
gazebo
2019-06-25 15:47:50 +08:00
parent 8f7c6f13ea
commit 73e9355903
4 changed files with 49 additions and 43 deletions

View File

@@ -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
}

View File

@@ -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{}

View File

@@ -13,7 +13,7 @@ import (
)
const (
DefRadius = 8000
DefRadius = 5000
DefGridWith = 3000
)

View File

@@ -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