Udostępnij za pośrednictwem


geo_line_to_s2cells()

Dotyczy: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

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

Przeczytaj więcej na temat hierarchii komórek S2.

Składnia

geo_line_to_s2cells(lineString [, poziom[ , promień]])

Dowiedz się więcej na temat konwencji składni.

Parametry

Nazwisko Type Wymagania 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 określono, zostanie użyta wartość 11 domyślna.
promień real Promień buforu w metrach. Jeśli nie określono, 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 elementów: wiersz, poziom, promień jest nieprawidłowy lub liczba komórek przekracza limit, zapytanie spowoduje wygenerowanie wyniku o wartości null.

Uwaga

  • Pokrycie linii za pomocą tokenów komórek S2 może być przydatne w dopasowywaniu współrzędnych do linii, w związku z czym znalezienie punktów znajdujących się w pobliżu.
  • Wiersz obejmujący tokeny są na tym samym poziomie 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ą geodesykami na sferze.
  • Jeśli krawędzie linii wejściowej są liniami kartezjańskimi, rozważ użycie geo_line_densify() w celu przekonwertowania krawędzi planarnych na geodesiki.

Wybieranie poziomu komórki S2

  • W idealnym przypadku chcemy pokryć każdą linię z jedną 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ężenie, grupując współrzędne, które znajdują się bardzo blisko siebie, używając klastrowania geoprzestrzennego lub przez filtrowanie 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ężeniami, zakres do obszaru zainteresowania lub ujednolicenie 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ówka może poprawić 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