یک bounding box سادهترین و مفیدترین primitive spatial در هر mapping stack است. چهار عدد است که یک مستطیل در فضای عرض و طول جغرافیایی توصیف میکند و در تقریباً هر API call، فایل GeoJSON و کتابخانه نقشهای که استفاده میکنید ظاهر میشود.
این راهنما توضیح میدهد bounding box چیست، قراردادهای فرمتی که باید بدانید، الگوهای production که در آنها کاربرد دارد و مشکلاتی که هر توسعهدهنده حداقل یک بار با آنها روبرو میشود.
تعریف
یک bounding box (bbox) کوچکترین مستطیل axis-alignedای است که یک feature یا مجموعهای از نقاط را در بر میگیرد. "Axis-aligned" یعنی اضلاع آن در امتداد محورهای عرض و طول جغرافیایی اجرا میشوند؛ مستطیل چرخانده نیست. Bbox با چهار عدد توصیف میشود: طول جغرافیایی غربی، عرض جغرافیایی جنوبی، طول جغرافیایی شرقی و عرض جغرافیایی شمالی.
برای پاریس، bbox رسمی شهری تقریباً [2.224, 48.8156, 2.4699, 48.9022] است. برای فرانسه سرزمینی تقریباً [-5.142, 41.333, 9.560, 51.089] است. برای کل کره زمین [-180, -90, 180, 90] است.
یک bbox همیشه دو گوشه مقابل هم است. نمیتواند یک شکل غیرمستطیلی توصیف کند، اما میتواند مستطیلی که هر شکلی را میپیچاند توصیف کند که برای فیلتر spatial سریع کافی است.
مسئله فرمت
قراردادهای فرمت برای bbox در سیستمهای مختلف ناسازگار هستند و این ناسازگاری منشأ اکثر باگهای bbox است.
GeoJSON، استانداردهای OGC و اکثر APIهای مدرن: [west, south, east, north]، معادل [minLng, minLat, maxLng, maxLat]. طول جغرافیایی اول، عرض جغرافیایی دوم، هر دو در WGS84.
برخی کتابخانههای web mapping (Leaflet، اشیاء bounds Mapbox GL): یک شیء LatLngBounds با گوشههای _southWest و _northEast. Lat اول، بعد lng.
بسیاری از APIهای قدیمیتر و خروجیهای CSV: [south, west, north, east] (lat اول). مستندات را بخوانید.
سرویسهای tile و WMS: bbox در واحدهای projection (متر Web Mercator، نه lat/lng) وقتی tile در EPSG:3857 است.
قانون دفاعی: هرگز از یک آرایه خالص ۴ عنصری در کد خودتان استفاده نکنید. آن را در یک شیء با نوع تعریفشده با فیلدهای نامگذاریشده ({ west, south, east, north }) بپیچانید تا ترتیب صریح باشد. در مرزهای API تبدیل کنید.
جایی که Bounding Boxها ارزش میآفرینند
یک bbox سریعترین فیلتر spatial ممکن است. سه مورد استفاده کلاسیک:
Fit کردن نقشه به یک feature. وقتی کاربر روی یک نتیجه جستجو میرسد، map.fitBounds(bbox) را صدا میکنید و نقشه zoom و pan میکند تا feature را با فاصله مناسب نشان دهد. هر کتابخانه نقشه مدرن این primitive را دارد.
فیلتر کوئریهای API بر اساس منطقه. موتورهای پایگاه داده و APIهای جستجو بboxها را بسیار کارآمد ایندکس میکنند. کوئریای مثل "همه مکانهای این viewport را نشان بده" bbox قابل مشاهده را به سرور ارسال میکند که از یک spatial index برای برگرداندن فقط رکوردهای مطابق استفاده میکند. این پایه جستجوی مبتنی بر viewport است.
Bias کردن autocomplete و geocoding. bbox کنونی نقشه کاربر را به عنوان viewport bias ارسال کنید. Geocoder نتایج داخل bbox را با وزن بیشتری رتبهبندی میکند، بنابراین تایپ "آزادی" داخل viewport نقشه تهران، برج آزادی را قبل از هر آزادی دیگری در جهان برمیگرداند.
یک مورد استفاده چهارم کمتر آشکار: bboxها واحد bookkeeping یک سیستم vector tile هستند. هر tile یک bbox شناختهشده در یک zoom شناختهشده را پوشش میدهد و رندرر آنها را به نقشه قابل مشاهده ترکیب میکند.
یک API چه برمیگرداند
اکثر APIهای geocoding یک bbox در کنار هر match برمیگردانند، چون هم اندازه feature matched را نشان میدهد (bbox یک کشور بزرگ است، bbox یک ساختمان کوچک) و هم نحوه fit کردن نقشه را. یک پاسخ geocoding برای "فرانسه" یک bbox در مقیاس ملی برمیگرداند؛ یک پاسخ برای "۱۰ Downing Street" یک bbox در مقیاس ساختمان برمیگرداند.
میتوانید اندازه bbox برگرداندهشده را به عنوان یک بررسی اعتبار دقت استفاده کنید. کوئریای که در دقت "کشور" match میکند اما یک bbox در اندازه ساختمان برمیگرداند مشکوک است.
Bounding Boxهایی که از Antimeridian عبور میکنند
یک مشکل ظریف: یک bbox که از antimeridian 180 درجه عبور میکند (مثلاً برای روسیه، اقیانوس آرام، فیجی) نمیتواند به صورت west < east توصیف شود چون به دور میچرخد. قراردادها متفاوت هستند:
- برخی سیستمها چنین بboxی را به دو تکه تقسیم میکنند، یکی برای هر طرف antimeridian.
- برخی سیستمها
west > eastرا مجاز میدانند و آن را به صورت "به دور بپیچ" تفسیر میکنند. - GeoJSON wrap-around را مجاز میداند اما برای قابلیت همکاری تقسیم را توصیه میکند.
برای اکثر موارد استفاده اروپایی یا تککشوری این هرگز پیش نمیآید. اگر یک محصول جهانی میسازید (مسیرهای هوایی، حملونقل دریایی، شیلات)، موارد antimeridian را صریحاً تست کنید.
Bounding Boxها در مقابل Polygonها
یک bbox یک مستطیل است. یک feature واقعی بهندرت مستطیلی است. bbox فرانسه شامل بخشهایی از اقیانوس اطلس و اسپانیا میشود. bbox منهتن شامل بخشهایی از نیوجرسی و کوئینز میشود.
وقتی تقریب مستطیلی کافی است (fit کردن نقشه، پیشفیلتر سریع)، bbox ابزار مناسب است. وقتی نیاز دارید بدانید آیا یک نقطه واقعاً داخل feature است، به ریاضیات point-in-polygon نسبت به هندسه مرز واقعی نیاز دارید. یک الگوی production رایج: اول با bbox فیلتر کنید (سریع، قابل ایندکس، ۹۹٪ رکوردها را حذف میکند)، بعد point-in-polygon را روی بازماندگان اجرا کنید (کند اما دقیق). این رویکرد دو مرحلهای نحوه کارکرد اکثر پایگاههای داده spatial زیر پوشه است.
Bounding Boxها در Computer Vision
ممکن است در object detection، robotics یا ۳D rendering عبارت "oriented bounding box" را ببینید. این یک مفهوم متفاوت است: یک OBB برای fit محکمتر به یک feature چرخانده میشود. در کار geospatial، bboxهای axis-aligned استاندارد هستند چون بهدرستی ایندکس میشوند و تست همپوشانی برای آنها بدیهی است. Oriented bboxها در ریاضیات مستطیل چرخانده ظاهر میشوند که در نقشهبرداری نادر است اما در computer vision رایج.
چطور MapAtlas از Bounding Boxها استفاده میکند
هر نتیجه از Geocoding API و Search API یک فیلد bbox با extent feature matched در ترتیب longitude/latitude WGS84 برمیگرداند، دقیقاً همان فرمتی که GeoJSON و کتابخانههای نقشه مدرن انتظار دارند. میتوانید یک پارامتر boundary.rect.* برای bias کردن geocoding به یک viewport ارسال کنید و Isochrone API polygonهای زمان سفر خود را با یک bbox احاطهکننده برمیگرداند تا بتوانید نقشه را بدون محاسبه خودتان fit کنید.
برای یک مقدمه عملی به GeoJSON و نحوه قرارگیری bboxها در تصویر بزرگتر داده spatial، What Is GeoJSON و What Is a Geocode را ببینید.
سوالات متداول
Bounding box چیست؟
یک bounding box (اغلب bbox نوشته میشود) کوچکترین مستطیل axis-alignedای است که یک feature جغرافیایی یا مجموعهای از نقاط را در بر میگیرد. با چهار عدد توصیف میشود: حداقل و حداکثر طول جغرافیایی و حداقل و حداکثر عرض جغرافیایی. Bounding boxها همه جا در نقشهبرداری هستند: برای fit کردن نقشه به یک feature، فیلتر کوئریهای پایگاه داده بر اساس منطقه، تعریف extent یک tile و bias کردن نتایج geocoding به یک منطقه. آنها سادهترین و سریعترین primitive spatial در کد production هستند.
فرمت استاندارد بounding box چیست؟
GeoJSON و اکثر APIهای مدرن از ترتیب [west, south, east, north] استفاده میکنند، که به صورت [minLng, minLat, maxLng, maxLat] هم نوشته میشود. این فرمتی است که باید بهصورت پیشفرض از آن استفاده کنید. برخی APIهای قدیمیتر و خروجیهای CSV از [south, west, north, east] (یعنی lat اول) استفاده میکنند. همیشه مستندات API یا فرمت خاص را بررسی کنید. رایجترین اشتباه ترکیب ترتیب lat/lng است که box را در سمت اشتباهی از کره زمین قرار میدهد.
تفاوت بین bounding box و oriented bounding box چیست؟
یک bounding box معمولی axis-aligned است: اضلاع آن در امتداد محورهای عرض و طول جغرافیایی اجرا میشوند. یک oriented bounding box (OBB، رایج در computer vision و game engine) برای fit محکمتر به feature چرخانده میشود که مساحت کمتر اما ریاضیات پیچیدهتری دارد. در کار geospatial، bboxهای axis-aligned استاندارد هستند چون بهدرستی در پایگاههای داده spatial ایندکس میشوند و برای تست همپوشانی ساده هستند.
چطور از bounding box برای فیلتر یک geocoding API استفاده کنم؟
bbox را به عنوان پارامتر viewport bias ارسال کنید. در MapAtlas Geocoding API پارامترهای `boundary.rect.min_lon`، `boundary.rect.min_lat`، `boundary.rect.max_lon`، `boundary.rect.max_lat` را ارسال میکنید و geocoder نتایج داخل آن منطقه را نسبت به نتایج خارج بالاتر رتبهبندی میکند. این برای autocomplete داخل یک نقشه ضروری است: با pan کاربر، bbox را بهروز میکنید تا پیشنهادات با چیزی که نگاه میکنند مطابقت داشته باشد.

