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 |
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor