geo_line_lookup插件(预览版)

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

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

语法

T|evaluategeo_line_lookup(LookupTable,LookupLineKey,SourceLongitude,SourceLatitude,半径, [ return_unmatched ] , [ lookup_area_radius ] , [ return_lookup_key ] )

参数

名称 类型 必选 DESCRIPTION
T string ✔️ 表格输入,其列 SourceLongitudeSourceLatitude 用于行匹配。
LookupTable string ✔️ 包含行查找数据的表或表格表达式,其列 LookupLineKey 用于行匹配。
LookupLineKey dynamic ✔️ 具有 GeoJSON 格式LookupTable 列,以及与每个 SourceLongitudeSourceLatitudes 值匹配的动态类型的行或多行列。
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 一个可选的布尔标志,用于定义结果是否应包括列 LookupLineKey (默认值: false) 。

退货

geo_line_lookup 插件返回联接的结果(查找)。 表的架构是源表和查阅表的并集,类似于运算符的结果lookup

通过 geo_distance_point_to_line()测试距离线的位置距离。

如果 return_unmatched 参数设置为 true,则生成的表包括匹配的行和不匹配的行(用 null 填充)。

如果 return_unmatched 参数设置为 false或省略(使用默认值 false ),则生成的表包含与匹配结果相同的记录数。 与执行相比 return_unmatched=true ,此查找变体的性能更好。

设置 lookup_area_radius 长度会替代内部匹配机制,并可能会改善或恶化运行时和\或内存消耗。 它不会影响查询正确性。 请阅读下面有关如何设置此可选值的详细信息。

注释

  • 此插件介绍了将位置分类到从该行到半径内的行的方案,假设查找表格大小较小,输入表可以选择具有更大的大小。
  • 插件的性能取决于查找和数据源表的大小、列数和匹配记录数。
  • 地理空间坐标解释为 WGS-84 坐标参考系统表示。
  • 用于测量地球上距离 的地缘基准 是一个球体。 线条边缘是球体上的 测地线
  • 如果输入线边缘是直笛卡尔线,请考虑使用 geo_line_densify() 将平面边缘转换为地理区域。
  • 输入行应有效。

LineString 定义和约束

dynamic({“type”: “LineString”,“coordinates”: [[lng_1,lat_1], [lng_2,lat_2],..., [lng_N,lat_N]]})

dynamic({“type”: “MultiLineString”,“coordinates”: [[line_1, line_2, ..., line_N]]})

  • LineString 坐标数组必须至少包含两个条目。
  • 坐标 [经度, 纬度] 必须有效,其中经度是 [-180, +180] 范围内的实数,纬度是 [-90, +90] 范围内的实数。
  • 边缘长度必须小于 180 度。 选择两个顶点之间的最短边缘。

设置lookup_area_radius(如果需要)

设置查找区域半径会覆盖内部机制,以便将位置匹配到各自的行。 该值是一个以米为单位的距离。 理想情况下,查找区域半径应表示与线条中心之间的距离,这样一个距离内,一个点就完全匹配一行,在该距离内,就没有一条线了。 由于线条数据可能很大,因此与彼此相比,线条的大小和形状可能会大不相同,并且线条相互接近,因此很难想出性能最佳的半径。 如果需要,下面是一个可能有所帮助的示例。

LinesTable |项目值 = geo_line_length(line) |summarize min = min(value), avg = avg(value), max = max(value)

尝试使用从平均值开始的查找半径(如果线条彼此接近)或最大值(2 的倍数)。

小窍门

例子

以下示例仅返回匹配的行。

