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 cấu trúc tham khảo và ví dụ để tạo hình ảnh dữ liệu bản đồ với dữ liệu vị trí trong Google Cloud Platform BigQueryGoogle Maps Platform Datasets API, 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 nhóm phương tiện 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 chuyến đi cũng như chuẩn bị cho những cơn bão; bản đồ thông tin kinh doanh giúp người dùng khám phá thông tin chi tiết từ bản phân tích dữ liệu của họ và bản đồ viễn thông giúp người dùng hiểu được phạm vi bao phủ và chất lượng của nhà cung cấp trong một khu vực dịch vụ nhất định.

Tuy nhiên, các nhà phát triển ứng dụng gặp khó khăn trong việc tạo ra những hình ảnh trực quan hoá dữ liệu bản đồ lớn có hiệu suất cao và cung cấp trải nghiệm người dùng tuyệt vời. Dữ liệu lớn phải được tải vào phía máy khách của bộ nhớ, làm chậm thời gian tải bản đồ đầu tiên. Hình ảnh phải hoạt động tốt trên tất cả các thiết bị, kể cả điện thoại di động cấp thấp hơn có hạn chế về bộ nhớ và GPU. Cuối cùng, các 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 ứng dụng trực quan hoá dữ liệu lớn yêu cầu 2 thành phần chính.

  1. Phần phụ trợ của khách hàng – tất cả dịch vụ và dữ liệu ứng dụng phụ trợ, 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 trực quan hoá 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 ý: Maps Datasets APIsả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ố trong thiết kế để tạo hình ảnh dữ liệu về hiệu suất cao bằ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 dưới 5mb hoặc cập nhật rất thường xuyên (ví dụ: dự báo 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 ứng dụng đối tượng geojson trong ứng dụng của bạn và hiển thị thông qua 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à không được cập nhật nhanh hơn một lần mỗi giờ, hãy cân nhắc cấu trúc Datasets API trong tài liệu này.
      1. Tập dữ liệu hỗ trợ các 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 xem xét việc cắt bớt 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 phần Cắt bớt 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 thuộc tính mã nhận dạng duy nhất trên toàn cầu 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 đối tượng đã chọn trong sự kiện người dùng "nhấp".
    2. Định dạng dữ liệu của bạn dưới dạng CSV hoặc GeoJSON theo thông số API Datasets với tên cột, loại 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. Tập dữ liệu hỗ trợ nhập hình học từ CSV ở định dạng Văn bản đã biết (WKT) từ cột có tên wkt.
    4. Kiểm tra xem dữ liệu của bạn có phải là hình học và loại dữ liệu hợp lệ hay không. Ví dụ: GeoJSON phải nằm trong hệ toạ độ WGS84, thứ tự cuộn dây hình học, v.v.
    5. Sử dụng công cụ như geojson-validate để đảm bảo tất cả hình học trong tệp nguồn là hợp lệ hoặc 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 một khoá nhận dạng duy nhất (ví dụ).
    2. Sử dụng loại dữ liệu số nguyên cho đối tượng thuộc tính nếu có thể để giảm thiểu không gian lưu trữ thẻ thông tin, giúp thẻ thông tin hoạt động hiệu quả để tải qua HTTPS trong ứng dụng khách.
    3. Đơn giản hoá và/hoặc tổng hợp các hình đối tượng rất phức tạp; hãy cân nhắc sử dụng các hàm của BigQuery như ST_Simplify cho các hình đa giác phức tạp để giảm kích thước tệp nguồn và nâng cao hiệu suất của bản đồ.
  4. Xếp kề
    1. Google Maps Datasets API 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à một hệ thống lập chỉ mục dựa trên thu phóng cung cấp các cách hiệu quả hơn để tải dữ liệu vào một ứng dụng trực quan.
    3. Các ô bản đồ có thể thả 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) có thể trông khác so với khi phóng to vào 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 kiến trúc tham chiếu để tạo một ứng dụng web với GCP và Google Maps nhằm trực quan hóa tất cả các đường ray ở London từ dữ liệu Open Street Map (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 rằng bạn đã thiết lập dự án và tài khoản thanh toán trê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 dữ liệu Mở Bản đồ đường phố (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 có sẵn để truy vấn trong Wiki OSM bao gồm 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 bq query (truy vấn bq) để chỉ truy vấn tất cả đường ray được lọc theo London bằng cách sử dụng một 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 tính năng cắt mã sau đây, 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. giá trị nhận dạng duy nhất cho mỗi 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 mà các cột Địa lý của BigQuery trả về trong một truy vấn.

Lưu ý: Để xác thực trực quan kết quả truy vấn 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 trang tổng quan từ BigQuery bằng cách sử dụ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 Trích xuất bq 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 cách sử dụ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 Google Maps Platform từ dữ liệu đầu ra của truy vấn trên Google Cloud Storage (GCS). Bằng cách 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ừ một tệp được lưu trữ trên GCS.

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

Sau khi quá trình tải Tập dữ liệu lên hoàn tất, bạn có thể xem trước tập dữ liệu của mình trong GUI 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 của bạn với một mã bản đồ

Sau khi Tập dữ liệu được tạo, bạn có thể tạo Mã bản đồ có 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 Kiểu bản đồ dựa trên đám mây để tùy chỉnh giao diện bản đồ của bạn.

Bước 5 – Tạo hình ảnh bản đồ cho ứ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 API JS của Maps. Khởi động đối tượng bản đồ bằng cách sử dụng mapID được liên kết với tập dữ liệu từ bước trước đó. Sau đó, thiết lập kiểu và tương tác của lớp Tập dữ liệu. Hãy xem hướng dẫn đầy đủ về cách định kiểu theo hướng dữ liệu bằng Tập dữ liệu để biết thêm 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ẽ định nghĩa một 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 ý – Hãy nhớ sử dụng kênh v=beta để triển khai API Maps JS của bạn.

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 thuộc tính cho Tập dữ liệu vào ứng dụng bản đồ của bạn. Để thêm thuộc tính 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 OSM.

Mã ở trên khi được khởi chạy trong một ứng dụng web một trang sẽ tạo ra 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 trực quan hoá bản đồ trong hàm setStyle() bằng cách thêm logic vào các đối tượ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 về cấu trúc tham chiếu và cách triển khai mẫu của ứng dụng trực quan hoá dữ liệu lớn bằng Google Cloud và Nền tảng Google Maps. Bằng cách 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 BigQuery hoạt động trên mọi thiết bị bằng Google Maps Datasets API.

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