geo_line_to_s2cells()

Oblicza tokeny komórek S2, które obejmują linię lub wielowierszową na Ziemi. Ta funkcja jest przydatnym narzędziem sprzężenia geoprzestrzennego.

Składnia

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

Dowiedz się więcej o konwencjach składniowych.

Parametry

Nazwa Typ Wymagane Opis
Linestring dynamic ✔️ Wiersz lub wielowierszowy w formacie GeoJSON.
Poziom int Definiuje żądany poziom komórki. Obsługiwane wartości znajdują się w zakresie [0, 30]. Jeśli nie zostanie określona, zostanie użyta wartość 11 domyślna.
Promień real Promień buforu w metrach. Jeśli nie zostanie określona, zostanie użyta wartość 0 domyślna.

Zwraca

Tablica ciągów tokenu komórki S2, które obejmują wiersz lub wielowierszowy. Jeśli promień jest ustawiony na wartość dodatnią, pokrycie będzie mieć zarówno kształt wejściowy, jak i wszystkie punkty w promieniu geometrii wejściowej.

Jeśli którykolwiek z następujących: wiersz, poziom, promień jest nieprawidłowy lub liczba komórek przekracza limit, zapytanie spowoduje wygenerowanie wyniku null.

Uwaga

  • Pokrycie linii z tokenami komórek S2 może być przydatne w dopasowywaniu współrzędnych do linii, dzięki czemu znalezienie punktów znajdujących się w pobliżu linii.
  • Linia obejmująca tokeny ma ten sam poziom komórki S2.
  • Maksymalna liczba tokenów na wiersz wynosi 65536.
  • Geodetyczne datum używane do mierzenia odległości na Ziemi jest sferą. Krawędzie linii są geodesics na sferze.
  • Jeśli krawędzie linii wejściowej są liniami kartezjańskimi, rozważ użycie geo_line_densify(), aby przekonwertować krawędzie planarne na geodesy.

Wybieranie poziomu komórki S2

  • W idealnym przypadku chcemy pokryć każdą linię jednym lub tylko kilkoma unikatowymi komórkami, tak aby żadna dwie linie nie miały tej samej komórki.
  • W praktyce spróbuj zakryć tylko kilka komórek, nie więcej niż tuzin. Pokrycie z ponad 10.000 komórek może nie przynieść dobrej wydajności.
  • Użycie czasu wykonywania zapytań i pamięci może się znacznie różnić ze względu na różne wartości na poziomie komórki S2.

Sugestie dotyczące poprawy wydajności

  • Jeśli to możliwe, zmniejsz rozmiar tabeli współrzędnych przed sprzężenia, grupując współrzędne, które są bardzo blisko siebie przy użyciu klastra geoprzestrzennego lub przez odfiltrowanie niepotrzebnych współrzędnych ze względu na charakter danych lub potrzeb biznesowych.
  • Jeśli to możliwe, zmniejsz liczbę wierszy ze względu na charakter danych lub potrzeb biznesowych. Odfiltruj niepotrzebne wiersze przed sprzężeniem, zakres do obszaru zainteresowania lub ujednolicania wierszy.
  • W przypadku bardzo dużych linii zmniejsz ich rozmiar przy użyciu geo_line_simplify().
  • Zmiana poziomu komórki S2 może zwiększyć wydajność i zużycie pamięci.
  • Zmiana rodzaju sprzężenia i wskazówki mogą zwiększyć wydajność i zużycie pamięci.
  • W przypadku ustawienia promienia dodatniego można przywrócić promień 0 w postaci buforowanej przy użyciu geo_line_buffer() zwiększyć wydajność.

Przykłady

Poniższe zapytanie znajduje wszystkie stacje metra w odległości 500 metrów od ulic i agreguje rury zlicza się według nazwy ulicy.

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
name count
Pałac Buckingham 1
London Bridge 1

W przypadku nieprawidłowego wiersza zostanie zwrócony wynik o wartości null.

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