在部队军事地形学和地方测绘工作中,常常需要知道当前位置的平面直角坐标,现在仅仅通过一个带GPS的安卓手机就可以实现。以后在外出找点时,就靠它了。

先看效果:

下载地址:

1:5万版apk文件下载

1:2.5万版apk文件下载

程序源码下载

//首先通过android api函数获取GPS地理坐标即经纬度

LocationManager lm;
lm=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
if(!lm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER))
{Toast.makeText(MainActivity.this, "GPS设备,未开启,请打开位置和安全设置,打开GPS卫星",Toast.LENGTH_LONG).show();return ;
}
String bestProvider=lm.getBestProvider(getCriteria(), true);
Location l=lm.getLastKnownLocation(bestProvider);
lm.requestLocationUpdates(bestProvider,5000,8, listener);

double x,y;  // x=location.getLatitude();  //纬度 y=location.getLongitude();//经度

接着进行经纬度转化为高斯坐标,网上此类函数很多,不过大都不够准确,下面是最准确的一种。

//经纬度转换平面坐标double[] GaussProjCal(double longitude, double latitude) {int ProjNo=0; int ZoneWide; ////带宽double longitude1,latitude1, longitude0,latitude0, X0,Y0, xval,yval;double a,f, e2,ee, NN, T,C,A, M, iPI;iPI = 0.0174532925199433; ////3.1415926535898/180.0;ZoneWide = 6; ////6度带宽
//        a=6378245.0; f=1.0/298.3; //54年北京坐标系参数////a=6378140.0; f=1/298.257; //80年西安坐标系参数a=m_a;f=m_f;if(longitude % ZoneWide==0)ProjNo = (int)(longitude / ZoneWide)-1;elseProjNo = (int)(longitude / ZoneWide);longitude0 = ProjNo * ZoneWide + ZoneWide / 2;longitude0 = longitude0 * iPI ;latitude0=0;longitude1 = longitude * iPI ; //经度转换为弧度latitude1 = latitude * iPI ; //纬度转换为弧度e2=2*f-f*f;ee=e2*(1.0-e2);NN=a/Math.sqrt(1.0-e2*Math.sin(latitude1)*Math.sin(latitude1));T=Math.tan(latitude1)*Math.tan(latitude1);C=ee*Math.cos(latitude1)*Math.cos(latitude1);A=(longitude1-longitude0)*Math.cos(latitude1);M=a*((1-e2/4-3*e2*e2/64-5*e2*e2*e2/256)*latitude1-(3*e2/8+3*e2*e2/32+45*e2*e2*e2/1024)*Math.sin(2*latitude1)+(15*e2*e2/256+45*e2*e2*e2/1024)*Math.sin(4*latitude1)-(35*e2*e2*e2/3072)*Math.sin(6*latitude1));xval = NN*(A+(1-T+C)*A*A*A/6+(5-18*T+T*T+72*C-58*ee)*A*A*A*A*A/120);yval = M+NN*Math.tan(latitude1)*(A*A/2+(5-T+9*C+4*C*C)*A*A*A*A/24+(61-58*T+T*T+600*C-330*ee)*A*A*A*A*A*A/720);X0 = 500000L;Y0 = 0;xval = xval+X0; yval = yval+Y0;double X = xval;double Y = yval;double long_laNum[]=new double[3];long_laNum[0]=(X);//经度long_laNum[1]=(Y);//纬度long_laNum[2]=ProjNo+1;//纬度return long_laNum;}

以下是高斯坐标转化为经纬度的函数

