geo_line_to_s2cells()
적용 대상: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
지구의 선 또는 여러 줄을 포함하는 S2 셀 토큰을 계산합니다. 이 함수는 유용한 지리 공간적 조인 도구입니다.
S2 셀 계층 구조에 대해 자세히 알아보세요.
구문
geo_line_to_s2cells(
lineString [,
level[ ,
radius]])
구문 규칙에 대해 자세히 알아봅니다.
매개 변수
이름 | Type | 필수 | 설명 |
---|---|---|---|
lineString | dynamic |
✔️ | GeoJSON 형식의 줄 또는 여러 줄입니다. |
level | int |
요청된 셀 수준을 정의합니다. 지원되는 값은 [0, 30] 범위에 있습니다. 지정하지 않으면 기본값 11 이 사용됩니다. |
|
반지름 | real |
버퍼 반경(미터)입니다. 지정하지 않으면 기본값 0 이 사용됩니다. |
반품
줄 또는 여러 줄을 포함하는 S2 셀 토큰 문자열의 배열입니다. 반지름이 양수 값으로 설정된 경우 덮개는 입력 셰이프와 입력 기하 도형의 반지름 내의 모든 점이 됩니다.
줄, 수준, 반지름이 잘못되었거나 셀 수가 제한을 초과하면 쿼리에서 null 결과를 생성합니다.
참고 항목
- S2 셀 토큰으로 선을 덮는 것은 좌표를 선과 일치시켜 가까운 선을 찾는 데 유용할 수 있습니다.
- 줄 덮개 토큰은 동일한 S2 셀 수준입니다.
- 줄당 최대 토큰 수는 65536개입니다.
- 지구 거리를 측정하는 데 사용되는 측지 데이텀은 구입니다. 선 가장자리는 구의 측지식 입니다.
- 입력 선 가장자리가 직선 카티전 선인 경우 평면 가장자리를 측지로 변환하기 위해 geo_line_densify()를 사용하는 것이 좋습니다.
S2 셀 수준 선택
- 두 줄이 같은 셀을 공유하지 않도록 모든 줄을 하나 또는 몇 개의 고유한 셀로 덮는 것이 이상적입니다.
- 실제로는 셀이 12개 이하인 셀만 덮어보세요. 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 |