共用方式為


geo_polygon_lookup外掛程式 (預覽)

適用於:✅Microsoft FabricAzure 數據總管

外掛程式 geo_polygon_lookup 會在查閱表格中查閱 Polygon 值,並傳回具有相符值的數據列。 外掛程式是使用運算子叫 evaluate 用的。

語法

T|evaluategeo_polygon_lookup(LookupTable,LookupPolygonKey,SourceLongitude,SourceLatitude, [ radius ] , [ return_unmatched ] , [ lookup_area_radius ] , [ return_lookup_key ] )

參數

名稱 類型 為必填項目 說明
T string ✔️ 表格式輸入,其數據行 SourceLongitudeSourceLatitude 用於多邊形比對。
LookupTable string ✔️ 含有多邊形查閱數據的數據表或表格式表達式,其數據行 LookupPolygonKey 用於多邊形比對。
LookupPolygonKey dynamic ✔️ 具有 GeoJSON 格式LookupTable 資料行,以及與每個 SourceLongitude、SourceLatitudes 值相符的動態類型之 Polygon 或 multipolygon 的數據行。
SourceLongitude real ✔️ 要查閱LookupTable中具有經度值之 T 的數據行。 以度為單位的經度值。 有效值為實數,且範圍 [-180, +180]。
SourceLatitude real ✔️ LookupTable中查閱具有緯度值的 T 數據行。 以度為單位的緯度值。 有效值為實數,且範圍 [-90, +90]。
半徑 real 選擇性半徑值,定義位置視為相符位置之多邊形框線的長度。
return_unmatched bool 選擇性布爾值旗標,定義結果是否應該包含所有或只相符的數據列(預設值: false - 只傳回相符的數據列)。
lookup_area_radius real 選擇性的查閱區域半徑距離公尺值,有助於比對位置與其各自的多邊形。
return_lookup_key bool 選擇性布爾值旗標,定義結果是否應該包含 數據行LookupPolygonKey (預設值: false)。

退貨

外掛程式 geo_polygon_lookup 會傳回聯結的結果(查閱)。 數據表的架構是源數據表和查閱數據表的聯集,類似於運算子的結果lookup

多邊形中的點內含專案是透過 geo_point_in_polygon()測試,或如果設定半徑,則 geo_distance_point_to_polygon()

如果 return_unmatched 自變數設定為 true,則產生的數據表會同時包含相符和不相符的數據列(填入 Null)。

如果 return_unmatched 自變數設定為 false,或省略 (使用的預設值 false ),產生的數據表就會有與相符結果一樣多的記錄。 相較於執行,這種查閱變體的效能 return_unmatched=true 更好。

設定 lookup_area_radius 長度會覆寫內部比對機制,而且可能會改善或惡化運行時間和記憶體耗用量。 這不會影響查詢正確性。 深入瞭解如何設定此選擇性值。

備註

  • 此外掛程式涵蓋將位置分類為多邊形的案例,假設查閱表格大小很小,而輸入數據表選擇性地具有較大的大小。
  • 外掛程式的效能取決於查閱和數據源數據表的大小、數據行數目,以及相符記錄的數目。
  • 地理空間座標會解譯為 WGS-84 座標參考系統所代表。
  • 用於地球上測量的 地緣日期 是球體。 多邊形邊緣是球體上的 地理區域
  • 如果輸入多邊形邊緣是直線笛卡兒線,請考慮使用 geo_polygon_densify() 將平面邊緣轉換成地理座標。
  • 輸入多邊形應該有效。

多邊形定義和條件約束

dynamic({“type”: “Polygon”,“coordinates”: [ LinearRingShell, LinearRingHole_1, ..., LinearRingHole_N ]})

