Google maps iki nokta arası mesafe hesaplama

Başlatan armsistem, 16 Ocak 2012, 18:42:28

armsistem

Arkadaşlar merhaba, google maps iki nokta arasındaki mesafeyi metre olarak öğrenebiliyoruz merak ettiğim nokta bu işin matematiksel formülü nasıldır.İnternette araştırdığımda net bir şey bulamadım. Yardımlarınız için teşekkür ederim.

Örnek :1.Nokta  42.26,3600       28.34,4800         2.Nokta 43.48,2500  27.45,0000          iki nokta arasında mesafe 45 KM. şeklinde bir formül arıyorum.


cicjoe

16 Ocak 2012, 19:09:50 #2 Son düzenlenme: 16 Ocak 2012, 19:12:22 cicjoe
hocam dogrudan 2 nokta arasini enlem ve boylam farklarindan olcmek mumkun olsada google maps karayollari uzerinden weighted graph kullanarak en uygun yolu buluyor (en kisa değil). eger 2 nokta arasini kus ucusu olcecekseniz, boylamlarin daralma miktarini hesaplayan formullere bakmaniz lazim. enlemler sabit 111km. eger google maps gibi yapmak istiyorsaniz bence birakin google maps yapsin sizin yerinize. ornegin:

url ile koordinatlari iletin
http://maps.google.com/maps?q=from:38.453992,27.103615%20to:38.424546,27.130394

gelen html icerisinden ilgili alani cekin
<div class="altroute-rcol altroute-info">
    <span>13.9 km</span>,
    <span>20 mins</span>
</div>

OptimusPrime

2 koordinat arası mesafe haversine denilen yöntem ile bulunuyor...


armsistem

Gelen Html'den veriyi nasıl çekebilirim.

erolca

merhaba,
daha önceden c# ile yazmış olduğum kod
Kod Seç

 double C_RADIUS_EARTH_KM 
6371.1;
       
double C_RADIUS_EARTH_MI3958.82;
       
double C_PI 3.14159265358979;
       
double GreatCircleDistance(double Latitude1double Longitude1,
                     
double Latitude2double Longitude2bool ValuesAsDecimalDegrees,
                     
bool ResultAsMiles)
       {
            
double Lat1;
            
double Lat2;
            
double Long1;
            
double Long2;
            
long X
             
double Delta;

            if (
ValuesAsDecimalDegrees ==true)
                
1;
            else
                
24;
            
            
// convert to decimal degrees
            
Lat1 Latitude1 X;
            
Long1 Longitude1 X;
            
Lat2 Latitude2 X;
            
Long2 Longitude2 X;
           
           
// convert to radians: radians = (degrees/180) * PI
            
Lat1 = (Lat1 180) * C_PI;
            
Lat2 = (Lat2 180) * C_PI;
            
Long1 = (Long1 180) * C_PI;
            
Long2 = (Long2 180) * C_PI;
           
// get the central spherical angle

            
Delta = (Math.Asin(Math.Sqrt((Math.Pow(Math.Sin((Lat1 Lat2) / 2), 2) + Math.Cos(Lat1) * Math.Cos(Lat2) * (Math.Pow(Math.Sin((Long1 Long2) / 2), 2))))));
               
            if( 
ResultAsMiles ==true)
                return( 
Delta C_RADIUS_EARTH_MI);
            else
               return(
Delta C_RADIUS_EARTH_KM);
                       
       
       }



eroool

muhittin_kaplan

verdiğiniz kod birçok kişinin işine yarayacak.

iyildirim

Bende de bunlar varmış.

Kodları nerelerden topladığımı hatırlamıyorum, ama hepsi alıntıdır. Yaptıysam sadece hesapları kısaltacak düzenlemeler yapmışımdır.

İki koordinat arası mesafenin yanısıra, Heading, verilen heading ve mesafe ile gidilecek koordinat hesapları gibi extraları da  var.

Yönü bilinen nesneyi yakalama gibi şeylerde vardı. Bulursam eklerim. Anti füze sistemleri  yapmak isteyen olur belki.

Kod Seç


double R_EARTH 
6371000;
double ROPE 6371000;  //radius of earth 6371 KM
double deg2rad 0.0174532925199433;
double rad2deg 57.2957795130823;


