KQL查询geo_point_in_polygon动态多边形参数报错问题排查
解决KQL中geo_point_in_polygon的动态类型参数报错问题
问题根源
你之前的查询里,polygon变量是一个单行列的表对象,但geo_point_in_polygon函数需要的是标量dynamic类型值,两者类型不匹配导致报错。而直接定义dynamic(...)时,变量本身就是标量,所以能正常运行。
解决方案
核心是把从表中获取的多边形数据,从表对象转换为标量dynamic值,具体步骤如下:
- 用
toscalar()函数提取表中的单个值,将表转换为标量 - 如果原表的
Value字段是字符串类型(而非dynamic),需额外用parse_json()把字符串转为dynamic格式
修正后的完整查询
let polygon = toscalar( adt_dh_FerrovialTwins_westeurope | where ModelId == "dtmi:ferrovial:domain:models:v1:acopiotemploraltwin;1" and Key == "localizacion" | top 1 by Id | project Value ); // 若Value字段存的是字符串格式的GeoJSON,替换上面的polygon定义为: // let polygon = parse_json(toscalar( // adt_dh_FerrovialTwins_westeurope // | where ModelId == "dtmi:ferrovial:domain:models:v1:acopiotemploraltwin;1" // and Key == "localizacion" // | top 1 by Id // | project Value // )); adt_dh_FerrovialTwins_westeurope | where ModelId == "dtmi:ferrovial:domain:models:v1:camiondetierrastwin;1" and Key == "localizacion" | extend lon=(Value).geometry.coordinates[0], lat= (Value).geometry.coordinates[1] | project todecimal(lon), todecimal(lat), Id | where geo_point_in_polygon(lon, lat, polygon) | summarize count() by Id, hash = geo_point_to_s2cell(lon, lat, 7) | project geo_s2cell_to_central_point(hash), Id, count_ | render piechart with (kind=map)
额外检查
可以用以下语句确认Value字段的类型:
adt_dh_FerrovialTwins_westeurope | getschema
如果结果里Value的DataType是string,就必须用parse_json()转换;如果是dynamic,直接用toscalar()即可。
内容的提问来源于stack exchange,提问作者cdiazal
相关产品推荐
相关产品推荐

