Amazon Location Service のジオフェンスで Circle が使えるようになったので試してみた

2022.08.12

いわさです。

Amazon Location Service にはジオフェンスコレクションという機能があって、トラッカーあるいは指定した位置情報をジオフェンスコレクションに送信することで、ジオフェンスの範囲に入ったか外れたかを検知することが出来ます。

これまでは対象のジオフェンスは Polygon データのみサポートされていましたが、本日のアップデートで Circle データがサポートされるようになりました。

使ってみる

ジオフェンスの登録

ジオフェンスの登録をまずは行ってみましょう。
ジオフェンスデータはマネジメントコンソールからも登録出来るのですが、本日時点ではマネジメントコンソールでは Polygon のみがサポートされており Circle は登録出来ません。

Polygon の場合であれば、以下のようにジオフェンスデータを用意してそのままアップロードで登録が可能です。

Circle ジオフェンスを登録する場合は本日時点では AWS API か CLI 経由で登録を行います。
必要なデータは中心の緯度経度とジオフェンスの範囲を示す半径(メートル)です。

ここでは以下のような Circle サンプルデータを用意してみました。クラスメソッド札幌オフィスを中心とした半径 100km です。

circle.json

{
    "Circle": {
        "Center": [
            141.35455553388053,
            43.06588598345024
        ],
        "Radius": 100000
    }
}

AWS CLI を使って登録してみます。
後述しますが、本日時点では V2 はまだサポートされていません。

% aws-v1 location \
        put-geofence \
            --collection-name explore.geofence-collection \
            --geofence-id hogehogecircle \
            --geometry file://circle.json
{
    "CreateTime": "2022-08-11T21:28:30.703Z",
    "GeofenceId": "hogehogecircle",
    "UpdateTime": "2022-08-11T21:28:30.703Z"
}

登録することが出来ました。

検知

登録したジオフェンスを使ってみましょう。
一般的な使い方としては、ジオフェンスコレクションに対してデバイスと位置情報を送信する、あるいはトラッカーを作成してジオフェンスコレクションとリンクさせた上でトラッカーの位置情報を更新することです。
そして、ジオフェンス範囲内に入ったり出たりすると、イベントが発生し EventBridge で検知することが出来るようになっています。

デバイスIDと位置情報をジオフェンスコレクションに対して送信し状態を評価することが出来る API が用意されているので本日はこちらを使ってみます。

EventBridge に Amazon Location Service の Locatin Geofence Event が用意されているので上記内容でそのままルールを作成します。
ルールが作成出来たら以下のコマンドで位置情報の評価を行います。

送信データのSampleTimeに注意してください。
直近の日時を指定する必要があるので古すぎるデータだとイベントが発生しません。
また、登録履歴を管理しながら時系列で入ったのか出たのかをイベント判断してくれるのでSampleTimeを時系列にあわせて更新しながら評価する必要があります。

ここでは以下2つの位置情報データを用意しました。
1つ目のデータは札幌オフィスの位置情報です。2つ目のデータはその5分後に函館山にいることを示す位置情報です。

hoge1.json

[
    {
        "DeviceId": "hogeiwasa2",
        "Position": [
            141.35455553388053,
            43.06588598345024
        ],
        "SampleTime": "2022-08-11T22:06:00.000Z",
        "Accuracy": {
            "Horizontal": 10.30
        },
        "PositionProperties": {
            "field1": "value1",
            "field2": "value2"
        }
    }
]

hoge2.json

[
    {
        "DeviceId": "hogeiwasa2",
        "Position": [
            140.72084562446372,
            41.77507300686667
        ],
        "SampleTime": "2022-08-11T22:06:05.000Z",
        "Accuracy": {
            "Horizontal": 10.30
        },
        "PositionProperties": {
            "field1": "value1",
            "field2": "value2"
        }
    }
]

まず1つ目のデータを評価してみます。

% aws-v1 location \
    batch-evaluate-geofences \
        --collection-name explore.geofence-collection \
        --device-position-updates file://hoge1.json

ENTERイベントを取得することが出来ました。
評価データに含まれているPositionPropertiesなどもイベントに含まれているので、うまくフィルタリングして特定のデータのみトリガーにするようなカスタマイズも出来そうですね。

