Azure Stream Analyticsの地理空間機能は、ライドシェア、フリート管理、資産追跡、ジオフェンシング、携帯電話追跡などのシナリオでリアルタイムの地理空間データのストリーミング解析を可能にします。 わずか数行のクエリコードで、Stream Analytics Query Languageの7つの組み込み関数(CreateLineString、 CreatePoint、 CreatePolygon、 ST_DISTANCE、 ST_OVERLAPS、 ST_INTERSECTS、 ST_WITHIN)を活用し、すべてのWKTタイプとGeoJSONポイント、ポリゴン、ラインストリングをサポートするソリューションを構築できます。 この記事では各関数を説明し、自分のストリーミングデータに適用できる例のクエリを示します。
幾何学の種類と座標順序
地理空間関数は3種類のGeoJSONジオメトリで動作します。 点とは、経度と緯度によって定義された単一の場所です。 LineStringとは、ルートや道路のように、2点以上の点が順序付けられた集合で、連結した直線を形成します。 ポリゴンとは、境界が出発点に戻る閉じた形状のことです。例えば建物のフットプリントやジオフェンスなどです。
機能は2つのグループに分かれます。 コンストラクタ関数(CreatePoint、 CreateLineString、 CreatePolygon)は、イベントデータの座標値からジオメトリを作成します。 関係関数(ST_DISTANCE、 ST_OVERLAPS、 ST_INTERSECTS、 ST_WITHIN)は、二つの幾何学を比較し、それらが空間でどのように関係するかを記述します。
GeoJSONでは、座標は経度が先、緯度が次に並ぶため、入力された緯度と経度は結果の幾何学の中で逆の順序で現れます。 この順序と、多角形が要求する反時計回りのリングの向きを理解することで、各関数の出力を予測するのに役立ちます。
CreateLineString
CreateLineString はGeoJSON LineStringを返す構成関数であり、LineStringは地図上の直線として連結された点の列を表す幾何学です。 2点以上のポイントを受け入れ、リストした順番で接続するため、ストリーミングデータからルート、経路、道路区間を自然にモデル化できます。
以下の例は、3つの点をLineStringに結合することでこの挙動を示しています。 最初のポイントは入力データのストリーミングから来ており、残りの2つは手動で定義します。
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ポリゴンを返すコンストラクタ関数です。 ポリゴンは、建物のフットプリント、倉庫の境界、ジオフェンスなど、マップ上の囲いのあるエリアを表します。 点の順序は右手のリング方向、つまり反時計回りに従います。宣言した順序で点から次の点へ歩くと、多角形の中心はずっと左側に留まります。
以下の例は、3点から多角形を作成することでこの挙動を示しています。 最初の2点は手動で定義し、最後の点は入力データから得られます。
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 はメートル単位で2つの幾何学間の距離を返す関係関数です。 これにより、2つの場所がどれほど近いか遠いかを把握でき、近接車両の警報やサービスエリアの計算などの近接シナリオに役立ちます。
以下の例は、ガソリンスタンドが車から10km未満の距離にある場合にこの関数を使う方法を示しています。
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 は2つの幾何学を比較し、共通の領域を共有しているかどうかを報告する関係関数です。 ジオメトリが重なるときは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 は、ある幾何学が他の幾何学に完全に含まれているかどうかを報告する関係関数です。 最初のジオメトリが2つ目のジオメトリの内側にある場合は1を返し、そうでない場合は0を返します。これはジオフェンシングや配送ゾーンチェックなどの封じ込めシナリオの基礎となっています。
以下の例は、配達目的地ポイントが特定の倉庫ポリゴン内にあるかどうかを判定することで、この挙動を示しています。
SELECT
ST_WITHIN(input.deliveryDestination, input.warehouse)
FROM input
入力例
| deliveryDestination | 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 リファレンスを参照してください。