۸ شعبان زاده
map.locate و سوال درباره script
جامعه پی اچ پی ایجاد شده در ۰۳ فروردین ۱۴۰۲

درود . وقت شما بخیر . امیدوارم سال نو سال خوبی برای شما باشد

من دو سوال دارم :‌

اول اینکه استاد تابع map.locate را در سایت leaflet از کجا پیدا کردند . چون من قسمت document را جستجو کردم پیدا نکردم این تابع را .

سوال دوم من اینست که مگر در php اسکریپت‌ها خط به خط خوانده نمی‌شود؟ پس چرا تابع map.locate را بعد از متغیر‌های locationerror & locationfound قرار داده اند ؟ آیا نباید بر اساس ترتیب اجرای کدها که خط به خط از بالا خوانده می‌شود اول تابع map.locate اجرا شود تا در داده ای که بر می‌گرداند متغیر‌های locationerror & locationfound مقدار بگیرد؟

با سپاس از پاسخ شما

سلام علی عزیز

تابع locate که صدا زدیم برای سرویس دیگه ای بود که روی لیفلت ران میشد که استاد هم نامش رو در ویدیو گفتند.

ما پیداکردن لوکیشن رو اکشن دکمه قرار دادیم و با کلیک روی دکمه فانکشن پیدا کردن لوکیشن اجرا میشه.

احمدرضا فاطمی کیا ۰۴ فروردین ۱۴۰۲، ۱۰:۲۱

سلام احمد جان . روز شما بخیر

استاد گفتند تابع map.locate از توابع leaflet است و دو نوع جواب retutrn می‌کند . اگر پیدا کردن لوکیشین کاربر با استفاده از ژئولیکشن موفقیت آمیز بود event با نام locationfound فایر میشه و اگر موفقیت آمیز نبود locationerror فایر میشه . تابع locate هم توسط setinterval هر ۵ ثانیه در صفحه جاری کاربر فراخوانی و اجرا میشه . صحبت از دکمه نیست در اینجا . حالا سوال من اینه که :

۱- استاد ، تابع map.locate را در سایت leaflet از کجا پیدا کردند چون من در document سایت مورد نظر پیداش نکردم .

۲- سوال دیگه من درباره این است که استاد در اسکریپ‌ها ابتدا event‌ها را فراخوانی می‌کنند map.on('locationfound' function()) --- map.on('locationerror' function()) و سپس (e)function locate رو ایجاد کردند . حالا با توجه به اینکه اسکریپت‌ها خط به خط اجرا میشه ، چطور ایونت‌های locationfound و locationerror می‌تونن به جوابی که تابع locate تولید می‌کنه دسترسی داشته باشند و بر اساس جواب تابع locate مشخص بشه که کدامیک فایر بشوند؟؟ چون هنوز تابع locate اجرا نشده که جوابی return کنه !!

ممنون از پاسخگویی شما...



شعبان زاده ۰۴ فروردین ۱۴۰۲، ۱۲:۳۷

تابع map.locate() در مستندات Leaflet API فهرست نشده است، اما در راهنمای شروع سریع Leaflet در بخش "دریافت ورودی کاربر" ذکر شده. همچنین در Leaflet Github قرار داده شده است.


رویدادهای map.on('locationfound', function(e){}) و map.on('locationerror', function(e){}) در واقع تابع locate() را اجرا نمی‌کنند. آنها استفاده کنندگان رویداد را برای رویدادهای locationfound و locationerror ثبت می‌کنند که توسط تابع ()locate اجرا می‌شوند. وقتی تابع locate() فراخوانی می‌شود، مشخص می‌کند که آیا در یافتن موقعیت کاربر با استفاده از موقعیت جغرافیایی موفق بوده است یا نه، و سپس بر اساس آن، رویداد locationfound یا locationerror را فعال می‌کند. آرگومان e در توابع رویداد به شی رویدادی اشاره دارد که هنگام اجرا شدن رویداد به آنها ارسال می‌شود و حاوی اطلاعاتی در مورد رویداد است، مانند مختصات مکان کاربر در مورد locationfound. بنابراین، تابع locate() مسئول ارسال رویدادها و ارسال اطلاعات لازم به توابع دریافت کننده رویداد است.

