Google maps iki nokta arası mesafe hesaplama

Başlatan armsistem, 16 Ocak 2012, 15: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

#2
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...
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||


armsistem

Gelen Html'den veriyi nasıl çekebilirim.

erolca

merhaba,
daha önceden c# ile yazmış olduğum kod
double C_RADIUS_EARTH_KM = 6371.1;
       double C_RADIUS_EARTH_MI= 3958.82;
       double C_PI = 3.14159265358979;
       double GreatCircleDistance(double Latitude1, double Longitude1,
                     double Latitude2, double Longitude2, bool ValuesAsDecimalDegrees,
                     bool ResultAsMiles)
       {
            double Lat1;
            double Lat2;
            double Long1;
            double Long2;
            long X; 
             double Delta;

            if (ValuesAsDecimalDegrees ==true)
                X = 1;
            else
                X = 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 = (2 * 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.

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


double calcDistance(double degLAT1, double degLON1, double degLAT2, double 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 radLAT1, radLAT2;
// double radLON1, radLON2;
   
   double deltaLATrad;
   double deltaLONdeg, deltaLONrad;
   
   double sinDeltaLAT, sinDeltaLON;
   double a, d;

   radLAT1 = degLAT1 * deg2rad;
   radLAT2 = degLAT2 * deg2rad;
   

   deltaLATrad = radLAT1 - radLAT2;

   deltaLONdeg = degLON2 - degLON1;
   deltaLONrad = deltaLONdeg * deg2rad;

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

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

   return d;


}

double calcDistance2(double degLAT1, double degLON1, double degLAT2, double degLON2)   //returns meters
{
   //Spherical Law of Cosines


   double radLAT1, radLAT2;
   double deltaLONdeg, deltaLONrad;
   double d;

   radLAT1 = degLAT1 * deg2rad;
   radLAT2 = degLAT2 * deg2rad;
   

   deltaLONdeg = degLON2 - degLON1;
   deltaLONrad = deltaLONdeg * deg2rad;

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

   return d;


}

double calcHeading(double degLAT1, double degLON1, double degLAT2, double degLON2)  //returns radian
{

   double radLAT1, radLAT2;
// double radLON1, radLON2;
   
   double deltaLATrad;
   double deltaLONdeg, deltaLONrad;
   
   double sinDeltaLON;

   double x, y;
   
   double bearing;

   radLAT1 = degLAT1 * deg2rad;
   radLAT2 = degLAT2 * deg2rad;
   

   deltaLATrad = radLAT1 - radLAT2;

   deltaLONdeg = degLON2 - degLON1;
   deltaLONrad = deltaLONdeg * deg2rad;

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



   y = sin(deltaLONrad) * cos(radLAT2);
   x = cos(radLAT1) * sin(radLAT2) - sin(radLAT1) * cos(radLAT2) * cos(deltaLONrad);

   bearing = atan2(y, x);

   return bearing;

}

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

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






/**********************************************************************************************/
/**********************************************************************************************/
double GetHeading(double lat1, double lat2, double lon1, double 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 lat1, double lat2, double lon1, double lon2)
{
    double d;
    d = acos((sin(lat1)*sin(lat2))+(cos(lat1)*cos(lat2)*cos(lon2-lon1)))*R_EARTH;
    return d;
}

double GetCTE(double current_lat, double current_lon, double dest_lat, double dest_lon, double track_angle)
{
    double cte, dist, bearing;
    dist = GetDistance(current_lat,dest_lat,current_lon, dest_lon);
    bearing = GetHeading(current_lat,dest_lat,current_lon, dest_lon);
    cte = asin(sin(dist/R_EARTH)*sin(bearing-track_angle)) * R_EARTH;
    return cte;
}

void GetPosWHdngDist(double lat1, double lon1, double hdng, double dist, double *new_lat, double *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.