android附近的人的實現,android實現

來源:互聯網
上載者:User

android附近的人的實現,android實現

項目要做附近的人這功能,然後就研究了下:


 (1) 首先要做的就是要擷取到自己當前位置的經緯度

( 2)然後就是上傳自己的資料給伺服器

 (3) 伺服器經過計算然後把符合項目定義的最大距離的附近的人的資料傳到前台

  (4)前台通過資料來展示



   其中最主要的其實就是經緯度的距離的計算,這裡我把我試過的倆個貼上來


public static double getDistance(double lat1,double longt1 , double lat2,double longt2            ) {        double PI = 3.14159265358979323; // 圓周率        double R = 6371229; // 地球的半徑        double x, y, distance;        x = (longt2 - longt1) * PI * R                * Math.cos(((lat1 + lat2) / 2) * PI / 180) / 180;        y = (lat2 - lat1) * PI * R / 180;        distance = Math.hypot(x, y);        return distance;    }



還有一個比較複雜的方法,相比上邊的更加精確

public static double computeDistance(double lat1, double lon1,             double lat2, double lon2) {             // Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf             // using the "Inverse Formula" (section 4)             int MAXITERS = 20;             // Convert lat/long to radians             lat1 *= Math.PI / 180.0;             lat2 *= Math.PI / 180.0;             lon1 *= Math.PI / 180.0;             lon2 *= Math.PI / 180.0;             double a = 6378137.0; // WGS84 major axis             double b = 6356752.3142; // WGS84 semi-major axis             double f = (a - b) / a;             double aSqMinusBSqOverBSq = (a * a - b * b) / (b * b);             double L = lon2 - lon1;             double A = 0.0;             double U1 = Math.atan((1.0 - f) * Math.tan(lat1));             double U2 = Math.atan((1.0 - f) * Math.tan(lat2));             double cosU1 = Math.cos(U1);             double cosU2 = Math.cos(U2);             double sinU1 = Math.sin(U1);             double sinU2 = Math.sin(U2);             double cosU1cosU2 = cosU1 * cosU2;             double sinU1sinU2 = sinU1 * sinU2;             double sigma = 0.0;             double deltaSigma = 0.0;             double cosSqAlpha = 0.0;             double cos2SM = 0.0;             double cosSigma = 0.0;             double sinSigma = 0.0;             double cosLambda = 0.0;             double sinLambda = 0.0;             double lambda = L; // initial guess             for (int iter = 0; iter <</span> MAXITERS; iter++) {                 double lambdaOrig = lambda;                 cosLambda = Math.cos(lambda);                 sinLambda = Math.sin(lambda);                 double t1 = cosU2 * sinLambda;                 double t2 = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda;                 double sinSqSigma = t1 * t1 + t2 * t2; // (14)                 sinSigma = Math.sqrt(sinSqSigma);                 cosSigma = sinU1sinU2 + cosU1cosU2 * cosLambda; // (15)                 sigma = Math.atan2(sinSigma, cosSigma); // (16)                 double sinAlpha = (sinSigma == 0) ? 0.0 :                     cosU1cosU2 * sinLambda / sinSigma; // (17)                 cosSqAlpha = 1.0 - sinAlpha * sinAlpha;                 cos2SM = (cosSqAlpha == 0) ? 0.0 :                     cosSigma - 2.0 * sinU1sinU2 / cosSqAlpha; // (18)                 double uSquared = cosSqAlpha * aSqMinusBSqOverBSq; // defn                 A = 1 + (uSquared / 16384.0) * // (3)                     (4096.0 + uSquared *                      (-768 + uSquared * (320.0 - 175.0 * uSquared)));                 double B = (uSquared / 1024.0) * // (4)                     (256.0 + uSquared *                      (-128.0 + uSquared * (74.0 - 47.0 * uSquared)));                 double C = (f / 16.0) *                     cosSqAlpha *                     (4.0 + f * (4.0 - 3.0 * cosSqAlpha)); // (10)                 double cos2SMSq = cos2SM * cos2SM;                 deltaSigma = B * sinSigma * // (6)                     (cos2SM + (B / 4.0) *                      (cosSigma * (-1.0 + 2.0 * cos2SMSq) -                       (B / 6.0) * cos2SM *                       (-3.0 + 4.0 * sinSigma * sinSigma) *                       (-3.0 + 4.0 * cos2SMSq)));                 lambda = L +                     (1.0 - C) * f * sinAlpha *                     (sigma + C * sinSigma *                      (cos2SM + C * cosSigma *                       (-1.0 + 2.0 * cos2SM * cos2SM))); // (11)                 double delta = (lambda - lambdaOrig) / lambda;                 if (Math.abs(delta) <</span> 1.0e-12) {                     break;                 }             }             return  b * A * (sigma - deltaSigma);}







聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.