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

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

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

资料来源: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 }  
时间: 2024-10-10 23:51:47

计算球面上经纬度坐标方法比较的相关文章

C# 计算地图上某个坐标点的到多边形各边的距离

原文:C# 计算地图上某个坐标点的到多边形各边的距离 在判断了某个坐标点是否在多边形内后,还有另一个需求就是当我这个坐标点在多边形外部时,我需要计算这个坐标点到多边形的距离是否在一个允许的误差范围内 通过两个位置的经纬度坐标计算距离(C#版本) 转自:https://blog.csdn.net/jasonsong2008/article/details/78423496 经纬坐标系中求点到线段距离的方法 转自C语言版本: https://blog.csdn.net/ufoxiong21/arti

C# 计算地图上某个坐标点的是否在多边形内

原文:C# 计算地图上某个坐标点的是否在多边形内 这个方法引用自群友的博客 https://www.xiaofengyu.com/?p=143 使用百度地图的时候,常常会用到判断一个点是否在一个多边形的范围内,该方法用到的是射线法, 通过修改Javascrpit的代码过来的,射线法的意思就是从点出发和任意的一边的交叉点数为奇数则为在改区域内, 参考文档http://erich.realtimerendering.com/ptinpoly/ public class location { publ

椭球面上经纬度坐标转空间直角坐标

N:法线长. 注:法线长N=P0K被赤道面截为两部分,位于赤道面和端半轴之间的长度是Ne2,介于赤道面和椭球面之间的部分是N-Ne2. 原文地址:https://www.cnblogs.com/yibeimingyue/p/11622056.html

【转】通过经纬度坐标计算距离的方法(经纬度距离计算)

最近在网上搜索“通过经纬度坐标计算距离的方法”,发现网上大部分都是如下的代码: #define PI 3.14159265 static double Rc = 6378137;  // 赤道半径 static double Rj = 6356725;  // 极半径 class JWD { public: double m_Longitude, m_Latitude; double m_RadLo, m_RadLa; double Ec; double Ed; public: JWD(doub

利用JS实现的根据经纬度计算地球上两点之间的距离

最近用到了根据经纬度计算地球表面两点间距离的公式,然后就用JS实现了一下. 计算地球表面两点间的距离大概有两种办法. 第一种是默认地球是一个光滑的球面,然后计算任意两点间的距离,这个距离叫做大圆距离(The Great Circle Distance). 公式如下: 使用JS来实现为: var EARTH_RADIUS = 6378137.0;    //单位M    var PI = Math.PI;        function getRad(d){        return d*PI/

计算地球上两个坐标点(经度,纬度)之间距离sql函数

go --计算地球上两个坐标点(经度,纬度)之间距离sql函数 --作者:lordbaby --整理:www.aspbc.com CREATE FUNCTION [dbo].[fnGetDistance](@LatBegin REAL, @LngBegin REAL, @LatEnd REAL, @LngEnd REAL) RETURNS FLOAT AS BEGIN --距离(千米) DECLARE @Distance REAL DECLARE @EARTH_RADIUS REAL SET @

Java 根据两个经纬度坐标计算距离

public class Distance{    private static final double EARTH_RADIUS = 6378137;    private static double rad(double d)    {       return d * Math.PI / 180.0;    }        /**     * 根据两点间经纬度坐标(double值),计算两点间距离,单位为米     * @param lng1     * @param lat1    

IOS 计算两个经纬度之间的距离

一 丶 -(double)distanceBetweenOrderBy:(double) lat1 :(double) lat2 :(double) lng1 :(double) lng2{ CLLocation *curLocation = [[CLLocation alloc] initWithLatitude:lat1 longitude:lng1]; CLLocation *otherLocation = [[CLLocation alloc] initWithLatitude:lat2

使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换

[摘 要] 本文针对从事测绘工作者普遍遇到的坐标转换问题,简要介绍ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标转换原理和步骤. [关键词] ArcGIS 坐标转换 投影变换 1 坐标转换简介 坐标系统之间的坐标转换既包括不同的参心坐标之间的转换,或者不同的地心坐标系之间的转换,也包括参心坐标系与地心坐标系之间的转换以及相同坐标系的 直角坐标与大地坐标之间的坐标转换,还有大地坐标与高斯平面坐标之间的转换.在两个空间角直坐标系中,假设其分别为O--XYZ和O--XYZ,如果两个 坐标系