Trực quan hóa dữ liệu bằng BigQuery và API tập dữ liệu

Tài liệu này cung cấp một cấu trúc tham khảo và ví dụ về cách tạo hình ảnh trực quan dữ liệu bản đồ bằng dữ liệu vị trí trong Google Cloud Platform BigQueryAPI Tập dữ liệu trên Nền tảng Google Maps, chẳng hạn như phân tích dữ liệu mở của thành phố, tạo bản đồ phạm vi viễn thông hoặc trực quan hoá dấu vết di chuyển của đội xe di động.

Trực quan hoá dữ liệu bản đồ là một công cụ mạnh mẽ để thu hút người dùng và khám phá thông tin chi tiết về không gian trong dữ liệu vị trí. Dữ liệu vị trí là dữ liệu có các đối tượng điểm, đường hoặc đa giác. Ví dụ: bản đồ thời tiết giúp người tiêu dùng hiểu và lên kế hoạch cho các chuyến đi cũng như chuẩn bị cho các cơn bão; bản đồ thông minh kinh doanh giúp người dùng khám phá thông tin chi tiết từ quá trình phân tích dữ liệu của họ, còn bản đồ viễn thông giúp người dùng hiểu được phạm vi phủ sóng và chất lượng của nhà cung cấp trong một khu vực kinh doanh nhất định.

Tuy nhiên, các nhà phát triển ứng dụng gặp khó khăn trong việc trực quan hoá dữ liệu bản đồ lớn, vừa có hiệu quả vừa mang lại trải nghiệm tuyệt vời cho người dùng. Dữ liệu lớn phải được tải vào phía máy khách bộ nhớ, làm chậm thời gian tải bản đồ đầu tiên. Hình ảnh phải hoạt động hiệu quả trên tất cả các thiết bị, bao gồm cả điện thoại di động cấp thấp hơn bị hạn chế về bộ nhớ và GPU. Cuối cùng, nhà phát triển cần chọn một thư viện kết xuất dữ liệu lớn, dễ di chuyển, đáng tin cậy và hiệu quả với lượng dữ liệu lớn.

Cấu trúc tham chiếu

Việc phát triển các ứng dụng trực quan hoá dữ liệu lớn cần 2 thành phần chính.

  1. Phần phụ trợ của khách hàng – tất cả dữ liệu và dịch vụ phụ trợ của ứng dụng, chẳng hạn như xử lý và lưu trữ.
  2. Khách hàng – Giao diện người dùng của ứng dụng có thành phần hình ảnh bản đồ.

Dưới đây là sơ đồ hệ thống về cách hai thành phần này tương tác với người dùng ứng dụng, Google Cloud và Nền tảng Google Maps để tạo ra một ứng dụng trực quan hoá dữ liệu lớn.

sơ đồ cấu trúc

⭐ Lưu ý: API Tập dữ liệu Maps là một sản phẩm trước giai đoạn phát hành rộng rãi. Xem thông tin chi tiết trong Điều khoản dịch vụ.

Những điều cần lưu ý khi thiết kế

