ناهمواری‌ها در نقشه و مسیریاب بلد


به نام خدا

در این مطلب، به همراه همکار خوبم عرفان قادرمرزی، می‌خواهیم به صورت ساده، در مورد اطلاعات ناهمواری در بلد صحبت کنیم، اینکه این اطلاعات چه هستند و در کجا و چگونه در اپلیکیشن بلد استفاده می‌شوند صحبت کوتاهی داشته‌باشیم.


بلد به عنوان یک پلتفرم نقشه سعی می‌کند تا انواع نیازهای مکان محور کاربران را رفع کند، برای رفع این نیاز‌ها در بلد از انواع داده‌های مکان‌محور استفاده می‌کنیم، داده‌های معابر، داده‌های کسب‌و‌کارها که با کمک کاربران بلد هم بهبود داده می‌شود، تصاویر ماهواره‌ای و ... . اطلاعات ناهمواری‌ها نیز جزئی از داده‌هایی هستند که بلد با کمک آن‌ها سعی در ارائه‌ٔ خدمات بهتری برای کاربران می‌کند.

در ادامه ابتدا توضیح می‌دهیم که داده‌ٔ ناهمواری‌ها به چه صورت است، سپس در مورد اینکه چگونه از آن برای نمایش دادن کوه‌ها در بلد استفاده می‌شود به عنوان یک مثال توضیح می‌دهیم.


مدل رقومی ارتفاع (DEM)

به نقل از ویکی‌پدیای فارسی:

مدل رقومی ارتفاع (انگلیسی: Digital elevation model) یا DEM مدلی دیجیتال یا نمایشی سه‌بعدی از سطح زمین، ماه یا دیگر سیاره‌ها است که معمولاً برای نمایش ناهمواری‌های زمین و با استفاده از داده‌های ارتفاع از سطح دریا تهیه می‌شود.

دیتای خام ما مدل رقومی ارتفاع است که همان‌طور که ویکی‌پدیا توضیح داده‌است، ارتفاع از سطح دریای هر نقطه از ایران را در آن داریم. دیتای مدل رقومی را می‌توان در قالب یک مستطیل n در m دید که هر خانهٔ آن معرف یک ناحیه از زمین است و مقدار آن نشان‌دهنده‌ٔ ارتفاع از سطح دریای آن نقطه است.

تصویر۱. نمونه‌ای از «مدل رقومی ارتفاع»، در این داده هر نقطه نمایانگر ارتفاع یک محدوده در ایران است، نقاط روشن‌تر ارتفاع‌های بیشتر و نقاط تیره‌تر ارتفاع‌های نزدیک به سطح دریا را نشان می‌دهد، فرم رشته کوه‌ها کاملا مشخص است. همچنین نقطه‌ای که با پیکان قرمز مشخص شده ‌است قلهٔ دماوند است.
تصویر۱. نمونه‌ای از «مدل رقومی ارتفاع»، در این داده هر نقطه نمایانگر ارتفاع یک محدوده در ایران است، نقاط روشن‌تر ارتفاع‌های بیشتر و نقاط تیره‌تر ارتفاع‌های نزدیک به سطح دریا را نشان می‌دهد، فرم رشته کوه‌ها کاملا مشخص است. همچنین نقطه‌ای که با پیکان قرمز مشخص شده ‌است قلهٔ دماوند است.


همان‌طور که در تصویر هم مشاهده می‌کنید با اینکه مدل رقومی ارتفاع، ناهمواری‌ها را به خوبی نشان می‌دهد، ولی در ذهن تصویر سه‌بعدی از کوه‌ها را به وجود نمی‌آورد، پس لازم است پردازشی روی مدل رقومی ارتفاع انجام بدیم تا به تصویری سه بعدی (یا شبه سه بعدی) از ناهمواری‌ها و کوه‌ها برسیم.

تپه‌سایه (Hillshade)

