2010-07-12 24 views
9

Tôi đang cố gắng tìm điểm đích, cho điểm bắt đầu lat/long, mang khoảng cách &. Máy tính từ trang web này dưới đây cho tôi kết quả mong muốn.Tính điểm cuối cho khoảng cách, ổ trục, điểm bắt đầu

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

Khi tôi cố gắng thực hiện giống nhau thông qua mã, tôi không nhận được kết quả ngay.

Dưới đây là mã của tôi -

private GLatLng pointRadialDistance(double lat1, double lon1, 
       double radianBearing, double radialDistance) 
    { 
     double rEarth = 6371.01; 
     lat1 = DegreeToRadian(lat1); 
     lon1 = DegreeToRadian(lon1); 
     radianBearing = DegreeToRadian(radianBearing); 
     radialDistance = radialDistance/rEarth; 
     double lat = Math.Asin(Math.Sin(lat1) * Math.Cos(radialDistance) + Math.Cos(lat1) 
         * Math.Sin(radialDistance) * Math.Cos(radianBearing)); 
     double lon; 
     if (Math.Cos(lat) == 0) 
     { // Endpoint a pole 
      lon = lon1; 
     } 
     else 
     { 
      lon = ((lon1 - Math.Asin(Math.Sin(radianBearing) * Math.Sin(radialDistance)/Math.Cos(lat)) 
          + Math.PI) % (2 * Math.PI)) - Math.PI; 
     } 
     lat = RadianToDegree(lat); 
     lon = RadianToDegree(lon); 
     GLatLng newLatLng = new GLatLng(lat, lon); 
     return newLatLng; 
    } 

    public double Bearing(double lat1, double long1, double lat2, double long2) 
    { 
     //Convert input values to radians 
     lat1 = DegreeToRadian(lat1); 
     long1 = DegreeToRadian(long1); 
     lat2 = DegreeToRadian(lat2); 
     long2 = DegreeToRadian(long2); 

     double deltaLong = long2 - long1; 

     double y = Math.Sin(deltaLong) * Math.Cos(lat2); 
     double x = Math.Cos(lat1) * Math.Sin(lat2) - 
       Math.Sin(lat1) * Math.Cos(lat2) * Math.Cos(deltaLong); 
     double bearing = Math.Atan2(y, x); 
     return bearing; 
    } 

    public double DegreeToRadian(double angle) 
    { 
    return Math.PI * angle/180.0; 
    } 

    public double RadianToDegree(double angle) 
    { 
     return 180.0 * angle/Math.PI; 
    } 

Từ chương trình chính, tôi gọi là thủ tục phụ như sau -

double bearing = Bearing(-41.294444, 174.814444, -40.90521, 175.6604); 
GLatLng endLatLng = pointRadialDistance(-41.294444, 174.814444, bearing, 80); 

tôi nhận được bên dưới kết quả -

Bearing=1.02749621782165 
endLatLng=-40.5751022737927,174.797458881699 

Câu trả lời Tôi mong đợi là -40.939722,175.646389 (từ liên kết trang web ở trên).

Có ai có thể đề xuất sai lầm tôi đang thực hiện trong mã ở đây không?

+0

Đối với một điều, kết quả được trả về bởi Vòng bi phải được chuyển đổi thành mức độ. –

Trả lời

18

Dưới đây là một số mã đạt được những gì bạn muốn làm.

public static GeoLocation FindPointAtDistanceFrom(GeoLocation startPoint, double initialBearingRadians, double distanceKilometres) 
{ 
    const double radiusEarthKilometres = 6371.01; 
    var distRatio = distanceKilometres/radiusEarthKilometres; 
    var distRatioSine = Math.Sin(distRatio); 
    var distRatioCosine = Math.Cos(distRatio); 

    var startLatRad = DegreesToRadians(startPoint.Latitude); 
    var startLonRad = DegreesToRadians(startPoint.Longitude); 

    var startLatCos = Math.Cos(startLatRad); 
    var startLatSin = Math.Sin(startLatRad); 

    var endLatRads = Math.Asin((startLatSin * distRatioCosine) + (startLatCos * distRatioSine * Math.Cos(initialBearingRadians))); 

    var endLonRads = startLonRad 
     + Math.Atan2(
      Math.Sin(initialBearingRadians) * distRatioSine * startLatCos, 
      distRatioCosine - startLatSin * Math.Sin(endLatRads)); 

    return new GeoLocation 
    { 
     Latitude = RadiansToDegrees(endLatRads), 
     Longitude = RadiansToDegrees(endLonRads) 
    }; 
} 