Bạn cần cân nhắc một số yếu tố thiết kế để tạo hình ảnh dữ liệu hiệu quả cao bằng cách sử dụng Google Cloud và Nền tảng Google Maps.

  1. Kích thước dữ liệu nguồn và tần suất cập nhật.
    1. Nếu dữ liệu nguồn ở định dạng geojson <5mb hoặc cập nhật rất thường xuyên, chẳng hạn như dự báo ra đa thời tiết trực tiếp, hãy cân nhắc phân phát dữ liệu dưới dạng phía máy khách đối tượng geojson trong ứng dụng của bạn và kết xuất bằng lớp deck.gl.
    2. Nếu dữ liệu của bạn có kích thước lớn hơn 5 MB và cập nhật không quá một lần mỗi giờ, hãy xem xét cấu trúc API Tập dữ liệu trong tài liệu này.
      1. Các tập dữ liệu hỗ trợ tệp có kích thước tối đa 350 mb.
      2. Nếu dữ liệu của bạn lớn hơn 350mb, hãy cân nhắc việc cắt giảm hoặc đơn giản hoá dữ liệu hình học trong tệp nguồn trước khi chuyển vào Tập dữ liệu (xem việc cắt giảm dữ liệu bên dưới).
  2. Giản đồ và định dạng
    1. Đảm bảo dữ liệu của bạn có một tài sản mã nhận dạng chung duy nhất cho mỗi tính năng. Mã nhận dạng duy nhất cho phép bạn chọn và tạo kiểu cho một tính năng cụ thể hoặc kết hợp dữ liệu với một tính năng để trực quan hoá, chẳng hạn như tạo kiểu cho một tính năng đã chọn trên sự kiện người dùng "nhấp chuột".
    2. Định dạng dữ liệu của bạn dưới dạng CSV hoặc GeoJSON theo thông số kỹ thuật của API Datasets với các tên cột, kiểu dữ liệu và loại đối tượng GeoJSON hợp lệ.
    3. Để dễ dàng tạo Tập dữ liệu từ BigQuery, hãy tạo một cột có tên là wkt trong tệp xuất CSV SQL. Các tập dữ liệu hỗ trợ nhập hình từ một tệp CSV ở định dạng Văn bản đã biết (WKT) từ một cột có tên là wkt.
    4. Kiểm tra để đảm bảo dữ liệu của bạn là hình học và kiểu dữ liệu hợp lệ. Ví dụ: GeoJSON phải nằm trong hệ toạ độ WGS84, thứ tự quanh co hình học, v.v.
    5. Sử dụng một công cụ như geojson-validate để đảm bảo tất cả hình học trong tệp nguồn đều hợp lệ hoặc sử dụng ogr2ogr để chuyển đổi tệp nguồn giữa các định dạng hoặc hệ thống toạ độ.
  3. Cắt bớt dữ liệu
    1. Giảm thiểu số lượng thuộc tính của các đối tượng. Bạn có thể kết hợp các thuộc tính khác với một tính năng trong thời gian chạy bằng khoá giá trị nhận dạng duy nhất (ví dụ).
    2. Sử dụng kiểu dữ liệu số nguyên cho đối tượng thuộc tính khi có thể để giảm thiểu không gian lưu trữ thẻ thông tin, đảm bảo thẻ thông tin luôn hoạt động hiệu quả khi tải qua HTTPS trong ứng dụng khách.
    3. Đơn giản hóa và/hoặc tổng hợp các hình học của đối tượng rất phức tạp; xem xét sử dụng các hàm BigQuery như ST_Simplify (Đơn giản hoá) trên các hình học đa giác phức tạp để giảm kích thước tệp nguồn và cải thiện hiệu suất trên bản đồ.
  4. Lát gạch
    1. API Tập dữ liệu Google Maps tạo các ô bản đồ từ tệp dữ liệu nguồn của bạn để sử dụng trong API Maps JS.
    2. Ô bản đồ là hệ thống lập chỉ mục dựa trên mức thu phóng, cung cấp những cách hiệu quả hơn để tải dữ liệu vào một ứng dụng trực quan.
    3. Ô bản đồ có thể làm giảm các đối tượng dày đặc hoặc phức tạp ở mức thu phóng thấp hơn. Khi người dùng thu nhỏ một tiểu bang hoặc quốc gia (ví dụ: z5-z12) thì giao diện có thể khác với khi phóng to một thành phố hoặc vùng lân cận (ví dụ: z13-z18).

Ví dụ – Đường sắt ở London

Trong ví dụ này, chúng ta sẽ áp dụng cấu trúc tham chiếu để tạo một ứng dụng web với GCP và Google Maps, giúp trực quan hoá tất cả các đường ray ở London từ dữ liệu Mở bản đồ đường phố (OSM).

Điều kiện tiên quyết

  1. Quyền truy cập vào Hộp cát BigQueryBảng điều khiển Cloud
  2. Đảm bảo bạn đã thiết lập tài khoản thanh toán và dự án GCP.

Bước 1 – Truy vấn dữ liệu trong BigQuery

Chuyển đến Tập dữ liệu công khai BigQuery. Tập dữ liệu 'bigquery-public-data' và bảng geo_openstreetmap.planet_features chứa giá trị của toàn bộ dữ liệu Bản đồ đường phố mở (OSM) trên toàn cầu, bao gồm tất cả các tính năng có thể có. Khám phá tất cả tính năng hiện có để truy vấn trong OSM Wiki, bao gồm cả amenity, roadlanduse.

Sử dụng Cloud Shell hoặc BigQuery Cloud Console(https://console.cloud.google.com) để truy vấn bảng bằng SQL. Đoạn mã bên dưới sử dụng lệnh truy vấn bq để truy vấn tất cả các đường ray được lọc riêng đến London bằng cách sử dụng hộp giới hạn và hàm ST_Intersects().

Để thực hiện truy vấn này từ Cloud Shell, hãy chạy công cụ cắt mã sau, cập nhật mã dự án, tập dữ liệu và tên bảng cho môi trường của bạn.

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)]
    ))
   )' 

Truy vấn trả về:

  1. một giá trị nhận dạng riêng biệt của từng tính năng osm_id
  2. feature_type, ví dụ: điểm, đường, v.v.
  3. name của tính năng, ví dụ: Paddington Station
  4. Loại railway, ví dụ: chính, du lịch, quân sự, v.v.
  5. wkt của đối tượng – hình học điểm, đường hoặc đa giác ở định dạng WKT. WKT là định dạng dữ liệu chuẩn của các cột Địa lý trong BigQuery trong một truy vấn.

