两个纬度和经度之间的中点

我试图将这个http://www.movable-type.co.uk/scripts/latlong.html中给出的代码片段转换为java。 但我没有得到与网站相同的结果。 这里是我的代码来find两个点之间的中点,其中纬度和经度给予

midPoint(12.870672,77.658964,12.974831,77.60935); public static void midPoint(double lat1,double lon1,double lat2,double lon2) { double dLon = Math.toRadians(lon2-lon1); double Bx = Math.cos(lat2) * Math.cos(dLon); double By = Math.cos(lat2) * Math.sin(dLon); double lat3 = Math.atan2(Math.sin(lat1)+Math.sin(lat2),Math.sqrt( (Math.cos(lat1)+Bx)*(Math.cos(lat1)+Bx) + By*By) ); double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx); System.out.print(lat3 +" " + lon3 ); } 

我不确定这个dLon是否正确。 所以请帮助我们弄清楚。 PSI需要find中点的纬度和经度

你需要转换为弧度。 将其更改为以下内容:

 public static void midPoint(double lat1,double lon1,double lat2,double lon2){ double dLon = Math.toRadians(lon2 - lon1); //convert to radians lat1 = Math.toRadians(lat1); lat2 = Math.toRadians(lat2); lon1 = Math.toRadians(lon1); double Bx = Math.cos(lat2) * Math.cos(dLon); double By = Math.cos(lat2) * Math.sin(dLon); double lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By)); double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx); //print out in degrees System.out.println(Math.toDegrees(lat3) + " " + Math.toDegrees(lon3)); } 

使用Android“Google地图实用工具”更容易:

 LatLngBounds bounds = new LatLngBounds(start, dest); bounds.getCenter(); 

您需要将其他公式中使用的lat和lon值转换为Radians。 你可以在下面的代码〜3/5的代码中看到这个。 线索是在余弦距离公式的球形定律的末尾给出的:

(请注意,在这里和所有后续的代码片段中,为了简单起见,我不显示从度数到弧度的转换;请参阅下面的完整版本)。

我做了一个跟踪模块,我使用这个公式来计算两个坐标之间的距离。

 //Location lat and lon double locLat = -23.548333; double locLon = -46.636111; //Destination lat and lon double dstLat = -22.902778; double dstLon = -43.206667; double arcoAB = 90 - (dstLat); double arcoAC = 90 - (locLat); double difLon = locLon - (dstLon); double cosA = Math.cos(Math.toRadians(arcoAC)) * Math.cos(Math.toRadians(arcoAB)) + Math.sin(Math.toRadians(arcoAC)) * Math.sin(Math.toRadians(arcoAB)) * Math.cos(Math.toRadians(difLon)); double acosCosA = Math.toDegrees(Math.acos(cosA)); double raio = 2 * Math.PI * 6371; double distance = (raio * acosCosA) / 360; return distance; //Distance in KM, convert to anything else (miles, meters..) if you need.. 

你可以得到中点的距离除以2。

啊,这个另一个公式也起作用:

 double dLat = Math.toRadians(dstLat - locLat); double dLon = Math.toRadians(dstLon - locLon); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math.toRadians(locLat)) * Math.cos(Math.toRadians(dstLat)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); double d = 6371 * c; return d; //Distance in KM