دیداری‌سازی داده‌ها با BigQuery

این سند معماری مرجع و نمونه‌ای برای ایجاد کردن مصورسازی‌های داده‌های نقشه با داده‌های مکان در Google Cloud BigQuery و Google Maps Platform Datasets API ارائه می‌دهد، مانند تجزیه‌وتحلیل کردن داده‌های شهرداری باز، ایجاد کردن نقشه پوشش مخابراتی، یا مصورسازی کردن ردپای حرکت ناوگان خودروهای سیار.

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

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

معماری مرجع

توسعه برنامه‌هایی با دیداری‌سازی داده‌های بزرگ به دو مؤلفه اصلی نیاز دارد.

  1. بخش پشتی مشتری - همه داده‌ها و سرویس‌های برنامه بخش پشتی مثل پردازش و فضای ذخیره‌سازی.
  2. کارخواه مشتری - میانای کاربر برنامه شما با مؤلفه تجسم نقشه.

در زیر نمودار سیستمی از نحوه تعامل این دو مؤلفه با کاربر برنامه، Google Cloud، و «پلاتفرم Google Maps» برای ایجاد برنامه تجسم داده‌های بزرگ ارائه شده است.

نمودار معماری

ملاحظات طراحی

برای ایجاد تجسم داده کارا بااستفاده از Google Cloud و Google Maps Platform، باید تعدادی از ملاحظات طراحی را رعایت کنید.

  1. اندازه داده‌های منبع و فواصل تجدید نظر.
    1. اگر داده‌های منبع در قالب geojson کمتر از ۵ مگابایت است یا به‌طور مکرر به‌روز می‌شود (مثلاً پیش‌بینی رادار آب‌وهوای زنده)، داده‌ها را به‌عنوان شیء geojson در سمت کارخواه در برنامه‌تان ارائه دهید و با لایه deck.gl رندر کنید.
    2. اگر اندازه داده‌هایتان بیشتر از ۵ مگابایت است و سریع‌تر از یک بار در ساعت به‌روز نمی‌شود، معماری Datasets API را در این سند درنظر بگیرید.
      1. مجموعه‌های داده از فایل‌های تا اندازه ۳۵۰ مگابایت پشتیبانی می‌کنند.
      2. اگر داده‌هایتان بزرگ‌تر از ۳۵۰ مگابایت است، پیش‌از ارسال به «مجموعه داده‌ها»، داده‌های هندسی را در فایل منبع هرس یا ساده کنید (به «هرس کردن داده‌ها» در زیر مراجعه کنید).
  2. طرح‌واره و قالب
    1. مطمئن شوید که داده‌هایتان برای هر عارضه دارای ویژگی شناسه یکتای جهانی باشد. شناسه یکتا به شما امکان می‌دهد ویژگی خاصی را انتخاب کنید و به آن سبک دهید یا داده‌ها را به ویژگی‌ای برای تجسم کردن بپیوندید، برای مثال، سبک دادن به ویژگی انتخاب‌شده در رویداد کاربر «کلیک».
    2. داده‌هایتان را به‌صورت CSV یا GeoJSON مطابق با مشخصات Datasets API با نام‌های ستون، انواع داده، و انواع شیء GeoJSON معتبر قالب‌بندی کنید.
    3. برای ایجاد آسان «مجموعه داده» از BigQuery، ستونی با نام wkt در صادر کردن SQL CSV ایجاد کنید. «مجموعه داده‌ها» از وارد کردن هندسه از CSV در قالب Well-Known Text (WKT) از ستونی به‌نام wkt پشتیبانی می‌کند.
    4. بررسی کنید که داده‌هایتان ازنظر هندسی و نوع داده معتبر باشد. برای مثال، GeoJSON باید در سیستم مختصات WGS84، ترتیب پیچش هندسی، و غیره باشد.
    5. از ابزاری مانند geojson-validate استفاده کنید تا مطمئن شوید همه هندسه‌ها در فایل منبع معتبر هستند یا از ogr2ogr برای تبدیل فایل منبع بین قالب‌ها یا سیستم‌های مختصات استفاده کنید.
  3. هرس کردن داده‌ها
    1. تعداد ویژگی‌های عارضه‌ها را به حداقل برسانید. می‌توانید ویژگی‌های بیشتری را در زمان اجرا به یک مشخصه در کلید شناسه یکتا (مثال) اضافه کنید.
    2. درصورت امکان، از انواع داده‌های عدد صحیح برای اشیای ویژگی استفاده کنید تا فضای ذخیره‌سازی کاشی به‌حداقل برسد و کاشی‌ها برای بار شدن ازطریق HTTPS در برنامه کارخواه عملکرد خوبی داشته باشند.
    3. هندسه‌های عارضه‌ای بسیار پیچیده را ساده و/یا انبوهش کنید؛ برای کاهش اندازه فایل منبع و بهبود عملکرد نقشه، استفاده از توابع BigQuery مانند ST_Simplify را در هندسه‌های چندضلعی پیچیده درنظر بگیرید.
  4. کاشی‌کاری
    1. Google Maps Datasets API از فایل داده منبع شما کاشی‌های نقشه ایجاد می‌کند تا با Maps SDK وب یا تلفن همراه استفاده شود.
    2. کاشی‌های نقشه یک سیستم نمایه‌سازی مبتنی بر بزرگ‌نمایی است که روش‌های کارآمدتری برای بار کردن داده‌ها در یک برنامه تصویری ارائه می‌دهد.
    3. کاشی‌های نقشه ممکن است ویژگی‌های متراکم یا پیچیده را در سطوح بزرگ‌نمایی پایین‌تر حذف کنند. وقتی کاربر نمای نقشه را به ایالت یا کشور تغییر می‌دهد (مثلاً z5-z12)، ممکن است متفاوت از زمانی باشد که نمای نقشه را به شهر یا محله تغییر می‌دهد (مثلاً z13-z18).

