流分析地理空间函数简介

Azure 流分析 中的地理空间功能可对流式地理空间数据进行实时分析,适用于网约车、车队管理、资产跟踪、地理围栏以及跨蜂窝基站的手机跟踪等场景。 只需几行查询代码,你就能构建使用Stream Analytics查询语言中内置的七个函数(CreateLineStringST_OVERLAPSST_WITHINCreatePointCreatePolygonST_DISTANCEST_INTERSECTS和),这些函数支持所有WKT类型以及GeoJSON点、多边形和线条。 本文介绍了每个函数,并展示了示例查询,方便你将它们应用于自己的流数据。

几何类型与坐标顺序

地理空间函数支持三种 GeoJSON 几何类型。 是由经度和纬度定义的单一位置。 线串是一组有序的两个或多个点组成的连通直线,例如一条路线或一条道路。 多边形是一种封闭形状,其边界返回起点,例如建筑基底或地理围栏。

这些功能分为两类。 构造函数(CreatePointCreateLineStringCreatePolygon)会根据事件数据中的坐标值构建几何体。 关系函数(ST_DISTANCEST_OVERLAPSST_INTERSECTS, 和 ST_WITHIN)比较两个几何体,并描述它们在空间中的关系。

在 GeoJSON 中,坐标顺序是先按经度排序,后按纬度排列,因此输入的纬度和经度在生成的几何中以相反顺序出现。 理解这种顺序,以及多边形所需的逆时针环方向,有助于预测每个函数的输出。

CreateLineString

CreateLineString 是一个构造函数,返回 GeoJSON 线串,这是一种将连通点列表示为地图直线的几何体。 它接受两个或多个点,并按你列出的顺序连接它们,这使得它自然地从流数据中建模路线、路径和路段。

以下示例通过将三个点组合成线串来说明这种行为。 第一点来自流式输入数据,另外两点则是手动定义的。

SELECT  
     CreateLineString(CreatePoint(input.latitude, input.longitude), CreatePoint(10.0, 10.0), CreatePoint(10.5, 10.5))  
FROM input  

输入示例

纬度 经度
3.0 -10.2
-87.33 20.2321

输出示例

{“type” : “LineString”, “coordinates” : [ [-10.2, 3.0], [10.0, 10.0], [10.5, 10.5] ]}

{“type” : “LineString”, “coordinates” : [ [20.2321, -87.33], [10.0, 10.0], [10.5, 10.5] ]}

欲了解更多信息,请参阅 CreateLineString 参考资料。

CreatePoint

CreatePoint 是一个构造函数,返回来自纬度和经度的GeoJSON点。 点是最基本的几何形状,代表地图上的单个位置,例如车辆或资产的当前位置。 纬度和经度值必须是 float 数据类型。

以下示例通过从流输入数据中的纬度和经度值创建点来说明这种行为。

SELECT  
     CreatePoint(input.latitude, input.longitude)  
FROM input 

输入示例

纬度 经度
3.0 -10.2
-87.33 20.2321

输出示例

{“type” : “Point”, “coordinates” : [-10.2, 3.0]}

{“type” : “Point”, “coordinates” : [20.2321, -87.33]}

想了解更多,请参见 CreatePoint 参考文献。

CreatePolygon

CreatePolygon 是一个构造函数,从一组点返回一个 GeoJSON 多边形。 多边形表示地图上的封闭区域,例如建筑基址、仓库边界或地理围栏。 点的顺序遵循右手环方向,或逆时针方向:如果你想象按照你宣告的顺序从一个点走到另一个点,多边形的中心始终保持在你的左侧。

以下示例通过从三个点创建一个多边形来说明这种行为。 前两点是手动定义的,最后一点来自输入数据。

SELECT  
     CreatePolygon(CreatePoint(input.latitude, input.longitude), CreatePoint(10.0, 10.0), CreatePoint(10.5, 10.5), CreatePoint(input.latitude, input.longitude))  
FROM input  

输入示例

纬度 经度
3.0 -10.2
-87.33 20.2321

输出示例

