ایجاد یک کارتوگرام متحرک (QGIS3) 

کارتوگرام نوعی تجسم نقشه است که در آن شکل هر یک از ویژگی ها متناسب با یک متغیر تحریف می شود. کارتوگرام ها دیدن تغییرات زیاد در داده ها را آسان می کنند. ساده ترین روش برای ایجاد یک کارتوگرام، مقیاس بندی اندازه هر منطقه بر اساس یک متغیر است. این روش شکل اصلی چند ضلعی را حفظ می کند و فقط اندازه را تغییر می دهد. اینها به عنوان کارتوگرام های هم شکل غیر پیوسته شناخته می شوند . در این آموزش، نحوه استفاده از عبارات QGIS برای ایجاد یک کارتوگرام و استفاده از Temporal Controller برای ایجاد انیمیشنی که به تدریج ویژگی ها را به اندازه هدف تبدیل می کند، یاد می گیریم.

این آموزش بر اساس آموزش کارتوگرام عالی Hans van der Kwast ساخته شده است . فرمول ضریب مقیاس استفاده شده در اینجا از مقاله اصلی Noncontiguous Area Cartograms نوشته جودی ام اولسون است.

همچنین می‌توانید ویدیوی یوتیوب من را تماشا کنید QGIS Expressions: Hidden Gems and Unnexpected Possibilities که مفاهیم پشت این آموزش را توضیح می‌دهد.

نمای کلی کار 

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

../../_images/output.gif

دریافت داده ها 

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

  1. از صفحه داده‌های فایل‌های مرزی نقشه‌کشی – Shapefile در وب‌سایت اداره سرشماری ایالات متحده دیدن کنید . به پایین اسکرول کنید و shapefile States را دانلود کنید cb_2018_us_state_20m.zip. این چند ضلعی حالتی دارد که ما برای تجسم نیاز داریم.
../../_images/data19.png
  1. چند ضلعی های ایالتی هیچ داده جمعیتی ندارند. این داده ها باید به طور جداگانه بارگیری شوند و برای استفاده در GIS به فایل شیپ ملحق شوند. از صفحه کل جمعیت ایالتی و مؤلفه های تغییر: ۲۰۲۰-۲۰۲۳ بازدید کنید و برآوردهای سالانه جمعیت، مؤلفه های تخمینی تغییر جمعیت ساکن، و نرخ مؤلفه های تغییر جمعیت ساکن برای ایالات متحده، ایالات متحده، ناحیه کلمبیا و پورتو را دانلود کنید. ریکو: مجموعه داده های ۱ آوریل ۲۰۲۰ تا ۱ ژوئیه ۲۰۲۳ که به صورت دانلود خواهد شد NST-EST2023-ALLDATA.csv.
../../_images/data23.png
  1. QGIS را باز کنید. فایل را در مرورگرcb_2018_us_state_20m.zip QGIS بیابید و آن را گسترش دهید. لایه را روی بوم بکشید و رها کنید .cb_2018_us_state_20m.shp
../../_images/data33.png
  1. یک لایه جدید به پنل لایه هاcb_2018_us_state_20m اضافه می شود . سپس فایل CSV را بارگذاری می کنیم. روی دکمه Open Data Source Manager کلیک کنید .
../../_images/data43.png
  1. به تب متن جدا شده بروید . روی  در کنار نام فایل کلیک کنید و NST-EST2023-ALLDATA.csvفایل دانلود شده را مرور کنید. قسمت Geometry Definition را باز کرده و انتخاب کنید . روی افزودن کلیک کنید .No geometry (attribute only table)
../../_images/data53.png
  1. یک لایه جدید به پنل لایه هاNST-EST2023-ALLDATA اضافه می شود . کلیک راست کرده و Open Attribute Table را انتخاب کنید . این جدول تعداد جمعیت را در ستون دارد. هر حالت یک شناسه منحصر به فرد در ستون دارد که از آن برای پیوستن به این جدول با لایه چند ضلعی استفاده می کنیم.POPESTIMATE2023STATE
