外掛程式 geo_polygon_lookup
會在查閱表格中查閱 Polygon
值,並傳回具有相符值的數據列。 外掛程式是使用運算子叫 evaluate
用的。
語法
T|
evaluate
geo_polygon_lookup(
LookupTable,
LookupPolygonKey,
SourceLongitude,
SourceLatitude,
[ radius ] ,
[ return_unmatched ] ,
[ lookup_area_radius ] ,
[ return_lookup_key ] )
參數
名稱 | 類型 | 為必填項目 | 說明 |
---|---|---|---|
T | string |
✔️ | 表格式輸入,其數據行 SourceLongitude 和 SourceLatitude 用於多邊形比對。 |
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 |