let roads = datatable(road_name:string, road:dynamic)
[
    "5th Avenue NY", dynamic({"type":"LineString","coordinates":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}),
    "Palace Ave", dynamic({"type":"LineString","coordinates":[[-0.18756982045002246,51.50245944666557],[-0.18908519740253382,51.50544952706903]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "Grand Central Terminal", -73.97713140725149, 40.752730320824895,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
    "Kensington Palace", -0.1885272501232862,  51.504906159672316
];
locations
| evaluate geo_line_lookup(roads, road, longitude, latitude, 100, return_lookup_key = true)

输出

location_name 经度 纬度 road_name 道路
帝国大厦 -73.9856733789857 40.7484262997738 纽约第五大道 {“type”:“LineString”,“coordinates”:[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]}}
肯辛顿宫 -0.188527250123286 51.5049061596723 宫殿大道 {“type”:“LineString”,“coordinates”:[[-0.18756982045002247,51.5024594466557],[-0.1890851974025383,51.50544952706903]}

以下示例返回匹配行和非匹配行。

let roads = datatable(road_name:string, road:dynamic)
[
    "5th Avenue NY", dynamic({"type":"LineString","coordinates":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}),
    "Palace Ave", dynamic({"type":"LineString","coordinates":[[-0.18756982045002246,51.50245944666557],[-0.18908519740253382,51.50544952706903]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "Grand Central Terminal", -73.97713140725149, 40.752730320824895,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
    "Kensington Palace", -0.1885272501232862,  51.504906159672316
];
locations
| evaluate geo_line_lookup(roads, road, longitude, latitude, 100, return_unmatched = true, return_lookup_key = true)

输出

location_name 经度 纬度 road_name 道路
帝国大厦 -73.9856733789857 40.7484262997738 纽约第五大道 {“type”:“LineString”,“coordinates”:[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]}}
肯辛顿宫 -0.188527250123286 51.5049061596723 宫殿大道 {“type”:“LineString”,“coordinates”:[[-0.18756982045002247,51.5024594466557],[-0.1890851974025383,51.50544952706903]}
自由女神像 -74.04462223203123 40.689195627512674
大中央终端 -73.97713140725149 40.752730320824895

以下示例返回匹配行和非匹配行,半径设置为 350m。

let roads = datatable(road_name:string, road:dynamic)
[
    "5th Avenue NY", dynamic({"type":"LineString","coordinates":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}),
    "Palace Ave", dynamic({"type":"LineString","coordinates":[[-0.18756982045002246,51.50245944666557],[-0.18908519740253382,51.50544952706903]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "Grand Central Terminal", -73.97713140725149, 40.752730320824895,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
    "Kensington Palace", -0.1885272501232862,  51.504906159672316
];
locations
| evaluate geo_line_lookup(roads, road, longitude, latitude, 350, return_unmatched = true, return_lookup_key = true)
location_name 经度 纬度 road_name 道路
帝国大厦 -73.9856733789857 40.7484262997738 纽约第五大道 {“type”:“LineString”,“coordinates”:[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]}}
肯辛顿宫 -0.188527250123286 51.5049061596723 宫殿大道 {“type”:“LineString”,“coordinates”:[[-0.18756982045002247,51.5024594466557],[-0.1890851974025383,51.50544952706903]}
大中央终端 -73.97713140725149 40.752730320824895 纽约第五大道 {“type”:“LineString”,“coordinates”:[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]}}
自由女神像 -74.04462223203123 40.689195627512674

以下示例按靠近道路对位置进行计数。

let roads = datatable(road_name:string, road:dynamic)
[
    "5th Avenue NY", dynamic({"type":"LineString","coordinates":[[-73.97291864770574,40.76428551254824],[-73.99708638113894,40.73145135821781]]}),
    "Palace Ave", dynamic({"type":"LineString","coordinates":[[-0.18756982045002246,51.50245944666557],[-0.18908519740253382,51.50544952706903]]}),
];
let locations = datatable(location_name:string, longitude:real, latitude:real)
[
    "Empire State Building", -73.98567337898565, 40.74842629977377,
    "Grand Central Terminal", -73.97713140725149, 40.752730320824895,
    "Statue of Liberty",  -74.04462223203123, 40.689195627512674,
    "Kensington Palace", -0.1885272501232862,  51.504906159672316
];
locations
| evaluate geo_line_lookup(roads, road, longitude, latitude, 350)
| summarize count() by road_name 

输出

road_name 计数_
纽约第五大道 2
宫殿大道 1