../../_images/data63.png
  1. روی لایه کلیک راست کرده cb_2018_us_state_20mو Open Attribute Table را انتخاب کنید . شناسه های حالت در GEOIDستون موجود است. در حالی که اعداد یکسان هستند، آنها به عنوان یک عدد ۲ رقمی ۰-padded قالب بندی می شوند. برای تطبیق این موارد با STATEستون جدول جمعیت ما، به اعدادی با فرمت مشابه نیاز داریم. را انتخاب کنید NST-EST2023-ALLDATA. به پردازش ‣ جعبه ابزار بروید . جدول وکتور ‣ الگوریتم ماشین حساب فیلد را جستجو و مکان یابی کنید . برای باز کردن آن دوبار کلیک کنید.
../../_images/data73.png
  1. در گفتگوی فیلد ماشین حساب ، NST-EST2023-ALLDATAبه عنوان لایه ورودی انتخاب کنید . GEOIDبه عنوان نام فیلد وارد کنید و نوع فیلد نتیجه را روی . اکنون اعداد را از فیلد می گیریم و از تابع برای ایجاد یک رشته ۲ رقمی ۰ استفاده می کنیم. عبارت زیر را وارد کرده و روی Run کلیک کنید .Text (string)STATElpad()
lpad("STATE", 2, '0')

../../_images/data82.png

  1. یک لایه جدید به پنل لایه هاCalculated اضافه می شود . کلیک راست کرده و Open Attribute Table را انتخاب کنید . توجه داشته باشید که ستون جدید ایجاد شده دارای شناسه های فرمت صحیح است. اکنون می توانیم از این فیلد برای پیوستن به این جدول با لایه states استفاده کنیم. جستجو و مکان یابی بردار کلی ‣ با الگوریتم مقدار فیلد به صفات بپیوندید. برای باز کردن آن دوبار کلیک کنید.GEOID
../../_images/data92.png
  1. در گفتگوی Join خصیصه‌ها توسط مقدار فیلد ، cb_2018_us_state_20mبه عنوان لایه ورودی انتخاب کنید . GEOIDبه عنوان فیلد جدول انتخاب کنید . برای لایه ورودی ۲ ، جدول ما Calculatedو فیلد جدول ۲ را انتخاب کنید GEOID. جدول دارای ستون های زیادی است اما ما فقط به جمعیت آخرین سال نیاز داریم. برای کپی کردن فیلدهای لایه ۲ روی دکمه  کلیک کنید و فقط فیلد را انتخاب کنید. سایر گزینه‌ها را به مقدار پیش‌فرضشان رها کنید و روی Run کلیک کنید .POPESTIMATE2023
../../_images/data102.png
  1. یک لایه جدید به پنل لایه ها اضافه می شود . قبل از استفاده از این لایه برای کارتوگرام، اجازه دهید آن را دوباره به یک CRS پیش‌بینی‌شده بازتاب دهیم. الگوریتم لایه Vector general ‣ Reproject را جستجو و مکان یابی کنید . برای باز کردن آن دوبار کلیک کنید.Joined layer
../../_images/data114.png
  1. در گفتگوی لایه Reproject ، به عنوان لایه ورودی انتخاب کنید . برای Target CRS ، روی دکمه Select CRS کلیک کنید . CRS را جستجو کنید و آن را انتخاب کنید. این لایه نهایی ما است، بنابراین ما آن را در دیسک ذخیره می کنیم. روی دکمه  کنار Reprojected کلیک کنید و Save to File را انتخاب کنید .Joined layerNorth_America_Albers_Equal_Area_Conic
../../_images/data123.png
  1. نام لایه را به عنوان وارد کنید us_states_with_population.gpkgو Save را انتخاب کنید . روی Run کلیک کنید تا فایل GeoPackage با داده های بازپخش شده ایجاد شود.