dynamic({“type”: “MultiPolygon”,“coordinates”: [[LinearRingShell, LinearRingHole_1, ..., LinearRingHole_N ], ..., [LinearRingShell, LinearRingHole_1, ..., LinearRingHole_M]})

  • LinearRingShell 是必要的,並定義為 counterclockwise 已排序的座標陣列 [[lng_1,lat_1],...,[lng_i,lat_i],...,[lng_j,lat_j],...,[lng_1,lat_1]]。 只能有一個殼層。
  • LinearRingHole 是選擇性的,並定義為 clockwise 已排序的座標數位列 [[lng_1,lat_1],...,[lng_i,lat_i],...,[lng_j,lat_j],...,[lng_1,lat_1]]。 可以有任意數量的內環和孔。
  • 線性Ring 頂點必須與至少三個座標相異。 第一個座標必須等於最後一個座標。 至少需要四個專案。
  • 座標 [經度, 緯度] 必須有效。 經度必須是範圍 [-180, +180] 中的實數,而緯度必須是範圍 [-90, +90] 中的實數。
  • LinearRingShell 會括住球體的大部分部分。 LinearRing 會將球體分成兩個區域。 系統會選擇兩個區域中的較小一個。
  • LinearRing 邊緣長度必須小於 180 度。 選擇兩個頂點之間的最短邊緣。
  • LinearRings 不得交叉且不得共享邊緣。 LinearRings 可能會共享頂點。

備註

  • 多邊形不一定包含其頂點。 多邊形中的點內含專案已定義,因此,如果地球細分為多邊形,則每個點都只包含一個多邊形。 因此,設定Radius = 0 不等於不設定它。

設定lookup_area_radius (如有需要)

設定查閱區域半徑會覆寫符合其個別多邊形位置的內部機制。 此值是以公尺為單位的距離。 在理想情況下,查閱區域半徑應該代表與多邊形中心之間的距離,因此在該距離內,點會以一對一的方式與一個多邊形完全相符,而且在該距離內,該多邊形不超過單一多邊形。 由於多邊形數據可能很大,因此多邊形的大小和形狀可能會有很大的差異,而且多邊形彼此相近,因此很難想出能發揮最佳效能的半徑。 如有需要,以下是可能有助於的範例。

PolygonsTable |專案值 = sqrt(geo_polygon_area(多邊形)) |summarize min = min(value), avg = avg(value), max = max(value)

請嘗試使用從平均值開始到最小值的查閱半徑(如果多邊形彼此接近),或最大值為 2 的倍數。

小提示

  • 如果 Locations 數據表有太多彼此接近的座標,請考慮使用 geo_point_to_s2cell() 加以匯總。
  • 如果您想要知道是否有任何多邊形包含一個點,請嘗試下列步驟:將多邊形集合折疊成一個多多邊形。 然後查詢這個多polygon。 這個方法可能會改善效能。 請參閱下列範例。
  • 您可以使用 geo_polygon_to_s2cells() 來建置更個人化(或高效能)的聯結功能。

範例

下列範例只會傳回相符的數據列。

let polygons = datatable(polygon_name:string, polygon:dynamic)
[
    "New York", dynamic({"type":"Polygon", "coordinates":[[[-73.97375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.99910622331991,40.74112695466084],[-73.97375470114766,40.74300078124614]]]}),
    "Paris", dynamic({"type":"Polygon","coordinates":[[[2.57564669886321,48.769567764921334],[2.420098611499384,49.05163394896812],[2.1016783119165723,48.80113794475062],[2.57564669886321,48.769567764921334]]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "National Museum of Mathematics", -73.98778501496217, 40.743565232771545,
    "Eiffel Tower", 2.294489426068907, 48.858263476169185,
    "London", -0.13245599272019604, 51.49879464208368,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
];
locations
| evaluate geo_polygon_lookup(polygons, polygon, longitude, latitude, return_lookup_key = true)

輸出

location_name 經度 緯度 polygon_name 多邊形
紐約國家數學博物館 -73.9877850149622 40.7435652327715 紐約 {“type”:“Polygon”,“coordinates”:[[-7375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.99910622331992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
帝國大廈 -73.9856733789857 40.7484262997738 紐約 {“type”:“Polygon”,“coordinates”:[[-7375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.99910622331992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
埃菲爾鐵塔 2.29448942606891 48.8582634761692 巴黎 {“type”:“Polygon”,“coordinates”:[[[[2.5756469886321,48.769567764921337],[2.420098611499384,49.05163394896812],[2.1016783119165725,48.80113794475062],[2.5756469886321,48.769567764921337]]}

下列範例會傳回相符和非配對數據列。

let polygons = datatable(polygon_name:string, polygon:dynamic)
[
    "New York", dynamic({"type":"Polygon", "coordinates":[[[-73.97375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.99910622331991,40.74112695466084],[-73.97375470114766,40.74300078124614]]]}),
    "Paris", dynamic({"type":"Polygon","coordinates":[[[2.57564669886321,48.769567764921334],[2.420098611499384,49.05163394896812],[2.1016783119165723,48.80113794475062],[2.57564669886321,48.769567764921334]]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "NY National Museum of Mathematics", -73.98778501496217, 40.743565232771545,
    "Eiffel Tower", 2.294489426068907, 48.858263476169185,
    "London", -0.13245599272019604, 51.49879464208368,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
];
locations
| evaluate geo_polygon_lookup(polygons, polygon, longitude, latitude, return_unmatched = true, return_lookup_key = true)

輸出

location_name 經度 緯度 polygon_name 多邊形
紐約國家數學博物館 -73.9877850149622 40.7435652327715 紐約 {“type”:“Polygon”,“coordinates”:[[-7375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.99910622331992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
帝國大廈 -73.9856733789857 40.7484262997738 紐約 {“type”:“Polygon”,“coordinates”:[[-7375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.99910622331992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
埃菲爾鐵塔 2.29448942606891 48.8582634761692 巴黎 {“type”:“Polygon”,“coordinates”:[[[[2.5756469886321,48.769567764921337],[2.420098611499384,49.05163394896812],[2.1016783119165725,48.80113794475062],[2.5756469886321,48.769567764921337]]}
自由女神像 -74.04462223203123 40.689195627512674
倫敦 -0.13245599272019604 51.498794642083681

下列範例會傳回相符和非相符的數據列,其中半徑設定為 7 公里。

let polygons = datatable(polygon_name:string, polygon:dynamic)
[
    "New York", dynamic({"type":"Polygon", "coordinates":[[[-73.97375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.99910622331991,40.74112695466084],[-73.97375470114766,40.74300078124614]]]}),
    "Paris", dynamic({"type":"Polygon","coordinates":[[[2.57564669886321,48.769567764921334],[2.420098611499384,49.05163394896812],[2.1016783119165723,48.80113794475062],[2.57564669886321,48.769567764921334]]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "NY National Museum of Mathematics", -73.98778501496217, 40.743565232771545,
    "Eiffel Tower", 2.294489426068907, 48.858263476169185,
    "London", -0.13245599272019604, 51.49879464208368,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
];
locations
| evaluate geo_polygon_lookup(polygons, polygon, longitude, latitude, radius = 7000, return_unmatched = true, return_lookup_key = true)

輸出

location_name 經度 緯度 polygon_name 多邊形
紐約國家數學博物館 -73.9877850149622 40.7435652327715 紐約 {“type”:“Polygon”,“coordinates”:[[-7375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.99910622331992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
帝國大廈 -73.9856733789857 40.7484262997738 紐約 {“type”:“Polygon”,“coordinates”:[[-7375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.99910622331992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
埃菲爾鐵塔 2.29448942606891 48.8582634761692 巴黎 {“type”:“Polygon”,“coordinates”:[[[[2.5756469886321,48.769567764921337],[2.420098611499384,49.05163394896812],[2.1016783119165725,48.80113794475062],[2.5756469886321,48.769567764921337]]}
自由女神像 -74.04462223203123 40.689195627512674 紐約 {“type”:“Polygon”,“coordinates”:[[-7375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.99910622331992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
倫敦 -0.13245599272019604 51.498794642083681

下列範例會依多邊形計算位置。

let polygons = datatable(polygon_name:string, polygon:dynamic)
[
    "New York", dynamic({"type":"Polygon", "coordinates":[[[-73.97375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.99910622331991,40.74112695466084],[-73.97375470114766,40.74300078124614]]]}),
    "Paris", dynamic({"type":"Polygon","coordinates":[[[2.57564669886321,48.769567764921334],[2.420098611499384,49.05163394896812],[2.1016783119165723,48.80113794475062],[2.57564669886321,48.769567764921334]]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "NY National Museum of Mathematics", -73.98778501496217, 40.743565232771545,
    "Eiffel Tower", 2.294489426068907, 48.858263476169185,
    "London", -0.13245599272019604, 51.49879464208368,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
];
locations
| evaluate geo_polygon_lookup(polygons, polygon, longitude, latitude)
| summarize count() by polygon_name

輸出

polygon_name 計數_
紐約 2
巴黎 1