计算球面上经纬度坐标方法比较

计算球面上的两点(坐标为经纬度)之间的距离可以直接通过公式计算得到,也可以先将经纬度坐标转化为墨卡托投影坐标来,然后用平面中两点之间的距离公式来计算。

在网上找了一些代码,然后简单进行了测试,发现前者精度更高:

 资料来源:http://0414.iteye.com/blog/2039199

     http://blog.sina.com.cn/s/blog_8ab3b2cf0100xd69.html

 

 1 package com.suncreate.spatialquery.web.utils;
 2 
 3 public class LatitudeLontitudeUtil2 {  
 4 
 5     // http://blog.charlee.li/location-search/  
 6 
 7     /** 地球半径 */  
 8     private static final double EARTH_RADIUS = 6371393;  
 9 
10     static double M_PI = Math.PI;
11 
12     public LatitudeLontitudeUtil2() {  
13 
14     }  
15 
16     //经纬度转墨卡托
17     public static double[] lonLat2Mercator(double lon,double lat)
18     {
19         double[] xy = new double[2];
20         double x = lon *20037508.342789/180;
21         double y = Math.log(Math.tan((90+lat)*M_PI/360))/(M_PI/180);
22         y = y *20037508.34789/180;
23         xy[0] = x;
24         xy[1] = y;
25         return xy;
26     }
27     
28     //点到点距离算法一
29     public static double getDistance2(double lat0, double lng0, double lat1, double lng1) {  
30         double[] xy = new double[2];
31         
32         System.out.println("----原始经纬度坐标----");
33         System.out.println("lat0:"+lat0+",lng0:"+lng0);
34         System.out.println("lat1:"+lat1+",lng1:"+lng1);
35         
36         xy =LatitudeLontitudeUtil2.lonLat2Mercator(lng0, lat0);
37         double lat0m= xy[1];
38         double lng0m= xy[0];
39         
40         xy =LatitudeLontitudeUtil2.lonLat2Mercator(lng1, lat1);
41         double lat1m= xy[1];
42         double lng1m= xy[0];
43         
44         System.out.println("----转化后墨卡托坐标----");
45         System.out.println("lat0m:"+lat0m+",lng0m:"+lng0m);
46         System.out.println("lat1m:"+lat1m+",lng1m:"+lng1m);
47          
48         double distance = 0; 
49         distance= Math.sqrt((lat0m - lat1m) * (lat0m - lat1m) + (lng0m - lng1m) * (lng0m - lng1m));
50         return distance;  
51     }  
52     //点到点距离算法二
53     public static double getDistance(double lat0, double lng0, double lat1, double lng1) {  
54 
55         lat0 = Math.toRadians(lat0);  
56         lat1 = Math.toRadians(lat1);  
57         lng0 = Math.toRadians(lng0);  
58         lng1 = Math.toRadians(lng1);  
59 
60         double dlng = Math.abs(lng0 - lng1);  
61         double dlat = Math.abs(lat0 - lat1);  
62         double h = hav(dlat) + Math.cos(lat0) * Math.cos(lat1) * hav(dlng);  
63         double distance = 2 * EARTH_RADIUS * Math.asin(Math.sqrt(h));  
64 
65         return distance;  
66     }  
67     
68     public static double hav(double theta) {  
69         double s = Math.sin(theta / 2);  
70         return s * s;  
71     }  
72     
73     public static void main(String[] args) {  
74         //测试用例
75         //117.222009,31.815101   祁门路天鹅湖左
76         //117.238718,31.815132   祁门路天鹅湖右
77         
78         double lat = 31.815101;  
79         double lng = 117.222009;  
80         
81         double lat1 = 31.815132 ;  
82         double lng1 = 117.238718;  
83         
84         double d = LatitudeLontitudeUtil2.getDistance(lat, lng, lat1, lng1);  
85         double d2 = LatitudeLontitudeUtil2.getDistance2(lat, lng, lat1, lng1);
86         
87         System.out.println(d); 
88         System.out.println(d2); 
89         
90         //百度地图测距约为1.6km,可知直接计算球面距离较为准确,而直接先将经纬度转化为墨卡托坐标再求距离不准
91     }  
92 }  

 