مثال - راه‌آهن در لندن

در این نمونه، معماری مرجع را برای ایجاد برنامه وب با Google Cloud و Google Maps اعمال می‌کنیم که همه راه‌آهن‌های لندن را از داده‌های Open Street Map (OSM) تجسم می‌کند.

پیش‌نیازها

  1. دسترسی به جعبه شنی BigQuery و کنسول Cloud
  2. مطمئن شوید که پروژه Google Cloud و حساب صورت‌حساب راه‌اندازی کرده‌اید.

مرحله ۱ - پُرسمان کردن داده‌ها در BigQuery

به مجموعه داده‌های عمومی BigQuery بروید. مجموعه داده «bigquery-public-data» و جدول geo_openstreetmap.planet_features حاوی داده‌های Open Street Map (OSM) کل جهان ازجمله همه ویژگی‌های ممکن است. همه ویژگی‌های دردسترس برای پُرسمان را در OSM Wiki، ازجمله amenity،‏ road، و landuse، کاوش کنید.

از Cloud Shell یا کنسول BigQuery Cloud برای پُرسمان جدول بااستفاده از SQL استفاده کنید. قطعه کد زیر از فرمان bq query برای جستجوی همه راه‌آهن‌های فیلترشده فقط برای لندن بااستفاده از جعبه مرزی و تابع ST_Intersects() استفاده می‌کند.

برای اجرای این پُرسمان از Cloud Shell، قطعه کد زیر را اجرا کنید و شناسه پروژه، مجموعه‌داده، و نام جدول را برای محیط خود به‌روز کنید.

bq query --use_legacy_sql=false \
--destination_table PROJECTID:DATASET.TABLENAME \
--replace \
'SELECT
osm_id, 
feature_type,
(SELECT value
         FROM   unnest(all_tags)
         WHERE  KEY = "name") AS name,
(SELECT value
         FROM   unnest(all_tags)
         WHERE  KEY = "railway") AS railway,
geometry as wkt
FROM   bigquery-public-data.geo_openstreetmap.planet_features
WHERE ("railway") IN (SELECT key FROM unnest(all_tags)) 
    AND ST_Intersects(
    geometry,
ST_MakePolygon(ST_MakeLine(
      [ST_GeogPoint(-0.549370, 51.725346),
      ST_GeogPoint(-0.549370, 51.2529407),
      ST_GeogPoint(0.3110581, 51.25294),
      ST_GeogPoint(0.3110581, 51.725346),
      ST_GeogPoint(-0.549370, 51.725346)]
    ))
   )'

پُرسمان این نتیجه را برمی‌گرداند:

  1. شناسه یکتا برای هر ویژگی osm_id
  2. feature_type مثلاً نقاط، خطوط، و غیره
  3. name ویژگی، مثلاً Paddington Station
  4. نوع railway، مثلاً اصلی، گردشگری، نظامی، و غیره
  5. wkt ویژگی - هندسه نقطه، خط، یا چندضلعی در قالب WKT. WKT قالب داده استانداردی است که ستون‌های BigQuery Geography در پُرسمان برمی‌گردانند.

توجه - برای اعتبارسنجی دیداری نتایج پُرسمان قبل‌از ایجاد «مجموعه داده»، می‌توانید به‌سرعت داده‌هایتان را در داشبوردی از BigQuery بااستفاده از Looker Studio دیداری‌سازی کنید.

