داده های خود را با BigQuery و Datasets API تجسم کنید

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

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

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

معماری مرجع

توسعه اپلیکیشن‌هایی با قابلیت مصورسازی داده‌های بزرگ به دو جزء اصلی نیاز دارد.

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

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

architecture diagram

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

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

  1. اندازه داده‌های منبع و فرکانس به‌روزرسانی .
    1. اگر داده‌های منبع در قالب geojson کمتر از ۵ مگابایت هستند یا مرتباً به‌روزرسانی می‌شوند، مثلاً پیش‌بینی زنده رادار آب و هوا، ارائه داده‌ها به عنوان یک شیء geojson سمت کلاینت در برنامه خود را در نظر بگیرید و با یک لایه deck.gl رندر کنید.
    2. اگر حجم داده‌های شما بیش از ۵ مگابایت است و به‌روزرسانی‌ها سریع‌تر از یک بار در ساعت انجام نمی‌شوند، معماری API مجموعه داده‌ها را در این سند در نظر بگیرید.
      1. مجموعه داده‌ها از فایل‌هایی تا حجم ۳۵۰ مگابایت پشتیبانی می‌کنند.
      2. اگر داده‌های شما بزرگتر از ۳۵۰ مگابایت است، قبل از انتقال به مجموعه داده‌ها، هرس کردن یا ساده‌سازی داده‌های هندسی در فایل منبع را در نظر بگیرید (به بخش هرس داده‌ها در زیر مراجعه کنید).
  2. طرحواره و قالب
    1. مطمئن شوید که داده‌های شما برای هر ویژگی، یک شناسه (ID) منحصر به فرد در سطح جهانی دارند. یک شناسه منحصر به فرد به شما امکان می‌دهد یک ویژگی خاص را انتخاب و استایل‌دهی کنید یا داده‌ها را به یک ویژگی برای نمایش بصری، مثلاً استایل‌دهی به یک ویژگی انتخاب شده در رویداد "کلیک" کاربر، متصل کنید.
    2. داده‌های خود را طبق مشخصات API مجموعه داده‌ها با نام‌های ستون معتبر، انواع داده‌ها و انواع اشیاء GeoJSON به صورت CSV یا 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. API مجموعه داده‌های نقشه‌های گوگل، کاشی‌های نقشه را از فایل داده منبع شما برای استفاده با SDK نقشه‌های وب یا موبایل ایجاد می‌کند.
    2. کاشی‌های نقشه یک سیستم فهرست‌بندی مبتنی بر زوم هستند که روش‌های کارآمدتری برای بارگذاری داده‌ها در یک برنامه بصری ارائه می‌دهند.
    3. کاشی‌های نقشه ممکن است در سطوح بزرگنمایی پایین‌تر، ویژگی‌های متراکم یا پیچیده را حذف کنند. وقتی کاربر روی یک ایالت یا کشور بزرگنمایی می‌کند (مثلاً z5-z12) ممکن است متفاوت از زمانی باشد که روی یک شهر یا محله بزرگنمایی می‌کند (مثلاً z13-z18).

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

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

پیش‌نیازها

  1. دسترسی به BigQuery Sandbox و Cloud Console
  2. مطمئن شوید که یک پروژه Google Cloud و حساب پرداخت راه‌اندازی کرده‌اید.

مرحله 1 - جستجوی داده‌ها در BigQuery

به مجموعه داده‌های عمومی BigQuery بروید. مجموعه داده 'bigquery-public-data' و جدول geo_openstreetmap.planet_features شامل کل داده‌های نقشه خیابان باز (OSM) جهان، شامل تمام ویژگی‌های ممکن است. تمام ویژگی‌های موجود برای جستجو در ویکی OSM، از جمله amenity ، road و landuse را کشف کنید.

برای پرس‌وجو از جدول با استفاده از SQL، از Cloud Shell یا BigQuery Cloud Console استفاده کنید. قطعه کد زیر از دستور 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 در فضای ذخیره‌سازی ابری گوگل، از دستور 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) از خروجی کوئری در فضای ابری گوگل (GCS) ایجاد کنید. با استفاده از API مجموعه داده‌ها (Datasets API )، می‌توانید یک مجموعه داده ایجاد کنید و سپس داده‌ها را از فایلی که در GCS میزبانی می‌شود، به مجموعه داده خود آپلود کنید .

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

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

Dataset preview

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

پس از ایجاد مجموعه داده (Dataset)، می‌توانید یک شناسه نقشه (map ID) با یک سبک نقشه (Map Style) مرتبط ایجاد کنید . در ویرایشگر سبک نقشه (Map Style)، می‌توانید یک mapId و سبک را با مجموعه داده مرتبط کنید. همچنین در اینجا می‌توانید از سبک‌دهی نقشه مبتنی بر ابر (Cloud Based Map Styling) برای سفارشی‌سازی ظاهر و حس نقشه خود استفاده کنید.

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

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

شما می‌توانید با استفاده از Maps JS API، استایل را سفارشی کنید، event handlerهایی برای تغییر استایل به صورت پویا اضافه کنید و کارهای بیشتری انجام دهید. برای مثال‌ها به مستندات مراجعه کنید. در زیر یک تابع 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,
           }
     }
}

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

london railway map

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

نتیجه‌گیری

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

اقدامات بعدی

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

مشارکت‌کنندگان

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

  • رایان باومن ، مدیر مهندسی راهکارهای پلتفرم نقشه‌های گوگل