Delen via


geo_line_to_s2cells()

Berekent S2-celtokens die een lijn of meerdere lijnen op aarde bedekken. Deze functie is een handig hulpprogramma voor georuimtelijke koppeling.

Syntax

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

Meer informatie over syntaxisconventies.

Parameters

Naam Type Vereist Beschrijving
lineString dynamic ✔️ Lijn of meerdere regels in de GeoJSON-indeling.
Niveau int Hiermee definieert u het aangevraagde celniveau. Ondersteunde waarden bevinden zich in het bereik [0, 30]. Als u dit niet opgeeft, wordt de standaardwaarde 11 gebruikt.
Radius real Bufferradius in meters. Als u dit niet opgeeft, wordt de standaardwaarde 0 gebruikt.

Retouren

Matrix van S2-celtokenreeksen die een regel of een meerdere regel bedekken. Als de radius is ingesteld op een positieve waarde, heeft de afdekking zowel de invoervorm als alle punten binnen de radius van de invoergeometrie.

Als een van de volgende opties: lijn, niveau, radius ongeldig is of als het aantal cellen de limiet overschrijdt, produceert de query een null-resultaat.

Notitie

  • Het afdekken van de lijn met S2-celtokens kan handig zijn bij het vergelijken van coördinaten met lijnen, waardoor punten in de buurt van lijnen worden gevonden.
  • De lijn voor tokens is van hetzelfde S2-celniveau.
  • Het maximum aantal tokens per regel is 65536.
  • De geodetische datum die wordt gebruikt om de afstand op aarde te meten, is een bol. Lijnranden zijn geodetische op de bol.
  • Als de randen van de invoerlijn rechte cartesische lijnen zijn, kunt u overwegen geo_line_densify() te gebruiken om planaire randen te converteren naar geodetische lijnen.

Het celniveau S2 kiezen

  • Idealiter zouden we elke regel willen bedekken met één of slechts enkele unieke cellen, zodat geen twee lijnen dezelfde cel delen.
  • Probeer in de praktijk slechts een paar cellen te bedekken, niet meer dan een dozijn. Afdekken met meer dan 10.000 cellen levert mogelijk geen goede prestaties op.
  • De uitvoeringstijd van query's en het geheugenverbruik kunnen sterk verschillen vanwege verschillende waarden op celniveau S2.

Suggesties voor prestatieverbetering

  • Verklein indien mogelijk de grootte van de coördinatentabellen voordat u de join uitvoert door coördinaten die zeer dicht bij elkaar liggen te groeperen met behulp van georuimtelijke clustering of door overbodige coördinaten te filteren vanwege de aard van de gegevens of bedrijfsbehoeften.
  • Verminder indien mogelijk het aantal regels vanwege de aard van de gegevens of zakelijke behoeften. Filter overbodige regels uit voordat u gaat samenvoegen, bereik tot het interessegebied of voeg lijnen samen.
  • In het geval van zeer grote lijnen verkleint u de grootte met behulp van geo_line_simplify().
  • Als u het niveau van de S2-cel wijzigt, kunnen de prestaties en het geheugenverbruik worden verbeterd.
  • Het wijzigen van de soort en hint voor joins kan de prestaties en het geheugenverbruik verbeteren.
  • Als een positieve radius is ingesteld, kan het terugkeren naar radius 0 op gebufferde shape met behulp van geo_line_buffer() de prestaties verbeteren.

Voorbeelden

Met de volgende query worden alle metrostations binnen 500 meter van straten gevonden en worden de buizen geteld op straatnaam.

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
naam count
Buckingham Palace 1
London Bridge 1

In het geval van een ongeldige regel wordt een null-resultaat geretourneerd.

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