Praktik terbaik untuk analisis spasial
Dokumen ini menjelaskan praktik terbaik untuk mengoptimalkan performa kueri geospasial di BigQuery. Anda dapat menggunakan praktik terbaik berikut untuk meningkatkan performa serta mengurangi biaya dan latensi.
{i>Dataset<i} dapat berisi kumpulan poligon, bentuk multipoligon, dan linestring untuk merepresentasikan fitur kompleks—misalnya, jalan, persil tanah, dan kawasan banjir, Setiap bentuk dapat berisi ribuan titik. Dalam sebagian besar spasi operasi di BigQuery (misalnya, persimpangan dan jarak ), algoritma yang mendasari biasanya mengunjungi sebagian besar poin dalam setiap bentuk untuk memperoleh sebuah hasil. Untuk beberapa operasi, algoritma mengunjungi semua poin. Untuk bentuk yang kompleks, mengunjungi setiap titik dapat meningkatkan biaya dan durasi operasi spasial. Anda dapat menggunakan strategi dan metode yang disajikan dalam untuk mengoptimalkan operasi spasial umum ini guna meningkatkan performa dan pengurangan biaya.
Dokumen ini mengasumsikan bahwa tabel geospasial BigQuery Anda dikelompokkan pada kolom geografi.
Menyederhanakan bentuk
Praktik terbaik: Menggunakan fungsi sederhanakan dan snap-to-grid untuk menyimpan fungsi yang disederhanakan {i>dataset<i} asli Anda sebagai tampilan terwujud.
Banyak bentuk kompleks dengan jumlah titik yang besar dapat disederhanakan dengan mudah
kehilangan presisi. Gunakan BigQuery
ST_SIMPLIFY
dan
ST_SNAPTOGRID
fungsi secara terpisah atau bersama-sama untuk mengurangi jumlah
titik dalam bentuk yang kompleks.
Gabungkan fungsi-fungsi ini dengan BigQuery
tampilan terwujud untuk menyimpan
versi sederhana dari {i>dataset<i} asli Anda sebagai
tampilan terwujud yang
diperbarui secara otomatis terhadap tabel dasar.
Menyederhanakan bentuk sangat berguna untuk meningkatkan biaya dan performa set data dalam kasus penggunaan berikut:
- Anda perlu mempertahankan tingkat kemiripan yang tinggi dengan bentuk yang 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 basis
tabel 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 kondisi terburuk
besar, yang terjadi di khatulistiwa.
Setelah Anda membuat tampilan ini, buat kueri tampilan base_mv
menggunakan kueri yang sama
semantik yang akan Anda gunakan
untuk melakukan kueri tabel dasar. Anda dapat menggunakan teknik ini
untuk mengidentifikasi dengan cepat sekumpulan bentuk yang perlu dianalisis lebih dalam,
kemudian Anda dapat melakukan analisis
kedua lebih dalam tentang tabel dasar. Uji
untuk melihat nilai minimum yang paling sesuai untuk data Anda.
Untuk kasus penggunaan pengukuran, tentukan tingkat akurasi kasus penggunaan Anda
Anda butuhkan. Saat menggunakan fungsi ST_SIMPLIFY
, setel threshold_meters
parameter ke tingkat akurasi yang diperlukan. Untuk mengukur jarak pada timbangan
dari sebuah kota atau lebih besar, tetapkan ambang batas sejauh 10 meter. Pada skala yang lebih kecil—untuk
misalnya, saat mengukur jarak antara gedung dan badan terdekat
air—pertimbangkan untuk menggunakan ambang batas yang lebih kecil 1 meter atau kurang. Menggunakan lebih kecil
nilai minimum menghasilkan penghapusan lebih sedikit titik dari bentuk yang diberikan.
Saat menyajikan lapisan peta dari layanan web, Anda dapat menghitung terlebih dahulu
tampilan untuk tingkat zoom yang berbeda dengan
project bigquery-geotools,
yang merupakan {i>driver<i} untuk Geoserver yang memungkinkan
Anda melayani lapisan spasial dari
menggunakan BigQuery. Dorongan ini membuat beberapa tampilan terwujud dengan
parameter nilai minimum ST_SIMPLIFY
yang berbeda sehingga lebih sedikit detail yang ditampilkan
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 merepresentasikan detail secara akurat dan proporsi bentuk, tetapi lebih mengoptimalkannya untuk mewakili lokasi dari bentuk tersebut.
Anda dapat menggunakan titik pusat geografis dari suatu bentuk (pusatnya) untuk mewakili lokasi keseluruhan 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 sangat berguna untuk meningkatkan biaya dan performa dari sebuah {i>dataset<i} saat Anda perlu mengukur jarak antara dua titik, seperti di antara dua kota.
Misalnya, pertimbangkan untuk memuat {i>database<i} persil tanah di Amerika Serikat ke dalam
tabel BigQuery dan kemudian menentukan perairan terdekat.
Dalam hal ini, lakukan pra-komputasi sentroid persil menggunakan
ST_CENTROID
fungsi ini dalam kombinasi dengan metode yang dijelaskan dalam
Bagian Sederhanakan bentuk dalam dokumen ini dapat mengurangi
jumlah perbandingan yang dilakukan saat menggunakan
ST_DISTANCE
atau
ST_DWITHIN
fungsi-fungsi lainnya. Saat menggunakan fungsi ST_CENTROID
, sentroid persil harus
dipertimbangkan dalam penghitungan. Menghitung sentroid persil dengan cara ini
juga dapat mengurangi variabilitas kinerja, karena bentuk persil yang berbeda
mungkin 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,
dapat mengurangi
terjadinya {i>edge case<i}. Varian ini masih menawarkan
performa yang baik dan konsisten, karena output 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.
Gunakan lambung kapal
Praktik terbaik: Gunakan hull untuk mengoptimalkan representasi lokasi bentuk.
Jika Anda membayangkan bentuk penyusutan dan menghitung batas penyusutan 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, Jika menggunakan lambung mobil, Anda harus menyimpan dan mempertimbangkan lebih banyak poin 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
ST_EXTENT
fungsi, kecuali bentuk output berisi lebih banyak titik dan bervariasi dalam angka
titik berdasarkan kompleksitas bentuk input. Meskipun performa
manfaatnya cenderung diabaikan untuk {i>dataset
<i}kecil dari bentuk tidak kompleks, karena
set data 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 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, seorang 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 ada di area tertentu.
Menggunakan sistem petak standar seperti S2 dan H3 dapat mempercepat agregasi statistik dan analisis spasial tersebut. Menggunakan {i>grid<i} ini juga dapat menyederhanakan pengembangan analitik dan meningkatkan tim dan efisiensi.
Misalnya, perbandingan menggunakan jalur sensus di Amerika Serikat mengalami inkonsistensi dalam ukuran, yang berarti faktor korektif harus diterapkan untuk melakukan perbandingan sejenis antara jalur sensus. Selain itu, jalur sensus dan batas-batas administratif lainnya berubah dari waktu ke waktu dan membutuhkan memperbaiki perubahan tersebut. Menggunakan sistem jaringan untuk analisis spasial dapat mengatasi tantangan tersebut.
Menggunakan penelusuran vektor dan indeks vektor
Praktik terbaik: Menggunakan penelusuran vektor dan indeks vektor untuk tetangga terdekat dan kueri geospasial.
Kemampuan penelusuran vektor sebelumnya diperkenalkan di BigQuery untuk memfasilitasi kasus penggunaan machine learning seperti penelusuran semantik, deteksi kemiripan, dan pembuatan yang ditingkatkan yang berbasis pengambilan. Kunci untuk memungkinkan kasus penggunaan ini yang disebut metode pengindeksan perkiraan tetangga terdekat. Anda dapat menggunakan penelusuran vektor untuk mempercepat dan menyederhanakan kueri geospasial tetangga terdekat dengan membandingkan vektor yang merepresentasikan titik-titik dalam ruang angkasa.
Anda dapat menggunakan penelusuran vektor untuk menelusuri fitur menurut radius. Pertama, tetapkan
radius pencarian. Anda dapat menemukan radius optimal dalam kumpulan hasil penelusuran tetangga terdekat. Setelah Anda menetapkan radius, gunakan
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 sentroid dari setiap bangunan sebagai vektor dalam tabel baru, mengindeks tabel, dan penelusuran menggunakan penelusuran vektor.
Untuk contoh ini, Anda juga dapat menggunakan data Overture Maps di BigQuery untuk membuat tabel terpisah berisi bentuk bangunan 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 pada 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 yang paling dekat dengan anchor tertentu
bangunan, 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 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 tersebut memanfaatkan indeks vektor building_vector_index
, yang dapat
buat sebelumnya.
Membagi bentuk besar
Praktik terbaik: Bagi bentuk besar dengan fungsi ST_SUBDIVIDE
.
Gunakan fungsi ST_SUBDIVIDE
untuk
pecah bentuk besar atau string garis panjang menjadi bentuk yang lebih kecil.
Langkah selanjutnya
- 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 mengetahui informasi selengkapnya tentang menganalisis dan memvisualisasikan data geospasial di BigQuery, lihat artikel Mulai menggunakan analisis geospasial.