Bagikan melalui


geo_line_to_s2cells()

Menghitung token sel S2 yang mencakup garis atau multibaris di Bumi. Fungsi ini adalah alat gabungan geospasial yang bermanfaat.

Baca selengkapnya tentang hierarki sel S2.

Sintaks

geo_line_to_s2cells(lineString [, level[ , radius]])

Pelajari selengkapnya tentang konvensi sintaksis.

Parameter

Nama Tipe Wajib Deskripsi
lineString dynamic ✔️ Garis atau multibaris dalam format GeoJSON.
tingkat int Menentukan tingkat sel yang diminta. Nilai yang didukung berada dalam rentang [0, 30]. Jika tidak ditentukan, nilai default 11 akan digunakan.
radius real Radius buffer dalam meter. Jika tidak ditentukan, nilai default 0 akan digunakan.

Mengembalikan

Array string token sel S2 yang mencakup garis atau multibaris. Jika radius diatur ke nilai positif, maka penutup akan menjadi bentuk input dan semua titik dalam radius geometri input.

Jika salah satu hal berikut: garis, tingkat, radius tidak valid, atau jumlah sel melebihi batas, kueri akan menghasilkan hasil null.

Catatan

  • Menutupi garis dengan token sel S2 dapat berguna dalam mencocokkan koordinat dengan garis, sehingga menemukan titik di dekat garis.
  • Token penutup garis memiliki tingkat sel S2 yang sama.
  • Jumlah maksimum token per baris adalah 65536.
  • Datum geodetik yang digunakan untuk mengukur jarak di Bumi adalah bola. Tepi garis adalah geodesik pada bola.
  • Jika tepi garis input adalah garis kartesius lurus, pertimbangkan untuk menggunakan geo_line_densify() untuk mengubah tepi planar menjadi geodesik.

Memilih tingkat sel S2

  • Idealnya kita ingin menutupi setiap baris dengan satu atau hanya beberapa sel unik sehingga tidak ada dua baris yang berbagi sel yang sama.
  • Dalam praktiknya, coba tutupi hanya dengan beberapa sel, tidak lebih dari selusin. Mencakup lebih dari 10.000 sel mungkin tidak menghasilkan performa yang baik.
  • Durasi kueri dan konsumsi memori mungkin sangat berbeda karena nilai tingkat sel S2 yang berbeda.

Saran peningkatan performa

  • Jika memungkinkan, kurangi ukuran tabel koordinat sebelum bergabung, dengan mengelompokkan koordinat yang sangat dekat satu sama lain dengan menggunakan pengklusteran geospasial atau dengan memfilter koordinat yang tidak perlu karena sifat data atau kebutuhan bisnis.
  • Jika memungkinkan, kurangi jumlah garis karena sifat data atau kebutuhan bisnis. Memfilter baris yang tidak perlu sebelum bergabung, cakupan ke area yang menarik atau menyatukan baris.
  • Dalam kasus garis yang sangat besar, kurangi ukurannya menggunakan geo_line_simplify().
  • Mengubah tingkat sel S2 dapat meningkatkan performa dan konsumsi memori.
  • Mengubah jenis gabungan dan petunjuk dapat meningkatkan performa dan konsumsi memori.
  • Jika radius positif diatur, mengembalikan ke radius 0 pada bentuk buffer menggunakan geo_line_buffer() dapat meningkatkan performa.

Contoh

Kueri berikut menemukan semua stasiun tabung dalam 500 meter jalan dan tabung agregat dihitung berdasarkan nama jalan.

let radius = 500;
let tube_stations = datatable(tube_station_name:string, lng:real, lat: real)
[
    "St. James' Park",        -0.13451078568013486, 51.49919145858172,
     "London Bridge station", -0.08492752160134387, 51.504876316440914,
     // more points
];
let streets = datatable(street_name:string, line:dynamic)
[
    "Buckingham Palace", dynamic({"type":"LineString","coordinates":[[-0.1399656708283601,51.50190802248855],[-0.14088438832752104,51.50012082761452]]}),
    "London Bridge",    dynamic({"type":"LineString","coordinates":[[-0.087152,51.509596],[-0.088340,51.506110]]}),
    // more lines
];
let join_level = 14;
let lines = materialize(streets | extend id = new_guid());
let res = 
    lines
    | project id, covering = geo_line_to_s2cells(line, join_level, radius)
    | mv-expand covering to typeof(string)
    | join kind=inner hint.strategy=broadcast
    (
        tube_stations
        | extend covering = geo_point_to_s2cell(lng, lat, join_level)
    ) on covering;
res | lookup lines on id
| where geo_distance_point_to_line(lng, lat, line) <= radius
| summarize count = count() by name = street_name
nama jumlah
Istana Buckingham 1
Jembatan London 1

Jika baris tidak valid, hasil null akan dikembalikan.

let line = dynamic({"type":"LineString","coordinates":[[[0,0],[0,0]]]});
print isnull(geo_line_to_s2cells(line))
print_0
Benar