نقشه کروپلت رایجترین نقشه موضوعی است که در اخبار، گزارشهای سیاستی و dashboardهای شرکتها خواهید دید. اگر تا حالا به یک نقشه انتخاباتی سایهگذاری شده با margin، یک نقشه COVID سایهگذاری شده با نرخ موارد، یا یک نقشه GDP سایهگذاری شده با درآمد نگاه کرده باشید، یک کروپلت خواندهاید.
این راهنما توضیح میدهد که نقشه کروپلت چیست، کی از آن استفاده کنید، رایجترین اشتباهات کداماند، و چطور یک نقشه کروپلت production با vector tile API بسازید.
تعریف تکجملهای
نقشه کروپلت هر منطقه از نقشه را بر اساس یک مقدار عددی واحد اندازهگیری شده برای آن منطقه سایهگذاری میکند، با استفاده از یک مقیاس رنگی که magnitude را encode میکند.
این کلمه از یونانی khoros (ناحیه) و plethos (کثرت) میآید. از دهه 1820 توسط آماردانان فرانسوی شکل گرفت و از آن زمان ستون فقرات کارتوگرافی موضوعی بوده است.
مثالهای نقشه کروپلت
برخی کاربردهای کلاسیک:
- تراکم جمعیت بر اساس کشور، استان یا کد پستی
- نتایج انتخابات بر اساس ناحیه، با شدت رنگ که margin پیروزی را نشان میدهد
- GDP سرانه بر اساس کشور، اغلب با مقیاس لگاریتمی
- نرخ بیکاری بر اساس منطقه
- نرخ موارد COVID به ازای 100,000 ساکن بر اساس کانتی
- قیمت متوسط ملک بر اساس محله
- پذیرش broadband بر اساس حوزه سرشماری
- محصول کشاورزی بر اساس منطقه کشاورزی
ویژگی مشترک این است که داده یک عدد واحد در هر منطقه از پیش تعریفشده است.
نقشه کروپلت در مقابل heat map
این دو اغلب اشتباه گرفته میشوند. تفاوت مهم است.
نقشه کروپلت به مناطق از پیش تعریفشده نیاز دارد. داده از قبل aggregate شده است. هر منطقه یک رنگ میگیرد. مرزها بخشی از پیام هستند.
heat map به داده نقطهای نیاز دارد. تراکم با binning یا kernel smoothing محاسبه میشود. خروجی یک gradient پیوسته است که مرزهای اداری را نادیده میگیرد. از آن برای کشف cluster استفاده کنید، نه برای مقایسه منطقه.
اگر یک عدد در هر کد پستی دارید، از کروپلت استفاده کنید. اگر ابری از pingهای GPS دارید، از heat map استفاده کنید.
نقشه کروپلت چگونه ساخته میشود
سه ماده:
- هندسه مرزی. مجموعهای از polygonهای GeoJSON (یا لایههای vector tile) برای مناطقی که میخواهید رنگ کنید، هر کدام با یک identifier پایدار (مثلاً کد کشور ISO، FIPS ایالت US، کد NUTS EU، کد پستی).
- یک مقدار داده در هر منطقه. یک object JSON ساده یا CSV که با همان identifier کلید شده است.
- یک renderer که آنها را join میکند. کتابخانههای web mapping مدرن (MapLibre GL، Mapbox GL، deck.gl، OpenLayers) میتوانند داده را در runtime با استفاده از feature-state یا property expression به مرزها join کنند.
الگوی مفهومی در MapLibre GL JS اینجاست:
map.addSource('regions', {
type: 'vector',
url: 'https://api.mapatlas.xyz/v1/tiles/regions.json',
});
map.addLayer({
id: 'regions-fill',
type: 'fill',
source: 'regions',
'source-layer': 'regions',
paint: {
'fill-color': [
'interpolate',
['linear'],
['feature-state', 'value'],
0, '#f7fbff',
50, '#6baed6',
100, '#08306b',
],
'fill-opacity': 0.8,
},
});
// Push your data to each feature at runtime
for (const [regionId, value] of Object.entries(yourData)) {
map.setFeatureState(
{ source: 'regions', sourceLayer: 'regions', id: regionId },
{ value }
);
}
نقشه boundary tileها را یک بار fetch میکند و آنها را با تغییر دادههای شما re-style میکند. بدون re-rendering سمت سرور.
انتخاب مقیاس رنگی مناسب
سه قانون:
Sequential برای داده تکجهته. روشن تا تیره در یک هیو. برای کمیتهایی که از پایین به بالا بدون نقطه میانی معنادار میروند (جمعیت، درآمد، نرخ) استفاده میشود.
Diverging برای داده دوجهته. یک نقطه میانی خنثی و دو هیو که به بیرون پخش میشوند (قرمز و آبی، قهوهای و teal). وقتی صفر یا میانگین معنادار است و مقادیر میتوانند در هر طرف قرار گیرند (رشد سال به سال، margin انتخابات، انحراف از mean) استفاده میشود.
از مقیاسهای رنگینکمان اجتناب کنید. آنها ترتیبی را القا میکنند که با درک انسان به طور یکنواخت مطابقت ندارد. همچنین برای بینندگان کوررنگ شکست میخورند. ColorBrewer (colorbrewer2.org) استاندارد آزمودهشده توسط کارتوگراف برای paletteهای کروپلت است.
یک اشتباه رایج استفاده از تعداد bin زیاد است. پنج تا هفت نقطه ایدهآل است. بیشتر از آن و خواننده نمیتواند سایههای مجاور را تشخیص دهد.
سؤال طبقهبندی
وقتی یک مقیاس دارید، باید تصمیم بگیرید مرزهای bin را کجا بکشید:
- Equal interval. range را به قطعات مساوی تقسیم میکند. برای دادههای توزیعشده یکنواخت کار میکند، با وجود outlier شکست میخورد.
- Quantile. هر bin تعداد مساوی از مناطق را نگه میدارد. وقتی میخواهید هر سایه قابل مشاهده باشد مفید است، اما میتواند magnitude تفاوتها را پنهان کند.
- Natural breaks (Jenks). variance درون binها را کمینه میکند. پیشفرض دادهمحورترین.
- Manual. وقتی مرزهای bin معنا دارند (مثلاً tax bracket، آستانههای جمعیتی).
انتخاب اثر واقعی بر داستانی که نقشه میگوید دارد. روش طبقهبندی را در هر گزارش جدی publish کنید.
دامهای رایج
Area bias. مناطق بزرگ و کمتراکم به صورت بصری بر نقشه غالب میشوند. یک کروپلت نتایج انتخابات ریاستجمهوری US رنگشده با margin بیشتر قرمز به نظر میرسد چون کانتیهای روستایی عظیم هستند. Cartogram یا نقشه dot-density این را اصلاح میکند.
شمارش خام به جای نرخ. نقشه "موارد COVID در هر ایالت" بیشتر یک نقشه جمعیت است. همیشه بر اساس جمعیت، مساحت یا denominator دیگری normalise کنید مگر اینکه شمارش مطلق آن چیزی باشد که میخواهید منتقل کنید.
مقیاس گمراهکننده. مقیاسهای quantile هر نقشه را جالب نشان میدهند حتی وقتی پراکندگی زیربنایی کوچک است. مقیاسهای equal-interval هر نقشه را با وجود outlier تخت نشان میدهند. طبقهبندی را با سؤال مطابقت دهید.
داده گمشده. از قبل تصمیم بگیرید آیا منطقهای بدون داده خاکستری نشان داده شود، حذف شود، یا مثل صفر رنگ شود. هر انتخاب خواندن را تغییر میدهد.
کی یک چارت متفاوت انتخاب کنید
اگر داده شما در هر منطقه multivariate است، کروپلت آن را flatten میکند. در نظر بگیرید:
- Small multiples. یک grid از نقشههای کروپلت، یکی به ازای هر متغیر.
- Bivariate choropleth. دو متغیر encode شده به صورت grid رنگی 2D. خواندنش سخت اما وقتی کار میکند قدرتمند است.
- Cartogram. اندازه منطقه را بر اساس مقدار distort میکند، وقتی area bias غالب است مفید.
- نمودار میلهای روی نقشه. گاهی داده فقط یک table است؛ نقشه تزئین است.
کارتوگرافی ارتباط است. کروپلت یکی از ابزارهای متعدد است.
جای MapAtlas کجاست
Dynamic Maps API منابع vector tile برای مرزهای کشور، منطقه و کد پستی ارائه میدهد که میتوانید در runtime با دادههای خودتان style کنید، دقیقاً مثل snippet MapLibre بالا. مرزها EU-hosted، نسخهبرچسبگذاری شده و طراحی شدهاند تا به طور تمیز در برابر identifierهای استاندارد (ISO 3166، NUTS، سیستمهای کد پستی ملی) join شوند.
برای صفحاتی که نیاز به نمایش آمار aggregate بر اساس منطقه دارند (قیمت املاک در هر کد پستی، هزینه delivery در هر منطقه، فروش بر اساس قلمرو) GeoEnrich API مقادیر هر منطقه را که با همان boundary IDها کلید شدهاند برمیگرداند، بنابراین همان join برای هم نقشه و هم جدولهای شما کار میکند. زمینه کامل thematic-map در Thematic Map Guide پوشش داده شده است.
سوالات متداول
نقشه کروپلت چیست؟
نقشه کروپلت یک نقشه موضوعی است که در آن مناطق جغرافیایی (کشورها، استانها، کدهای پستی، حوزههای سرشماری) به تناسب یک متغیر آماری اندازهگیری شده برای هر منطقه رنگ یا سایهگذاری میشوند. شدت رنگ مقدار را encode میکند، بنابراین سایه تیرهتر معمولاً به معنای مقدار بالاتر و سایه روشنتر به معنای مقدار پایینتر است. نقشههای کروپلت روش استاندارد برای نمایش تراکم جمعیت، نتایج انتخابات، GDP سرانه، نرخ بیکاری و هر کمیت دیگری هستند که به طور طبیعی بر اساس مرز اداری aggregate میشود.
تفاوت نقشه کروپلت و heat map چیست؟
نقشه کروپلت مناطق از پیش تعریفشده (کشورها، کدهای پستی، نواحی) را بر اساس یک مقدار aggregate برای هر منطقه رنگ میکند. heat map شدت دادههای نقطهای را به صورت پیوسته در فضا نشان میدهد، بدون احترام به مرزهای اداری. وقتی داده شما از قبل بر اساس منطقه aggregate شده است (مثلاً آرا در هر استان، فروش در هر کد پستی) از کروپلت استفاده کنید. وقتی داده شما ابری از نقاط است و میخواهید ببینید کجا cluster میشوند (مثلاً حوادث جنایی، pin مشتری، خواندن سنسور) از heat map استفاده کنید.
کی باید از نقشه کروپلت استفاده کنم؟
از نقشه کروپلت زمانی استفاده کنید که داده شما یک مقدار عددی واحد در هر منطقه باشد و مناطق تقریباً از نظر اندازه قابل مقایسه باشند یا بتوانید بر اساس مساحت یا جمعیت normalise کنید. مثالهای خوب: درصد خانوارهای دارای broadband بر اساس کانتی، موارد COVID به ازای هر 100 هزار نفر بر اساس منطقه، اجاره متوسط بر اساس کد پستی. از کروپلت اجتناب کنید وقتی مناطق از نظر مساحت بسیار متفاوت هستند (مناطق روستایی بزرگ به صورت بصری غالب میشوند حتی اگر جمعیت کمتری داشته باشند)، یا وقتی چند متغیر در هر منطقه دارید (از small multiples یا یک نوع چارت متفاوت استفاده کنید).
چطور یک نقشه کروپلت بسازم؟
به سه چیز نیاز دارید: هندسه مرزی برای مناطق (polygonهای GeoJSON)، یک مقدار داده برای هر منطقه که با ID پایدار کلید شده، و یک renderer که این دو را join میکند و یک مقیاس رنگی اعمال میکند. استکهای رایج: MapLibre GL یا Mapbox GL با fill-color expression، deck.gl GeoJsonLayer با getFillColor، D3.js با d3-geo برای SVG ایستا، یا یک dynamic map API هاستشده. MapAtlas Dynamic Maps API برای کشورها، مناطق و کدهای پستی boundary tile ارائه میدهد که میتوانید در runtime با دادههای خودتان style کنید.
چه مقیاس رنگی خوبی برای نقشه کروپلت وجود دارد؟
وقتی داده یک کمیت واحد با صفر طبیعی است از مقیاس sequential تکهیو (مثلاً آبی روشن تا آبی تیره) استفاده کنید. وقتی مقادیر حول یک نقطه میانی معنادار diverge میکنند (margin انتخاباتی، تغییر سال به سال) از مقیاس diverging دوهیو (مثلاً قرمز تا سفید تا آبی) استفاده کنید. از مقیاسهای رنگینکمان اجتناب کنید: آنها ترتیبی را القا میکنند که انسانها به طور یکنواخت درک نمیکنند و برای کاربران کوررنگ شکست میخورند. ColorBrewer مرجع استاندارد برای paletteهای آزمودهشده توسط کارتوگراف است.

