ورود

View Full Version : نحوه بدست اوردن مسافت طی شده



omid_student
چهارشنبه 11 دی 1392, 09:43 صبح
سلام دوستان
من برنامه ای نوشتم اطلاعات جی پی اس رو سرور میفرسته
حالا میخوام مسافت طی شده رو هم نشون بده
من برنامه رو با basic4android نوشتم
در این برنامه جی پی اس رویدادی با عنوان
Sub GPS1_LocationChange(Loccation1 as Location)
داره
واقعا نمیدونم چطور مسافت رو بدست بیارم چیکار کنم
اومدم متغییر گذاشتم که هر سری جی پی اس تغییر یکنه اون هم عوض شه و یه متر اضافه بشه ولی نشد
شما میتونید کمک کنید

rubiks.kde
چهارشنبه 11 دی 1392, 11:33 صبح
خب مسافت رو میخوایید نصبت به چی بدست بیارید(وضعیت قبلی ، وضعیت اولیه ؟؟؟)
دوم اینکه شما موقعیت رو بر اساس طول و عرض جغرافیایی در دست دارید؟؟

omid_student
چهارشنبه 11 دی 1392, 13:21 عصر
ببنید من latitude و longitude رو میگیرم
در کل کاری به اینا نداریم
میخوام مسافتی که داره طی میشه نشون بده ینی بدون موقعیت جغرافیایی
یکی از دوستان گفتکه هر متر که جی پی اس تغییر میده اون موقع متفیر بذار هر موقع 1000 شد بزن یک کیلومتر ولی نشد
حالا شما راهکاری ندارید

rubiks.kde
چهارشنبه 11 دی 1392, 14:22 عصر
شما هر بار که موقعیت تغییر میکنه Location رو نگه دار با به دست امدن Location جدید میتونی فاصله این دوتا رو با تابع DistanceTo (TargetLocation As android.location.Location) As Float محاسبه کنی.
یعنی فاصله بین شروع و پایان رو میتونی حساب کنی.

اگه هم به این صورت نشد باید از فرمول های دستی استفاده کنی.یعنی با استفاده از طول و عرض جغرافیایی باید با یه سری محاسبات این کار رو انجام بدی

omid_student
چهارشنبه 11 دی 1392, 16:19 عصر
شما هر بار که موقعیت تغییر میکنه Location رو نگه دار با به دست امدن Location جدید میتونی فاصله این دوتا رو با تابع DistanceTo (TargetLocation As android.location.Location) As Float محاسبه کنی.
یعنی فاصله بین شروع و پایان رو میتونی حساب کنی.

اگه هم به این صورت نشد باید از فرمول های دستی استفاده کنی.یعنی با استفاده از طول و عرض جغرافیایی باید با یه سری محاسبات این کار رو انجام بدی
همین کار رو کردم ولی درست نمیده
روش دیگه ای نیست
میگم اون متد GPS1.Start(MinimueTime AS Long,sMinimume Distance)f چطوری
من تست کردم نشد

rubiks.kde
چهارشنبه 11 دی 1392, 19:15 عصر
به این صورت استفاده کردید؟

Dim Location1, Location2 As Location

Location1.Latitude = Latitude1
Location1.Longitude = Longitude1
Location2.Latitude = Latitude2
Location2.Longitude = Longitude2
Distance = Location1.DistanceTo(Location2)

روش دیگه اینه :

فرمول ریاضی که استفاده میشه اینه :

a = sin²(Δφ/2) + cos(φ1).cos(φ2).sin²(Δλ/2)
c = 2.atan2(√a, √(1−a))
d = R.c

که φ عرض جغرافیایی و λ طول جغرفیایی و R هم شعاع زمین.

حالا شما این رو شبیه سازی کن توی بیسیک.

مثلا این برای جاوا اسکریپته :

var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();

var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;

اینم نمونه جاواش:

private double distance(double lat1, double lon1, double lat2, double lon2, char unit) {
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;
if (unit == "K") {
dist = dist * 1.609344;
} else if (unit == "N") {
dist = dist * 0.8684;
}
return (dist);
}

/*::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::*/
/*:: This function converts decimal degrees to radians :*/
/*::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::*/
private double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}

/*::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::*/
/*:: This function converts radians to decimal degrees :*/
/*::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::*/
private double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}

system.println(distance(32.9697, -96.80322, 29.46786, -98.53506, "M") + " Miles\n");
system.println(distance(32.9697, -96.80322, 29.46786, -98.53506, "K") + " Kilometers\n");
system.println(distance(32.9697, -96.80322, 29.46786, -98.53506, "N") + " Nautical Miles\n");