../../_images/data132.png

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

us_states_with_population.gpkg

منبع داده [USCENSUS]

  1. یک پروژه جدید QGIS را شروع کنید. us_states_with_population.gpkgفایل را در مرورگر پیدا کنید و آن را گسترش دهید. us_states_with_populationلایه را روی بوم خالی بکشید و رها کنید .
../../_images/140.png
  1. یک لایه جدید به پنل لایه هاus_states_with_population اضافه می شود . کلیک راست کرده و Open Attribute Table را انتخاب کنید . برای کارتوگرام خود باید از تراکم جمعیت به عنوان متغیر استفاده کنیم. ما از مقادیر جمعیت در فیلد استفاده خواهیم کرد. ویژگی جدول را ببندید.POPESTIMATE2023
../../_images/227.png
  1. جدول وکتور ‣ الگوریتم ماشین حساب فیلد را از جعبه ابزار پردازش جستجو و مکان یابی کنید . برای باز کردن آن دوبار کلیک کنید.
../../_images/319.png
  1. در گفتگوی فیلد ماشین حساب ، us_states_with_populationبه عنوان لایه ورودی انتخاب کنید . densityبه عنوان نام فیلد وارد کنید . برای محاسبه چگالی عبارت زیر را وارد کنید. همانطور که تابع area(@geometry)مساحت واحد CRS را محاسبه می کند (که بر حسب متر است)، ضریب تبدیل را برای تبدیل آن به کیلومتر مربع اعمال می کنیم. روی Run کلیک کنید .
۱۰۰۰*۱۰۰۰* "POPESTIMATE2023" /
area(@geometry)

../../_images/48.png

  1. روی دکمه … کنار Calculated کلیک کنید و Save to File را انتخاب کنید . نام لایه را به عنوان وارد کنید us_states_population_density.gpkgو Save را انتخاب کنید . روی Run کلیک کنید .
../../_images/58.png
  1. یک لایه جدید به پنل لایه هاus_states_population_density اضافه می شود . کلیک راست کرده و Open Attribute Table را انتخاب کنید . ما باید یک ویژگی Anchor را انتخاب کنیم که همه ویژگی‌های دیگر با آن مقیاس شوند. در حالت ایده‌آل، ویژگی با بالاترین مقدار متغیری را که می‌خواهید برای کارتوگرام استفاده کنید، انتخاب کنید. این تضمین می کند که مناطقی با هم تداخل نداشته باشند. برای مرتب کردن جدول بر اساس چگالی، روی سربرگ ستون چگالی دوبار کلیک کنید . متوجه خواهید شد که بالاترین مقدار چگالی در مجموعه داده ما در مقایسه با مقادیر دیگر بسیار بزرگ است و به حالت نسبتاً کوچکی تعلق دارد. این باعث می شود تمام ویژگی ها به اندازه های بسیار کوچک مقیاس شوند. ما می‌توانیم ویژگی را به عنوان دومین ویژگی با تراکم انتخاب کنیم که مساحت نسبتاً زیادی دارد و چگالی آن با سایر ویژگی‌ها قابل مقایسه است.
../../_images/68.png
  1. در کارتوگرام های Area، ضریب مقیاس تعیین می کند که چقدر مساحت ویژگی کاهش می یابد. ما باید مساحت هر ویژگی را کاهش دهیم تا تراکم جمعیت ویژگی با تراکم جمعیت ویژگی لنگر یکسان باشد. فرمول ضریب مقیاس، نسبت ریشه مربع ارزش ویژگی در برابر ریشه مربع ارزش ویژگی لنگر است. جدول وکتور ‣ الگوریتم ماشین حساب فیلد را از جعبه ابزار پردازش باز کنید . در گفتگوی فیلد ماشین حساب ، us_states_population_densityبه عنوان لایه ورودی انتخاب کنید . scale_factorبه عنوان نام فیلد وارد کنید . برای محاسبه ضریب مقیاس عبارت زیر را وارد کنید. این عبارت نسبت ریشه دوم چگالی ویژگی را در برابر ریشه دوم چگالی دومین مقدار چگالی بزرگ محاسبه می کند. روی دکمه  کنار Calculated کلیک کنید و Save to File را انتخاب کنید . نام لایه را به عنوان وارد کنید us_states_scale_factor.gpkgو Save را انتخاب کنید . روی Run کلیک کنید .
