다음을 통해 공유


geo_line_to_s2cells()

적용 대상: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft 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