Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找距离我所在位置1公里处180度(南)的位置_Java_Android_Geolocation_Location - Fatal编程技术网

Java 查找距离我所在位置1公里处180度(南)的位置

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

我有一个位置(拉特和朗),我想找到下一个位置(拉特和朗),它距离我的位置(拉特和朗)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 - 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公式创建新函数。你能帮帮我吗?用你最喜欢的