اصولا همهٔ نقشه‌ها بخشی از واقعیت موجود در زمین را با تغییراتی نشان می‌دهند. اگر بخواهیم زمین را مانند آن‌چه که هست نشان بدهیم (مثل عکس‌های ماهواره‌ای) نتیجه ممکن است قشنگ باشد ولی کاربر ممکن است نتواند اطلاعاتی که لازم دارد را به راحتی پیدا کند. بنابراین همیشه در تهیهٔ نقشه‌ها یک سری ساده‌سازی‌ها انجام می‌شود و فقط اطلاعات لازم نمایش داده می‌شود. از طرف دیگر ساده‌کردن بیش از حد هم نقشه را خسته‌کننده می‌کند. هنر طراحی نقشه یا کارتوگرافی در این است که بتواند بین بخش‌های کاربردی نقشه و زیبایی آن تعادل ایجاد کند. استفاده از رنگ و سایه‌روشن و تغییر مقیاس برخی چیزها در نقشه کمک می‌کند که نقشه در عین کاربردی بودن از لحاظ بصری هم جذابیت داشته باشد.

از آن‌جا که زمین یک شئ سه‌بعدی است و نقشه یک نگارهٔ دو بعدی است به ناچار برخی اطلاعات زمین مثل ارتفاع نقاط از دست می‌رود و باید برای نمایش آن فکر دیگری کرد. تکنیک‌های مختلفی برای نمایش پستی و بلندی‌های زمین وجود دارد. مثلا استفاده از خطوط هم‌ارتفاع (کانتور contour) یک راه فنی مناسب برای درک ارتفاعات روی نقشه است. این تکنیک البته بیشتر در نقشه‌های فنی و عمرانی کاربرد دارد و برای نقشه‌های با کاربرد عام از روش‌های دیگری مثل هیل‌شید (تپه‌سایه) استفاده می‌شود.

تپه‌سایه چیست؟

از لحاظ تئوری اگر شما عمود بر یک صفحه به آن نگاه کنید تغییرات ارتفاعی در آن را متوجه نمی‌شوید. (مثلا اگر به یک استوانه از کنار نگاه کنیم مستطیل دیده می‌شود و در ظاهر فرقی با یک مکعب ندارد). ولی اگر به این جسم نوری تابانده شود بر سطح آن سایه‌هایی ایجاد می‌شود که به چشم کمک می‌کند که عمق را در آن تشخیص دهد. این قضیه برای سطح زمین هم همین‌طور است و مثلا هنگامی که از هواپیما به کوه‌ها وتپه‌ها نگاه می‌کنیم با تابش نور خورشید به آن‌ها و دیدن سایه روشن‌ها کلیتی از حجم و فرم آن‌ها را درک می‌کنیم. حالا اگر از همین تکنیک روی نقشه استفاده کنیم و یک نقطه را به عنوان محل فرضی خورشید در نظر بگیریم و نقاطی که رو به این منبع نوری هستند روشن‌تر و نقاط پشت به آن را تیره‌تر نشان بدهیم می‌توانیم تا حد زیادی حس دیدن ناهمواری‌ها را در کاربر ایجاد کنیم. این کار اوایل دستی انجام می‌شد و کارتوگرافرهای زبردستی مثل ادوارد ایمهوف (Eduard Imhof) با تکیه بر تجربه و ذوقشان به نقشه عمق می‌دادند و حس واقع‌گرایی را در آن ایجاد می‌کردند.

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


اما در عصر نقشه‌های دیجیتال تپه‌سایه‌ها چطور تهیه می‌شوند؟

در بالا گفتیم که اطلاعات پستی و بلندی‌های زمین در یک فایل DEM ذخیره می‌شوند که در آن هر پیکسل از فایل نماینده ناحیه‌ای از زمین است (بسته به رزولوشن فایل DEM اندازه این ناحیه متفاوت است) و رنگ هر پیکسل نشان‌دهندهٔ ارتفاع آن از سطح دریاست. برای تهیهٔ سایه‌روشن‌ها فرض می‌شود که نور خورشید از بالا سمت چپ و با ارتفاع مشخصی به این سطح می‌تابد. حالا چرا بالا و چپ؟ این مساله ربطی به موقعیت واقعی خورشید نسبت به زمین ندارد و به ادراک بصری انسان بستگی دارد. در زندگی روزمره ما عموما عادت داریم اشیاء را طوری ببینیم که نور از بالا به آن تابیده می‌شود.