sqrt("density")/array_get(array_agg(
   expression:=sqrt("density"),
   order_by:=sqrt("density")), -2)

../../_images/78.png

  1. یک لایه جدید به پنل لایه هاus_states_scale_factor اضافه می شود . کلیک راست کرده و Open Attribute Table را انتخاب کنید . اکنون این فیلد حاوی نسبتی است که بر اساس آن هر ویژگی باید مقیاس شود تا تراکم جمعیتی مشابه ویژگی لنگر داشته باشد.scale_factor
../../_images/88.png
  1. ما فقط به us_states_scale_factorلایه برای تجسم نهایی نیاز داریم. لایه های باقیمانده را انتخاب کنید، کلیک راست کرده و Remove Layer را انتخاب کنید .
../../_images/98.png
  1. لایه را انتخاب کنید us_states_scale_factorو روی دکمه Open the layer styling panel در پنل لایه ها کلیک کنید . Simple Fill را انتخاب کنید و انتخابگر کشویی را برای نوع لایه نماد باز کنید . نوع لایه Symbol را روی آن تنظیم کرده و رنگ مورد نظر خود را انتخاب کنید. هنگامی که اندازه چند ضلعی ها را تغییر می دهیم، این لایه نماد مرجعی برای نقشه ما خواهد بود.Outline: Simple Line
../../_images/1012.png
  1. روی دکمه Add Symbol Layer (+) کلیک کنید . یک لایه نماد جدید Simple Fill اضافه خواهد شد. رنگ Fill را همرنگ خطوط قرار دهید و رنگ Stroke را کمی تیره تر کنید.
../../_images/1115.png
  1. سپس، انتخابگر کشویی را برای نوع لایه نماد باز کنید و نوع لایه نماد را انتخاب کنید . مولد هندسه به ما اجازه می دهد تا هندسه را برای رندر با استفاده از عبارات تغییر دهیم. روی دکمه Expression Builder کلیک کنید .Geometry Generator
../../_images/1213.png
  1. ما از تابع scale() استفاده خواهیم کرد که اندازه هندسه داده شده را با عوامل X- و Y-scaling تغییر اندازه می دهد. برای کارتوگرام خود، می خواهیم اندازه هر چند ضلعی را با نسبت جمعیت آن به بالاترین جمعیت تغییر دهیم. عبارت زیر را وارد کنید تا این مقیاس بندی اعمال شود و روی OK کلیک کنید .
scale(
   @geometry,
   "scale_factor",
   "scale_factor",
   centroid(@geometry)
)

../../_images/1311.png

  1. خواهید دید که چند ضلعی های ایالت اکنون بر اساس نسبت جمعیت هر ایالت به بالاترین جمعیت اندازه می شوند. بسیاری از ایالت های بزرگ با تراکم جمعیت کم در حال حاضر بسیار کوچکتر از اندازه اصلی خود هستند. متوجه خواهید شد که چند ضلعی هایی با اشکال نامنظم پس از مقیاس بندی خارج از مرکز هستند. این به این دلیل است که نقطه لنگر مقیاس بندی مرکز هندسه است که اغلب نقطه نماینده چند ضلعی است. بیایید بیان خود را برای رفع این مشکل به روز کنیم. روی دکمه Expression Builder کلیک کنید .