احمدرضا فاطمی کیا ۰۴ فروردین ۱۴۰۲، ۱۹:۱۲

سلام احمد جان . شبت بخیر

ببخشید احمد جان . اما من هنوز هم تو تفسیر این کد مشکل دارم . کدی که استاد نوشتن رو می‌گذارم روی کد یک توضیح بدید ممنون میشیم .

// find Current Location (at first, Use Shekan.ir)
var current_position, current_accuracy;
map.on('locationfound', function(e) {
    // if position defined, then remove the existing position marker and accuracy circle from the map
    if (current_position) {
        map.removeLayer(current_position);
        map.removeLayer(current_accuracy);
    }
    var radius = e.accuracy;
    current_position = L.marker(e.latlng).addTo(map)
        .bindPopup("دقت تقریبی: " + radius + " متر").openPopup();
    current_accuracy = L.circle(e.latlng, radius).addTo(map);
});
map.on('locationerror', function(e) {
    alert(e.message);
});
// wrap map.locate in a function    
function locate() {
    map.locate({ setView: true, maxZoom: defaultZoom });
}
// call locate every 5 seconds... forever
// setInterval(locate, 5000);

من اینطور تفسیر می‌کنم کد بالا رو

با توجه به کد بالا تابع locate در اسکریپت ، پایین‌تر از رویداد‌های map.on('locationfound', function(e){}) و map.on('locationerror', function(e){}) قرار دارد .

در نتیجه هنوز رویدادی نداریم ( اسکریپت هنوز به تابع locate نرسیده ) تا یکی از دو مورد map.on('locationfound', function(e){}) و map.on('locationerror', function(e) بر اساس خروجی تابع locate انتخاب و فایر شود. نکته ای که برای من مبهم است همینجاست چون فکر می‌کنم اسکریپت کد فوق به ترتیب از بالا به پایین اجرا شده و اول باید تابع locate نوشته می‌شد تا یک خروجی داشته باشد و سپس بر اساس آن یکی از حالت‌های locationerror یا locationfound صدا زده می‌شد .


شعبان زاده ۰۴ فروردین ۱۴۰۲، ۲۰:۰۱

علی عزیز

تفسیر شما از کد درست هست.

ما اومدیم و گفتیم که نقشه در زمانیکه یه اتفاقی میوفته(map.on) یه کاری رو انجام بده.

پس صفحه رندر و کدها آماده پردازش میشه تا زمانیکه لوکیشن کاربر پیدا بشه.(یعنی بعد از فایر شدن لوکیشن اون اتفاقا میوفته)

.تابع locate() به منظور یافتن موقعیت کاربر تعریف شده است. همچنین، دو رویداد locationfound و locationerror برای پردازش خروجی تابع locate() تعریف شده است.

بله، اجرای کد از بالا به پایین صورت می‌گیرد و تابع locate() بعد از تعریف رویدادهای locationfound و locationerror آمده است. با این حال، این موضوع مهم نیست، زیرا تابع locate() تنها زمانی فراخوانی می‌شود که کاربر رویداد موقعیت را فراخوانی کند (با استفاده از دکمه‌ی مشخص شده در صفحه). به این ترتیب، کد به درستی کار خود را انجام می‌دهد.

احمدرضا فاطمی کیا ۰۴ فروردین ۱۴۰۲، ۲۰:۴۳

خیلی ممنون احمد عزیز .

اینطور که من متوجه شدم ، به دلیل اینکه رویداد‌های locationfound و locationerror یک نوع listener هستند پس باید حتما قبل از متد locate آماده (lunch) شده و آماده گوش کردن به تابع locate باشند تا به محض اینکه تابع locate اجرا شد ، خروجی آنرا گرفته و دستورات داخلی خود را اجرا کنند . به همین دلیل باید قبل از تابع locate قرار بگیرند .

احمد جان من درست فهمیدم ؟

شعبان زاده ۰۵ فروردین ۱۴۰۲، ۰۹:۳۸

بله دقیقا

بهترین پاسخ
احمدرضا فاطمی کیا ۰۵ فروردین ۱۴۰۲، ۱۰:۰۲

خیلی ممنون احمد جان . ببخشید وقتت رو گرفتم . موفق باشید

شعبان زاده ۰۵ فروردین ۱۴۰۲، ۱۰:۱۸