تصویر ۳. کدام‌یک تپه و کدام‌یک گودال هستند؟
تصویر ۳. کدام‌یک تپه و کدام‌یک گودال هستند؟

در این شکل تصاویر فقط ۱۸۰ درجه چرخیده‌اند. ولی ما یکی را تپه می‌بینیم و یکی را گودال. به خاطر این عادت چشم انسان، ما موقعیت خورشید را همیشه از بالا در نظرم می‌گیریم که اتفاقا در نیم‌کره‌ٔ شمالی خلاف موقعیت واقعی خورشید در آسمان است.

خب پس از مشخص شدن منبع نوری، تعیین اینکه یک نقطه در معرض نور است یا در سایه کار ساده‌ای است. کافی است از این نقطه به منبع نوری وصل کنیم و اگر در مسیرش به نقطهٔ دیگری برخورد کرد یعنی در سایه آن قرار گرفته ولی اگر بدون مانع به منبع نوری وصل شد یعنی در روشنایی است. البته این «ساده» که گفتیم یعنی مفهوم و روند آن ساده است و از لحاظ فنی مسائل زیادی وجود دارد که باید حل شود. مثلا اغراق در ارتفاعات برای نشان دادن واضح‌تر سایه‌ها لازم است. احتمالا خبر دارید که زمین از لحاظ ناهمواری نسبی (یعنی نسبت ارتفاع دره و کوه‌ها به شعاع) از یک پرتقال هموارتر است! به همین خاطر سایه‌هایی که ایجاد می‌شود اگر با مقیاس واقعی ترسیم شوند خیلی کوچک می‌شوند و عملا دیده نمی‌شوند.

در نهایت پس از استخراج تپه‌سایه‌ها ما یک فایل رستر داریم که هنوز برای نمایش روی نقشه بلد مناسب نیست. چون هم حجم زیادی دارد هم اینکه نمی‌توان به سادگی آن را با بقیه عوارض نقشه ترکیب کرد.


تصویر ۴. نسخه‌ٔ اولیه از تپه‌سایه، در تصویر بالا خورشید از گوشه‌ی بالا چپ با زاویه‌ی ۴۵ درجه نسبت به محور z می‌تابد، نقاط نورانی نقاطی هستند که نور خورشید به آن‌ها می‌رسد و نقاط تیره نقاطی هستند که نور خورشید به آن‌ها نمی‌رسد، ناحیه‌های مسطح نور خورشید به اندازهٔ متوسط به آن‌ها برخورد می‌کند و نه کاملا روشن و نه کاملا تیره‌اند. دوباره قله‌ٔ دماوند با فلش مشخص شده است.
تصویر ۴. نسخه‌ٔ اولیه از تپه‌سایه، در تصویر بالا خورشید از گوشه‌ی بالا چپ با زاویه‌ی ۴۵ درجه نسبت به محور z می‌تابد، نقاط نورانی نقاطی هستند که نور خورشید به آن‌ها می‌رسد و نقاط تیره نقاطی هستند که نور خورشید به آن‌ها نمی‌رسد، ناحیه‌های مسطح نور خورشید به اندازهٔ متوسط به آن‌ها برخورد می‌کند و نه کاملا روشن و نه کاملا تیره‌اند. دوباره قله‌ٔ دماوند با فلش مشخص شده است.


تا الان به چیزی رسیدیم که احساس ناهمواری بودن و کوه بودن به آن داریم، اما همین تصویر چندین گیگابایت حجم دارد و نمی‌توان آن‌را به همین شکل ارائه داد.

در ادامه توضیحات مختصری در مورد نمایش تپه‌سایه بر روی گوشی می‌پردازیم.

وارد کردن تپه‌سایه در اپلیکیشن

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

کاشی‌ها

