Php İle Koordinatlar Arasındaki Km Uzaklığı Bulmak
-
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' -
((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
-
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 -
Google API kullanabilirsin.
- https://developers.google.com/maps/documentation/javascript/distancematrix
- http://www.nmcmahon.co.uk/getting-the-distance-between-two-locations-using-google-maps-api-and-php/
Bunlar da çalışan örnekleri.
- https://google-developers.appspot.com/maps/documentation/javascript/examples/distance-matrix
- http://www.nmcmahon.co.uk/labs/distance.php
-
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