{“type” : “Polygon”, “coordinates” : [[ [-10.2, 3.0], [10.0, 10.0], [10.5, 10.5], [-10.2, 3.0] ]]}

{“type” : “Polygon”, “coordinates” : [[ [[ [20.2321, -87.33], [10.0, 10.0], [10.5, 10.5], [20.2321, -87.33] ]]}

若要了解详细信息,请访问 CreatePolygon 参考。

ST_DISTANCE

ST_DISTANCE 是一个关系函数,返回两个几何体之间的距离(单位为米)。 它帮助您了解两个地点的距离,这对于附近车辆警报和服务区计算等接近场景非常有用。

以下示例展示了如何利用该函数识别加油站距离汽车不到10公里。

SELECT Cars.Location, Station.Location 
FROM Cars c  
JOIN Station s ON ST_DISTANCE(c.Location, s.Location) < 10 * 1000

欲了解更多信息,请参阅 ST_DISTANCE 参考文献。

ST_OVERLAPS

ST_OVERLAPS 是一个关系函数,用于比较两个几何体并报告它们是否共享一个共同区域。 当几何体重叠时返回 1,不重叠时返回 0。 该功能用于检测空间冲突,例如危险区域与兴趣区域相连。

以下示例展示了如何使用该函数识别建筑物是否处于可能的洪水区内。

SELECT Building.Polygon, Flooding.Polygon
FROM Building b 
JOIN Flooding f ON ST_OVERLAPS(b.Polygon, f.Polygon)

下一个示例也使用 ST_OVERLAPS 来检测风暴是否正朝着一辆汽车移动。

SELECT Cars.Location, Storm.Course
FROM Cars c
JOIN Storm s ON ST_OVERLAPS(c.Location, s.Course)

欲了解更多信息,请参阅 ST_OVERLAPS 参考文献。

ST_INTERSECTS

ST_INTERSECTS 是一个关系函数,用于比较两个几何体,并报告它们是交叉还是接触。 当几何体相交时返回1,不相交时返回0。 这个功能帮助你检测路径或区域的交汇点。

以下示例展示了如何使用该函数来判断铺装道路是否与土路相交。

SELECT  
     ST_INTERSECTS(input.pavedRoad, input.dirtRoad)  
FROM input  

输入示例

铺装道路 土路
{“type”:“LineString”, “coordinates”: [ [-10.0, 0.0], [0.0, 0.0], [10.0, 0.0] ]} {“type”:“LineString”, “coordinates”: [ [0.0, 10.0], [0.0, 0.0], [0.0, -10.0] ]}
{“type”:“LineString”, “coordinates”: [ [-10.0, 0.0], [0.0, 0.0], [10.0, 0.0] ]} {“type”:“LineString”, “coordinates”: [ [-10.0, 10.0], [0.0, 10.0], [10.0, 10.0] ]}

输出示例

1

0

若要了解详细信息,请访问 ST_INTERSECTS 参考文档。

ST_WITHIN

ST_WITHIN 是一个关系函数,用于报告一个几何体是否完全包含在另一个内部。 当第一个几何体位于第二个几何体内部时返回1,不在时返回0,这也是地理围栏和配送区检查等封闭场景的基础。

以下示例通过确定配送目的地点是否位于给定的仓库多边形内来说明这种行为。

SELECT  
     ST_WITHIN(input.deliveryDestination, input.warehouse)  
FROM input 

输入示例

配送目的地 warehouse
{“type”:“Point”, “coordinates”: [76.6, 10.1]} {“type”:“Polygon”, “coordinates”: [ [0.0, 0.0], [10.0, 0.0], [10.0, 10.0], [0.0, 10.0], [0.0, 0.0] ]}
{“type”:“Point”, “coordinates”: [15.0, 15.0]} {“type”:“Polygon”, “coordinates”: [ [10.0, 10.0], [20.0, 10.0], [20.0, 20.0], [10.0, 20.0], [10.0, 10.0] ]}

输出示例

0

1

若要了解详细信息,请访问 ST_WITHIN 文档。