برای صادر کردن جدول به فایل CSV در مخزن Google Cloud Storage، از فرمان bq extract در Cloud Shell استفاده کنید:

bq extract \
--destination_format "CSV" \
--field_delimiter "," \
--print_header=true \
PROJECTID:DATASET.TABLENAME \
gs://BUCKET/FILENAME.csv

توجه: می‌توانید هر مرحله را بااستفاده از Cloud Scheduler خودکار کنید تا داده‌هایتان به‌طور منظم به‌روز شود.

مرحله ۲ - ایجاد «مجموعه داده» از فایل CSV

سپس یک مجموعه داده Google Maps Platform از خروجی پُرسمان در Google Cloud Storage (GCS) ایجاد کنید. بااستفاده از Datasets API، می‌توانید مجموعه داده ایجاد کنید و سپس داده‌ها را از فایلی که در GCS میزبانی می‌شود به مجموعه داده‌تان بارگذاری کنید.

برای شروع، Maps Datasets API را در پروژه Google Cloud خود فعال کنید و اسناد API را مرور کنید. کتابخانه‌های کارخواه Python و Node.js برای فراخوانی Datasets API از منطق در پس‌بک برنامه شما وجود دارد. علاوه‌براین، رابط کاربری گرافیکی مجموعه‌های داده برای ایجاد دستی مجموعه‌های داده در «کنسول Cloud» وجود دارد.

پس‌از تکمیل بارگذاری «مجموعه داده»، می‌توانید مجموعه داده‌تان را در رابط کاربری گرافیکی «مجموعه داده‌ها» پیش‌نمایش کنید.

پیش‌نمایش مجموعه داده

مرحله ۴ - مرتبط کردن «مجموعه داده» با شناسه نقشه

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

مرحله ۵ - ایجاد تجسم نقشه برنامه کارخواه

درنهایت، می‌توانید بااستفاده از Maps JS API، مجموعه داده را به برنامه دیداری‌سازی داده سمت کارخواه اضافه کنید. مقداردهی اولیه شیء نقشه را بااستفاده از mapID مرتبط با مجموعه داده‌تان از مرحله قبلی انجام دهید. سپس سبک و تعامل‌پذیری لایه «مجموعه داده» را تنظیم کنید. برای جزئیات بیشتر، راهنمای کامل سبک‌بندی داده‌محور با مجموعه داده‌ها را بررسی کنید.

می‌توانید سبک را سفارشی‌سازی کنید، کنترل‌کننده‌های رویداد را برای تغییر پویای سبک اضافه کنید، و کارهای بیشتری بااستفاده از Maps JS API انجام دهید. نمونه‌ها را در اسناد ببینید. در زیر، تابع setStyle را برای ایجاد سبک عارضه نقطه و خط برای این مثال براساس مشخصه «feature_type» تعریف می‌کنیم.

function setStyle(params) {
  const map.getDatasetFeatureLayer("your-dataset-id");
  const datasetFeature = params.feature;
  const type = datasetFeature.datasetAttributes["feature_type"];
if (type == "lines") {
           return {
             fillColor: "blue",
             strokeColor: "blue",
             fillOpacity: 0.5,
             strokeWeight: 1,
           }
         } else if (type == "points") {
           return {
             fillColor: "black",
             strokeColor: "black",
             strokeOpacity: 0.5,
             pointRadius: 2,
             fillOpacity: 0.5,
             strokeWeight: 1,
           }
     }
}

کد بالا وقتی در برنامه وب تک‌صفحه‌ای مقداردهی اولیه می‌شود، دیداری‌سازی داده‌های نقشه زیر را ارائه می‌دهد:

نقشه راه‌آهن لندن

از اینجا، می‌توانید با افزودن منطق برای فیلتر کردن ویژگی‌ها، افزودن سبک براساس تعامل کاربر، و تعامل با بقیه برنامه‌تان، تجسم نقشه خود را در تابع setStyle() گسترش دهید.

نتیجه‌گیری

در این سند، درباره معماری مرجع و نمونه پیاده‌سازی برنامه تجسم داده‌های بزرگ بااستفاده از Google Cloud و Google Maps Platform بحث کردیم. بااستفاده از این معماری مرجع، می‌توانید از هر داده‌ای در Google Cloud BigQuery برنامه‌های تجسم داده مکان ایجاد کنید که بااستفاده از Google Maps Datasets API در هر دستگاهی عملکرد خوبی داشته باشند.

کنش‌های بعدی

مطالعه بیشتر:

همیاران

نویسندگان اصلی: