プロジェクト

全般

プロフィール

Windows Location API

はじめに

GPSを扱うAPIです。従来は、GPSデバイスが固有に用意したドライバ(ライブラリ)を使ってプログラミングする必要がありました。大抵はシリアルポート(USB接続の上でシリアル通信)を使ってPCとGPSデバイスとの通信を行い、NMEAフォーマットで流れてくるメッセージを解析して座標を取得していました。

Location APIがWindows 7から導入され、GPSデバイスがLocation API対応ドライバを用意していれば、標準化されたLocation APIを使ってGPSへアクセスすることが可能となります。

プログラミング

Microsoftのドキュメントがあります。
Location APIプログラミングガイド

必要なヘッダーとライブラリ

#include <windows.h>
#include <atlbase.h>
#include <atlcom.h>
#include <LocationApi.h>

locationapi.lib Windows SDK に含まれている(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib にあり)
LocationApi.dll C:\Windows\System32 に置かれている

コード

COMライブラリの初期化

    HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE);
    if (FAILED(hr))
    {
        return 1;
    }

ILocationオブジェクトのインスタンス生成

    CComPtr<ILocation> pLocation;
    if (FAILED(pLocation.CoCreateInstance(CLSID_Location))) {
        return 1;
    }

権限の取得

    IID REPORT_TYPES[] = { IID_ILatLongReport };
    if (FAILED(pLocation->RequestPermissions(nullptr, REPORT_TYPES, ARRAYSIZE(REPORT_TYPES), TRUE))) {
        return 1;
    }

位置情報のステータスの取得

    LOCATION_REPORT_STATUS status;
    if (FAILED(pLocation->GetReportStatus(IID_ILatLongReport, &status))) {
        return 1;
    }
    switch (status) {
    case LOCATION_DESIRED_ACCURACY_DEFAULT:
        // do something
        break;
    case LOCATION_DESIRED_ACCURACY_HIGH:
        // do something
        break;
    }

位置情報(ILocationReport)の取得

    CComPtr<ILocationReport> pLocationReport;
    hr = pLocation->GetReport(IID_ILatLongReport, &pLocationReport);
    if (FAILED(hr)) {
        return 1;
    }

位置情報(ILocationReport)を緯度経度情報(ILatLongReport)へ

    CComQIPtr<ILatLongReport> pLatLongReport(pLocationReport);

緯度経度情報から緯度経度の値を取得

    double latitude = 0.0;
    double longitude = 0.0;
    if (FAILED(pLatLongReport->GetLatitude(&latitude))) {
        return 1;
    }
    if (FAILED(pLatLongReport->GetLongitude(&longitude))) {
        return 1;
    }

動作

位置センサーを持たないマシンでの実行

位置センサーを持たないマシンでプログラムを実行すると次のダイアログが表示されます。

nodevice-1.png

[今すぐ規定の位置を入力する]をクリックすると、コントロールパネル > ハードウェアとサウンド > 位置センサーとその他のセンサー > 規定の位置 が表示されます。

住所は入れられるものの、緯度、経度は入力することができません。
専用のプログラムを作ってAPIで設定する必要があるようです。

以下に設定プログラムを作成・公開しているページがありました。
https://sites.google.com/site/morisdov/home/Windows7-Default-Location