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