2011-01-11 7 views
23

Tôi đang cố chuyển đổi đoạn mã được đưa ra trong http://www.movable-type.co.uk/scripts/latlong.html thành java này. Nhưng tôi không nhận được kết quả tương tự như của trang web. Đây là mã của tôi để tìm trung điểm giữa hai điểm mà vĩ độ và kinh độ của chúng được đưa rađiểm giữa giữa hai vĩ độ và kinh độ

midPoint(12.870672,77.658964,12.974831,77.60935); 
    public static void midPoint(double lat1,double lon1,double lat2,double lon2) 
    { 
    double dLon = Math.toRadians(lon2-lon1); 
     double Bx = Math.cos(lat2) * Math.cos(dLon); 
     double By = Math.cos(lat2) * Math.sin(dLon); 
     double lat3 = Math.atan2(Math.sin(lat1)+Math.sin(lat2),Math.sqrt((Math.cos(lat1)+Bx)*(Math.cos(lat1)+Bx) + By*By)); 
     double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx); 
     System.out.print(lat3 +" " + lon3); 
    } 

Tôi không chắc chắn rằng dLon có đúng hay không. Vì vậy, hãy giúp tôi tìm ra. P.S.I cần phải tìm vĩ độ và kinh độ của điểm giữa

Trả lời

62

Bạn cần chuyển đổi sang radian. Thay đổi nó thành các mục sau:

public static void midPoint(double lat1,double lon1,double lat2,double lon2){ 

    double dLon = Math.toRadians(lon2 - lon1); 

    //convert to radians 
    lat1 = Math.toRadians(lat1); 
    lat2 = Math.toRadians(lat2); 
    lon1 = Math.toRadians(lon1); 

    double Bx = Math.cos(lat2) * Math.cos(dLon); 
    double By = Math.cos(lat2) * Math.sin(dLon); 
    double lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By)); 
    double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx); 

    //print out in degrees 
    System.out.println(Math.toDegrees(lat3) + " " + Math.toDegrees(lon3)); 
} 
+0

Thank bạn cho sự giúp đỡ của bạn :-) – Allwyn

+0

Cảm ơn công thức. ! –

+0

hi @dogbane tôi cần một trợ giúp. http://stackoverflow.com/questions/11758582/find-if-the-current-location-is-along-a-straight-line-drawn-between-two-points – RVG

1

Bạn cần chuyển đổi các giá trị lat và lon của bạn được sử dụng trong các công thức khác thành Radian. Bạn có thể thấy điều này trong mã ~ 3/5ths của cách xuống trang. Các đầu mối đã được đưa ra ở cuối của pháp luật hình cầu của công thức khoảng cách cosines:

(Lưu ý rằng ở đây và trong tất cả các đoạn mã tiếp theo, để đơn giản tôi không hiển thị chuyển đổi từ độ để radian;).

-1

Công việc cuối cùng của tôi là tạo mô-đun theo dõi và tôi đang sử dụng công thức này để tính khoảng cách giữa 2 tọa độ.

//Location lat and lon 
double locLat = -23.548333; 
double locLon = -46.636111; 

//Destination lat and lon 
double dstLat = -22.902778; 
double dstLon = -43.206667; 

double arcoAB = 90 - (dstLat); 
double arcoAC = 90 - (locLat); 

double difLon = locLon - (dstLon); 

double cosA = Math.cos(Math.toRadians(arcoAC)) * Math.cos(Math.toRadians(arcoAB)) + Math.sin(Math.toRadians(arcoAC)) * Math.sin(Math.toRadians(arcoAB)) * Math.cos(Math.toRadians(difLon)); 
double acosCosA = Math.toDegrees(Math.acos(cosA)); 

double raio = 2 * Math.PI * 6371; 
double distance = (raio * acosCosA)/360; 

return distance; //Distance in KM, convert to anything else (miles, meters..) if you need.. 

Bạn có thể lấy điểm giữa cách chia khoảng cách bằng 2.

Ah, đây công thức khác hoạt động quá:

double dLat = Math.toRadians(dstLat - locLat); 
double dLon = Math.toRadians(dstLon - locLon); 

double a = Math.sin(dLat/2) * Math.sin(dLat/2) 
      + Math.cos(Math.toRadians(locLat)) * Math.cos(Math.toRadians(dstLat)) 
      * Math.sin(dLon/2) * Math.sin(dLon/2); 
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
double d = 6371 * c; 

return d; //Distance in KM 
+1

Nhưng tôi cần phải tìm vĩ độ và kinh độ của điểm giữa. Làm thế nào để làm điều đó? – Allwyn

+0

@scooby bạn có tìm thấy giải pháp nào giống nhau không? – JgdGuy