- 饿百与京东拉门店数据基本OK
This commit is contained in:
100
business/jxutils/ditu/ditu.go
Normal file
100
business/jxutils/ditu/ditu.go
Normal file
@@ -0,0 +1,100 @@
|
||||
package ditu
|
||||
|
||||
import (
|
||||
"math"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
const (
|
||||
keyMultiple = 1000000
|
||||
)
|
||||
|
||||
type Coordinate struct {
|
||||
Lng float64
|
||||
Lat float64
|
||||
}
|
||||
|
||||
func roundCoordinate(lng, lat float64, roundLng, roundLat int) (lng2, lat2 int) {
|
||||
lng2 = jxutils.StandardCoordinate2Int(lng+jxutils.IntCoordinate2Standard(roundLng)/2) / roundLng * roundLng
|
||||
lat2 = jxutils.StandardCoordinate2Int(lat+jxutils.IntCoordinate2Standard(roundLat)/2) / roundLat * roundLat
|
||||
return lng2, lat2
|
||||
}
|
||||
|
||||
func (c *Coordinate) GetMapKey() int64 {
|
||||
return int64(c.Lng*keyMultiple*keyMultiple + c.Lat*keyMultiple)
|
||||
}
|
||||
|
||||
func GetRound4Radius(lng, lat float64, gridWith int) (roundLng, roundLat int) {
|
||||
lng2, _ := jxutils.ConvertDistanceToLogLat(lng, lat, float64(gridWith), 90)
|
||||
_, lat2 := jxutils.ConvertDistanceToLogLat(lng, lat, float64(gridWith), 0)
|
||||
// globals.SugarLogger.Debugf("GetRound4Radius gridWith:%d, lng:%f, lat:%f, lng2:%f, lat2:%f", gridWith, lng, lat, lng2, lat2)
|
||||
return jxutils.StandardCoordinate2Int(math.Abs(lng2 - lng)), jxutils.StandardCoordinate2Int(math.Abs(lat2 - lat))
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
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),
|
||||
})
|
||||
}
|
||||
}
|
||||
return coordList
|
||||
}
|
||||
|
||||
func GetDistrictCoordinateList(districtCode int, radius, gridWith int) (coordList []*Coordinate) {
|
||||
districts, err := api.AutonaviAPI.GetDistricts(0, 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)...)
|
||||
}
|
||||
}
|
||||
}
|
||||
return coordList
|
||||
}
|
||||
|
||||
func GetCityCoordinateList(cityCode int, radius, gridWith int) (coordList []*Coordinate) {
|
||||
districts, err := api.AutonaviAPI.GetDistricts(1, 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)
|
||||
}
|
||||
}
|
||||
return coordList
|
||||
}
|
||||
Reference in New Issue
Block a user