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 poligon, bentuk multipoligon, dan linestring yang besar 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 penghitungan 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 guna meningkatkan performa dan mengurangi biaya.
Dokumen ini mengasumsikan bahwa tabel geospasial BigQuery Anda dikelompokkan pada kolom geografi.
Menyederhanakan bentuk
Praktik terbaik: Gunakan fungsi sederhanakan dan snap-to-grid untuk menyimpan versi sederhana dari set data asli Anda sebagai tampilan yang terwujud.
Banyak bentuk kompleks dengan sejumlah besar titik dapat disederhanakan tanpa banyak
kehilangan presisi. Gunakan fungsi BigQuery ST_SIMPLIFY
dan ST_SNAPTOGRID
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 secara otomatis diperbarui terhadap tabel dasar.
Menyederhanakan bentuk paling berguna untuk meningkatkan biaya dan performa set data dalam kasus penggunaan berikut:
- Anda harus mempertahankan tingkat kemiripan yang tinggi dengan bentuk sebenarnya.
- 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 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 kumpulan bentuk yang perlu dianalisis lebih mendalam dengan cepat,
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 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 yang lebih kecil, yaitu 1 meter atau kurang. Menggunakan nilai nilai minimum yang lebih kecil akan menghapus lebih sedikit titik dari bentuk yang diberikan.
Saat menayangkan 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 menayangkan lapisan spasial dari BigQuery. Driver ini membuat beberapa tampilan terwujud dengan
parameter nilai minimum ST_SIMPLIFY
yang berbeda sehingga lebih sedikit detail yang ditayangkan pada
tingkat zoom yang lebih tinggi.
Menggunakan titik dan persegi panjang
Praktik terbaik: Kurangi bentuk menjadi titik atau persegi panjang untuk mewakili lokasinya.
Anda dapat meningkatkan performa kueri dengan mengurangi bentuk menjadi satu titik atau persegi panjang. Metode di bagian ini tidak secara akurat mewakili detail dan proporsi bentuk, tetapi mengoptimalkan untuk mewakili lokasi bentuk.
Anda dapat menggunakan titik tengah geografis suatu bentuk (centroid) untuk mewakili lokasi seluruh bentuk. Gunakan persegi panjang yang berisi bentuk untuk membuat ekstensi bentuk, yang dapat Anda gunakan untuk merepresentasikan lokasi bentuk dan mempertahankan informasi tentang ukuran relatifnya.
Menggunakan titik dan persegi panjang paling berguna untuk meningkatkan biaya dan performa set data saat Anda perlu mengukur jarak antara dua titik, seperti antara dua kota.
Misalnya, pertimbangkan untuk memuat database persil tanah di Amerika Serikat ke dalam tabel BigQuery, lalu menentukan badan air terdekat.
Dalam hal ini, prakomputasi centroid persil menggunakan fungsi ST_CENTROID
yang dikombinasikan 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
, centroid persil perlu
dipertimbangkan dalam penghitungan. Menghitung centroid persil terlebih dahulu dengan cara ini juga dapat mengurangi variabilitas performa, karena bentuk persil yang berbeda kemungkinan akan berisi jumlah titik yang berbeda.
Varian metode ini adalah menggunakan fungsi
ST_BOUNDINGBOX
,
bukan fungsi ST_CENTROID
untuk menghitung amplop persegi panjang
di sekitar bentuk input. Meskipun tidak seefisien menggunakan satu titik,
cara ini dapat mengurangi terjadinya kasus ekstrem tertentu. Varian ini masih menawarkan
performa yang baik dan konsisten, karena output fungsi ST_BOUNDINGBOX
selalu hanya berisi empat titik yang perlu dipertimbangkan. Hasil
bounding box akan berupa jenis
STRUCT
, yang
berarti Anda harus menghitung jarak secara manual atau menggunakan
metode indeks vektor yang dijelaskan nanti dalam
dokumen ini.
Menggunakan lambung
Praktik terbaik: Gunakan hull untuk mengoptimalkan representasi lokasi bentuk.
Jika Anda membayangkan shrink wrap bentuk dan menghitung batas shrink wrap, batas tersebut disebut hull. Dalam cangkang cembung, semua sudut bentuk yang dihasilkan adalah cembung. Seperti cakupan bentuk, cangkang cembung mempertahankan beberapa informasi tentang ukuran dan proporsi relatif bentuk yang mendasarinya. Namun, menggunakan hull akan memerlukan penyimpanan dan pertimbangan lebih banyak titik dalam analisis berikutnya.
Anda dapat menggunakan fungsi ST_CONVEXHULL
untuk mengoptimalkan representasi
lokasi bentuk. Penggunaan fungsi ini akan meningkatkan akurasi, tetapi hal ini
akan menurunkan performa. Fungsi ST_CONVEXHULL
mirip dengan fungsi ST_EXTENT
, kecuali bentuk output berisi lebih banyak titik dan jumlah titik bervariasi 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 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 agregasi data dalam area yang dilokalkan dan membandingkan agregasi statistik area tersebut satu sama lain, Anda dapat mendapatkan manfaat dari penggunaan sistem petak standar untuk membandingkan berbagai area.
Misalnya, retailer mungkin ingin menganalisis perubahan demografis dari waktu ke waktu di area tempat toko mereka berada atau tempat mereka mempertimbangkan untuk 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 grid ini juga dapat menyederhanakan pengembangan analisis dan meningkatkan efisiensi pengembangan.
Misalnya, perbandingan menggunakan sensus tract di Amerika Serikat mengalami inkonsistensi ukuran, yang berarti faktor korektif perlu diterapkan untuk melakukan perbandingan yang setara antara sensus tract. Selain itu, wilayah sensus dan batas administratif lainnya berubah dari waktu ke waktu dan memerlukan upaya untuk mengoreksi perubahan ini. Menggunakan 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 pembuatan yang ditingkatkan pengambilan. Kunci untuk mengaktifkan kasus penggunaan ini adalah metode pengindeksan yang disebut penelusuran tetangga terdekat yang mendekati. Anda dapat menggunakan penelusuran vektor untuk mempercepat dan menyederhanakan kueri geospasial tetangga terdekat dengan membandingkan vektor yang mewakili titik dalam ruang.
Anda dapat menggunakan penelusuran vektor untuk menelusuri fitur berdasarkan radius. Pertama, tentukan
radius untuk penelusuran Anda. Anda dapat menemukan radius optimal dalam kumpulan hasil penelusuran tetangga terdekat. Setelah Anda menetapkan radius, gunakan fungsi ST_DWITHIN
untuk mengidentifikasi fitur di sekitar.
Misalnya, pertimbangkan untuk menemukan sepuluh bangunan terdekat dengan bangunan anchor tertentu yang lokasinya sudah Anda miliki. Anda dapat menyimpan centroid setiap bangunan sebagai vektor dalam tabel baru, mengindeks tabel, dan menelusuri menggunakan penelusuran vektor.
Untuk contoh ini, Anda juga dapat menggunakan data Overture Maps di BigQuery untuk membuat tabel bentuk bangunan terpisah yang sesuai dengan area minat dan vektor yang disebut geom_vector
. Area minat dalam contoh ini adalah kota Norfolk, VA, Amerika Serikat, yang diwakili oleh kode FIPS 51710, seperti yang ditunjukkan dalam contoh kode berikut:
CREATE TABLE geo-solution-demos.vector_search.norfolk_buildings
AS (
SELECT
*,
[
ST_X(ST_CENTROID(building.geometry)),
ST_Y(ST_CENTROID(building.geometry))] AS geom_vector
FROM geo-solution-demos.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
`geo-solution-demos.vector_search.norfolk_buildings`(geom_vector)
OPTIONS (index_type = 'IVF')
Kueri ini mengidentifikasi 10 bangunan terdekat dengan bangunan anchor
tertentu, yang direpresentasikan sebagai anchor_building_id
:
declare anchor_building_id STRING;
SET anchor_building_id = '08b2af6202ce5fff02007d1778948bc4';
SELECT base.*
FROM
VECTOR_SEARCH(
TABLE `geo-solution-demos.vector_search.norfolk_buildings`,
'geom_vector',
(
SELECT
geom_vector
FROM
`geo-solution-demos.vector_search.norfolk_buildings`
WHERE id = anchor_building_id
),
top_k => 10,
distance_type => 'EUCLIDEAN',
options => '{"fraction_lists_to_search":0.1}')
Saat Anda melihat data geospasial di BigQuery Geo Viz, output-nya adalah cluster bentuk bangunan yang paling dekat dengan bangunan anchor, seperti yang ditampilkan dalam gambar berikut:
Saat Anda menjalankan kueri ini di konsol Google Cloud, klik Job Information dan
pastikan Vector Index Usage Mode 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
membagi bentuk besar atau string baris panjang menjadi bentuk yang lebih kecil.
Langkah berikutnya
- Pelajari cara menggunakan sistem petak untuk analisis spasial.
- Pelajari fungsi geografi BigQuery lebih lanjut.
- Pelajari cara mengelola indeks vektor.
- Pelajari lebih lanjut praktik terbaik untuk pengindeksan dan pengelompokan spasial di BigQuery.
- Untuk informasi selengkapnya tentang cara menganalisis dan memvisualisasikan data geospasial di BigQuery, lihat Memulai analisis geospasial.