folder Tahribat.com Forumları
linefolder Asp - Php - Cgi - Perl
linefolder Php İle Koordinatlar Arasındaki Km Uzaklığı Bulmak



Php İle Koordinatlar Arasındaki Km Uzaklığı Bulmak

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    gencbeyin
    gencbeyin's avatar
    Banlanmış Üye
    Kayıt Tarihi: 24/Ağustos/2005
    Erkek

    elimde koordinatlar var bunlar arasındaki kuş uçuşu uzaklıkları hesaplatabileceğim bir fonksiyon bilen var mıdır?

     

    Adana 37° 00.0' 35° 19.8'
    Adapazarı 40° 46.2' 30° 22.8'
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    SinusX
    SinusX's avatar
    Kayıt Tarihi: 14/Aralık/2010
    Erkek

    ((x2 - x1)^2 + (y2 - y1)^2)^1/2

    iki nokta arası uzaklıkta burda küresel koordinat var tam hatırlayamadım şimdi dönüşümleri


    Si vis pacem para bellum.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Hybris
    Hybris's avatar
    Kayıt Tarihi: 12/Haziran/2007
    Erkek

    yanlışım varsa düzeltin ama analitik formülü ile yapma şansı yok.

    çünkü ekvator çizgisi dışında iki boylam arası uzaklık sabit değil.

    http://www.yazgelistir.com/makale/gps-koordinatlari-verilen-iki-nokta-arasi-uzaklik

    edit:

    public static double VincentyDistance(double lat1, double lon1, double lat2, double lon2)
            {
                double a = 6378137, b = 6356752.3142,  f = 1/298.257223563;  // WGS-84 ellipsoid params
                double L = DegToRad(lon2 - lon1);
                double U1 = Math.Atan((1-f) * Math.Tan(DegToRad(lat1) ));
                double U2 = Math.Atan((1 - f) * Math.Tan(DegToRad(lat2)));
                double sinU1 = Math.Sin(U1), cosU1 = Math.Cos(U1);
                double sinU2 = Math.Sin(U2), cosU2 = Math.Cos(U2);
                
                double cosSigma;
                double sigma;
                double sinAlpha;
                double cosSqAlpha;
                double cos2SigmaM;
                double sinLambda;
                double sinSigma;
                double cosLambda;
     
                double lambda = L, lambdaP, iterLimit = 100;
               
                do
                {
                    sinLambda = Math.Sin(lambda);
                    cosLambda = Math.Cos(lambda);
                    sinSigma = Math.Sqrt((cosU2*sinLambda) * (cosU2*sinLambda) +
                      (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
                   
                    if (sinSigma==0)
                        return 0;  // co-incident points
                   
                    cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda;
                    sigma = Math.Atan2(sinSigma, cosSigma);
                    sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
                    cosSqAlpha = 1 - sinAlpha*sinAlpha;
                    cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha;
                   
                    if (Double.IsNaN(cos2SigmaM))
                        cos2SigmaM = 0;  // equatorial line: cosSqAlpha=0 (§6)
     
                    double C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));
                    lambdaP = lambda;
                    lambda = L + (1-C) * f * sinAlpha *
                      (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));
     
                } while (Math.Abs(lambda-lambdaP) > 1e-12 && --iterLimit>0);
     
                if (iterLimit == 0)
                    return Double.NaN;  // formula failed to converge
     
                double uSq = cosSqAlpha * (a*a - b*b) / (b*b);
                double A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
                double B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
                double deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
                    B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
                double s = b*A*(sigma-deltaSigma);
              
                return s;
            }
     
            ///
            /// Converts decimal degrees to radians.
            ///
            private static double DegToRad(double deg)
            {
                return (deg * Math.PI / 180.0);
            }
     
            ///
            /// Converts radians to decimal degrees.
            ///
            private static double RadToDeg(double rad)
            {
                return (rad / Math.PI * 180.0);
            }
    Hybris tarafından 09/Nis/13 09:54 tarihinde düzenlenmiştir

    agile isn’t how fast you can go, it’s how fast you can turn.
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    SinusX
    SinusX's avatar
    Kayıt Tarihi: 14/Aralık/2010
    Erkek
    Hybris bunu yazdı

    yanlışım varsa düzeltin ama analitik formülü ile yapma şansı yok.

    çünkü ekvator çizgisi dışında iki boylam arası uzaklık sabit değil.

    http://www.yazgelistir.com/makale/gps-koordinatlari-verilen-iki-nokta-arasi-uzaklik

    edit:

    public static double VincentyDistance(double lat1, double lon1, double lat2, double lon2)
            {
                double a = 6378137, b = 6356752.3142,  f = 1/298.257223563;  // WGS-84 ellipsoid params
                double L = DegToRad(lon2 - lon1);
                double U1 = Math.Atan((1-f) * Math.Tan(DegToRad(lat1) ));
                double U2 = Math.Atan((1 - f) * Math.Tan(DegToRad(lat2)));
                double sinU1 = Math.Sin(U1), cosU1 = Math.Cos(U1);
                double sinU2 = Math.Sin(U2), cosU2 = Math.Cos(U2);
                
                double cosSigma;
                double sigma;
                double sinAlpha;
                double cosSqAlpha;
                double cos2SigmaM;
                double sinLambda;
                double sinSigma;
                double cosLambda;
     
                double lambda = L, lambdaP, iterLimit = 100;
               
                do
                {
                    sinLambda = Math.Sin(lambda);
                    cosLambda = Math.Cos(lambda);
                    sinSigma = Math.Sqrt((cosU2*sinLambda) * (cosU2*sinLambda) +
                      (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
                   
                    if (sinSigma==0)
                        return 0;  // co-incident points
                   
                    cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda;
                    sigma = Math.Atan2(sinSigma, cosSigma);
                    sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
                    cosSqAlpha = 1 - sinAlpha*sinAlpha;
                    cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha;
                   
                    if (Double.IsNaN(cos2SigmaM))
                        cos2SigmaM = 0;  // equatorial line: cosSqAlpha=0 (§6)
     
                    double C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));
                    lambdaP = lambda;
                    lambda = L + (1-C) * f * sinAlpha *
                      (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));
     
                } while (Math.Abs(lambda-lambdaP) > 1e-12 && --iterLimit>0);
     
                if (iterLimit == 0)
                    return Double.NaN;  // formula failed to converge
     
                double uSq = cosSqAlpha * (a*a - b*b) / (b*b);
                double A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
                double B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
                double deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
                    B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
                double s = b*A*(sigma-deltaSigma);
              
                return s;
            }
     
            ///
            /// Converts decimal degrees to radians.
            ///
            private static double DegToRad(double deg)
            {
                return (deg * Math.PI / 180.0);
            }
     
            ///
            /// Converts radians to decimal degrees.
            ///
            private static double RadToDeg(double rad)
            {
                return (rad / Math.PI * 180.0);
            }

    Gps yapacaksa güzel burda elipsoid olarak almış dünyayı yay uzunluğunu bulmuşta yaklaşık uzaklık için küre kabul etmesi işini kolaylaştırır ödev filansa


    Si vis pacem para bellum.
Toplam Hit: 1421 Toplam Mesaj: 5