geo_line_to_s2cells()
適用対象: ✅Microsoft Fabric✅Azure データ エクスプローラー✅Azure Monitor✅Microsoft Sentinel
地球上の行または複数行をカバーする S2 セル トークンを計算します。 この関数は、便利な地理空間結合ツールです。
詳細については、「S2 セルの階層」を参照してください。
構文
geo_line_to_s2cells(
lineString [,
level[ ,
radius]])
構文規則について詳しく知る。
パラメーター
件名 | タイプ | Required | 説明 |
---|---|---|---|
lineString | dynamic |
✔️ | GeoJSON 形式の行または複数行。 |
level | int |
要求されたセル レベルを定義します。 サポートされる値の範囲は [0, 30] です。 指定されない場合は、既定値の 11 が使用されます。 |
|
半径 | real |
バッファーの半径 (メートル単位)。 指定されない場合は、既定値の 0 が使用されます。 |
返品
行または複数行をカバーする S2 セル トークン文字列の配列。 半径が正の値に設定されている場合、カバーは入力図形と入力ジオメトリの半径内のすべてのポイントの両方になります。
行、レベル、半径のいずれかが無効であるか、セル数が制限を超えた場合、クエリは null 結果を生成します。
Note
- 線を S2 セル トークンで覆うと、座標を線に一致させ、近くの線を見つけるのに役立ちます。
- トークンをカバーする行は、同じ S2 セル レベルです。
- 1 行あたりのトークンの最大数は 65536 です。
- 地球上での距離の測定に使う測地原点は、球体となっています。 線のエッジは、球体の測地線です。
- 入力線のエッジが直交直線の場合は、geo_line_densify () を使用して平面のエッジを測地線に変換することを検討してください。
S2 セル レベルの選択
- 理想的には、2 つの行が同じセルを共有していないように、1 つまたは少数の一意のセルですべての行をカバーしたいと考えています。
- 実際には、10 個以下の数個のセルでカバーしてみてください。 10,000 個を超えるセルをカバーしても、優れたパフォーマンスが得られない可能性があります。
- クエリの実行時間とメモリ消費量は、S2 セル レベルの値が異なるため、大きく異なる場合があります。
パフォーマンス向上に関する推奨事項
- 可能であれば、 地理空間クラスタリングを使用して相互に非常に近い座標をグループ化するか データまたはビジネス ニーズの性質により不要な座標を除外することで、結合前に座標テーブルのサイズを小さくします。
- 可能であれば、データまたはビジネス ニーズの性質上、行数を減らします。 結合の前に不要な行を除外し、対象領域にスコープを設定するか、行を統合します。
- 非常に大きな線の場合は、 geo_line_simplify()を使用してサイズを小さくします。
- S2 セル レベルを変更すると、パフォーマンスとメモリ消費量が向上する可能性があります。
- 結合の種類とヒントを変更するとパフォーマンスとメモリ消費量が向上する可能性があります。
- 正の半径が設定されている場合、 geo_line_buffer() を使用してバッファーされた図形の半径 0 に戻す場合は、パフォーマンスが向上する可能性があります。
例
次のクエリでは、500 メートルの道路内のすべてのチューブ ステーションを検索し、道路名でチューブ数を集計します。
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 |
---|---|
バッキンガム宮殿 | 1 |
ロンドン橋 | 1 |
行が無効な場合は、null 結果が返されます。
let line = dynamic({"type":"LineString","coordinates":[[[0,0],[0,0]]]});
print isnull(geo_line_to_s2cells(line))
print_0 |
---|
True |