我试图创建一个让我提供2个参数的函数,一个新的位置和一个速度(以米/秒为单位)
看起来像这样:
func (l *Location) Move(newLoc *Location, speed float64) {
R := 6371.0 // Kilometers
lat1 := l.Latitude * math.Pi / 180
lat2 := l.Longitude * math.Pi / 180
diffLat := (newLoc.Latitude - l.Latitude) * math.Pi / 180
diffLon := (newLoc.Longitude - l.Longitude) * math.Pi / 180
a := math.Sin(diffLat/2)*math.Sin(diffLat/2) +
math.Cos(lat1)*math.Cos(lat2)*math.Sin(diffLon/2)*math.Sin(diffLon/2)
c := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a))
distanceToMove := R * c // Distance to travel in a straight line, in Kilometers
}
我唯一遇到麻烦的是考虑制定纬度的公式,从当前位置开始,并在一段时间内结束新的位置。
所以说这个人将纬度从56.65
更改为58.12
,我告诉它要以1.3m/s
旅行,我该如何做到这一点。感谢。
答案 0 :(得分:0)
如果我理解你的问题,你的目标是计算两个位置之间的所有中间点,从一个位置开始,然后使用指定的速度到达第二个位置。
如果我是对的,以下是我将如何获得第一个解决方案。如果有人能改进这一点,我会很感激。
On the proj4 documentation,你可以找到很多关于如何计算两点之间距离的信息。
从A点开始到达给定速度(m / s)的B,只是意味着计算每一秒与AB线上A距离为a的点A'。
采用更算法的方式(基于Vincenty's formula):
func (l *Location) Move(newLoc *Location, speed float64) Location {
azimuthA, azimuthB, d := inverseVincenty(l, newLoc)
// Use the direct vincenty's formula.
// Here transform speed to get the correct value
// without transformation, since speed is in m/s,
// the resulting point will be at speed(m) distance from l.
res := directVincenty(l, speed, azimuthA)
// Now res shall contain your new point.
return res
}
func main() {
// init A and B and speed values.
C := A // to conserve A position.
t := time.Tick(1* time.Second)
for stop := false; !stop; {
select {
case <- t:
C = C.Move(B, speed)
case // here a break condition:
stop = true
}
}
}
我认为这是一个开始,任何评论都对此答案表示赞赏。