两个纬度和经度之间的中点
我试图将这个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