Praktik terbaik untuk analisis spasial

Dokumen ini menjelaskan praktik terbaik untuk mengoptimalkan performa kueri geospasial di BigQuery. Anda dapat menggunakan praktik terbaik ini untuk meningkatkan performa serta mengurangi biaya dan latensi.

Set data dapat berisi kumpulan besar poligon, bentuk multipoligon, dan linestring untuk merepresentasikan fitur kompleks—misalnya, jalan, persil tanah, dan zona banjir. Setiap bentuk dapat berisi ribuan titik. Dalam sebagian besar operasi spasial di BigQuery (misalnya, persimpangan dan perhitungan jarak), algoritma yang mendasarinya biasanya mengunjungi sebagian besar titik di setiap bentuk untuk menghasilkan hasil. Untuk beberapa operasi, algoritma mengunjungi semua titik. Untuk bentuk yang kompleks, mengunjungi setiap titik dapat meningkatkan biaya dan durasi operasi spasial. Anda dapat menggunakan strategi dan metode yang disajikan dalam panduan ini untuk mengoptimalkan operasi spasial umum ini agar performanya lebih baik dan biayanya lebih rendah.

Dokumen ini mengasumsikan bahwa tabel geospasial BigQuery Anda dikelompokkan pada kolom geografi.

Menyederhanakan bentuk

Praktik terbaik: Gunakan fungsi sederhanakan dan sesuaikan dengan petak untuk menyimpan versi sederhana dari set data asli Anda sebagai tampilan terwujud.

Banyak bentuk kompleks dengan sejumlah besar titik dapat disederhanakan tanpa banyak kehilangan presisi. Gunakan fungsi ST_SIMPLIFY dan ST_SNAPTOGRID BigQuery secara terpisah atau bersama-sama untuk mengurangi jumlah titik dalam bentuk yang kompleks. Gabungkan fungsi ini dengan tampilan terwujud BigQuery untuk menyimpan versi sederhana set data asli Anda sebagai tampilan terwujud yang otomatis diperbarui terhadap tabel dasar.

Penyederhanaan bentuk paling berguna untuk meningkatkan biaya dan performa set data dalam kasus penggunaan berikut:

  • Anda harus mempertahankan tingkat kemiripan yang tinggi dengan bentuk aslinya.
  • Anda harus melakukan operasi presisi tinggi dan akurasi tinggi.
  • Anda ingin mempercepat visualisasi tanpa kehilangan detail bentuk yang terlihat.

Contoh kode berikut menunjukkan cara menggunakan fungsi ST_SIMPLIFY pada tabel dasar yang memiliki kolom GEOGRAPHY bernama geom. Kode ini menyederhanakan bentuk dan menghapus titik tanpa mengganggu tepi bentuk lebih dari toleransi yang diberikan sebesar 1,0 meter.

CREATE MATERIALIZED VIEW project.dataset.base_mv
  CLUSTER BY geom
AS (
  SELECT
    * EXCEPT (geom),
    ST_SIMPLIFY(geom, 1.0) AS geom
  FROM base_table
)

Contoh kode berikut menunjukkan cara menggunakan fungsi ST_SNAPTOGRID untuk menyelaraskan titik ke petak dengan resolusi 0,00001 derajat:

CREATE MATERIALIZED VIEW project.dataset.base_mv
  CLUSTER BY geom
AS (
  SELECT
    * EXCEPT (geom),
    ST_SNAPTOGRID(geom, -5) AS geom
  FROM base_table
)

Argumen grid_size dalam fungsi ini berfungsi sebagai eksponen, yang berarti 10e-5 = 0,00001. Resolusi ini setara dengan sekitar 1 meter dalam kasus terburuk, yang terjadi di ekuator.

Setelah membuat tampilan ini, buat kueri tampilan base_mv menggunakan semantik kueri yang sama dengan yang akan Anda gunakan untuk membuat kueri tabel dasar. Anda dapat menggunakan teknik ini untuk mengidentifikasi dengan cepat kumpulan bentuk yang perlu dianalisis lebih mendalam, lalu Anda dapat melakukan analisis kedua yang lebih mendalam pada tabel dasar. Uji kueri Anda untuk melihat nilai minimum mana yang paling sesuai untuk data Anda.

Untuk kasus penggunaan pengukuran, tentukan tingkat akurasi yang diperlukan kasus penggunaan Anda. Saat menggunakan fungsi ST_SIMPLIFY, tetapkan parameter threshold_meters ke tingkat akurasi yang diperlukan. Untuk mengukur jarak pada skala kota atau yang lebih besar, tetapkan nilai minimum 10 meter. Pada skala yang lebih kecil—misalnya, saat mengukur jarak antara bangunan dan badan air terdekat—pertimbangkan untuk menggunakan nilai minimum 1 meter atau kurang. Menggunakan nilai batas yang lebih kecil akan menghasilkan lebih sedikit titik yang dihapus dari bentuk yang diberikan.

