2011-02-05 32 views
8

Looking for nguồn lực hay thuật toán để tính toán sau trong một ứng dụng chuyển hướng:Tính toán GPS/GIS: Thuật toán để dự đoán vị trí tương lai dựa trên chuyển động/mph?

Nếu vị trí GPS hiện tại của tôi là (0,0) và tôi đang hướng 32 độ ở mức 15 dặm một giờ, làm thế nào tôi có thể tính toán những gì tôi vị trí sẽ được trong 10 giây?

ví dụ: GPSCoordinate predictedCoord = GPSCoordinate.FromLatLong(0, 0).AddByMovement(32, 15, TimeSpan.FromSeconds(10));

Edit: mã hiện dựa trên câu trả lời dưới đây:

public GPSCoordinate AddMovementMilesPerHour(double heading, double speedMph, TimeSpan duration) 
{ 
    double x = speedMph * System.Math.Sin(heading * pi/180) * duration.TotalSeconds/3600; 
    double y = speedMph * System.Math.Cos(heading * pi/180) * duration.TotalSeconds/3600; 

    double newLat = this.Latitude + 180/pi * y/earthRadius; 
    double newLong = this.Longitude + 180/pi/System.Math.Sin(this.Latitude * pi/180) * x/earthRadius; 

    return GPSCoordinate.FromLatLong(newLat, newLong); 
} 
+0

Nếu xe đang chuyển động trên một đường phố bạn có thể muốn làm theo các đường phố thay vì ngoại suy tuyến tính. – CodesInChaos

+0

@CodeInChaos trong trường hợp này, tôi muốn tuyến tính; này không mất con đường đất vào tài khoản (có thể sau!) – Brandon

+0

Mã trong câu trả lời đầu tiên trên http://stackoverflow.com/questions/3225803/calculate-endpoint-given-distance-bearing-starting-point
sẽ giải thích cho bạn tất cả mọi thứ – faruk

Trả lời

10

Dưới đây là câu trả lời tham số hoàn chỉnh:

biến:

  • heading: tiêu đề (tức là . ngược góc từ góc phương vị 0 °, trong độ)
  • speed: vận tốc (ví dụ chuẩn mực của vector tốc độ, tính bằng dặm/giờ)
  • lat0, lon0: tọa độ ban đầu ở độ
  • dtime: khoảng thời gian từ khi bắt đầu vị trí, chỉ trong vài giây
  • lat, lon: tọa độ dự đoán trong độ
  • pi: các pi không đổi (3,14159 ...)
  • Rt: Trái đất bán kính trong dặm (6.378.137,0 m mà làm 3964,037911746 dặm)

Trong một (Đông, miền Bắc) khung địa phương, các vị trí sau khi khoảng thời gian là:

x = speed * sin(heading*pi/180) * dtime/3600; 
y = speed * cos(heading*pi/180) * dtime/3600; 

(với tọa độ trong dặm)

Từ đó bạn có thể tính toán vị trí mới trong khung WGS84 (tức vĩ độ và kinh độ):

lat = lat0 + 180/pi * y/Rt; 
lon = lon0 + 180/pi/sin(lat0*pi/180) * x/Rt; 

Edit: chỉnh dòng cuối cùng: * sin (phi) đến/sin (phi)

+1

Đừng thử điều này trên một chuyến thám hiểm cực: P Mã phá vỡ trong gần (một vài mét tôi đoán) đến một cực – CodesInChaos

+0

Có lẽ tôi nên đã đề cập đến nó ... Nhưng nó là một xấp xỉ tốt miễn là bạn không đến quá gần các cực và thứ tự của độ lớn cho khoảng cách ở khoảng cách hoặc dưới 10km. Cảm ơn! –

+1

Câu trả lời hay, cảm ơn bạn. Nếu tôi từng tham gia một chuyến thám hiểm cực, mã của tôi sẽ không chỉ bị phá vỡ, nhưng ý tưởng của tôi về một thời điểm tốt sẽ là ... – Brandon

0

Dưới đây là các công thức mà bạn cần.

http://www.movable-type.co.uk/scripts/latlong.html

Hy vọng điều đó sẽ hữu ích.

Bob

[cập nhật] Dưới đây là các công thức trong JavaScript (sao chép từ nguồn)

var lat2 = Math.asin (Math.sin (lat1) * Math.cos (d/R) + Math.cos (lat1) * Math.sin (d/R) * Math.cos (brng)); var lon2 = lon1 + Math.atan2 (Math.sin (brng) * Math.sin (d/R) * Math.cos (lat1), Math.cos (d/R) -Math.sin (lat1) * Môn Toán.tội lỗi (lat2));

d = khoảng cách di chuyển = vận tốc x thời gian R = bán kính của trái đất

Các vấn đề liên quan