../../_images/1410.png
  1. تابع scale () یک پارامتر اختیاری برای تعیین نقطه مرکز مقیاس می گیرد. ما از تابع pole_of_inaccessibility() برای پیدا کردن یک نقطه لنگر نماینده برای هر چند ضلعی استفاده خواهیم کرد. این شبیه به یک مرکز است، اما تضمین شده است که در داخل چند ضلعی قرار دارد، در حالی که یک مرکز ممکن است برای اشکال خاصی به بیرون بیفتد. عبارت را همانطور که در زیر نشان داده شده است به روز کنید که قطب غیرقابل دسترس بودن هندسه را با مقدار تلورانس کوچک محاسبه می کند و روی OK کلیک کنید .
scale(
    @geometry,
    "scale_factor",
    "scale_factor",
    pole_of_inaccessibility(@geometry, 100)
)

../../_images/1510.png

  1. اکنون چند ضلعی های کوچک شده قرارگیری بسیار بهتری خواهند داشت. مشکل دیگری را می بینیم. بسیاری از ویژگی های لایه چند ضلعی هستند ، یعنی بیش از یک قسمت دارند. چنین ویژگی هایی دارای ۲ یا چند چند ضلعی هستند که بخشی از یک هندسه هستند. با عبارت فعلی ما، هر دو با همان نقطه لنگر محاسبه شده از هندسه ترکیبی مقیاس بندی می شوند. این ایده آل نیست. به عنوان مثال، یک ویژگی بزرگ با چندین جزیره باید به گونه ای مقیاس بندی شود که هر جزیره با نقطه مرکزی خود مقیاس بندی شود. برای رفع این مشکل، عبارت خود را به‌روزرسانی می‌کنیم تا روی هر قسمت از هندسه تکرار شود و آن را با مرکز خاص خود مقیاس کنیم. روی دکمه Expression Builder کلیک کنید .
../../_images/169.png
  1. در اینجا ما از تابع ()array_foreach برای تکرار روی هر قسمت از هندسه و تولید نسخه های مقیاس شده آنها استفاده می کنیم. در نهایت تابع collect_geometries() هر بخش مقیاس شده را در یک هندسه چند ضلعی ترکیب می کند. عبارت را مطابق شکل زیر به روز کنید و روی OK کلیک کنید .
collect_geometries(
    array_foreach(generate_series(1, @geometry_part_count),
            scale(geometry_n(@geometry,@element),
                    "scale_factor",
                    "scale_factor",
pole_of_inaccessibility(geometry_n(@geometry,@element), 100)
            )
    )
)

../../_images/1710.png

  1. نتیجه مقیاس بندی بسیار بهتر برای ویژگی های چند قسمتی است.
../../_images/188.png
  1. کارتوگرام ما آماده است. این نقشه تمرکز جمعیت در نیمه شرقی ایالات متحده و عدم وجود جمعیت در ایالت های غرب رودخانه می سی سی پی را نشان می دهد.
../../_images/197.png
  1. ما می توانیم با ایجاد یک انیمیشن که به آرامی رندر اصلی را به اندازه نهایی تبدیل می کند، تجسم بهبود یافته ای ایجاد کنیم. روی دکمه Temporal Control Panel با نماد ساعت در نوار ابزار ناوبری نقشه کلیک کنید . دکمه پیمایش زمانی متحرک را انتخاب کنید .
../../_images/207.png
  1. محدوده پیش‌فرض انیمیشن با یک پنجره ۲۴ ساعته با افزایش ۱ ساعته پر می‌شود. این برای مورد استفاده ما خوب است زیرا ما انیمیشن ۲۴ فریمی دریافت خواهیم کرد. اگر می‌خواهید انیمیشن کندتر/سریع‌تری داشته باشید، می‌توانید این را تنظیم کنید. روی لایه کلیک راست کرده us_states_with_populationو Properties را انتخاب کنید .