Saat menyajikan lapisan peta dari layanan web, Anda dapat menghitung terlebih dahulu tampilan yang diwujudkan untuk berbagai tingkat zoom dengan project bigquery-geotools, yang merupakan driver untuk Geoserver yang memungkinkan Anda menyajikan lapisan spasial dari BigQuery. Driver ini membuat beberapa tampilan terwujud dengan parameter nilai minimum ST_SIMPLIFY yang berbeda sehingga detail yang lebih sedikit ditampilkan pada tingkat zoom yang lebih tinggi.

Menggunakan titik dan persegi panjang

Praktik terbaik: Kurangi bentuk menjadi titik atau persegi panjang untuk merepresentasikan lokasinya.

Anda dapat meningkatkan performa kueri dengan mengurangi bentuk menjadi satu titik atau persegi panjang. Metode dalam bagian ini tidak secara akurat merepresentasikan detail dan proporsi bentuk, tetapi mengoptimalkan untuk merepresentasikan lokasi bentuk.

Anda dapat menggunakan titik pusat geografis bentuk (centroid) untuk mewakili lokasi seluruh bentuk. Gunakan persegi panjang yang berisi bentuk untuk membuat rentang bentuk, yang dapat Anda gunakan untuk merepresentasikan lokasi bentuk dan mempertahankan informasi tentang ukuran relatifnya.

Penggunaan titik dan persegi panjang paling berguna untuk meningkatkan biaya dan performa kumpulan data saat Anda perlu mengukur jarak antara dua titik, seperti antara dua kota.

Misalnya, pertimbangkan untuk memuat database bidang tanah di Amerika Serikat ke dalam tabel BigQuery, lalu menentukan badan air terdekat. Dalam hal ini, pra-penghitungan sentroid bidang menggunakan fungsi ST_CENTROID bersama dengan metode yang dijelaskan di bagian Menyederhanakan bentuk dalam dokumen ini dapat mengurangi jumlah perbandingan yang dilakukan saat menggunakan fungsi ST_DISTANCE atau ST_DWITHIN. Saat menggunakan fungsi ST_CENTROID, sentroid bidang tanah perlu dipertimbangkan dalam penghitungan. Dengan menghitung terlebih dahulu sentroid bidang tanah dengan cara ini, variabilitas performa juga dapat dikurangi karena bentuk bidang tanah yang berbeda cenderung berisi jumlah titik yang berbeda.

Variasi metode ini adalah menggunakan fungsi ST_BOUNDINGBOX alih-alih fungsi ST_CENTROID untuk menghitung amplop persegi panjang di sekitar bentuk input. Meskipun tidak seefisien menggunakan satu titik, hal ini dapat mengurangi terjadinya kasus ekstrem tertentu. Varian ini tetap menawarkan performa yang baik dan konsisten, karena output fungsi ST_BOUNDINGBOX selalu hanya berisi empat titik yang perlu dipertimbangkan. Hasil kotak pembatas akan berjenis STRUCT, yang berarti Anda harus menghitung jarak secara manual atau menggunakan metode indeks vektor yang dijelaskan nanti dalam dokumen ini.

Menggunakan hull

Praktik terbaik: Gunakan hull untuk mengoptimalkan representasi lokasi bentuk.

Jika Anda membayangkan membungkus bentuk dengan plastik vakum dan menghitung batas pembungkus vakum, batas tersebut disebut hull. Dalam hull cembung, semua sudut bentuk yang dihasilkan bersifat cembung. Seperti jangkauan bentuk, convex hull mempertahankan beberapa informasi tentang ukuran dan proporsi relatif bentuk yang mendasarinya. Namun, penggunaan hull menimbulkan biaya karena perlu menyimpan dan mempertimbangkan lebih banyak titik dalam analisis berikutnya.

Anda dapat menggunakan fungsi ST_CONVEXHULL untuk mengoptimalkan representasi lokasi bentuk. Penggunaan fungsi ini meningkatkan akurasi, tetapi dengan mengorbankan penurunan performa. Fungsi ST_CONVEXHULL mirip dengan fungsi ST_EXTENT, kecuali bentuk output berisi lebih banyak titik dan bervariasi dalam jumlah titik berdasarkan kompleksitas bentuk input. Meskipun manfaat performa mungkin tidak signifikan untuk set data kecil dengan bentuk yang tidak kompleks, untuk set data yang sangat besar dengan bentuk yang besar dan kompleks, fungsi ST_CONVEXHULL menawarkan keseimbangan yang baik antara biaya, performa, dan akurasi.

Menggunakan sistem petak

Praktik terbaik: Gunakan sistem petak geospasial untuk membandingkan area.

Jika kasus penggunaan Anda melibatkan penggabungan data dalam area yang dilokalkan dan membandingkan penggabungan statistik area tersebut satu sama lain, Anda dapat memanfaatkan sistem petak standar untuk membandingkan area yang berbeda.

