2011-01-11 23 views
23

Bu http://www.movable-type.co.uk/scripts/latlong.html'da verilen kod snippet'ini java'ya dönüştürmeye çalışıyorum. Ama ben siteninkiyle aynı sonucu elde edemiyorum. Onların enlem ve boylamlar dLon doğru olup olup olmad emin değilim İki enlem ve boylam arasındaki orta nokta

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); 
    } 

verilmektedir İşte burada iki nokta arasındaki orta noktayı bulmak için benim koddur. Yani lütfen bana bunu anlamaya yardım edin. Not:

cevap

62

Radyanlara dönüştürmeniz gerekir. Bunu aşağıdaki gibi değiştirin:

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

Teşekkür Yardımınız için teşekkürler :-) – Allwyn

+0

Formül için teşekkürler. ! –

+0

merhaba @dogbane bir yardıma ihtiyacım var. http://stackoverflow.com/questions/11758582/find-if-the-current-location-is-along-a-straight-line-drawn-between-two-points – RVG

1

'in orta noktasının enlem ve boylamını bulmalıyım. Diğer formüllerde kullanılan lat ve lon değerlerini ayrıca Radyanlara da dönüştürmelisiniz. Bunu, sayfanın sonuna doğru ~ 5/5'inde görebiliyorsunuz. ipucu kosinüsleri mesafesi formülü küresel hukuk sonunda verildi:

(basitlik için ben Dereceden radyana dönüşümleri gösterme, burada ve sonraki tüm kod parçalarında unutmayın; tam sürümleri için aşağıya bakınız).

-1

Son işimde bir izleme modülü yaptım ve 2 koordinat arasındaki mesafeyi hesaplamak için bu formülü kullanıyordum.

//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.. 

Sen 2.

Ah tarafından mesafeyi bölünmesi orta nokta alabilirsiniz, bu başka formül de çalışır:

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

Ama enlem ve boylamı bulmalıyım orta nokta. Bu nasıl yapılır? – Allwyn

+0

@scooby, bunun için herhangi bir çözüm buldunuz mu? – JgdGuy

İlgili konular