Java 查找距离我所在位置1公里处180度(南)的位置
我有一个位置(拉特和朗),我想找到下一个位置(拉特和朗),它距离我的位置(拉特和朗)180度(南)1公里。你能给我一些算法或函数吗?从Java实现开始:Java 查找距离我所在位置1公里处180度(南)的位置,java,android,geolocation,location,Java,Android,Geolocation,Location,我有一个位置(拉特和朗),我想找到下一个位置(拉特和朗),它距离我的位置(拉特和朗)180度(南)1公里。你能给我一些算法或函数吗?从Java实现开始: public static double haversine(double lat1, double lon1, double lat2, double lon2) { double dLat = Math.toRadians(lat2 - lat1); double dLon = Math.toRadians(lon2 - l
public static double haversine(double lat1, double lon1, double lat2, double lon2) {
double dLat = Math.toRadians(lat2 - lat1);
double dLon = Math.toRadians(lon2 - lon1);
lat1 = Math.toRadians(lat1);
lat2 = Math.toRadians(lat2);
double a = Math.pow(Math.sin(dLat / 2),2) + Math.pow(Math.sin(dLon / 2),2) * Math.cos(lat1) * Math.cos(lat2);
double c = 2 * Math.asin(Math.sqrt(a));
return R * c;
}
如果您知道lon1==lon2
,那么这段代码中有很多会立即消失,因为dLon==0
:
public static double haversine(double lat1, double lat2) {
double dLat = Math.toRadians(lat2 - lat1);
return R * dLat;
}
(这应该是熟悉的长度=半径*弧度角度公式)
因此,如果您知道R=6372.8
,并且您想要的结果是1
,那么很容易为dLat
找到一个值:
dLat = 1.0 / 6372.8;
换句话说,只需从当前纬度减去1.0/6372.8
(记住要小心处理纬度小于180-1.0/6372.8
的点)。从Java实现开始:
public static double haversine(double lat1, double lon1, double lat2, double lon2) {
double dLat = Math.toRadians(lat2 - lat1);
double dLon = Math.toRadians(lon2 - lon1);
lat1 = Math.toRadians(lat1);
lat2 = Math.toRadians(lat2);
double a = Math.pow(Math.sin(dLat / 2),2) + Math.pow(Math.sin(dLon / 2),2) * Math.cos(lat1) * Math.cos(lat2);
double c = 2 * Math.asin(Math.sqrt(a));
return R * c;
}
如果您知道lon1==lon2
,那么这段代码中有很多会立即消失,因为dLon==0
:
public static double haversine(double lat1, double lat2) {
double dLat = Math.toRadians(lat2 - lat1);
return R * dLat;
}
(这应该是熟悉的长度=半径*弧度角度公式)
因此,如果您知道R=6372.8
,并且您想要的结果是1
,那么很容易为dLat
找到一个值:
dLat = 1.0 / 6372.8;
换句话说,只需从当前纬度中减去1.0/6372.8
(记住要小心处理纬度小于180-1.0/6372.8
的点)。要获得简单的解决方案,请查看库及其方法:
/**
*
*计算从一个圆沿大圆路径移动的终点
*给定起始点和已知距离的给定初始方位。
*
*
*@param start
*起点。
*@param初始轴承
*初始方位。
*@param距离
*旅行的距离。
*@param单位
*测量距离的单位。
*@返回终点。
*/
公共静态车床行程(车床启动、双初始轴承、双距离、,
长度单位){
双bR=数学半径(初始方位);
double lat1R=Math.toRadians(start.getLatitude());
double lon1R=Math.toRadians(start.getLongitude());
double dR=距离/纬度配置getEarthRadius(单位);
双a=数学sin(dR)*数学cos(lat1R);
double-lat2=Math.asin(Math.sin(lat1R)*Math.cos(dR)+a*Math.cos(bR));
双lon2=lon1R
+Math.atan2(Math.sin(bR)*a,Math.cos(dR)-Math.sin(lat1R)*Math.sin(lat2));
返回新的LatLng(Math.toDegrees(lat2),Math.toDegrees(lon2));
}
你只要给它一个起点、方向、距离和单位,就可以得到计算出的位置。您需要获得完整的库,因为此方法使用库声明的某些类。它还有一些其他有用的计算
可在.下找到。有关简单的解决方案,请查看该库及其方法:
/**
*
*计算从一个圆沿大圆路径移动的终点
*给定起始点和已知距离的给定初始方位。
*
*
*@param start
*起点。
*@param初始轴承
*初始方位。
*@param距离
*旅行的距离。
*@param单位
*测量距离的单位。
*@返回终点。
*/
公共静态车床行程(车床启动、双初始轴承、双距离、,
长度单位){
双bR=数学半径(初始方位);
double lat1R=Math.toRadians(start.getLatitude());
double lon1R=Math.toRadians(start.getLongitude());
double dR=距离/纬度配置getEarthRadius(单位);
双a=数学sin(dR)*数学cos(lat1R);
double-lat2=Math.asin(Math.sin(lat1R)*Math.cos(dR)+a*Math.cos(bR));
双lon2=lon1R
+Math.atan2(Math.sin(bR)*a,Math.cos(dR)-Math.sin(lat1R)*Math.sin(lat2));
返回新的LatLng(Math.toDegrees(lat2),Math.toDegrees(lon2));
}
你只要给它一个起点、方向、距离和单位,就可以得到计算出的位置。您需要获得完整的库,因为此方法使用库声明的某些类。它还有一些其他有用的计算
它可以在“.正南移动,也可以正北移动”下使用,这使得计算变得简单,因为它避免了使用经度。
1公里等于0.0088339度
所以在北半球,从位置纬度减去0.0088339,保持经度不变。
对于南半球,添加0.0088339 移动正南,也就是正北,使计算变得简单,因为它避免了使用经度。
1公里等于0.0088339度
所以在北半球,从位置纬度减去0.0088339,保持经度不变。
对于南半球,添加0.0088339 您知道当前位置在哪个坐标系中?您可以使用来计算两点之间的距离。由于缺少更好的方法,您可以使用二进制搜索来找到该点。@Andy Turner:我觉得很难从Haversine公式创建新函数。你能帮我吗?用你最喜欢的搜索引擎搜索“Haversine formula Java”,找到很多很多实现。例如:这是相反的吗?在什么坐标系中您知道您当前的位置?您可以使用来计算两点之间的距离。由于缺少更好的方法,您可以使用二进制搜索来找到该点。@Andy Turner:我觉得很难从Haversine公式创建新函数。你能帮帮我吗?用你最喜欢的