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:

Data geospasial yang divisualisasikan di BigQuery Geo Viz.

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