در این متن به رندر کردن نقشه (Map Rendering) نگاهی خواهیم انداخت.
کاشیهای (𝐓𝐢𝐥𝐞𝐬) از پیش محاسبه شده یکی از مفاهیم بنیادی در رندر کردن نقشه، کاشیکاری (tiling) است. به جای رندر کردن کل نقشه به صورت یک تصویر بزرگ سفارشی، جهان به کاشیهای کوچکتر تقسیم میشود. کلاینت فقط کاشیهای مرتبط با منطقهای را که کاربر در آن قرار دارد دانلود میکند و آنها را مانند یک کاشیکاری برای نمایش به هم میچسباند. کاشیها در سطوح بزرگنمایی مختلف از پیش محاسبه میشوند. Google Maps از 21 سطح بزرگنمایی استفاده میکند.به عنوان مثال، در سطح بزرگنمایی 0 کل نقشه توسط یک کاشی تک با اندازه 256 * 256 پیکسل نمایش داده میشود. سپس در سطح بزرگنمایی 1، تعداد کاشیهای نقشه در هر دو جهت شمال-جنوب و شرق-غرب دو برابر میشود، در حالی که هر کاشی در اندازه 256 * 256 پیکسل باقی میماند. بنابراین در سطح بزرگنمایی 1 حدود 4 کاشی داریم و کل تصویر در سطح بزرگنمایی 1 اندازه 512 * 512 پیکسل دارد. با هر افزایش سطح، کل مجموعه کاشیها 4 برابر تعداد پیکسلهای سطح قبلی را دارد. افزایش تعداد پیکسلها، سطح جزئیات بیشتری را در اختیار کاربر قرار میدهد. این امر به کلاینت امکان میدهد نقشه را در بهترین سطوح جزئیات بسته به سطح بزرگنمایی کلاینت رندر کند، بدون اینکه پهنای باند زیادی برای دانلود کاشیهایی با جزئیات بیش از حد مصرف شود. این موضوع به ویژه هنگام بارگیری تصاویر از کلاینتهای موبایل اهمیت دارد.
بخشهای جاده و خیابان
اکنون که نقشههای عظیم را به کاشیهای کوچکتر تبدیل کردهایم، نیاز داریم یک ساختار داده برای جادهها نیز تعریف کنیم. ما جهان جادهها را به بلوکهای کوچک تقسیم میکنیم. به این بلوکها،بخشهای جاده میگوییم. هر بخش جاده شامل چندین جاده، تقاطعها و سایر متادیتاهای (metadata) دیگر است.
ما بخشهای نزدیک به هم را در اَبَر بخشها گروهبندی میکنیم. این فرآیند میتواند به طور مکرر برای رسیدن به سطح پوشش مورد نیاز اعمال شود. سپس بخشهای جاده را به یک ساختار داده تبدیل میکنیم که الگوریتمهای ناوبری میتوانند از آن استفاده کنند. رویکرد معمول این است که نقشه را به یک گراف تبدیل کنیم، جایی که گرهها بخشهای جاده هستند و دو گره اگر بخشهای جاده مربوطه همسایههای قابل دسترس باشند، به هم متصل میشوند. به این ترتیب، یافتن مسیر بین دو مکان به یک مسئله کوتاهترین مسیر تبدیل میشود که میتوانیم از الگوریتمهای Dijkstra یا در آن بهره ببریم.
گوگل پروژه Google Maps را در سال 2005 آغاز کرد. تا ماه مارس 2021 نرمافزار Google Maps یک میلیارد کاربر فعال روزانه داشت و 99 درصد از جهان را در 200 کشور پوشش میداد. اگرچه Google Maps یک سیستم بسیار پیچیده است، اما میتوانیم آن را به 3 مؤلفه سطح بالا تقسیم کنیم. در این متن بیایید نگاهی به چگونگی طراحی یک Google Maps سادهشده بیندازیم.
سرویس موقعیت مکانی
سرویس موقعیت مکانی مسئول ثبت بهروزرسانی موقعیت مکانی کاربر است. کلاینتهای Google Maps هر چند ثانیه یکبار موقعیت مکانی را بهروزرسانی میکنند. دادههای موقعیت مکانی کاربر در موارد زیر مورد استفاده قرار میگیرند:
رِندرکردن نقشه (𝐌𝐚𝐩 𝐑𝐞𝐧𝐝𝐞𝐫𝐢𝐧𝐠)
نقشه جهان به یک تصویر نقشه 2 بعدی بزرگ تصویر شده است. این نقشه به قطعات کوچک تصویری به نام "کاشی" (tile) تقسیم شده است (به بالا نگاه کنید). کاشیها ثابت هستند و اغلب تغییر نمیکنند. یک راه کارآمد برای سرویس دادن فایلهای کاشی ثابت، استفاده از CDN پشتیبانی شده توسط ذخیرهسازی ابری مانند S3 است. کاربران میتوانند tileهای مورد نیاز را از CDN نزدیک برای ترکیب یک نقشه بارگیری کنند.
اما اگر کاربر روی کلاینت در حال بزرگنمایی و حرکت در نقطه دید نقشه برای کاوش محیط اطراف خود باشد، چه اتفاقی میافتد؟
یک راه کارآمد این است که از قبل بلوکهای نقشه با سطوح بزرگنمایی مختلف را محاسبه کنیم و در صورت نیاز تصاویر را بارگیری کنیم.
سرویس مسیریابی (𝐍𝐚𝐯𝐢𝐠𝐚𝐭𝐢𝐨𝐧 𝐒𝐞𝐫𝐯𝐢𝐜𝐞)
این مؤلفه مسئول یافتن یک مسیر نسبتاً سریع از نقطه A به نقطه B است. برای کمک به محاسبه مسیر، از دو سرویس زیر استفاده میکند: