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);
}
时间: 2024-10-25 22:21:21

android附近的人的实现的相关文章

Android进阶(二十七)Android原生扰人烦的布局

Android原生扰人烦的布局 在开发Android应用时,UI布局是一件令人烦恼的事情.下面主要讲解一下Android中的界面布局. 一.线性布局(LinearLayout) 线性布局分为: (1)垂直线性布局: (2)水平线性布局: 针对这两种区别,只是一个属性的区别 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertic

强烈鄙视那些:自己完全不用android手机,却在做android开发的人

前言: 最近参加android技术交流会,看到几个同时用mac和iphone的人,以为他们是全栈工程师(android和ios都会) , 谁知道交流下来,居然只是做android开发的,ios根本不会. 而且问他们平时用什么手机,回答都是:iphone. 还带着鄙视的语气说:android都是屌丝用的,不好用.心里顿时一万个草泥马:你tmd 既然这么鄙视 ,你为什么还做android开发,还靠android找工作. 为什么不去做ios开发??? 这种人,肯定水平不咋地. 只会装B 和 吹牛逼.因

学Android开发的人可以去的几个网站

1.<IT蓝豹>Android开源项目分享平台 国内非常好的一个Android开发者分享站,分享android所有特效,每天都有最新的Android开源项目推荐,版块划分完全面向开发者,非常方便, 适合初学者和高手进阶的好地方,网站的水平也非常高,也有很多android源码项目可以下载,经常会出一些最新技术教程. 地址:http://www.itlanbao.com 2. helloAndroid 以教程为最大特色的国外网站对大家系统学习Android知识非常有帮助, 地址:http://ww

推荐一个Android开发懒人库 -- ButterKnife

ButterKnife -- 项目地址:https://github.com/JakeWharton/butterknife 都说程序员都是比较懒的,什么事情都想着让程序自动化帮忙减轻工作量,这个开源库可以让我们从大量的findViewById()和setonclicktListener()解放出来. 解放控件对象实例化 也就是 findViewById(),一直以来的做法都是一个个定义,然后在 setContentView() 或 inflate() 之后一一来findViewById()进行

android多媒体框架学习 详解 最新版本

一:多媒体框架概述   jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现了media 在整个android系统中的重要性!framework/av下都是些C/C++代码(libmedia,libmediaplayerservice,libstagefright),jni和 java api 还是保留在原来的位置,改革还不够彻底,但还是迈出了这一步,以后维护能更好的进

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

Android ListView性能优化实战方案

前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListView进行性能优化,不仅是面试中常常会被问到的(我前段时间面试了几家公司,全部都问到了这个问题了),而且在实际项目中更是非常重要的一环,它甚至在某种程度上决定了用户是否喜欢接受你的APP.(如果你的列表滑起来很卡,我敢说很多人会直接卸载) 网上关于如何对ListView进行性能优化,提出了很多方案.但

【Android UI】ListView系列二(自定义Adapter订阅新闻栏目)

目标:自定义适配器Adapter实现点击每个item订阅按钮 上一篇介绍了listview的基本属性以及ArrayAdapter和SimpleAdapter的简单实用,链接:listview使用方式基础篇. 今天主要介绍一下自定义adapter,来实现稍微复杂点的功能,今天实现的效果是:类似于listiew展示许多可供订阅的栏目,每个栏目最右端有订阅按钮,用户点击订阅可以订阅该栏目,再次点击可取消订阅,效果图如下,下面我们一步步来实现. 1. 定义主布局文件activity_main.xml 主

Android实现双进程守护

做过android开发的人应该都知道应用会在系统资源匮乏的情况下被系统杀死!当后台的应用被系统回收之后,如何重新恢复它呢?网上对此问题有很多的讨论.这里先总结一下网上流传的各种解决方案,看看这些办法是不是真的可行.1.提高优先级这个办法对普通应用而言,应该只是降低了应用被杀死的概率,但是如果真的被系统回收了,还是无法让应用自动重新启动!    2.让service.onStartCommand返回START_STICKY通过实验发现,如果在adb shell当中kill掉进程模拟应用被意外杀死的