geo_polygon_lookup插件(预览版)

适用于:✅Azure 数据资源管理器

geo_polygon_lookup 插件查找 Polygon 查阅表中的值,并返回具有匹配值的行。 该插件通过 evaluate 运算符调用。

语法

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

参数

名称 类型 必选 DESCRIPTION
T string ✔️ 表格输入,其列 SourceLongitudeSourceLatitude 用于多边形匹配。
LookupTable string ✔️ 包含多边形查找数据的表或表格表达式,其列 LookupPolygonKey 用于多边形匹配。
LookupPolygonKey dynamic ✔️ 具有 GeoJSON 格式LookupTable 或多多边形列,以及与每个 SourceLongitude、SourceLatitudes 值匹配的动态类型的列。
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]]。 只能有一个 shell。
  • LinearRingHole 是可选的,定义为 clockwise 坐标的有序数组 [[lng_1,lat_1],...,[lng_i,lat_i],...,[lng_j,lat_j],...,[lng_1,lat_1]]。 可以有任意数量的内环和孔。
  • 线性顶点必须具有至少三个坐标。 第一个坐标必须等于最后一个坐标。 至少需要四个条目。
  • 坐标 [经度, 纬度] 必须有效。 经度必须是 [-180, +180] 范围内的实数,纬度必须是 [-90, +90] 范围内的实数。
  • LinearRingShell 将括在球体的大部分部分。 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。

小窍门

  • 如果“位置”表具有彼此接近的坐标太多,请考虑使用 geo_point_to_s2cell()聚合它们。
  • 如果想要知道任何多边形是否包含点,请尝试以下步骤:将多边形的集合折叠成一个多多边形。 然后查询此多多边形。 此方法可以提高性能。 请参阅以下示例。
  • 可以使用 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”:[[-73.97375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.9991062231992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
帝国大厦 -73.9856733789857 40.7484262997738 纽约 {“type”:“Polygon”,“coordinates”:[[-73.97375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.9991062231992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
埃菲尔铁塔 2.29448942606891 48.8582634761692 巴黎 {“type”:“Polygon”,“coordinates”:[2.5756469886321,48.769567764921337],[2.420098611499384,49.0516394896812],[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”:[[-73.97375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.9991062231992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
帝国大厦 -73.9856733789857 40.7484262997738 纽约 {“type”:“Polygon”,“coordinates”:[[-73.97375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.9991062231992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
埃菲尔铁塔 2.29448942606891 48.8582634761692 巴黎 {“type”:“Polygon”,“coordinates”:[2.5756469886321,48.769567764921337],[2.420098611499384,49.0516394896812],[2.1016783119165725,48.80113794475062],[2.5756469886321,48.769567764921337]]}
自由女神像 -74.04462223203123 40.689195627512674
伦敦 -0.13245599272019604 51.498794642083681

以下示例返回半径设置为 7 km 的匹配行和非匹配行。

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”:[[-73.97375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.9991062231992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
帝国大厦 -73.9856733789857 40.7484262997738 纽约 {“type”:“Polygon”,“coordinates”:[[-73.97375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.9991062231992,40.7411269546084],[-73.97375470114766,40.74300078124614]]}
埃菲尔铁塔 2.29448942606891 48.8582634761692 巴黎 {“type”:“Polygon”,“coordinates”:[2.5756469886321,48.769567764921337],[2.420098611499384,49.0516394896812],[2.1016783119165725,48.80113794475062],[2.5756469886321,48.769567764921337]]}
自由女神像 -74.04462223203123 40.689195627512674 纽约 {“type”:“Polygon”,“coordinates”:[[-73.97375470114766,40.74300078124614],[-73.98653921014294,40.75486501361894],[-73.9991062231992,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