PDA

View Full Version : ساخت نقشه های خیلی بزرگ



benyamin_pc
جمعه 22 اردیبهشت 1391, 09:25 صبح
برای ساخت اینجور نقشه های خیلی بزرگ مثل google map نمیشه کل نقشه در یک لحظه لود شه و نمایش داده شه چون هم حجم داده های لود شده خیلی زیاد هست و هم حجم دیتاهای کشیده شده سمت کامپیوتر کاربر در سمت کلاینت و نمایش آنها به شکل گرافیکی بار زیادی را روی پردازنده و حافظه اصلی میگذاره
برای همین باید فقط ناحیه ای که مورد نیاز هست لود شود اما اینکه با کشیدن ناحیه لود شده به اطراف باید ناحیه هائی که در مسیر درگ موس قرار می گیرند هم لود شوند نقطه اصلی کار هست که من هم توی همین مشکل دارم
از دوستانی که با این الگوریتم آشنائی دارند خواهشمند است راهنمائی بفرمایند

MMSHFE
جمعه 22 اردیبهشت 1391, 20:21 عصر
دوست عزیز، کار زیاد سختی نیست. شما باید نقشه اصلی رو به ابعاد کوچک تقسیم کنید و هرکدوم رو جداگانه ذخیره کنید و در هر لحظه فقط اون تکه هایی که توی کادر هستن رو Load کنید و نشون بدین. هرموقع هم عمل پیمایش به سمت چپ یا راست انجام شد، باید ببینید کدوم تکه ها از کادر خارج میشه و کدوم تکه ها وارد میشه و مجدداً تکه های جدید رو بارگذاری کنید. کار سختی نیست. فقط یکم محاسبه میخواد که بدونید کدوم تکه ها رو در آرایه تصاویرتون باید انتخاب کنید. موفق باشید.

benyamin_pc
جمعه 22 اردیبهشت 1391, 21:05 عصر
از راهنمائیتون تشکر اما تو پست اول اشاره به همین موضوع کردم و تا اینجاشو مشکلی ندارم , یعنی اگه قرار باشه با جهت نما نقشه هر بار در جهت چپ یا راست یا پائین یا بالا حرکت کنه مشکلی نیست چون هر بار میشه تشخیص داد نقشه تو چه موقعیتی است و تیکه های همون موقعیت لود کنه , اما وقتی بخاد درگ بشه یعنی اینکه تو ایونت موس موو باید هر لحظه تشخیص بدیم نقشه تو چه موقعیتی است , سپس همون موقعیت تیکه هاشو لود کنیم و این باعث میشه انفجار رکوئست ها به سمت سرور روانه شن , حالا برای این قسمت فکر کردم تو ایونت موس موو اول روی کلاینت بررسی کنم که تو موقعیت فعلی چه تیکه هائی لود شده و دیگه درخواست لود اون تیکه ها از صفحه فعلی برای سرور ارسال نشه
نظرتون چیه؟

MMSHFE
جمعه 22 اردیبهشت 1391, 21:16 عصر
نه نیازی به انفجار نیست. میتونید با jQueryUI و توابع Drag و Drop اون، فقط در لحظه ای که ماوس شروع به Drag میکنه موقعیت شروع رو بدست بیارین و بعد با استفاده از تابع Drop در لحظه رهاکردن ماوس موقعیت پایان رو هم محاسبه کنید و درنهایت با احتساب تفاضل اونها، میزان جابجایی نقشه رو بدست بیارین. حالا کافیه با PHP اون تکه ها که ناقص قرارمیگیرن رو بصورت جزئی به نمایش در بیارین. نمونه کدش رو اینجا (http://barnamenevis.org/showthread.php?215150-snippet-%D9%87%D8%A7%DB%8C-php&p=1484209&viewfull=1#post1484209) گذاشتم. موفق باشید.

benyamin_pc
جمعه 22 اردیبهشت 1391, 21:34 عصر
خوب اینی که الان شما گفتین اینجوری میشه که اگه نقشرو برداریم و اول بیاریمش سمت راست بعد ببریمش سمت چپ و موسو رها کنیم اون کار نداره سمت راست هم بردیمش میاد فقط از مکان اولیه تا سمت چپ رو اونم نه مسیری که موس از نقطه اولیه تا نقطه سمت چپی پیموده بلکه مسیری به شکل خط مستقیم از نقطه اولیه تا نقطه انتهائی

benyamin_pc
جمعه 22 اردیبهشت 1391, 21:39 عصر
روی این مورد قبلا تا حدی فکر کردم و دیدم راهی که بشه مثل گوگل مپ مسیری که موس طی میکنه همه تصاویرشو نمایش بدیم اینه که توی موس موو تعریف بشه و برای اینم که از انفجار رکوئست ها تا حدی بشه جلوگیری کرد میشه تو هر لحظه حرکت موس فقط درخواست تیکه هائی از صفحه فعلیو بدیم که لود نشدن و لود شده ها تکراری لود نشن , اگه شیوه بهینه تری در این مورد که مثل گوگل مپ کلیه مسیر پیموده شده با موسو نمایش بده تو ذهنتون هست بفرمائین

MMSHFE
جمعه 22 اردیبهشت 1391, 21:57 عصر
خود گوگل هم به محض حرکت کردن تصاویر رو بارگذاری نمیکنه. بلکه اگه چند لحظه ماوس رو در حال Dragکردن ثابت نگه دارین (مثلاً نیم ثانیه)، اونوقت درخواست رو میفرسته.

benyamin_pc
جمعه 22 اردیبهشت 1391, 22:39 عصر
فکر کنم سرعتتون کمه ها دوست عزیز , چون بنده به محض تکون دادن نقشه برام تیکه های دیگش لود میشه و به هر مسیری درگ کنم دقیقا مسیر درگ موس (همون موس موو) سریعا تیکه هاش لود میشن

djsaeedkhan
جمعه 22 اردیبهشت 1391, 23:30 عصر
سلام
می تونی از سایت avval.ir نگاه کنی
این سایت رو هم می تونی ببینی
http://www.sorush-soft.ir/map/

MMSHFE
جمعه 22 اردیبهشت 1391, 23:32 عصر
نه مشکل از سرعت نیست. مسئله ای که الآن فهمیدم اینه که گوگل نمیاد دقیقاً تکه تکه بارگذاری کنه. بلکه تصاویر رو تا چند محدوده از اطراف کادر دید بارگذاری میکنه و در زمان Drag کردن، به محض نزدیک شدن به محدوده ای که بارگذاری نشده، قبل از رسیدن به اون محدوده، اونها بارگذاری میشن. بعلاوه نمیاد بخشی از یک Tile رو Load کنه، بلکه کل Tile بارگذاری میشه و با CSS کادری دور محدوده قرار میگیره که با z-order بالاتر، روی قسمتهای خارج کادر رو میپوشونه.

benyamin_pc
شنبه 23 اردیبهشت 1391, 00:37 صبح
سلام
می تونی از سایت avval.ir نگاه کنی
این سایت رو هم می تونی ببینی
http://www.sorush-soft.ir/map/

برادر اینجوری که سادس بحث سر نمایش در مسیر درگه که چجوری رکوئست ها به حداقل برسن

benyamin_pc
شنبه 23 اردیبهشت 1391, 00:48 صبح
نه مشکل از سرعت نیست. مسئله ای که الآن فهمیدم اینه که گوگل نمیاد دقیقاً تکه تکه بارگذاری کنه. بلکه تصاویر رو تا چند محدوده از اطراف کادر دید بارگذاری میکنه و در زمان Drag کردن، به محض نزدیک شدن به محدوده ای که بارگذاری نشده، قبل از رسیدن به اون محدوده، اونها بارگذاری میشن. بعلاوه نمیاد بخشی از یک Tile رو Load کنه، بلکه کل Tile بارگذاری میشه و با CSS کادری دور محدوده قرار میگیره که با z-order بالاتر، روی قسمتهای خارج کادر رو میپوشونه.

خوب مسئله هسته الگوریتم هست , حالا چه فقط تیکه های صفحه جاری رو نمایش بده چه بیاد تیکه های صفحه جاری بعلاوه تیکه های اطراف صفحه جاری هم به عنوان یه جور بافر بگیره اما بازم موقعی که درگ میکنیم مپو باز باید لحظه به لحظه چک کنه که اگه تو صفحه جاری ای که درگ داره هی تغییرش میده قطعاتی لود نشدن همرو لود کنه و این اتفاق لحظه به لحظه اگه نیافته مسیر درگ روشن نمیشه

الگوریتمی که اول گفتم بازم حس میکنم بشه : اگه طرف کلاینت هر تایلی که لود میشه تو یه وکتوری آرایه دوبعدی چیزی تیک بزنیم بعد میشه تو موس موو هی صفحه جاری ببینیم الان چی هست و تایلای کل اون صفحرو دونه دونه اول همون سمت کلاینت چک کنیم اگه تو آرایه تیک نخورده یعنی لود نشده و رکوئستو ارسال کنیم و به این شیوه مسیر درگ روشن کنیم و حداقل درخواست هارو سمت سرور بفرستیم

به نظرتون بهینه تر میشه؟

MMSHFE
شنبه 23 اردیبهشت 1391, 14:31 عصر
بله به این شکل میشه بهینه تر عمل کرد ولی سیستم کلاینت رو خیلی درگیری میکنیم و اگه کلاینت کلاً Cache رو غیرفعال کرده باشه، این روش جواب نمیده. ضمناً گوگل و... برای اینجور کارها یک سرور قدرتمند اختصاصی میگذارن که با مشکل انبوه درخواستها مواجه نشن. طبیعتاً نباید انتظار داشته باشیم که با یک هاست اشتراکی نتیجه ای در حد Google Maps کسب کنیم.

benyamin_pc
شنبه 23 اردیبهشت 1391, 17:22 عصر
حداقل با این روش مسیر درگ روشن میشه و درخواست ها هم به سمت سرور به حداقل میرسن (اگه روش بهینه تری تو ذهنتونه خوشحال میشم اطلاعاتتونو به اشتراک بذارین) اما مشکل درگیری کلاینت و بار افتادن روی پردازنده و حافظه بخاطر گشتن تو اون آرایه برای چک کردن لودی ها و عمل درگ کل تایلهای لود شده دقیقا وجود داره اما گوگل مپ هم تا حدی این بار روی پردازنده کلاینت میندازه که اگه بیایم آرایرو به صورت لوکال جستجو کنیم این بار به حداقل میرسه تا لازم نباشه برای چک تایلهای لودی صفحه جاری کل آرایرو بگردیم

MMSHFE
شنبه 23 اردیبهشت 1391, 19:43 عصر
دقیقاً این همون کاریه که گوگل میکنه. درواقع خود کلاینت محاسبه میکنه چه Tileهایی رو لازم داره و اونها رو از سرور درخواست میکنه. اینطور نیست که گوگل براساس تغییرمکان، تایلهای جدید رو تشخیص بده بلکه تمام عملیات تغییرمکان و یافتن تایلهایی که جدیداً وارد کادر شدن و اونهایی که از کادر خارج شدن همه در سمت کلاینت انجام میشه (حتی در اعمالی مثل بزرگنمایی و...) و نهایتاً فقط تایلهای جدید از سرور درخواست میشن. میتونید با ابزارهایی مثل LiveHTTPHeaders در Firefox این عملیات رو ردیابی کنید. موفق باشید.

benyamin_pc
یک شنبه 24 اردیبهشت 1391, 01:08 صبح
درواقع خود کلاینت محاسبه میکنه چه Tileهایی رو لازم داره و اونها رو از سرور درخواست میکنه. اینطور نیست که گوگل براساس تغییرمکان، تایلهای جدید رو تشخیص بده

اینکه توش بحثی نبود , خوب مشخصه که گوگل جز پاسخ به درخواست های کلاینت کاری نمیکنه , بحث سر این بود که چجوری کمترین درخواست از کلاینت ارسال شه و کی ارسال شه , که پیشنهاد من این بودکه درخواست هارو در هنگام موس موو بفرسته اما بخاطر کمینه شدن درخواست ها اگه تایل مورد نظر لود نشده درخواستشو بفرسته , بازم دوستان تو بهینه کردن یا در صورت مشکل احتمالی تو این گفته اگه چیزی تو ذهنشونه بفرماین , یا اگه ایده متفاوتی تو ذهنشونه به همین شفافی که بنده این الگوریتمو ارائه دادم لطفا ارائه بفرماین