`

计算地球表面以一点为中心指定距离为半径范围内的经纬度

 
阅读更多
private final static double DEF_PI = 3.14159265359; // PI
private final static double DEF_PI180 = 0.01745329252; // PI/180.0
private final static double DEF_R = 6370693.5; // radius of earth

/**
* 根据圆心、半径算出经纬度范围
* 
* @param lon	圆心经度
* @param lat	圆心纬度
* @param r  半径(米)
* @return double[4] 南侧经度,北侧经度,西侧纬度,东侧纬度
*/
public static double[] getRange(double lon, double lat, int r) {
	double[] range = new double[4];
	// 角度转换为弧度
	double ns = lat * DEF_PI180;
	double sinNs = Math.sin(ns);
	double cosNs = Math.cos(ns);
	double cosTmp = Math.cos(r / DEF_R);
	// 经度的差值
	double lonDif = Math.acos((cosTmp - sinNs * sinNs) / (cosNs * cosNs)) / DEF_PI180;
	// 保存经度
	range[0] = lon - lonDif;
	range[1] = lon + lonDif;
	double m = 0 - 2 * cosTmp * sinNs;
	double n = cosTmp * cosTmp - cosNs * cosNs;
	double o1 = (0 - m - Math.sqrt(m * m - 4 * (n))) / 2;
	double o2 = (0 - m + Math.sqrt(m * m - 4 * (n))) / 2;
	// 纬度
	double lat1 = 180 / DEF_PI * Math.asin(o1);
	double lat2 = 180 / DEF_PI * Math.asin(o2);
	// 保存
	range[2] = lat1;
	range[3] = lat2;
	return range;
}

/**
 * 计算地球面上两上坐标点之间距离
* @param lon1	位置1经度
* @param lat1	位置1纬度
* @param lon2	位置2经度
* @param lat2	位置2纬度
 */
public static double 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 distance;
}

public static void main(String args[]) {
	double x1 = 13.957503;
	double y1 = 49.77837;
	double r[] = getRange(x1, y1, 100000);
	System.out.println(r[0]);
	System.out.println(r[1]);
	System.out.println(r[2]);
	System.out.println(r[3]);
	System.out.println(getLongDistance(x1, y1, r[0], y1));
	System.out.println(getLongDistance(x1, y1, r[1], y1));
	System.out.println(getLongDistance(x1, y1, x1, r[2]));
	System.out.println(getLongDistance(x1, y1, x1, r[3]));
}

 

分享到:
评论

相关推荐

    经纬度周边半径计算

    - 计算每度经度和纬度对应的地球表面实际距离。 - `degree = (24901 * 1609) / 360.0`,其中24901英里为地球赤道周长,1609为1英里换算成米。 - `dpmLat = 1 / degree`表示每度纬度对应的米数。 - `radiusLat = ...

    java根据两点经纬度计算距离

    这个任务通常涉及到地球表面的距离计算,因为经纬度是地球坐标系统的一部分。以下是一些相关的重要知识点: 1. 地球坐标系统:地球被假想为一个完美的球体或椭球体,经纬度是用来定位地球上任何位置的坐标系统。...

    知道距离及方位角,计算对方经纬度

    6. **验证和校正**:计算出的经纬度需要检查是否合理,例如,它们应该位于地球表面且符合实际的地理限制。 在编程实现这一算法时,可以使用各种编程语言,如Python的geopy库、geodesy库等,它们提供了内置的函数来...

    app根据经纬度求指定范围

    本篇文章将详细探讨如何根据中心点的经纬度来计算指定范围内的其他点。 首先,我们需要了解经纬度系统。经纬度是地球上位置的一种表示方式,经度(longitude)是从本初子午线开始,向东和向西量度的角度,而纬度...

    计算两个经纬度之间的公里数

    1. **经纬度**:地球表面的位置可以用经度和纬度来表示。纬度范围是-90到90度,表示南北方向;经度范围是-180到180度,表示东西方向。 2. **球面距离公式**:用于计算球面上两点之间的最短距离,也称为大圆距离。本...

    墨卡托坐标与经纬度坐标互换

    经纬度坐标是地球表面位置的标准参考系统,由经度和纬度两个参数组成。经度表示东西方向,以本初子午线为基准,0°至180°E和0°至180°W之间划分;纬度表示南北方向,以赤道为基准,0°至90°N和0°至90°S之间划分...

    经纬度与高斯坐标及经纬度与UTM坐标互转

    3. **UTM坐标**:通用横轴墨卡托投影(Universal Transverse Mercator,UTM)是一种全球性的分带投影方法,将地球表面划分为60个带,每个带宽6度,使用横轴墨卡托投影,便于全球范围内的测量和地图制作。 在C/C++中...

    utm坐标和经纬度相互转换

    经纬度是全球通用的标准地理坐标系统,但在大范围内进行计算时,由于地球曲率的影响,直接使用经纬度可能会导致比例尺的变化。 要实现经纬度与UTM坐标的转换,我们需要知道以下几点: 1. **转换公式**:经纬度到...

    使用GPS经纬度定位附近地点(某一点范围内查询)

    为了查找特定范围内的点,我们可以从中心点出发,逐步增加半径,每次增加一个固定的距离(如1米)。对于每个半径,我们可以计算出一个圆形边界,这个边界上的点与中心点的距离等于当前半径。由于我们无法直接通过加...

    经纬度地图转多普勒天气雷达地图 学习笔记.docx

    地图投影是将地球表面的信息从球面或者椭球面转移到平面上的过程。这种转换是为了便于地图制作和地理数据的分析。对于多普勒天气雷达地图而言,通常采用的是等距方位投影,这是一种以雷达为中心的投影方式。 #### ...

    平面坐标与经纬度的转换

    经纬度坐标系统则是地球表面位置的标准,由经度和纬度组成,以度为单位,0度经线(本初子午线)和0度纬线(赤道)为基准。 在C#中,实现坐标转换通常需要借助外部库或自定义的DLL。DLL(动态链接库)是一种可重用...

    经纬度与大地坐标换算

    经纬度是一种基于地球椭球体模型的地理坐标系统,它以度为单位表示地球表面的位置,通常由经度(longitude)和纬度(latitude)两部分组成。而大地坐标系统,如西安坐标系或北京坐标系,是根据特定国家或地区的地心...

    php计算地图上两点间的距离的类

    这个方法内部会进行角度到弧度的转换,然后执行公式计算,最后返回距离,可能以公里或米为单位。 3. 错误处理:为了确保准确性和鲁棒性,类可能还包含了错误检查,比如验证输入的坐标是否在有效范围内,以及处理除...

    高斯坐标转换,高斯坐标转换经纬度,Visual Basic源码.zip

    高斯坐标系统是平面坐标系统,用于将地球表面的地理位置转换为二维坐标,便于地图制作和测量。在实际应用中,由于地球是一个球体,而地图是平面的,因此需要进行坐标转换来减小误差。 高斯坐标转换涉及到两个主要...

    重力加速度计算工具

    重力加速度计算工具是一款基于LabWindows/CVI开发的应用程序,专用于计算地球表面或不同环境下的重力加速度值。LabWindows/CVI是美国国家仪器(National Instruments, NI)提供的一种集成开发环境(IDE),它结合了...

    兰伯特投影正反算公式

    兰伯特投影的正算公式是用来将地球表面的经纬度转换为平面坐标的过程。正算公式包括两个主要部分:经度和纬度到X和Y坐标的转换。对于经度λ和纬度φ,兰伯特投影的正算公式可以表示为: X = a * (λ - λ₀) * cos...

    坐标换带计算免费版,本程序可以实现高斯—克吕格投影不同分带坐标的相互转换,

    在该投影下,地球表面的曲面被转化为平面,通过分带处理来减少累积误差。 二、分带原理 由于地球是一个球体,无法在一个平面上完全展示其表面,因此需要进行分带处理。在中国,通常按照经度每隔6°划分为一个投影带...

    DistanceCal.rar_wgs84 距离_大椭圆_椭圆航线_椭球模型距离

    然而,由于地球的曲率,实际计算中通常采用的是大椭圆航线,这是因为在小角度范围内,大圆航线可以近似为大椭圆。 3. **椭圆航线计算**:计算大椭圆航线距离需要用到微积分和几何学。基本的算法是基于平面三角形的...

    geohash:一个解决计算附近距离的php类库.zip

    3. **范围查询**:根据某个中心点的Geohash和半径,找到所有在该范围内的其他Geohash,进而找出对应的地理位置。这是实现搜索附近商业点的关键功能。 4. **邻近性判断**:通过比较两个Geohash的相似性,快速判断两个...

    FY-4B标称上行列号和经纬度的互相转换-133E

    FY-4B卫星采用CGMSLRIT/HRIT全球规范定义的静止轨道标称投影,该投影方法将地球表面的地理位置映射到卫星图像坐标系中,实现地理坐标(经纬度)与图像坐标(标称上行列号)之间的互相转换。 1. **从地理经纬度转换...

Global site tag (gtag.js) - Google Analytics