ページ

ラベル WhereNow の投稿を表示しています。 すべての投稿を表示
ラベル WhereNow の投稿を表示しています。 すべての投稿を表示

2008-09-15

WhereNow更新

WhereNowのバグ修正をしました。
 
コメントでご指摘頂いて初めて気がついたのですが、メニューから一度ログのクリアを実行するまでログが作られていいませんでした。
原因は CreateFile()にOPEN_ALWAYSを渡すべきところを OPEN_EXISTINGにしていたために、新規にファイルを作成することができないという情けないものでした。
ログのクリアはファイルの作成を兼ねているので、一度でもクリアを実行すると無事にログを作成できていたんですね。失礼いたしました。
 
つまらないバグついでにコードを見直しているとこんなのも見つけました。
static VOID ExecGoogleMap()
{
    PROCESS_INFORMATION pi              = {0};
    TCHAR               szParam[256]    = _T("");

    if (0 < g_dblLatitude && 0 < g_dblLongitude) {
        // パラメータ作成
    }
    if (CreateProcess(g_szGoogleMapPath, szParam, NULL, NULL, NULL, 0, NULL, NULL, NULL, &pi)) {
        CloseHandle(pi.hProcess);
    }
}

モバイルGoogleマップを起動している部分ですが、適当にサンプルを写したので 意味もなくPROCESS_INFORMATIONを使っています。
この場合、モバイルGoogleマップの終了を待っている訳でもないので piがメモリリークしちゃうんですよね。多分... (勘違いだったらこっそり教えて下さい)
勘違いでした(笑
pi.hProcessをCloseHandle()しているのが悪いのではなく、pi.hThreadをCloseHandle()していない事が悪かったみたいです。
static VOID ExecGoogleMap()
{
    PROCESS_INFORMATION pi              = {0};
    TCHAR               szParam[256]    = _T("");

    if (0 < g_dblLatitude && 0 < g_dblLongitude) {
        // パラメータ作成
    }
    if (CreateProcess(g_szGoogleMapPath, szParam, NULL, NULL, NULL, 0, NULL, NULL, NULL, &pi)) {
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }
}

 
また、GPSの監視部分でもサンプルを写したときの間違いがありました。
お手本にした「Windows Mobileプログラミング徹底理解」では3種類のイベントを監視していたのですが、WhereNowでは2種類を監視すればよかったので 次のようにしています。
static  HANDLE  g_hGpsEvent[2] = {0};

// GPS計測開始
VOID GpsStart(HWND hWnd)
{
    g_hGpsEvent[EVENT_STOP]         = CreateEvent(NULL, FALSE, FALSE, NULL);
    g_hGpsEvent[EVENT_NEWLOCATION]  = CreateEvent(NULL, FALSE, FALSE, NULL);

ところが、肝心のイベント監視の部分ではそのまま WaitForMultipleObjects(3, ...)としていました。
今度は典型的なバッファオーバーランですね。WaitForMultipleObjects(2,...)と修正しておきました。
 
探せば他にもボロが出てきそうですが、今日はこの辺で...。
 

2008-08-08

WhereNow更新

まだ作業中の部分も残っているのですが、WhereNow v0.9を公開します。
 
新たにKMLファイルを作成してモバイルGoogleマップで開くことができるようになりました。
 
現状、デバイスのルートフォルダにログファイルを作成して必要に応じてマイドキュメントの中にKMLファイルを作成します。
このあたりの場所は指定できるようにしたいですね。
 
またGPSを使用して大量の座標を保存した場合、KMLファイルの作成に若干時間がかかります。
その間 画面が固まってしまうので こちらも要改善点として残っています。
 
何とも中途半端な感じですが、KMLが開けるようになった記念ということで(笑
 

2008-08-07

モバイルGoogleマップでKMLを表示させる方法

ここしばらく、モバイルGoogleマップにローカルのKMLファイルを読ませる方法がわからずに悩んでいました。
 
KMLファイルを Webサーバに置いておけば、
GoogleMaps.exe -URL "?action=locn&a=http://~"
と指定することでKMLファイルを表示することができるのですが、いちいちWebサーバにアップするのも面倒ですよね。
file://~とかでいけるのかなとも思ったのですが、読み込んでくれませんでした。
 
ところが今日になって 作成したKMLファイルを誤ってタップしたところ、モバイルGoogleマップが起動してファイルの内容が表示されるではありませんか。
以前からこんな動きだったのでしょうか? それとも最近更新した2.2.0.16の新機能?
 
いずれにせよ、これで悩みは一気に解決。
結局はShellExecuteEx()を使ってファイルを開くだけでした。
SHELLEXECUTEINFO sei = {0};

if (CreateKML()) {
    sei.cbSize = sizeof(sei);
    sei.fMask  = 0;
    sei.hwnd   = NULL;
    sei.lpVerb = _T("open");
    sei.lpFile = GetKMLFileName();
    ShellExecuteEx(&sei);
}

でも、こういう使い方は最初から公開しておいて欲しいですよね...。
 

2008-08-03

ログ出力(続き)

先日のログ出力の件、WideCharToMultiByte()に CP_UTF8を指定することでうまくいきました。
tmytさん、情報ありがとうございました。
ZeroMemory(szWBuf, sizeof(szWBuf));
ZeroMemory(szMbBuf, sizeof(szMbBuf));
wsprintf(szWBuf, KML_DATA, data[i].dblLongitude, data[i].dblLatitude);
//dwLen = wcstombs(NULL, szWBuf, 0);
//wcstombs(szMbBuf, szWBuf, dwLen);
dwLen = WideCharToMultiByte(CP_UTF8, 0, szWBuf, -1, szMbBuf, sizeof(szMbBuf), NULL, NULL);
WriteFile(hKMLFile, szMbBuf, dwLen - 1, NULL, NULL);

 
ただ、WideCharToMultiByte()の仕様なのか 出力文字列にANK文字(?)が含まれていないとCP_UTF8を指定してもシフトJISで出力されるようです。
今回はコメントに日本語を含めることで無事にUTF-8になりました。
 
また、WideCharToMultiByte()は変換したバイト数を返しますが これには終端ヌル文字も含まれているので WriteFile()に渡すときは -1しましょう。
未だにこんな事に引っ掛かるのは私だけかもしれませんが、Google Earthですら読み込んでくれなくなって しばらく悩みました。
 
ともあれ無事にGoogle Earth、Googleマップで読み込めるようになりました。
 
今のところ GPSを使えば それっぽい線が描かれているのですが、W-SIMだとあまり綺麗な線にならないので もう少し見せ方を考える必要がありそうです。  

2008-07-31

ログ出力

こちらを参考にしてWhereNowのデータを KML形式で出力してみました。
 
GoogleEarthで表示させてみるとこんな感じに。
もう少し細かく保存するようにした方がよさそうですね。
 
ただ、GoogleマップではUTF-8でファイルを作成しないと読み込むことができないようです。
wcstombs()でマルチバイトに変換してみましたが、シフトJISで出力されるだけで Googleマップでは受け付けてもらえませんでした。
ZeroMemory(szWBuf, sizeof(szWBuf));
ZeroMemory(szMbBuf, sizeof(szMbBuf));
wsprintf(szWBuf, KML_DATA, data[i].dblLongitude, data[i].dblLatitude);
dwLen = wcstombs(NULL, szWBuf, 0);
wcstombs(szMbBuf, szWBuf, dwLen);
WriteFile(hKMLFile, szMbBuf, dwLen, NULL, NULL);

 
setlocale()を使えばいいのかなとも思ったのですが、うまくビルドできません。
WindowsMobileでは使えないのでしょうか?
 
理想的にはKMLファイルを作成してからモバイルGoogleマップで表示させたいのですが、モバイルGoogleマップでローカルのKMLファイルを読み込めるのかどうかもよくわかりませんでした。
 
まだまだ先が長そうです。
 

2008-07-21

暫定更新

暑い3連休でしたね。
子どもたちは夏休みに突入しましたが、保護者としてはイベント事が増えただけでかえって自由時間が無くなってしまいました。
 
という訳で小粒な修正を2つ
 
 
1.WifiInfoのバグ修正
再起動時にBluetoothの状態が表示できていなかった問題とBluetooth関係の設定がレジストリに保存できていなかった問題の修正を行いました。
ご報告頂いている文字色が正しく設定できていない問題については確認できていません。
 
また v1.25ではCAMモード等の場合に文字色を赤で表示していたのですが、背景が赤いと何も見えないという事に気がついたのでそのままの文字色で表示するように変更しました。
CAMモード等の表示方法については別の方法を検討します。
 
この他、WifiInfoについては tmytさんの修正を取り入れて ZERO3以外でも動作するようにしようとしているのですが、何故か正しく動作させることができずに保留しています。
たぶん単純な勘違いだと思うので、近々反映できると思います。
 
 
2.WhereNowの修正
これまではアクションキーを押して起動していたのですが 03になってから個人的にタップが中心になっていたので、Todayプラグイン上でタップできるように変更しました。
 
また、ご要望頂いていた「Googleマップで開く」と「緯度・経度をコピー」をメニューに追加してみました。
 
一方でログ保存については連休の初日に書き始めたまま止まっています(笑
次の週末もスケジュールが埋まっているので それまでに何とか時間を作って対応したいものです。
 

2008-06-23

WhereNow更新

WhereNowで住所を1行に表示できれば...というご要望を頂いたので、暫定版として作ってみました。
 
W-SIMを利用する場合にオプションでモバイルGoogleマップの場所を空白にしておくことで、住所を1行で表示します。
 
但し、GPSを利用する場合は補足している衛星の数を表示している関係で2行表示のままになっています。
この辺りのオプションについては もう少し検討してみないといけませんね。  

2008-06-18

WhereNow更新

WhereNowを更新しました。
今回も住所データはそのままです。初めてダウンロードする場合のみ必要になります。
 
星羽さんからご指摘頂いていた通信中にW-SIMで測位しようとすると反応が無くなってしまう問題の対応を行いました。 通信中に測位しようとした場合は通信の終了まで待機します。
同様に圏外だった場合も測位できないようにしています。
 
またポップアップメニューに「住所をクリア」を追加しました。
表示中の住所を消去して初期状態に戻ります。
 
あとはd346prtさんからご指摘頂いていた Googleマップアイコンの件が残っているのですが...
再現方法がわからなくなってしまいました(笑
 
やはり気づいたときにすぐ直さないとダメですね。一晩よく寝てから再確認します。
 

2008-06-14

WhereNow更新

WhereNowを更新しました。
例によってデータファイルは含まれていませんので、初めてダウンロードして頂く場合は別途住所データをダウンロードしてください。
 
変更点は以下の2点です。
 
1つめ
設定画面で住所データの場所を指定するときにgsGetFile.dllを利用できるように変更しました。
 
また、モバイルGoogleマップの場所も指定できるようになっています。(こちらはgsGetFile.dll必須になります)
Today画面にモバイルGoogleマップ起動用のアイコンを表示させたくない場合はここを空欄にしてください。

 
2つめ
タップ&ホールドで表示されるポップアップメニューに「住所をコピー」と「メール作成」を追加しました。
 
「住所をコピー」を選択すると 表示している住所をクリップボードにコピーします。
「メール作成」を選択すると 表示している住所と座標を指定したGoogleマップのURLをメールソフトに渡します。

 
クリップボードへのコピーは SDKのサンプルの中になかったのですが、検索するといくつかのサンプルを見つけることができました。
ところがサンプルの通りにしてもコピーした住所が文字化けしてしまいます。
 
原因はクリップボードにデータを渡す SetClipboardData()の部分。
Windows Mobileは UNICODEが基本なので CF_TEXTではなく CF_UNICODETEXTとしてやる必要がありました。
 
HGLOBAL hGlobal = NULL;
PTCHAR  pszStr  = NULL;

hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, (ADDRESS_SIZE * 2 + 1) * sizeof(TCHAR));
if (!hGlobal) break;

pszStr = (PTCHAR)GlobalLock(hGlobal);

wsprintf(pszStr, _T("%s%s"), g_szAddress1, g_szAddress2);
GlobalUnlock(hGlobal);

if (!OpenClipboard(NULL)) {
    GlobalFree(hGlobal);
    break;
}                    
EmptyClipboard();
//SetClipboardData(CF_TEXT, hGlobal); ← これはダメ
SetClipboardData(CF_UNICODETEXT, hGlobal);
CloseClipboard();
 
メール送信はMAILTO:の機能を使ってメールソフトに件名と本文を渡しています。
メーラが対応していれば、本文に現在の住所とGoogleマップのURLが表示されると思います。
 
モバイルGoogleマップにも同様の機能がありますが、WhereNowを使うと座標指定されたURLが本文に張り付けられるので相手に現在位置を教えたいときに便利なのではないでしょうか。(携帯で見るのはツライかもしれませんが...)
 
尚、本来は件名や本文は全てURLエンコードすべきだと思うのですが、手抜きをして"?"や","等の最低限の文字しか置き換えていません。
少なくともW-ZERO3メールでは正常に表示してくれていますが、メーラによっては正しく表示できないものもあるかもしれません。
 

2008-06-08

WhereNow更新

データファイルの場所を指定するための設定画面を追加しました。
データファイルは含まれていませんので、初めてダウンロードして頂く場合は別途住所データをダウンロードしてください。

 
データファイルの場所は"\microSDカード\wn"のような形で指定することになりますが、Todayプラグインの設定画面では何故か日本語が入力できません。(WM6.1で直っているといいですね)
更にフォルダ選択ダイアログも使えなかったので、ファイル選択ダイアログで住所データ(index.dat等)を指定するようにしてみました。
 
 
ところで、ファイル選択ダイアログでは選択されたファイルのフルパスが取得できますが必要なのはフォルダ名までなので 以下のような感じでファイル名部分を取り除くようにしていました。
if (GetOpenFileName(&ofn)) {
    if (S_OK == StringCchLength(szDataFilePath, MAX_PATH, &nLength)) {
        for (int i = nLength - 1; i >= 0; i --) {
            if (_T('\\') == ofn.lpstrFile[i]) {
                ofn.lpstrFile[i] = NULL;
                break;
            }
        }
    }
    SetDlgItemText(hDlg, IDC_DATA_FOLDER_PATH, ofn.lpstrFile);
}
 
でも実はOPENFILENAMEには nFileOffsetというメンバがあって、わざわざどこからがファイル名なのかを調べる必要はなかったみたいです。
if (GetOpenFileName(&ofn)) {
    if (0 < ofn.nFileOffset) {
        ofn.lpstrFile[ofn.nFileOffset - 1] = NULL;
    }
    SetDlgItemText(hDlg, IDC_DATA_FOLDER_PATH, ofn.lpstrFile);
}
 
毎度の事ですが、書く前にドキュメントくらは読んでおかないといけませんね...。
 

2008-05-29

WhereNowのデータファイルについて

先日のWhereNowですが、環境によって必ずしも期待通りの動きをしてくれないようです。
 
外部メモリの名前を取得するようにしてみたところ外部メモリではなくネットワークドライブ等の名前を取得する場合があり、結果として住所が表示されないのだと思います。
 
回避方法としてはレジストリの HKCU\Software\tauchi.net\WhereNowに文字列型でDataFilePathという項目を作って"\microSDカード\wn"を指定する事で外部メモリの名前を取得することなくファイルを開くようになります。
TREを使用した場合は左の絵のような感じになりますね。

 
本来は取得したドライブの種類を判定すべきなのですが、手を抜いてデータファイルが開けなかった場合に"\microSDカード\wn"決め打ちでファイルを開きなおすように変更してみました。
  • WhereNow.zip
    (5/25のエントリに追加しているものと同じ内容です)
 
ついでに本当にファイルが開けなかった場合、「データファイルを読み込めません」とのエラーを表示するようにしています。

このエラーが表示されないのに「住所データが見つかりません」という表示が出る場合は、一度 [設定]-[Today]-[アイテム]から WhereNowを外してからインストールをし直してみてください。
 
あるいは、可能性は低いのですが本当に住所データがない場所もあります
その場合もエラーは表示されませんので、場所を変えて測位してみてください。
 

2008-05-25

WhereNow更新

ゴールデンウィーク前に暫定版を公開していたWhereNowを更新しました。
機能的には何も進歩していませんが以下の問題を修正しています。
  • "microSDカード"決め打ちになっていた外部メモリの名称をデバイスから取得するように変更
  • 住所データが見つからなかった場合に見当違いの住所を表示していた問題を修正
  • 時々 画面サイズが半分になって表示されていた問題を修正
 
今回はプログラムとデータファイルを別々にアップしています。
データファイルの内容は何も変わってないので前のバージョンを使用中であればダウンロードする必要はありません。
  • WhereNow.zip(プログラム本体)
    解凍したCABファイルをデバイス側にインストールしてください
  • WhereNow.zip
    データファイルが開けなかった場合"microSDカード"で再試行するように変更しました
  • wn.zip(データファイル)
    解凍したwnフォルダを外部メモリのルートにコピーしてください
 
ところで今回修正した画面が半分になっていた問題ですが、TodayプラグインのWM_TODAYCUSTOM_QUERYREFRESHCACHEメッセージの中で以下のような処理をしている部分があります。
if (0 == pTodayListItem->cyp) {
    pTodayListItem->cyp = DRA::SCALEY(20);
    bRet = TRUE;
}
 
SDKのサンプル通りの処理で Todayプラグインのサイズ(高さ)が 0であれば適切なサイズを設定しているのですが、この部分はプラグインの初期化時にだけ呼ばれるものと思い込んでいました。
実際には何らかのタイミングで高さが 0になっている場合があるみたいです。
今回の場合 現在位置を表示する場合は高さを変更しなければいけなかったので、以下のようにして対応しました。
if (0 == pTodayListItem->cyp) {
    if (STATUS_ADDRESS_FOUND == iStatus || STATUS_ADDRESS_NOT_FOUND == iStatus) {
        pTodayListItem->cyp = DRA::SCALEY(40);
    } else {
        pTodayListItem->cyp = DRA::SCALEY(20);
    }
    bRet = TRUE;
}
 
動的にサイズが変わるようなTodayプラグインを作成するときはご注意ください。
 

2008-05-22

外部メモリの名称

自作ツールのWhereNowを修正中です。
 
WhereNowは住所データが 170MB近くあるので外部メモリが必須なのですが、実は外部メモリの名称というのは Ad[es]では "microSDカード"、エミュレータだと "Storage Card"といった具合にまちまちになっています。
v0.1では "microSDカード"に決め打ちしていたのですが、エミュレータでテストする度にコードを切り替えるのが面倒だったので名称の取得方法を調べてみました。
 
最初はレジストリのどこかに記録されているものと思っていたのですが それらしい箇所は見当たりません。
SDKのサンプルの中にもそれらしいサンプルは無いようです。
 
ところが何気なく開いた「Windows Mobileプログラミング徹底理解」でFindFirstFlashCard()FindNextFlashCard()を発見。
いつもながら貴重な情報が満載ですね。
というか一度読んだはずなのに完全に頭から消えていました。
10回読み直せ>自分。
 
という訳で、外部メモリの名称を取得するようにしたコードがコチラ。
これでエミュレータと実機で共通のコードが使えるようになりました。
#define DEFAULT_STORAGE_NAME            _T("microSDカード")
#define INDEX_FILE                      _T("\\%s\\wn\\index.dat")


HANDLE          hFlashCard              = NULL,
                hIndexFile              = NULL;
WIN32_FIND_DATA findData                = {0};
TCHAR           szStorageCard[MAX_PATH] = _T(""),
                szIndexFile[MAX_PATH]   = _T("");

// 外部メモリの名前を取得
ZeroMemory(szStorageCard, sizeof(szStorageCard));
hFlashCard = FindFirstFlashCard(&findData);
if (INVALID_HANDLE_VALUE != hFlashCard) {
    StringCchCopy(szStorageCard, MAX_PATH, findData.cFileName);
    FindClose(hFlashCard);
} else {
    StringCchCopy(szStorageCard, MAX_PATH, DEFAULT_STORAGE_NAME);
}
// インデックスファイルの名称
wsprintf(szIndexFile, INDEX_FILE, g_szStorageCard);
 
でも、このコードでは FindNextFlashCard()を呼ばずに最初に見つかった名前を使っています。
複数の外部メモリがあるとたちまち問題が起きちゃいますね...。
 

2008-05-01

WhereNow?

作りかけの住所表示Todayプラグインですが、明日の夜から連休に突入して手をつけることができないので暫定版として公開します。
 
いつものように W-ZERO3.org Uploaderに...といきたいのですが、ファイルサイズが 50MBを超えるのでさすがにマズイですよね。
SkyDriveが使えるか?とも思ったのですが、50MBまでのサイズ制限に引っかかって断念。 ひとまずは自分のマシンに置いておきました。
  • WhereNow.zip
    非常にリソースの限られたマシンなので落ちてしまったらごめんなさい。
 
無事にダウンロードすることができたら CABを実行してプログラムをデバイス側にインストールしてください。
データは今のところ microSDのルートに wnフォルダがある前提で動いていますので手動でコピーをお願いします。
 
Today画面上でアクションボタンを押すと W-SIMから座標を取得して、おおよその住所を表示します。
 
 
タップ&ホールドでメニューを表示させることで、W-SIMとGPSを切り替えることができます。
 
 
GPSを使うとW-SIMよりはまともな住所が出てくるのではないでしょうか?
 
 
動作確認しているのは IMUB-01と VGP-BGU1の組み合わせですが、WindowsMobileで利用できるGPSユニットであればどれでも問題ないはずです。
 
住所データは 330万件程度入っているので市街地であれば大抵の場所の住所は表示できると思います。
連休で出かけたときにでも試してみてください。
 

2008-04-29

MicroSDカードからの読み込み速度

作りかけのTodayプラグインですが、データ読み込み部分に小細工をすることでエミュレータ上ではそれなりに動くようになりました。
 
ところが いざ実機で動かしてみると呆れるほど遅い。
GPSの測位自体はすぐに終わるのですが、データの読み込みで延々と時間がかかってしまいます。
 
 
ちなみに使っているMicroSDカードのパッケージには60倍速モデルと書かれていました。 書いてある通りならSDHCのスピードクラスで Class6に相当するのかもしれませんが、実売価格からするとそれほど高性能なわけではないかもしれませんね。
一般にフラッシュメモリ系はシーク時間が短いものと思い込んでいたのですが、少なくともAd[es]のMicroSDカードでは今回のようにデータのサイズが大きいとSetFilePointer()でシークするだけでもそれなりの時間がかかるようです。
とりあえずデータを細かく分割してどうなるか...ですね。
 
 
ところで今日は困ったことがもうひとつ。
知人の勧めでゲームを買ってみたのですが、チュートリアルから先に進めません(笑
「肉食獣の卵」を持って帰らないといけないらしいのですが すぐに割れてしまいます。
データができあがるまでに帰れるといいのですが...
 

2008-04-13

住所データをどうするか...

相変わらず住所データの保存方法で悩んでいます。
とりあえずCSV形式で保存しているのですが、あまり気の利いた検索ができない上に自分の住んでいる県だけでも6MBを超えるサイズになってしまいます。
SQL Server Compact Editionも調べてみたのですが、COMを使う必要があったので二の足を踏んでいます(笑
 
でも、MSDNを眺めていると EDBという選択肢もありました。
予定表や連絡先のデータが保存されている pim.volで使われている形式ですね。
今回扱いたいデータは単一の表で 座標をキーにしてシークできればいいので うってつけの方法かもしれません。
何よりも COMを使わなくていいのは気が楽です。
 
どの程度のサイズまで扱えるのか気になっていろいろ検索してみました。
これによると EDBのファイルサイズ上限は 64MBのようです。思ったよりも小さいですね。
一方の SQL Server Compact Editionなら 1GBまでいけるみたいです。逆にMicroSDの容量が心配になりますね。
 
結局、EDBを使うなら住所データを県または地区ごとに分ける必要がありそうです。
でも「それなら別に CSV形式でもいいじゃないか」と振り出しに戻ってしまいました。
たぶん無意識にCOMを避けようとしているだけかもしれませんけどね。
 

2008-04-10

GPSネタ(途中経過)

年度が変わってあまり時間を取れていないのですが、とりあえず住所の表示部分だけ作ってみました。
座標のデータは先日の街区レベル位置参照情報ダウンロードサービスのデータを利用しています。
 
 
現状、CSVファイルを読み込んでいる関係で思ったよりも表示に時間がかかっています。
やはり SQL Server Compact Editionを利用する方向で考えたほうがよさそうですね。
 

2008-03-26

GPSネタ

年度末で少しバタバタしています。
数日振りにWebをチェックしているとツールMEMOさんで気になるエントリを発見しました。
 
GPSTodayというソフトの紹介ですが、リンク先を見てみるとToday画面に現在位置の住所を表示させるプラグインみたいです。 これはなかなか便利そうですね
 
とりあえず同じような事をしようと思った場合の自分用メモ。
 
まずはGPS。
以前、VGP-BGU1を買った時に少しだけ使い方を調べていました。
白本にも解説があるので問題はなさそうですね。
 
次に取得した緯度・経度から住所への変換。
手っ取り早いのはGoogle Maps APIあたりを利用すれば住所を取得できそうです。
他にも同様のWebサービスを提供して下さっているサイトもありました。 Google Maps APIはキーを取得しないといけないので、こちらを利用させて頂く方がいいかもしれません。
 
ただ、常にWebサービスに問い合わせるというのも問題がありそうです。
パケット料は「新つなぎ放題」にプラン変更するという手もあるかもしれませんが、常に通信していたらバッテリが持ちませんね。
 
という訳でローカルに持つ方向で検討。
国土交通省が提供している位置情報がありました。
 
ダウンロードしてみると東京都でおよそ30MB、地元でも15MB強のCSVファイルが落ちてきます。
さすがにこんなファイルを頻繁に読み込んでいるとメモリを圧迫しそうです。
 
でもよく考えたら Ad[es]には SQL Server Compact Editionがインストールされている事を思い出しました。 下手に自分で作るよりよっぽど効率よく検索できるはずですよね。
まずはC++でSQL Serverを使う方法を調べるところから始めてみようと思います。