راه‌اندازی سرور نقشه آفلاین با OpenStreetMap

اگر بخواید داخل نرم‌افزاری که دارید توسعه می‌دید از نقشه استفاده کنید، سایتای زیادی هستن که این امکان رو بهتون می‌دن؛ اما اگه به هر دلیلی نخواید از اون‌ها استفاده کنید (مثلا نرم‌افزارتون توی شبکه داخلی باشه و دسترسی به اینترنت نداشته) مجبورید که خودتون یه نقشه بالا بیارید.برای بالا آوردن نقشه روی سیستم یا سرور خودتون، ابزارها و نرم‌افزارهای مختلفی مثل ThinkGeo ،MapTiler ،Mapbox Atlas و ... وجود دارن؛ اما ما تو این مقاله قصد داریم در مورد OpenStreetMap صحبت کنیم؛ چرا که:اوپن‌سورسه و خودش و نقشه‌هاش کاملا رایگانن :)نقشه‌هاش توسط یه جای خاص آپدیت نمیشه و با جمع‌سپاری توسط یه جماعت بزرگ آپدیت میشه.هم میشه نقشه یک کشور یا یک قاره رو استفاده کرد و هم میشه نقشه کل دنیا رو گرفت.ایمیج داکرش موجود هست (غیر رسمیه ولی اوکیه) و راه‌اندازیش خیلی دردسر نداره.خیلی پرطرفداره و کتابخونه‌های خوبی (مثل Leaflet) برای استفاده ازش وجود داره.توی تجربه شخصی‌مون، OpenStreetMap کاملا پاسخگوی نیازهامون بوده و احساس نیاز نکردیم تا به سولوشن‌های دیگه فک کنیم.با این اوصاف بریم سراغ نصب و راه‌اندازیش.نصب و راه‌اندازی OpenStreetMap با استفاده از داکرپیش‌نیازهافرض بر اینه که می‌خوایم OpenStreetMap رو روی اوبونتو سرور بریزیم و دایره لغتمون یه مقدار لینوکسی خواهد بود.از اونجایی که می‌خوایم OpenStreetMap رو با داکر نصب کنیم لازمه روی سیستممون داکر نصب باشه؛ توی این مقاله گفتم چجوری میشه داکر و داکر کامپوز رو روی اوبونتو نصب کرد.همچنین چون می‌خوایم ایمیجش رو از DockerHub دانلود کنیم لازمه از تحریم‌شکن استفاده کنیم که توی این مقاله فعالسازی شکن توی اوبونتو رو توضیح دادم.آماده‌سازی محیطبرا اینکه خیلی درگیر sudo و دسترسی و اینا نشیم با زدن دستور پایین دسترسی root بگیریم:sudo suحالا پوشه‌های مورد نیازمون رو بسازیم و دسترسیشونو میزون کنیم:mkdir -p /opt/osm/data mkdir -p /opt/osm/tiles mkdir -p /opt/osm/nodes chmod 777 /opt/osm/tiles chmod 777 /opt/osm/nodesدانلود دیتای نقشه (فایل PBF)فایل PBF حاوی دیتای نقشه (اماکن، خیابونا، مرزها و ...) هستش؛ برای دانلود:دیتای تمام کشورها به این لینک مراجعه کنید (در زمان نوشتن این متن حجمش ۶۱ گیگ هست که برای importش به حداقل ۱ ترابایت فضا احتیاج دارید).دیتای یه ناحیه خاص (قاره یا کشور خاص) به این لینک مراجعه کنید.دیتای کشور ایران به این لینک مراجعه کنید.فایل PBF مورد نظرتون رو که دانلود کردید داخل مسیر opt/osm با اسم data.osm.pbf بریزید؛ البته با این دستورم می‌تونیم مستقیم فایل مربوط به کشور ایران رو داخل خود سرور دانلود کنیم:wget https://download.geofabrik.de/asia/iran-latest.osm.pbf -O /opt/osm/data.osm.pbfوارد کردن (import) فایل PBFاول ایمیج OpenStreetMap رو دانلود کنیم:docker pull overv/openstreetmap-tile-server:v1.6.0اگه بخوایم نقشه یه منطقه کوچیک (مثلا یه کشور) رو import کنیم می‌تونیم از این دستور استفاده کنیم:docker run \ --rm \ --name osm-pbf-importer \ -e THREADS=$(nproc) \ -v /opt/osm/data.osm.pbf:/data.osm.pbf \ -v /opt/osm/data:/var/lib/postgresql/12/main \ overv/openstreetmap-tile-server:v1.6.0 \ importاما اگه بخوایم نقشه یه منطقه بزرگ یا کل دنیا رو import کنیم بهتره از این دستور استفاده کنیم:docker run \ --rm \ -d \ --name osm-pbf-importer \ -e THREADS=$(nproc) \ -e &quotOSM2PGSQL_EXTRA_ARGS=--flat-nodes /nodes/flat_nodes.bin -C 65536&quot \ -v /opt/osm/data.osm.pbf:/data.osm.pbf \ -v /opt/osm/nodes:/nodes \ -v /opt/osm/data:/var/lib/postgresql/12/main \ overv/openstreetmap-tile-server:v1.6.0 \ importچندتا نکته در مورد دستور بالا:مقدار THREADS برابر با تعداد هسته‌های موجود (به همراه هسته‌های مجازی) تنظیم شده؛ می‌تونید تعداد کمتری اختصاص بدید.عددی که بعد از C- وجود داره میزان استفاده از رم برای کش (به مگابایت) هستش؛ این رو هم پیشنهاد میشه حداقل دو سوم میزان رم سرورتون قرار بدید (اینجا هم میزان رم سرورمون ۹۶ گیگ فرض شده)؛ اگر مقدار رم سیستمتون کمتر از ۳۲ گیگ هست این مقدار رو حداکثر نصف بذارید.پروسه import نقشه کل دنیا بسته به سیستمتون از چند ساعت تا چند روز ممکنه طول بکشه؛ اینجا می‌تونید چند تا benchmark ببینید.برای دیدن وضعیت import می‌تونید از این دستور استفاده کنید:docker logs osm-pbf-importerبعد از اینکه import تموم شد می‌تونید پوشه nodes رو پاک کنید:rm -rf /opt/osm/nodesاجرای OpenStreetMapبرای اجرای OpenStreetMap هم کافیه این دستور رو اجرا کنیم:docker run \ --name openstreetmap \ --restart unless-stopped \ -p 8080:80 \ -e THREADS=$(nproc) \ -e &quotOSM2PGSQL_EXTRA_ARGS=-C 65536&quot \ -e ALLOW_CORS=enabled \ -v /opt/osm/data:/var/lib/postgresql/12/main \ -v /opt/osm/tiles:/var/lib/mod_tile \ -d overv/openstreetmap-tile-server:v1.6.0 \ runمقدار THREADS و کش (C-) رو همونطور که بالا گفته شد تغییر بدید.چند لحظه بعد از اجرا، سرور نقشه روی پورت ۸۰۸۰ قابل استفاده خواهد بود:http://IP_OR_DOMAIN:8080برای اطلاعات بیشتر می‌تونید به این صفحه مراجعه کنید؛ من هم در قسمت نظرات یا ایمیل mkay1375@gmail.com در خدمت هستم.