public struct GeoLocation 
{ 
    public double Latitude { get; set; } 
    public double Longitude { get; set; } 
} 

public static double DegreesToRadians(double degrees) 
{ 
    const double degToRadFactor = Math.PI/180; 
    return degrees * degToRadFactor; 
} 

public static double RadiansToDegrees(double radians) 
{ 
    const double radToDegFactor = 180/Math.PI; 
    return radians * radToDegFactor; 
} 
0

giải pháp rất đơn giản trong hình học thư viện (V3), nếu bạn không có một problema với việc sử dụng các bản đồ google api V3 (tùy thuộc vào ứng dụng - theo dõi tài sản trong thời gian thực, ví dụ - Giấy phép miễn phí không áp dụng HOẶC bạn có thể không muốn cấu trúc lại từ V2 sang V3).

1: khai báo một thư viện thêm cùng với tuyên bố hiện tại của bạn:

<script type="text/javascript" src="http://maps.google.com/maps/api/js?libraries=geometry&sensor=false"></script> 

2: thiết lập điểm bắt đầu, hướng và khoảng cách

var nyc = new google.maps.LatLng(40.715, -74.002); 
var distance = 5576673; 
var heading = 51.2145; 

thứ 3: đi đến đó

var endPoint = google.maps.geometry.spherical.computeOffset(nyc, distance, heading); 
var london = new google.maps.Marker({ 
    position: endPoint, 
    map: map 
}); 

xong, bây giờ bạn đang ở thị trấn London. để biết thêm về computeDistance, computeHeading và computeArea:

http://www.svennerberg.com/2011/04/calculating-distances-and-areas-in-google-maps-api-3/

http://code.google.com/intl/en/apis/maps/documentation/javascript/geometry.html

0

Dưới đây là việc thực hiện các mã JavaScript vào http://www.movable-type.co.uk/scripts/latlong.html mà tôi đã viết cho bản thân mình và sử dụng trong các dự án của riêng tôi. Bạn có thể thực hiện nó cho dự án của bạn nếu bạn muốn.

Lưu ý: Tọa độ là một lớp có thuộc tính X (kinh độ), Y (vĩ độ), Z (độ cao). ToDegree() và ToRadian() là các phần mở rộng cho kiểu Double. Cuối cùng, GetTarget() là một phần mở rộng cho một cá thể Tọa độ.

/// <summary>Calculates the destination coordinate by given angle and distance.</summary> 
/// <param name="origin">Origin.</param> 
/// <param name="bearing">Azimuth.</param> 
/// <param name="distance">Distance (km).</param> 
/// <returns>Coordinate.</returns> 
public static Coordinate GetTarget(
this Coordinate origin, double bearing, double distance, double altitude = 0) 
{ 
    var d = distance/6371; 
    var rlat = origin.Y.ToRadian(); 
    var rlon = origin.X.ToRadian(); 
    var rbearing = bearing.ToRadian(); 
    var lat2 = rlat + (d * Math.Cos(rbearing)); 
    var dlat = lat2 - rlat; 
    var dphi = Math.Log((Math.Tan((lat2/2) + (Math.PI/4)))/(Math.Tan((rlat/2) + (Math.PI/4)))); 
    var q = 
     Math.Abs(dlat) > 0.0000000001 
     ? dlat/dphi 
     : Math.Cos(rlat); 
    var dlon = (d * Math.Sin(rbearing))/q; 

    if (Math.Abs(lat2) > Math.PI/2) 
    { 
     lat2 = lat2 > 0 ? Math.PI : Math.PI - lat2; 
    } 

    var lon2 = (rlon + dlon + Math.PI) % (2 * Math.PI) - Math.PI; 

    return new Coordinate 
    { 
     X = lon2.ToDegree(), 
     Y = lat2.ToDegree(), 
     Z = origin.Z 
    }; 
} 
Các vấn đề liên quan