Lưu ý – Để xác thực kết quả truy vấn một cách trực quan trước khi tạo Tập dữ liệu, bạn có thể nhanh chóng trình bày trực quan dữ liệu của mình trong một trang tổng quan từ BigQuery bằng Looker Studio.

Để xuất bảng sang tệp CSV trong bộ chứa Google Cloud Storage, hãy sử dụng lệnh bq extract trong Cloud Shell:

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

Lưu ý: bạn có thể tự động hoá từng bước bằng Cloud Scheduler để thường xuyên cập nhật dữ liệu.

Bước 2 – Tạo Tập dữ liệu từ tệp CSV

Tiếp theo, hãy tạo một tập dữ liệu trên Nền tảng Google Maps từ dữ liệu đầu ra của truy vấn trên Google Cloud Storage (GCS). Khi sử dụng API Tập dữ liệu, bạn có thể tạo tập dữ liệu, sau đó tải dữ liệu lên Tập dữ liệu từ tệp được lưu trữ trên GCS.

Để bắt đầu, hãy bật API Tập dữ liệu Maps trong dự án GCP của bạn và xem các tài liệu API. Có các thư viện ứng dụng PythonNode.js để gọi API Datasets từ logic trong phần phụ trợ ứng dụng. Ngoài ra, còn có một Giao diện người dùng đồ hoạ (GUI) của Tập dữ liệu để tạo Tập dữ liệu theo cách thủ công trong Cloud Console.

Sau khi tải lên Tập dữ liệu hoàn tất, bạn có thể xem trước tập dữ liệu của mình trong GUI của Tập dữ liệu.

Xem trước tập dữ liệu

Bước 4 – Liên kết Tập dữ liệu với Mã bản đồ

Sau khi tập dữ liệu được tạo, bạn có thể tạo Mã bản đồ với Kiểu bản đồ được liên kết. Trong trình chỉnh sửa Kiểu bản đồ, bạn có thể liên kết mapId và kiểu với Tập dữ liệu. Đây cũng là nơi bạn có thể áp dụng Tạo kiểu bản đồ dựa trên đám mây để tùy chỉnh giao diện bản đồ của mình.

Bước 5 – Tạo hình ảnh bản đồ ứng dụng khách

Cuối cùng, bạn có thể thêm tập dữ liệu vào ứng dụng trực quan hoá dữ liệu phía máy khách bằng cách sử dụng Maps JS API. Khởi động đối tượng bản đồ bằng cách sử dụng mapID liên kết với tập dữ liệu ở bước trước. Sau đó, đặt kiểu và tính tương tác của lớp Tập dữ liệu. Hãy xem hướng dẫn đầy đủ về định kiểu theo hướng dữ liệu bằng Tập dữ liệu để biết thêm thông tin chi tiết.

Bạn có thể tuỳ chỉnh kiểu, thêm trình xử lý sự kiện để thay đổi kiểu một cách linh hoạt và làm nhiều việc khác bằng cách sử dụng Maps JS API. Xem ví dụ trong docs. Dưới đây, chúng ta sẽ xác định hàm setStyle để tạo kiểu đối tượng điểm và đường cho ví dụ này dựa trên thuộc tính “feature_type”.

Lưu ý – Nhớ sử dụng v=beta channel để triển khai Maps JS API.

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,
           }
     }
}

Lưu ý: Hãy nhớ luôn thêm mô hình phân bổ cho Tập dữ liệu vào ứng dụng bản đồ của bạn. Để thêm mô hình phân bổ OSM, hãy làm theo ví dụ về mã phân bổ trong tài liệu tuân thủ nguyên tắc về OSM.

Mã này ở trên khi được khởi chạy trong một ứng dụng web trang đơn sẽ mang lại hình ảnh dữ liệu bản đồ sau đây:

bản đồ đường sắt london

Từ đây, bạn có thể mở rộng hình ảnh của bản đồ trong hàm setStyle() bằng cách thêm logic vào các tính năng lọc, thêm kiểu dựa trên tương tác của người dùng và tương tác với phần còn lại của ứng dụng.

Kết luận

Trong bài viết này, chúng ta đã thảo luận một cấu trúc tham chiếu và ví dụ về cách triển khai một ứng dụng trực quan hoá dữ liệu lớn bằng Google Cloud và Nền tảng Google Maps. Khi sử dụng cấu trúc tham chiếu này, bạn có thể tạo các ứng dụng trực quan hoá dữ liệu vị trí từ bất kỳ dữ liệu nào trong BigQuery của GCP và có hiệu suất cao trên bất kỳ thiết bị nào nhờ sử dụng API Tập dữ liệu của Google Maps.

Hành động tiếp theo

Tài liệu đọc thêm:

Người đóng góp

Tác giả chính:

  • Ryan Bauman, Nhà quản lý kỹ thuật về giải pháp cho nền tảng Google Maps