اولین کار ما تبدیل تپه سایه به کاشی‌ (Tile)‌هایی‌ست که فقط آن‌ها نمایش داده شوند، وقتی در بلد در زوم کمتر یعنی در حالتی که همه‌ی ایران مشخص است، به ایران نگاه می‌کنید، کافی‌ست اطلاعات در حد ایران دانلود شوند و لازم نیست اطلاعات جزئی‌تر مانند اطلاعات مربوط به پلاک خانه‌ها و ... دانلود شوند، در مورد تپه‌سایه هم همین طور، وقتی تصویر در سطح کل ایران را می‌بینیم لازم نیست تپه‌سایه‌ای به دقت زیاد مشاهده‌کنیم، کافی‌ست دقت در سطح ایران باشد، همچنین وقتی به جلو می‌رویم، باید اطلاعات دقیق‌تری مشاهده کنیم. همچنین هنگامی که نقشه در سطح تهران را مشاهده می‌کنیم لازم نیست اطلاعات شهر دیگری مثل یزد دانلود شود. پس داده‌ها رو به دو صورت تقسیم می‌کنیم، اولا برای هر مقیاس از نقشه و میزان جلو رفتن داده‌هایی برای آن دقت می‌سازیم و سپس داده‌ها را بین ناحیه‌های مختلف تقسیم می‌کنیم تا وقتی شما بخشی از تهران را می‌بینید فقط داده‌های آن بخش از تهران دانلود شوند.

تصویر ۵. نمایش کاشی‌ها، هر کدام از مربع‌های قرمز یک کاشی هستند که داده‌های نقشه در آن ذخیره شده‌اند، وقتی نمای کلی ایران را می‌بینیم کاشی‌ها مساحت بزرگی را شامل می‌شوند، ولی شامل اطلاعات کلی هستند، ولی به سطح شهر می‌رسیم، کاشی‌ها شامل اطلاعات مساحت کمتری از نقشه‌اند ولی اطلاعات با جزئیات بیشتری را داخل خود ذخیره می‌کنند.
تصویر ۵. نمایش کاشی‌ها، هر کدام از مربع‌های قرمز یک کاشی هستند که داده‌های نقشه در آن ذخیره شده‌اند، وقتی نمای کلی ایران را می‌بینیم کاشی‌ها مساحت بزرگی را شامل می‌شوند، ولی شامل اطلاعات کلی هستند، ولی به سطح شهر می‌رسیم، کاشی‌ها شامل اطلاعات مساحت کمتری از نقشه‌اند ولی اطلاعات با جزئیات بیشتری را داخل خود ذخیره می‌کنند.


استخراج چندضلعی‌ها

همچنین تصاویر حجم زیادی دارند، به همین دلیل داده‌ها را تبدیل به شکل‌های هندسی مثل خط و چندضلعی می‌کنیم تا علاوه بر کیفیت و زیبایی، حجم کمتری را به صورت میانگین دانلود کنند، برای اینکار اولا ناحیه‌ی مسطح را از تپه‌سایه حذف کردیم و سپس رنگ‌های نورانی و تاریک را به چندین قسمت تقسیم کرده و برای هر کدام چند‌ضلعی‌هایی ساخیتم، برای اینکه بهتر متوجه شوید مثالی ساده‌شده از روند ساختن این چند ضلعی‌ها را برای ناحیهٔ کاملا تیره ارائه خواهیم کرد.

تصویر تپه‌سایه را کاملا مشابه تصویر مدل رقومی ارتفاع می‌توانید به صورت یک مستطیل n در m در نظر بگیرید که در هر خانه از این مستطیل میزان تیرگی آن پیکسل نوشته شده‌است. تمام پیکسل‌هایی که تیرگی آن‌ها از حدی بیشتر است را در نظر بگیرید، این پیکسل‌ها تعدادی مولفه‌ٔ همبندی‌ تشکیل می‌دهند. کوچکترین چندضلعی‌ای که همه‌ی این پیکسل‌ها را شامل می‌شود رسم کرده و با ساده‌سازی آن، به یک چندضلعی نهایی می‌رسیم.

تصویر ۶. مراحل به دست آوردن چندضلعی‌ها به صورت ساده برای یک سطح از تیرگی  ۰: تصویر تپه‌سایه در حالت زوم، پیکسل‌-پیکسل بودن آن را می‌توان دید.  ۱: تمام پیکسل‌هایی که تیرگی آن از حدی بیشتر است را قرمز کرده‌ایم.  ۲: کوچکترین چندضلعی‌ای که این پیکسل‌ها در آن قرار بگیرد را رسم کردیم.  ۳: با ساده‌سازی این چندضلعی‌ها به چندضلعی‌های نهایی رسیدیم.
تصویر ۶. مراحل به دست آوردن چندضلعی‌ها به صورت ساده برای یک سطح از تیرگی ۰: تصویر تپه‌سایه در حالت زوم، پیکسل‌-پیکسل بودن آن را می‌توان دید. ۱: تمام پیکسل‌هایی که تیرگی آن از حدی بیشتر است را قرمز کرده‌ایم. ۲: کوچکترین چندضلعی‌ای که این پیکسل‌ها در آن قرار بگیرد را رسم کردیم. ۳: با ساده‌سازی این چندضلعی‌ها به چندضلعی‌های نهایی رسیدیم.



سپس با کنار هم قرار دادن تمام این چندضلعی‌ها در سطح‌های تیرگی متفاوت دوباره تصویری مانند تصویر تپه‌سایه‌ی قبل ترسیم خواهد شد.

تصویر ۷. دو تصویر بالا چندضلعی‌هایی هستند که محدوده‌هایی که شدت نور در آن‌ها یک مقدار مشخص است را نشان می‌دهند، تصویر بالا راست محدوده‌ها با شدت نور زیاد و روشن است و تصویر بالا چپ محدوده‌ها با شدت نور کم و تاریک است. این محدوده‌ها به شکل اشکال هندسی مثل چند ضلعی در آورده شده‌اند و با کنارهم قرار گرفتن آن‌ها تصویر پایین ساخته شده است.
تصویر ۷. دو تصویر بالا چندضلعی‌هایی هستند که محدوده‌هایی که شدت نور در آن‌ها یک مقدار مشخص است را نشان می‌دهند، تصویر بالا راست محدوده‌ها با شدت نور زیاد و روشن است و تصویر بالا چپ محدوده‌ها با شدت نور کم و تاریک است. این محدوده‌ها به شکل اشکال هندسی مثل چند ضلعی در آورده شده‌اند و با کنارهم قرار گرفتن آن‌ها تصویر پایین ساخته شده است.


سایر مسائل برای وارد‌کردن تپه‌سایه

ساختن این چندضلعی‌ها از تصویر نکات جالب و زیادی دارد، این نکات از اینکه چگونه از تصویر به چندضلعی برسیم، چگونه این چند ضعلی‌ها را داخل کاشی‌ها ذخیره کنیم تا جزئیات مربوط به اینکه چگونه چندضعلی‌هایی که می‌سازیم حجم زیادی از دانلود اینترنت کاربرانمان را نگیرند و همچنین زیبایی داشته‌باشند است، حتی اجرای الگوریتم‌های مشهور روی این حجم از داده چندین ماه طول می‌کشد و لازم بود دنبال روش‌های بهینه‌تر با قابلیت توزیع پذیری برای محاسباتمان بگردیم. برای نمونه در مورد یکی از این جزئیات، همان‌طور که در بند قبل گفتیم، کاشی‌ها در مقایس‌های مختلف باید شامل جزئیات متفاوتی باشند تا تپه‌سایه در سطح ایران هم دیده شود ولی حجم مصرفی زیاد نباشد، همچنین در سطح شهر باید جزئیات تپه‌سایه بیشتر شود، مثلا برای یک کوه در سطح ایران نشان دادن دو عدد چند‌ضلعی یکی برای ناحیه‌ٔ روشن و دیگری برای ناحیه‌ٔ تیره کافی است، ولی وقتی زوم می‌کنیم باید جزئیات بیشتری از کوه نمایش داده شود. برای این‌کار دو روش داشتیم، یکی این بود که از الگوریتم‌های ساده‌سازی چندضلعی‌ها استفاده کنیم و سعی کنیم با کمک آن‌ها چندضلعی‌های کوچک و زیادی که برای جزئیات زیاد ساخته شده بود را تبدیل به چندضلعی‌هایی برای جزئیات کم کنیم و دیگری این بود که کیفیت تصویر را با روش‌هایی کم کنیم و تصویر با کیفیت کمتر این چندضلعی‌ها را تولید کنیم، الگوریتم‌های ساده‌سازی چندضلعی‌ها اکثر تلاش بر کم‌کردن تعداد اضلاع می‌کنند و کم کردن کیفیت باعث می‌شد که شکل چندضلعی‌ها از حالت عادی خودشان خارج شوند، با ترکیب این دو روش و چند روش دیگر در پردازش تصویر این مسئله نیز حل شد.

تصویر ۸. سه مرحله از جزئیات کوه دماوند و ناهمواری‌های اطراف آن را مشاهده می‌کنید، تصویر سمت چپ کوه دماوند فقط از ۵ چندضلعی ساخته‌شده و برای نمایش وقتی داریم کل ایران را مشاهده می‌کنیم مناسب است، تصویر دوم جزئیات بیشتر شده و تصویر از کنارهم قرارگرفتن چندصد چندضلعی تشکیل شده و برای حالتی که با زوم بیشتر نسبت به ایران به کوه‌ها نگاه می‌کنیم مناسب است و تصویر سوم جزئیات بازهم بیشتر شده و برای حالتی که روی کوه دماوند زوم کردیم مناسب است.
تصویر ۸. سه مرحله از جزئیات کوه دماوند و ناهمواری‌های اطراف آن را مشاهده می‌کنید، تصویر سمت چپ کوه دماوند فقط از ۵ چندضلعی ساخته‌شده و برای نمایش وقتی داریم کل ایران را مشاهده می‌کنیم مناسب است، تصویر دوم جزئیات بیشتر شده و تصویر از کنارهم قرارگرفتن چندصد چندضلعی تشکیل شده و برای حالتی که با زوم بیشتر نسبت به ایران به کوه‌ها نگاه می‌کنیم مناسب است و تصویر سوم جزئیات بازهم بیشتر شده و برای حالتی که روی کوه دماوند زوم کردیم مناسب است.



البته این روش انجام دارای مشکلاتی نیز است، مثلا همان‌طور که در بندهای بالا گفته شد وقتی نقشه را ۱۸۰ درجه بچرخانیم، دیگر تپه‌سایه‌ای که دیده می‌شود به حالت واقعی نزدیک نیست و احساس پستی و بلندی‌ها به بلندی‌ها و پستی‌ها تغییر می‌کند یا با اینکه حجم به طور میانگین از حالت تصویر کمتر است، در نقاطی که جزئیات ناهمواری‌ها زیاد است حجم از حالتی که کاشی‌ها را به صورت تصویر بودند بیشتر می‌شود و یا اینکه بخشی از پردازش و رندر چندضلعی‌ها را برعهده‌ٔ کلاینت گذاشته می‌شود و ....

تا حالا فکر می‌کردید نمایش دادن کوه‌ها در نقشه می‌تواند اینقدر جزئیات داشته‌باشد؟



خوب، باهم یکی از استفاده‌های داده‌های ارتفاعی در بلد را دیدیم، این تنها استفاده از این داده‌ها نیست و کاربرد‌های زیادی دارند، مثلا در مسیریابی پیاده شیب مسیر با کمک مدل رقومی ارتفاع محاسبه می‌شود و در تخمین سختی مسیر و زمان رسیدن موثر است.

بلد را می‌توانید از کافه بازار و گوگل پلی نصب کنید و صفحهٔ اینستاگرام و توئیتر بلد را از اینجا دنبال کنید.



پانویس:

۱. منبع تصویر ۳:

- https://hls-dhs-dss.ch/de/articles/031188/2008-01-22/

- Räber, Stefan & Jenny, Bernhard & Hurni, Lorenz. (2009).