从一个坐标到另一个坐标

我从http://www.movable-type.co.uk/scripts/latlong.html实施了“方位”公式。 但它似乎非常不准确 – 我怀疑我的实施中有些错误。 你能帮我找到它吗? 我的代码如下:

protected static double bearing(double lat1, double lon1, double lat2, double lon2){ double longDiff= lon2-lon1; double y = Math.sin(longDiff)*Math.cos(lat2); double x = Math.cos(lat1)*Math.sin(lat2)-Math.sin(lat1)*Math.cos(lat2)*Math.cos(longDiff); return Math.toDegrees((Math.atan2(y, x))+360)%360; } 

你只是把你的括号()放在错误的地方。

您正在以弧度为单位添加度数,这将无效。 toDegrees()将为您进行从弧度到度数的转换, 然后在得到度数值后进行标准化。

你有:

  Math.toDegrees( (Math.atan2(y, x))+360 ) % 360; 

但你需要:

 ( Math.toDegrees(Math.atan2(y, x)) + 360 ) % 360; 

还要记住, Math.sin()Math.cos()和所有其他三角函数的所有输入都必须是弧度。 如果你的输入是度数,你首先需要使用Math.toRadians()来转换它们。

这是最终的代码:

 protected static double bearing(double lat1, double lon1, double lat2, double lon2){ double longitude1 = lon1; double longitude2 = lon2; double latitude1 = Math.toRadians(lat1); double latitude2 = Math.toRadians(lat2); double longDiff= Math.toRadians(longitude2-longitude1); double y= Math.sin(longDiff)*Math.cos(latitude2); double x=Math.cos(latitude1)*Math.sin(latitude2)-Math.sin(latitude1)*Math.cos(latitude2)*Math.cos(longDiff); return (Math.toDegrees(Math.atan2(y, x))+360)%360; } 

从一个坐标到另一个坐标和找到北,东,南,weast 🙂 在此处输入图像描述

  public class FindBearing { public static void main(String[] args) { System.out.println(" Your Result >>> "+FindBearing.bearing(19.2859590, 73.4966430, 19.2861020, 73.4988090)); } protected static String bearing(double lat1, double lon1, double lat2, double lon2){ double longitude1 = lon1; double longitude2 = lon2; double latitude1 = Math.toRadians(lat1); double latitude2 = Math.toRadians(lat2); double longDiff= Math.toRadians(longitude2-longitude1); double y= Math.sin(longDiff)*Math.cos(latitude2); double x=Math.cos(latitude1)*Math.sin(latitude2)-Math.sin(latitude1)*Math.cos(latitude2)*Math.cos(longDiff); double resultDegree= (Math.toDegrees(Math.atan2(y, x))+360)%360; String coordNames[] = {"N","NNE", "NE","ENE","E", "ESE","SE","SSE", "S","SSW", "SW","WSW", "W","WNW", "NW","NNW", "N"}; double directionid = Math.round(resultDegree / 22.5); // no of array contain 360/16=22.5 if (directionid < 0) { directionid = directionid + 16; //no. of contains in array } String compasLoc=coordNames[(int) directionid]; return resultDegree+" "+compasLoc; } } 

一点点清理版@IvanT答案 :

 public static double bearingInRadians(LatLng src, LatLng dst) { double srcLat = Math.toRadians(src.getLatitude()); double dstLat = Math.toRadians(dst.getLatitude()); double dLng = Math.toRadians(dst.getLongitude() - src.getLongitude()); return Math.atan2(Math.sin(dLng) * Math.cos(dstLat), Math.cos(srcLat) * Math.sin(dstLat) - Math.sin(srcLat) * Math.cos(dstLat) * Math.cos(dLng)); } public static double bearingInDegrees(LatLng src, LatLng dst) { return Math.toDegrees((bearingInRadians(src, dst) + Math.PI) % Math.PI); } 

LatLng是:

 public final class LatLng { private final double latitude; private final double longitude; public LatLng(double latitude, double longitude) { this.latitude = latitude; this.longitude = longitude; } public double getLatitude() { return latitude; } public double getLongitude() { return longitude; } }