Misalnya, retailer mungkin ingin menganalisis perubahan demografi dari waktu ke waktu di area tempat toko mereka berada atau tempat mereka berencana membangun toko baru. Atau, perusahaan asuransi mungkin ingin meningkatkan pemahaman mereka tentang risiko properti dengan menganalisis risiko bahaya alam yang berlaku di area tertentu.

Penggunaan sistem petak standar seperti S2 dan H3 dapat mempercepat agregasi statistik dan analisis spasial tersebut. Penggunaan sistem petak ini juga dapat menyederhanakan pengembangan analisis dan meningkatkan efisiensi pengembangan.

Misalnya, perbandingan yang menggunakan wilayah sensus di Amerika Serikat menderita inkonsistensi ukuran, yang berarti faktor korektif perlu diterapkan untuk melakukan perbandingan yang setara antara wilayah sensus. Selain itu, wilayah sensus dan batas administratif lainnya berubah seiring waktu dan memerlukan upaya untuk mengoreksi perubahan ini. Penggunaan sistem petak untuk analisis spasial dapat mengatasi tantangan tersebut.

Menggunakan penelusuran vektor dan indeks vektor

Praktik terbaik: Gunakan penelusuran vektor dan indeks vektor untuk kueri geospasial tetangga terdekat.

Kemampuan penelusuran vektor diperkenalkan di BigQuery untuk memungkinkan kasus penggunaan machine learning seperti penelusuran semantik, deteksi kesamaan, dan retrieval-augmented generation. Kunci untuk mengaktifkan kasus penggunaan ini adalah metode pengindeksan yang disebut penelusuran tetangga terdekat perkiraan. Anda dapat menggunakan penelusuran vektor untuk mempercepat dan menyederhanakan kueri geospasial tetangga terdekat dengan membandingkan vektor yang merepresentasikan titik-titik di ruang.

Anda dapat menggunakan penelusuran vektor untuk menelusuri fitur berdasarkan radius. Pertama, tetapkan radius untuk penelusuran Anda. Anda dapat menemukan radius optimal dalam kumpulan hasil penelusuran tetangga terdekat. Setelah Anda menentukan radius, gunakan fungsi ST_DWITHIN untuk mengidentifikasi fitur di sekitar.

Misalnya, pertimbangkan untuk menemukan sepuluh bangunan terdekat dengan bangunan penanda tertentu yang lokasinya sudah Anda ketahui. Anda dapat menyimpan sentroid setiap bangunan sebagai vektor dalam tabel baru, mengindeks tabel, dan melakukan penelusuran menggunakan penelusuran vektor.

Untuk contoh ini, Anda juga dapat menggunakan data Overture Maps di BigQuery untuk membuat tabel terpisah dari bentuk bangunan yang sesuai dengan area yang diminati dan vektor yang disebut geom_vector. Area yang diminati dalam contoh ini adalah kota Norfolk, VA, Amerika Serikat, yang diwakili oleh kode FIPS 51710, seperti yang ditunjukkan dalam contoh kode berikut:

CREATE TABLE vector_search.norfolk_buildings
AS (
  SELECT
    *,
    [
      ST_X(ST_CENTROID(building.geometry)),
      ST_Y(ST_CENTROID(building.geometry))] AS geom_vector
  FROM `bigquery-public-data.overture_maps.building` AS building
  INNER JOIN `bigquery-public-data.geo_us_boundaries.counties` AS county
    ON (st_intersects(county.county_geom, building.geometry))
  WHERE county.county_fips_code = '51710'
)

Contoh kode berikut menunjukkan cara membuat indeks vektor pada tabel:

CREATE
  vector index building_vector_index
ON
  vector_search.norfolk_buildings(geom_vector)
  OPTIONS (index_type = 'IVF')

Kueri ini mengidentifikasi 10 bangunan terdekat dengan bangunan penanda tertentu:

SELECT base.*
FROM
  VECTOR_SEARCH(
    TABLE vector_search.norfolk_buildings,
    'geom_vector',
    (
      SELECT
        geom_vector
      FROM
        vector_search.norfolk_buildings
      WHERE id = '56873794-9873-4fe1-871a-5987bb3a0efb'
    ),
    top_k => 10,
    distance_type => 'EUCLIDEAN',
    options => '{"fraction_lists_to_search":0.1}')

Di panel Query results, klik tab Visualization. Peta menampilkan kumpulan bentuk bangunan yang paling dekat dengan bangunan penanda:

Data geospasial yang divisualisasikan di BigQuery.

Saat Anda menjalankan kueri ini di konsol Google Cloud , klik Informasi Tugas dan pastikan Mode Penggunaan Indeks Vektor disetel ke FULLY_USED. Hal ini menunjukkan bahwa kueri memanfaatkan indeks vektor building_vector_index, yang Anda buat sebelumnya.

Membagi bentuk besar

Praktik terbaik: Bagi bentuk besar dengan fungsi ST_SUBDIVIDE.

Gunakan fungsi ST_SUBDIVIDE untuk memecah bentuk besar atau string garis panjang menjadi bentuk yang lebih kecil.

Langkah berikutnya