我正在計算 Android 11 應用程式中 Yandex.Maps 歷史記錄中記錄的兩點之間的距離。在 getPoints 方法中一切正常。我們將它們在我們資料庫中的所有坐標寫入一個陣列串列。我什至實作了溢位、退出和陣列檢查。同樣,到目前為止,一切都運行良好并符合預期。
public ArrayList<Double> getPoints () {
ArrayList<Double> location = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery("select latitude,longitude from " Table_Name_Location,null);
if(cursor.getCount() > 0) {
while (cursor.moveToNext()) {
Double latitude = cursor.getDouble(cursor.getColumnIndex("Lat"));
Double longitude = cursor.getDouble(cursor.getColumnIndex("Longi"));
location.add(latitude);
location.add(longitude);
}
}
cursor.close();
return location;
}
但是,當我嘗試在距離方法中計算長度時,SQLite資料庫中存盤的幾個緯度和經度錯誤地計算了總距離,例如450公里,根據我們的資料,我們應該得到230公里。發生計算錯誤。
private double distance(double lat1, double lon1, double lat2, double lon2) {
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1))
* Math.sin(deg2rad(lat2))
Math.cos(deg2rad(lat1))
* Math.cos(deg2rad(lat2))
* Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
return (dist);
}
private double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
private double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
我嘗試使用半正弦公式計算距離。我還撰寫了將弧度轉換為度數的函式,反之亦然。在距離方法中,我使用半正弦公式計算距離。我懷疑錯誤在于計算距離,即在執行半正弦公式時。
uj5u.com熱心網友回復:
對于距離,您需要反向Haversine 公式:
dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))^2 cos(lat1) * cos(lat2) * (sin(dlon/2))^2
c = 2 * atan2(sqrt(a), sqrt(1-a))
d = R * c
R = 6371 # mean radius of the Earth in km
(公式來源:鏈接)
Java 中的實作如下所示:
private double distance(double lat1, double lon1, double lat2, double lon2) {
final int R = 6371;
double latDistance = Math.toRadians(lat2 - lat1);
double lonDistance = Math.toRadians(lon2 - lon1);
double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return R * c;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/363305.html