../../_images/2112.png
  1. برگه Temporal را انتخاب کرده و Dynamic Temporal Control را فعال کنید . این لایه با استفاده از عبارت به روز می شود، بنابراین نیازی به پیکربندی آن در اینجا نیست. کافیست آن را طوری انتخاب کنید که بعد از هر مرحله زمانی لایه به روز شود و با مقادیر به روز شده از عبارت رندر شود.Redraw Layer Only
../../_images/228.png
  1. بیایید عبارت Geometry Generator خود را به روز کنیم تا از مراحل زمانی انیمیشن استفاده کنیم و به تدریج هندسه را مقیاس کنیم. روی دکمه Open the layer styling panel در پنل لایه ها کلیک کنید . Geometry Generator و سپس دکمه Expression Builder را انتخاب کنید .
../../_images/236.png
  1. در اینجا می خواهیم با ضریب مقیاس ۱ شروع کنیم و به مقدار فاکتور مقیاس نهایی برای ویژگی در فیلد پایان دهیم scale_factor. ما از تابع scale_linear() استفاده می کنیم که زمان مرحله زمانی فعلی را می گیرد و ضریب مقیاس را با استفاده از زمان شروع و پایان محاسبه می کند. عبارت را مطابق شکل زیر به روز کنید و روی OK کلیک کنید .
collect_geometries(
    array_foreach(generate_series(1, @geometry_part_count),
            scale(geometry_n(@geometry,@element),
                    scale_linear(
                            epoch(@map_start_time),
                            epoch(@animation_start_time),
                            epoch(@animation_end_time),
                            ۱,
                            "scale_factor"),
                    scale_linear(
                            epoch(@map_start_time),
                            epoch(@animation_start_time),
                            epoch(@animation_end_time),
                            ۱,
                            "scale_factor"),
pole_of_inaccessibility(geometry_n(@geometry,@element), 100)
            )
    )
)

../../_images/247.png

  1. در پنل Temporal Controller ، روی دکمه Play کلیک کنید تا انیمیشن را ببینید. شما باید شکل هر چند ضلعی را به تدریج بعد از هر فریم کوچک کنید.
../../_images/257.png
  1. وقتی از پیکربندی راضی بودید، می‌توانیم انیمیشن را صادر کنیم. روی دکمه Export Animation کلیک کنید .
../../_images/266.png
  1. در گفتگوی Export Map Animation ، روی  در کنار فهرست خروجی کلیک کنید و به هر پوشه ای در رایانه خود بروید. همه گزینه های دیگر را به مقدار پیش فرض خود نگه دارید و روی ذخیره کلیک کنید .
../../_images/277.png
  1. فریم های تکی انیمیشن به صورت تصویر صادر می شود. ما می توانیم یک ویدیو یا GIF متحرک از این فریم ها ایجاد کنیم. من توصیه می کنم از وب سایت ezgif.com استفاده کنید که به شما امکان می دهد تصاویر GIF را به راحتی از تصاویر جداگانه ایجاد کنید. از Ezgif Animated GIF Maker دیدن کنید . به فریم های انیمیشن صادر شده بروید و روی آپلود فایل ها کلیک کنید! .
../../_images/287.png
  1. با تنظیم زمان تاخیر روی گزینه های GIF پیکربندی کنید ۵. جلوه فریم های متقاطع را بررسی کنید و تاخیر Fader و تعداد Fader را روی ۲. روی Make a GIF کلیک کنید ! /
../../_images/296.png
  1. برای دانلود انیمیشن به صورت فایل GIF روی دکمه ذخیره کلیک کنید .
../../_images/output.gif../../_images/hawaii.gif../../_images/alaska.gif

اگر می خواهید بازخورد بدهید یا تجربه خود را در مورد این آموزش به اشتراک بگذارید، لطفاً در زیر نظر دهید. (به حساب GitHub نیاز دارد)


دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

خانهدربارهتماسارتباط با ما