转载于:https://www.cnblogs.com/chuang8/p/4556116.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql给root开启远程访问权限,修改root密码

1.MySql-Server 出于安全方面考虑只允许本机(localhost, 127.0.0.1)来连接访问. 这对于 Web-Server 与 MySql-Server 都在同一台服务器上的网站架构来说是没有问题的. 但随着网站流量的增加, 后期服务器架构可能会将 Web-Server 与 MySql-Server 分别放在独立的服务器上, 以便得…

Docker - Docker中搭建MySQL主从

1.pull完centos7纯净版的镜像后,创建容器,然后将宿主机上下载的MySQL文件 (MySQL下载地址:http://mysql.mirror.kangaroot.net/Downloads/) 拷贝到Docker容器中。 1) 抓取centos7纯净版镜像# docker pull registry.cn-hangzhou.aliyuncs.com/…

java 上传远程图片,java上传图片到另一台服务器上,怎么解决

Java codepublic String upload(String dir, FormFile formFile) throws Exception {Date date new Date();//取欲上传的文件的名字和长度String fname formFile.getFileName();//将上传时间加入文件名int i fname.indexOf(".");String name String.valueOf(date…

Qt_Window@Qt Command Prompt从命令行创建工程

#include <QApplication> #include <QLabel>int main(int argc, char *argv[]) {QApplication app(argc, argv);QLabel *label new QLabel("Hello Qt!");label->show();return app.exec(); }第1 行和第2 行包含了两个类的定义&#xff1a;QApplicat…

linux中的守护进程

一、守护进程守护进程&#xff0c;也叫精灵进程&#xff08;daemon&#xff09;它和普通后台进程的区别在于以下三点1、守护进程自成会话&#xff0c;而普通后台进程则不一定2、守护进程不受终端的控制3、守护进程就是后台进程&#xff0c;而后台进程不同于守护进程用ps axj命令…

读取不同位置的配置文件

在开发和测试环境中&#xff0c;很容易混淆如何获取不同位置的配置文件。为了避免重复造轮子&#xff0c;在此记录一下自己的解决方案&#xff1a; 可以提出如下设想&#xff1a; 1、在开发环境下&#xff0c;读取resources下的config.properties文件    2、在生产环境下&a…

spring+log4j

Log4j是Apache的一个开放源代码项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等&#xff1b;我们也可以控制每一条日志的输出格式&#xff1b;通过定义每一条…

mysql主从复制 lvs+ keepalived

2019独角兽企业重金招聘Python工程师标准>>> 一、环境 Master&#xff08;主机A&#xff09;&#xff1a;192.168.1.1 Slave&#xff08;主机B&#xff09; &#xff1a;192.168.1.2 W-VIP&#xff08;写入&#xff09; &#xff1a;192.168.1.3 R-VIP&#xff…

php 逗号编码,php有几种编码

当前 mbstring 模块支持以下的字符编码。这些字符编码中的任意一个都能指定到 mbstring 函数中的 encoding 参数。该 PHP 扩展支持的字符编码有以下几种&#xff1a;UCS-4*UCS-4BE (推荐学习&#xff1a;PHP视频教程)UCS-4LE*UCS-2UCS-2BEUCS-2LEUTF-32*UTF-32BE*UTF-32LE*UTF-…

34 丑数

把只包含因子2、3和5的数称作丑数&#xff08;Ugly Number&#xff09;。例如6、8都是丑数&#xff0c;但14不是&#xff0c;因为它包含因子7 。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数 Java: 1 public class Solution {2 public int GetUglyNumbe…

oracle 导入导出

oracle 导入导出 CREATE TABLESPACE LCZYM LOGGING DATAFILE G:\ZYM_DB\LCZYM.ora SIZE 1000M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; 导出 exp 用户名/密码数据库 file路径 owner用户名 logc:\orabackup\hkbfull.log 删除此用户所有对象 drop user emi…

[TODO]Python拾遗(三)

Head First 系列书 这个系列的书很少有其他专业书里面看似很高大上的名词&#xff0c;只有一些最基本的概念&#xff0c;而且遵循的就是"learning by doing"的理念&#xff0c;每一章都是以编程例子为主的。《Head First Python》更夸张&#xff0c;全书其实就一个pr…

php+tp框架+API,【路由】利用Thinkphp路由实现API开发版本管理

# 前言*****### 在使用Thinkphp接口开发项目的程中可能会遇到这样的场景 准备将原有系统重构一遍&#xff0c;但是出于某种原因&#xff0c;老的系统在未来一段时间内必须和新的版本共存&#xff1b; APP存在老版本不能强制升级&#xff0c;所以服务端接口需要同时兼容新老客户…

jmeter命令行运行-分布式测试

秒秒开心jmeter命令行运行-分布式测试 上一篇文章我们说到了jmeter命令行运行但是是单节点下的&#xff0c; jmeter底层用java开发&#xff0c;耗内存、cpu&#xff0c;如果项目要求大并发去压测服务端的话&#xff0c;jmeter单节点难以完成大并发的请求&#xff0c;这时就需要…

水龙吟

人长是、多怨我&#xff0c;怎如今、情词穷尽。文墨浅薄,一字不题,忧恨难泄。闻说古今&#xff0c;才子佳人,难成双美。柳七一句,玉萧声断。 人已去、玉长在&#xff0c;莽匹夫、世故笑&#xff0c;轮转境台空觅梦。乱言疯语&#xff0c;一大快事,还看此篇。醉也未极,到梦中戏猴…

ambari 自定义组件安装

借鉴&#xff1a;http://www.ibm.com/developerworks/cn/opensource/os-cn-bigdata-ambari3/index.htmlAmbari 在启动的时候&#xff0c;会扫描 resource 目录下 Stack 下面的 service 配置。也就是每个 Service 的 metainfo.xml&#xff0c;同时会将这些配置信息放在自己的数据…

php 303,HTTP 的重定向301,302,303,307(转)

301 永久重定向,告诉客户端以后应从新地址访问.302 作为HTTP1.0的标准,以前叫做Moved Temporarily ,现在叫Found.现在使用只是为了兼容性的处理,包括PHP的默认Location重定向用的也是302.但是HTTP 1.1 有303 和307作为详细的补充,其实是对302的细化303&#xff1a;对于POST请求…

android 蓝牙各种UUID (转)

ServiceDiscoveryServerServiceClassID_UUID {00001000-0000-1000-8000-00805F9B34FB} BrowseGroupDescriptorServiceClassID_UUID {00001001-0000-1000-8000-00805F9B34FB}PublicBrowseGroupServiceClass_UUID {00001002-0000-1000-8000-00805F9B34FB} #蓝牙串口服务Serial…

android 双向滑动 seekbar

实现原理&#xff1a;1、自定义View&#xff0c;在onDraw(Canvas canvas)中&#xff0c;画出2个Drawable滑动块&#xff0c;2个Drawable滑动条&#xff0c;2个Paint&#xff08;text&#xff09;2、监听onTouchEvent()事件&#xff0c;修改滑块和滑动条的坐标&#xff0c;调用i…

java的算术表达式程序,java计算数学表达式

import java.util.EmptyStackException;import java.util.Stack;public class CaculateFunction {private static String[] TrnsInToSufix(String IFX)// PFX放后缀表达式&#xff0c;IFX为中缀表达式{String PFX[] new String[IFX.length()];StringBuffer numBuffer new Str…