double calcDistance(double degLAT1double degLON1double degLAT2double degLON2)
{
   
//The haversine formula 'remains particularly well-conditioned for numerical computation even at small distances' - unlike calculations based on the spherical law of cosines.
   //The 'versed sine' is 1-cos?, and the 'half-versed-sine' (1-cos?)/2 = sin²(?/2) as used above.

   
double radLAT1radLAT2;
// double radLON1, radLON2;
   
   
double deltaLATrad;
   
double deltaLONdegdeltaLONrad;
   
   
double sinDeltaLATsinDeltaLON;
   
double ad;

   
radLAT1 degLAT1 deg2rad;
   
radLAT2 degLAT2 deg2rad;
   

   
deltaLATrad radLAT1 radLAT2;

   
deltaLONdeg degLON2 degLON1;
   
deltaLONrad deltaLONdeg deg2rad;

   
sinDeltaLAT sin(deltaLATrad);
   
sinDeltaLON sin(deltaLONrad);

   
sinDeltaLAT sinDeltaLAT cos(radLAT1) * cos(radLAT2) * sinDeltaLON sinDeltaLON;
   
= (atan2(sqrt(a), sqrt(1-a))) * ROPE;

   return 
d;


}

double calcDistance2(double degLAT1double degLON1double degLAT2double degLON2)   //returns meters
{
   
//Spherical Law of Cosines


   
double radLAT1radLAT2;
   
double deltaLONdegdeltaLONrad;
   
double d;

   
radLAT1 degLAT1 deg2rad;
   
radLAT2 degLAT2 deg2rad;
   

   
deltaLONdeg degLON2 degLON1;
   
deltaLONrad deltaLONdeg deg2rad;

   
acos(sin(radLAT1) * sin(radLAT2) + cos(radLAT1) * cos(radLAT2) * cos(deltaLONrad)) * ROPE;

   return 
d;


}

double calcHeading(double degLAT1double degLON1double degLAT2double degLON2)  //returns radian
{

   
double radLAT1radLAT2;
// double radLON1, radLON2;
   
   
double deltaLATrad;
   
double deltaLONdegdeltaLONrad;
   
   
double sinDeltaLON;

   
double xy;
   
   
double bearing;

   
radLAT1 degLAT1 deg2rad;
   
radLAT2 degLAT2 deg2rad;
   

   
deltaLATrad radLAT1 radLAT2;

   
deltaLONdeg degLON2 degLON1;
   
deltaLONrad deltaLONdeg deg2rad;

// sinDeltaLAT = sin(deltaLATrad)
   
sinDeltaLON sin(deltaLONrad);



   
sin(deltaLONrad) * cos(radLAT2);
   
cos(radLAT1) * sin(radLAT2) - sin(radLAT1) * cos(radLAT2) * cos(deltaLONrad);

   
bearing atan2(yx);

   return 
bearing;

}

double radian2degree(double degvar)
{
   return 
degvar rad2deg;
}

double degree2radian(double radvar)
{
   return 
radvar deg2rad;
}






/**********************************************************************************************/
/**********************************************************************************************/
double GetHeading(double lat1double lat2double lon1double lon2)
{
    
double angle;
    
angle atan2(sin(lon2-lon1)*cos(lat2),cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1));
    return(
angle);
}

double GetDistance(double lat1double lat2double lon1double lon2)
{
    
double d;
    
acos((sin(lat1)*sin(lat2))+(cos(lat1)*cos(lat2)*cos(lon2-lon1)))*R_EARTH;
    return 
d;
}

double GetCTE(double current_latdouble current_londouble dest_latdouble dest_londouble track_angle)
{
    
double ctedistbearing;
    
dist GetDistance(current_lat,dest_lat,current_londest_lon);
    
bearing GetHeading(current_lat,dest_lat,current_londest_lon);
    
cte asin(sin(dist/R_EARTH)*sin(bearing-track_angle)) * R_EARTH;
    return 
cte;
}

void GetPosWHdngDist(double lat1double lon1double hdngdouble distdouble *new_latdouble *new_long)
{
    (*
new_lat) = asin(sin(lat1)*cos(dist/R_EARTH) + cos(lat1)*sin(dist/R_EARTH)*cos(hdng));
     (*
new_long) = lon1 atan2((sin(hdng)*sin(dist/R_EARTH)*cos(lat1)), (cos(dist/R_EARTH)-sin(lat1)*sin(*new_lat)));
}


armsistem

Katılım ve yanıtlar için teşekkür ederim.