double[] GaussProjInvCal(double X, double Y){int ProjNo; int ZoneWide; 带宽double longitude1,latitude1, longitude0,latitude0, X0,Y0, xval,yval;double e1,e2,f,a, ee, NN, T,C, M, D,R,u,fai, iPI;iPI = 0.0174532925199433; 3.1415926535898/180.0;
//      a = 6378245.0;
//      f = 1.0/298.3; //54年北京坐标系参数a=m_a;f=m_f;a=6378140.0; f=1/298.257; //80年西安坐标系参数ZoneWide = 6; 6度带宽ProjNo = (int)(X/1000000L) ; //查找带号longitude0 = (ProjNo-1) * ZoneWide + ZoneWide / 2;longitude0 = longitude0 * iPI ; //中央经线X0 = ProjNo*1000000L+500000L;Y0 = 0;xval = X-X0; yval = Y-Y0; //带内大地坐标e2 = 2*f-f*f;e1 = (1.0-Math.sqrt(1-e2))/(1.0+Math.sqrt(1-e2));ee = e2/(1-e2);M = yval;u = M/(a*(1-e2/4-3*e2*e2/64-5*e2*e2*e2/256));fai = u+(3*e1/2-27*e1*e1*e1/32)*Math.sin(2*u)+(21*e1*e1/16-55*e1*e1*e1*e1/32)*Math.sin(4*u)+(151*e1*e1*e1/96)*Math.sin(6*u)+(1097*e1*e1*e1*e1/512)*Math.sin(8*u);C = ee*Math.cos(fai)*Math.cos(fai);T = Math.tan(fai)*Math.tan(fai);NN = a/Math.sqrt(1.0-e2*Math.sin(fai)*Math.sin(fai));R = a*(1-e2)/Math.sqrt((1-e2*Math.sin(fai)*Math.sin(fai))*(1-e2*Math.sin(fai)*Math.sin(fai))*(1-e2*Math.sin(fai)*Math.sin(fai)));D = xval/NN;//计算经度(Longitude) 纬度(Latitude)longitude1 = longitude0+(D-(1+2*T+C)*D*D*D/6+(5-2*C+28*T-3*C*C+8*ee+24*T*T)*D*D*D*D*D/120)/Math.cos(fai);latitude1 = fai -(NN*Math.tan(fai)/R)*(D*D/2-(5+3*T+10*C-4*C*C-9*ee)*D*D*D*D/24+(61+90*T+298*C+45*T*T-256*ee-3*C*C)*D*D*D*D*D*D/720);//转换为度 DDdouble longitude = longitude1 / iPI;double latitude = latitude1 / iPI;double long_la[]=new double[2];long_la[0]=longitude;long_la[1]=latitude;return long_la;}

以下功能是通过经纬度计算1:5万地形图的图幅编号。

public String changeWwwd(int wdu,int wfen,int wmiao,int jdu,int jfen,int jmiao){double mywd;//39.48double myjd;//121.42mywd=wdu*60+wfen+wmiao/60;myjd=jdu*60+jfen+jmiao/60;int a=wdu/4+1;int b=jdu/6+31;int c;int swwd[]=new int[12];int swjd[]=new int[12];int i,j;int linex=0,liney=0;for(i=0;i<12;i++){swwd[i]=a*4*60-20*(i+1);}for(i=0;i<12;i++){if(swwd[i]<mywd){   linex=i;break;}}for(j=0;j<12;j++){swjd[j]=(b-31)*6*60+30*(j+1);}for(j=0;j<12;j++){if(swjd[j]>myjd){liney=j+1;break;}}c=linex*12+liney;int xtag=0,ytag=0;if(mywd>swwd[i]+10)xtag=1;else xtag=2;if(myjd<swjd[j]-15)ytag=1;else ytag=2;String wwwd="";switch (xtag){case 1:if(ytag==1){wwwd="甲";}else {wwwd="乙";}break;case 2:if(ytag==1){wwwd="丙";}else {wwwd="丁";}break;default:break;}wwwd=a+"-"+b+"-"+c+"-"+wwwd;return wwwd;}

转载于:https://www.cnblogs.com/xuhuixl78/archive/2013/05/19/3087834.html

通过android手机内置GPS获取平面直角坐标和高斯坐标的原理(附代码)相关推荐

  1. 卸载工具Android,教你轻松卸载/删除Android手机内置游戏/软件

    每年3.15晚会似乎都会引起一场轰动万分的揭秘大行动,今年Android手机应用似乎成为了揭秘行动的焦点内容. 对于那些内置的流氓软件,用户们做了一个艰难的决定--想方设法卸载掉. 但是很多内置的东西 ...

  2. 如何卸载Android手机内置应用

    很简单,两条命令搞定: //查看当前打开应用包名 adb shell dumpsys window | grep mCurrentFocus//根据包名卸载应用 adb shell pm uninst ...

  3. android手机内置jdk,手把手叫你安装JDK环境、配置模拟器,不买android手机一样体验android及强大功能.doc...

    很多用户现在还没有买android的手机,但又十分想体验一下android手机的强大功能,那是不是就没办法了呢?当然不是了,没有android手机一样可以体验到android手机的强大功能.下面给大家 ...

  4. 三星android6.0sd卡,三星 android 手机内置sd卡空间不足,怎么处理?

    尊敬的三星用户您好: 手机需要优化内存或已经提示内存已满/内存不足,建议您: 1.长按home键,打开ram管理器,清理正在运行的应用程序,以释放程序内存. 2.卸载自行安装的应用程序. 3.清除手机 ...

  5. Unity游戏开发之UGUI设计——制作一个游戏内置的控制台界面/作弊菜单(详细流程,附代码)

    功能说明 今天要实现的功能就是老滚5.GTA.P社等游戏里面那个按下某个按键就能开启调试(开挂)的控制台组件.老规矩,直接上实际效果图: 如上图所示,输入输出文本的控制台本质上就是一个游戏中内嵌的命令 ...

  6. android手机传感器坐标系,一种将手机内置传感器采集数据从手机坐标系转换到参考坐标系的处理方法与流程...

    本发明提出了一种将手机内置传感器采集的三轴加速度数据从手机坐标系转换到大地参考坐标系的处理方法,该方法涉及到移动通信.模式识别和情景感知等领域. 背景技术: 目前基于智能手机的行为识别是环境智能中的一 ...

  7. android存储文件数据恢复,安卓手机内置储存中的照片误删怎么恢复

    科技迅速发展随之而来的是人们生活习惯的改变,手机从一个简单的交流工具,变成生活中必备品,手机购物.手机支付.手机传送文件浏览网页.手机分享视频.手机拍照.手机里面满满的簇拥了太多的东西,定期清理的必然 ...

  8. Android隐藏录屏内容,原来手机内置的录屏功能这么强大,好多人都不会用,很可惜!...

    原标题:原来手机内置的录屏功能这么强大,好多人都不会用,很可惜! 原来手机内置的录屏功能这么强大,好多人不会用,真的很可惜 现在的手机朝着智能化的方向一直在发展,多了许多很实用的功能.就比如手机上自带 ...

  9. android 8.0 原生壁纸,HUAWEI华为Nova 8 (Pro) 手机内置原生壁纸分享

    华为发布了最新的第8代Nova系列手机.一如既往,华为Nova 8系列中推出了三种型号,分别是Nova 8.Nova 8 Pro和Nova 8 SE. HUAWEI nova 8 屏幕方面则采用了 6 ...

  10. 华为手机内置存储android可以删除吗,手机内置储存怎么清理 手机缓存清理教程...

    手机内置储存怎么清理? 有时候,某些数据是会经常需要访问的,像硬盘内部的缓存(暂存器的一种)会将读取比较频繁的一些数据存储在缓存中,再次读取时就可以直接从缓存中直接传输,我们都知道手机安装应用都会产生 ...

最新文章

  1. Linux下如何查看哪些端口处于监听状态
  2. Ext之Combobox的远程加载数据实例(附前后台代码)
  3. libsvm中svmtrain的参数和返回值
  4. ASP.NET MVC3 部署的前期工作
  5. 【GNN】图神经网络综述
  6. 广州最最最牛逼的 IT 公司全在这了!
  7. 微信小程序如何引入iconfont阿里巴巴素材库的图标
  8. zblog include html页面,zblog模板开发第一课:zblog标签调用大全
  9. RC522(RFID模块)实践总结
  10. PXC pxc_strict_mode
  11. python结果不能全部显示_numpy矩阵数值太多不能全部显示的解决
  12. Dango Web 开发指南 学习笔记 2
  13. 反函数 (逆映射) 存在定理
  14. 1--MySQL基础知识内容
  15. python已知两条直角边求斜边,Python实现“已知三角形两个直角边,求斜边”
  16. Oulipo(欧力波)(经典kmp模板题) HDU-1686
  17. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(2)- 界面构建(wxFormBuilder3.8.0)
  18. 将一个C类网络(192.168.1.0/24)划分为4个子网,每个子网至少可容纳30台主机,如何划分?
  19. AutoCAD2012从入门到精通中文视频教程 第6课 极坐标(个人收藏)
  20. java 截取mp3/aac

热门文章

  1. 静态代码块、构造代码块以及构造函数的加载顺序
  2. CMake 使用总结(转载)
  3. 英特尔的指令集体系结构_英特尔下一代Tremont的Jasper Lake系产品面世
  4. checkbox未赋值时获取value是on_【漏洞分析】关于mysqlconnectorjava连接时的反序列化...
  5. linux删除系统日志文件,Linux不小心删除日志文件syslog的解决方法
  6. 计算机2级文档试题,计算机二级考试word操作题真题
  7. 酷比魔方iwork8刷机shell_酷比魔方IWORK8旗舰版(I1-T)双系统刷机教程.doc
  8. 计算机原理及应用课程,课程描述
  9. 检测空指针 静态检测_Parasoft为G3提供专注于安全性和整体软件质量的静态分析解决方案...
  10. Django:数据插入报错django.db.utils.IntegrityError: (1364, “Field ‘id‘ doesn‘t have a default value“)