java判断点在第几象限_根据两点的经纬度坐标算出两点间距离和方位

这篇博客提供了Java代码实现,用于根据两点的经纬度坐标计算它们之间的距离和方位。包括LnglatEntity、LngLatHelper两个类,以及测试类LatlngTest,可以进行距离和方位的计算。
摘要由CSDN通过智能技术生成

完整的java代码,求地图两点经纬度的距离和方位,代码如下:

package org.test;

public class LnglatEntity {

public LnglatEntity() {

}

static double PI = Math.PI;//3.14159265

static double Rc = 6378137; // 赤道半径

static double Rj = 6356725; // 极半径

public double m_LoDeg, m_LoMin, m_LoSec; // longtitude 经度

public double m_LaDeg, m_LaMin, m_LaSec;

public double m_Longitude, m_Latitude;

public double m_RadLo, m_RadLa;

public double Ec;

public double Ed;

// 构造函数, 经度: loDeg 度, loMin 分, loSec 秒; 纬度: laDeg 度, laMin 分, laSec秒

public LnglatEntity(double loDeg, double loMin, double loSec, double laDeg,

double laMin, double laSec) {

m_LoDeg = loDeg;

m_LoMin = loMin;

m_LoSec = loSec;

m_LaDeg = laDeg;

m_LaMin = laMin;

m_LaSec = laSec;

m_Longitude = m_LoDeg + m_LoMin / 60 + m_LoSec / 3600;

m_Latitude = m_LaDeg + m_LaMin / 60 + m_LaSec / 3600;

m_RadLo = m_Longitude * PI / 180.;

m_RadLa = m_Latitude * PI / 180.;

Ec = Rj + (Rc - Rj) * (90. - m_Latitude) / 90.;

Ed = Ec * Math.cos(m_RadLa);

}

// !

public LnglatEntity(double longitude, double latitude) {

m_LoDeg = (int) (longitude);

m_LoMin = (int) ((longitude - m_LoDeg) * 60);

m_LoSec = (int) (longitude - m_LoDeg - m_LoMin / 60.) * 3600;

m_LaDeg = (int) latitude;

m_LaMin = (int) ((latitude - m_LaDeg) * 60);

m_LaSec = (latitude - m_LaDeg - m_LaMin / 60.) * 3600;

m_Longitude = longitude;

m_Latitude = latitude;

m_RadLo = longitude * PI / 180.;

m_RadLa = latitude * PI / 180.;

Ec = Rj + (Rc - Rj) * (90. - m_Latitude) / 90.;

Ed = Ec * Math.cos(m_RadLa);

}

}

LngLatHelper类:

package org.test;

import java.util.HashMap;

import java.util.Map;

public class LngLatHelper {

// ! 计算点A 和 点B的经纬度,求他们的距离和点B相对于点A的方位

/*

* ! /param A A点经纬度 /param B B点经纬度 /param angle B相对于A的方位, 不需要返回该值,则将其设为空

* /return A点B点的距离

*/

static Map distance(LnglatEntity A, LnglatEntity B) {

Map result = new HashMap();

double dx = (B.m_RadLo - A.m_RadLo) * A.Ed;

double dy = (B.m_RadLa - A.m_RadLa) * A.Ec;

double out = Math.sqrt(dx * dx + dy * dy);

double angle;

angle = Math.atan(Math.abs(dx / dy)) * 180. / Math.PI;

// 判断象限

double dLo = B.m_Longitude - A.m_Longitude;

double dLa = B.m_Latitude - A.m_Latitude;

if (dLo > 0 && dLa <= 0) {

angle = (90. - angle) + 90.;

} else if (dLo <= 0 && dLa < 0) {

angle = angle + 180.;

} else if (dLo < 0 && dLa >= 0) {

angle = (90. - angle) + 270;

}

result.put("distance", out / 1000);

result.put("angle", angle);

return result;

}

// ! 计算点A 和 点B的经纬度,求他们的距离和点B相对于点A的方位

/*

* ! /param longitude1 A点经度 /param latitude1 A点纬度 /param longitude2 B点经度

* /param latitude2 B点纬度 /param angle B相对于A的方位, 不需要返回该值,则将其设为空 /return

* A点B点的距离

*/

static Map distance(double longitude1, double latitude1,

double longitude2, double latitude2) {

LnglatEntity A = new LnglatEntity(longitude1, latitude1);

LnglatEntity B = new LnglatEntity(longitude2, latitude2);

return distance(A, B);

}

// ! 已知点A经纬度,根据B点据A点的距离,和方位,求B点的经纬度

/*

* ! /param A 已知点A /param distance B点到A点的距离 /param angle B点相对于A点的方位 /return

* B点的经纬度坐标

*/

static LnglatEntity GetlnglatByDis(LnglatEntity A, double distance, double angle) {

double dx = distance * 1000 * Math.sin(angle * Math.PI / 180.);

double dy = distance * 1000 * Math.cos(angle * Math.PI / 180.);

// double dx = (B.m_RadLo - A.m_RadLo) * A.Ed;

// double dy = (B.m_RadLa - A.m_RadLa) * A.Ec;

double BJD = (dx / A.Ed + A.m_RadLo) * 180. / Math.PI;

double BWD = (dy / A.Ec + A.m_RadLa) * 180. / Math.PI;

LnglatEntity B = new LnglatEntity(BJD, BWD);

return B;

}

// ! 已知点A经纬度,根据B点据A点的距离,和方位,求B点的经纬度

/*

* ! /param longitude 已知点A经度 /param latitude 已知点A纬度 /param distance B点到A点的距离

* /param angle B点相对于A点的方位 /return B点的经纬度坐标

*/

static LnglatEntity GetlnglatByDis(double longitude, double latitude,

double distance, double angle) {

LnglatEntity A = new LnglatEntity(longitude, latitude);

return GetlnglatByDis(A, distance, angle);

}

}

LatlngTest 测试类:

package org.test;

import java.util.Map;

public class LatlngTest {

/**

* @param args

*/

public static void main(String[] args) {

// // TODO Auto-generated method stub

// double ss =GetDistance(32, 120, 31, 120);

// System.out.println(ss);

//116.377535,39.921576

//116.383787,39.921188

double jd1 = 116.377535;

double wd1 = 39.921576;// 成都

double jd2 = 116.383787;

double wd2 = 39.921188;

// double jd1 = 10;

// double wd1 = 10;// 成都

// double jd2 = 10;

// double wd2 = 20;

Map result = LngLatHelper.distance(jd1,wd1,jd2,wd2);

double distance =result.get("distance");

double angle =result.get("angle");

System.out.println("距离:"+distance);

System.out.println("角度:"+angle);

angle = +90;

LnglatEntity entity = LngLatHelper.GetlnglatByDis(jd1, wd1, distance, angle);

System.out.println(entity.m_Longitude);

System.out.println(entity.m_Latitude);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值