1. 程式人生 > >計算兩點經緯度之間的距離

計算兩點經緯度之間的距離

常用需要,計算本身位置到指定位置距離,比較遠用千米單位,距離近用米:

直接上工具類:

public class MapDistance {
    private double DEF_PI = 3.14159265359; // PI
private double DEF_2PI = 6.28318530712; // 2*PI
private double DEF_PI180 = 0.01745329252; // PI/180.0
private double DEF_R = 6370693.5; // radius of earth
private MapDistance() {
    }

    private static 
MapDistance instance; public static synchronized MapDistance getInstance() { if (instance == null) { instance = new MapDistance(); } return instance; } /** * 返回為m,適合短距離測量 * * @param lon1 * @param lat1 * @param lon2 * @param lat2 * @return */ public String getShortDistance
(double lon1, double lat1, double lon2, double lat2) { double ew1, ns1, ew2, ns2; double dx, dy, dew; double distance; // 角度轉換為弧度 ew1 = lon1 * DEF_PI180; ns1 = lat1 * DEF_PI180; ew2 = lon2 * DEF_PI180; ns2 = lat2 * DEF_PI180; // 經度差 dew = ew1 - ew2; // 若跨東經和西經180 度,進行調整 if (dew > DEF_PI
) dew = DEF_2PI - dew; else if (dew < -DEF_PI) dew = DEF_2PI + dew; dx = DEF_R * Math.cos(ns1) * dew; // 東西方向長度(在緯度圈上的投影長度) dy = DEF_R * (ns1 - ns2); // 南北方向長度(在經度圈上的投影長度) // 勾股定理求斜邊長 distance = Math.sqrt(dx * dx + dy * dy); return trans(distance); } /** * 返回為km,適合長距離測量 * * @param lon1 * @param lat1 * @param lon2 * @param lat2 * @return */ public String getLongDistance(double lon1, double lat1, double lon2, double lat2) { double ew1, ns1, ew2, ns2; double distance; // 角度轉換為弧度 ew1 = lon1 * DEF_PI180; ns1 = lat1 * DEF_PI180; ew2 = lon2 * DEF_PI180; ns2 = lat2 * DEF_PI180; // 求大圓劣弧與球心所夾的角(弧度) distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1) * Math.cos(ns2) * Math.cos(ew1 - ew2); // 調整到[-1..1]範圍內,避免溢位 if (distance > 1.0) distance = 1.0; else if (distance < -1.0) distance = -1.0; // 求大圓劣弧長度 distance = DEF_R * Math.acos(distance); return trans(distance); } private String trans(double distance) { boolean isBig = false; // 是否為大於等於1000m if (distance >= 1000) { distance /= 1000; isBig = true; } return (new DecimalFormat(".00").format(distance)) + (isBig ? "千米" : "米"); } }

使用:

String s1 = MapDistance.getInstance().getLongDistance(1.11, 1.11, 1.11, 1.11);

相關推薦

mysql 下 計算 兩點 經緯度 之間距離 計算結果排序

就是 大致 整數 最大值 資源 order 技術 得到 padding 根據經緯度計算距離公式 公式 對上面的公式解釋如下: Lung1 Lat1表示A點經緯度, Lung2 Lat2表示B點經緯度; a=Lat1 – Lat2 為兩

計算兩點經緯度之間距離

常用需要,計算本身位置到指定位置距離,比較遠用千米單位,距離近用米: 直接上工具類: public class MapDistance { private double DEF_PI = 3.14159265359; // PI private double DE

mysql 下 計算 兩點 經緯度 之間距離

公式如下,單位米: 第一點經緯度:lng1 lat1 第二點經緯度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*pi()/180

mysql 下 計算 兩點 經緯度 之間距離 計算結果排序

公式如下,單位米: 第一點經緯度:lng1 lat1 第二點經緯度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*pi()/1

計算兩點經緯度距離

mysql 函式 DROP FUNCTION IF EXISTS func_calcDistance; CREATE FUNCTION func_calcDistance( origLng DECIMAL(20,6), origLat DE

兩點經緯度之間距離

#include <stdio.h> #include <math.h> #define PI                      3.1415

通過經緯度座標計算兩點間的距離以及角度關係(C++)

測試了一共八組點,大概關係是這樣的 計算的是那八個點從正北方向按順時針轉過的角度的大小 #include "stdafx.h" #include <math.h> #include <iostream> #include <stdio.h> #

經緯度互換、換算成米、兩點經緯度計算兩點間的距離

經緯度互換 度(DDD):E 108.90593度    N 34.21630度     如何將度(DDD):: 108.90593度換算成度分秒(DMS)東經E 108度54分22.2秒?轉換方法是將108.90593整數位不變取108(度),用0.90593*60=54.

SQL Server地理位置資訊計算兩點經緯度距離

計算兩點距離,4326是空間引用識別符號,4326代表GCS-WGS-1984座標系,是系統預設的座標系。 地理座標系空間需要用geography ,平面座標系空間用geometry,計算距離使用STDistance DECLARE @g geography; DECLA

HDU 2001 計算兩點間的距離

scanf 運用 保留 math.sqrt () imp 坐標 sin scrip Problem Description 輸入兩點坐標(X1,Y1),(X2,Y2),計算並輸出兩點間的距離。 Input 輸入數據有多組,每組占一行,由4個實數組成,分別表示x1,y

hdu2001 計算兩點間的距離【C++】

script title include rip ++ 組成 tom ali cep 計算兩點間的距離 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To

1338: 【計算兩點間的距離

題目描述 輸入兩點座標(X1,Y1),(X2,Y2),計算並輸出兩點間的距離。 輸入 輸入資料有多組,每組佔一行,由4個實陣列成,分別表示x1,y1,x2,y2,資料之間用空格隔開。 輸出 對於每組輸入資料,輸出一行,結果保留兩位小數。

Redis使用GEO計算兩點間的距離

之前在專案中使用了Redis的GEO函式,第一次接觸,所以記錄下來。 首先看下自己專案中的例子,然後後面會帖一個大佬寫的例子。 首先我們需要在pom.xml中引入jar 然後需要配置javaBean 然後就是應用了 try(Jedis jedis = jedisPoo

計算兩點間的距離

Problem Description 輸入兩點座標(X1,Y1),(X2,Y2),計算並輸出兩點間的距離。     Input 輸入資料有多組,每組佔一行,由4個實陣列成,分別表示x1,y1,x2,y2,資料之間用空格隔開。    

計算兩點間的距離 --JAVA

題目: 輸入兩點座標(X1,Y1),(X2,Y2),計算並輸出兩點間的距離。 Input 輸入資料有多組,每組佔一行,由4個實陣列成,分別表示x1,y1,x2,y2,資料之間用空格隔開。 Output 對於每組輸入資料,輸出一行,結果保留兩位小數。 Sample

HDU2001 計算兩點間的距離【入門】

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 229592    Accepted Submission(

hdu_problem_2001_計算兩點間的距離

/* * *Problem Description *輸入兩點座標(X1,Y1),(X2,Y2),計算並輸出兩點間的距離。 * * *Input *輸入資料有多組,每組佔一行,由4個實陣列成,分別表示x1,y1,x2,y2,資料之間用空格隔開。 * * *Output *對於每組輸入資料,

杭電ACM2001--計算兩點間的距離

計算兩點間的距離 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 291358  &nb

杭電ACM2001計算兩點間的距離 &&&&杭電ACM2002計算球體積-----20140722

2001---- #include<stdio.h> #include<math.h> main() {double a,b,c,d,s;  while(scanf("%lf %lf %lf %lf",&a,&b,&c,&am

(hdu 簡單題 128道)hdu 2001 計算兩點間的距離

題目:計算兩點間的距離Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 115566    Accepted Subm