{
    "version": "0",
    "id": "a3ca868e-fec8-026f-5bf9-b898cc85675f",
    "detail-type": "Location Geofence Event",
    "source": "aws.geo",
    "account": "123456789012",
    "time": "2022-08-11T22:09:27Z",
    "region": "ap-northeast-1",
    "resources": [
        "arn:aws:geo:ap-northeast-1:123456789012:geofence-collection/explore.geofence-collection"
    ],
    "detail": {
        "EventType": "ENTER",
        "GeofenceId": "hogehogecircle",
        "DeviceId": "hogeiwasa2",
        "SampleTime": "2022-08-11T22:06:00Z",
        "Position": [
            141.35455553388053,
            43.06588598345024
        ],
        "Accuracy": {
            "Horizontal": 10.3
        },
        "PositionProperties": {
            "field1": "value1",
            "field2": "value2"
        }
    }
}

2つ目のデータを評価してみます。

% aws-v1 location \
    batch-evaluate-geofences \
        --collection-name explore.geofence-collection \
        --device-position-updates file://hoge2.json

今度は、札幌オフィスの半径100kmから外れたことを示すEXITイベントを取得することが出来ました。

{
    "version": "0",
    "id": "0562b1c4-5309-dc0d-7d4c-eb2c4d884e69",
    "detail-type": "Location Geofence Event",
    "source": "aws.geo",
    "account": "123456789012",
    "time": "2022-08-11T22:09:44Z",
    "region": "ap-northeast-1",
    "resources": [
        "arn:aws:geo:ap-northeast-1:123456789012:geofence-collection/explore.geofence-collection"
    ],
    "detail": {
        "EventType": "EXIT",
        "GeofenceId": "hogehogecircle",
        "DeviceId": "hogeiwasa2",
        "SampleTime": "2022-08-11T22:06:05Z",
        "Position": [
            140.72084562446372,
            41.77507300686667
        ],
        "Accuracy": {
            "Horizontal": 10.3
        },
        "PositionProperties": {
            "field1": "value1",
            "field2": "value2"
        }
    }
}

AWS CLI V2 では本日時点では利用出来ない

AWS CLI v2.7.21 ではまだ Circle ジオフェンスの登録がサポートされていませんでした。

% aws location \   
        put-geofence \
            --collection-name explore.geofence-collection \
            --geofence-id hogehogecircle \
            --geometry file://circle.json

Parameter validation failed:
Unknown parameter in Geometry: "Circle", must be one of: Polygon

登録だけでなく、リストにも対応してません。(何かしらオブジェクトが登録されていることは認識できている様子)

% aws location list-geofences --collection-name explore.geofence-collection
{
    "Entries": [
        {
            "CreateTime": "2022-08-11T21:28:30.703000+00:00",
            "GeofenceId": "hogehogecircle",
            "Geometry": {},
            "Status": "ACTIVE",
            "UpdateTime": "2022-08-11T21:28:30.767000+00:00"
        },
        {
            "CreateTime": "2022-08-11T21:09:06.805000+00:00",
            "GeofenceId": "monitoring-c58c0409-ab59-4229-a6b1-620b6371353a",
            "Geometry": {
                "Polygon": [
                    [
                        [
                            141.328125,
                            42.84576511714769
                        ],
                        [
                            141.19216918945312,
                            42.77826738996885
                        ],
                        [
                            141.27044677734375,
                            42.67839711889055
                        ],
                        [
                            141.38992309570312,
                            42.679406713370305
                        ],
                        [
                            141.43798828125,
                            42.77423534479349
                        ],
                        [
                            141.328125,
                            42.84576511714769
                        ]
                    ]
                ]
            },
            "Status": "ACTIVE",
            "UpdateTime": "2022-08-11T21:09:06.864000+00:00"
        }
    ]
}

さいごに

本日は、Amazon Location Service のジオフェンスで Circle が使えるようになったので試してみました。

Circle がサポートされたことによって、今までは Polygon データを事前に用意しなければならなかったのですが単一の位置情報と半径のみでジオフェンスを表現出来るようになったので、流動的にターゲットジオフェンスが変更される場合(例:配送管理アプリケーションの配送先など)に使いやすくなりそうですね。

個人的には Location Service のジオフェンス機能を使うのが初めてだったので、SampleTimeの時系列の概念をちゃんと理解せずに最初使っていてイベントが発生しなくて少し困りました。公式ドキュメントのサンプルデータをそのまま使って通知がされないという方は参考にして頂ければと思います。