<?xml version="1.0" encoding="utf-8" ?>

<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:georss="http://www.georss.org/georss"
>

<channel rdf:about="http://kamoland.com/wiki/wiki.cgi?%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE%A1%BC%A1%C7s%A5%DA%A5%A4%A5%B8">
 <title>プログラマー’sペイジ</title>
 <link>http://kamoland.com/wiki/wiki.cgi?%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE%A1%BC%A1%C7s%A5%DA%A5%A4%A5%B8</link>
 <description>プログラミングやデータベースの話題</description>
 <items>
  <rdf:Seq>
   <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?GoogleMap%A4%C7%B4%B7%C0%AD%A5%B9%A5%AF%A5%ED%A1%BC%A5%EB" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?Intent%A4%CB%B2%E8%C1%FC%A4%F2%C5%CF%A4%B9%CA%FD%CB%A1" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?SRTM3%A5%C7%A1%BC%A5%BF%A4%AB%A4%E9%C9%B8%B9%E2%A4%F2%C6%C9%A4%E0" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?%B0%DE%C5%D9%B7%D0%C5%D9%BC%E8%C6%C0%A5%C4%A1%BC%A5%EB" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?Desire%A4%CEGPS%BC%E8%C6%C0%A4%C7%A4%CE%BB%EE%B9%D4%BA%F8%B8%ED" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?Yahoo%C3%CF%BF%DE%A4%CE%A5%BF%A5%A4%A5%EA%A5%F3%A5%B0" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?HOME%A4%CB%A5%B7%A5%E7%A1%BC%A5%C8%A5%AB%A5%C3%A5%C8%A4%F2%BA%EE%C0%AE%A4%B9%A4%EB" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?Android%A4%C7%B2%E8%CC%CC%A4%F2%BD%C4%B2%A3%B8%C7%C4%EA%A4%B9%A4%EB%CA%FD%CB%A1" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?GoogleMap%A4%CE%A5%BA%A1%BC%A5%E0%A5%EC%A5%D9%A5%EB%A4%C8%BD%CC%BC%DC" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?Android%A4%C7GoogleMap%A4%F2%A5%D8%A5%C7%A5%A3%A5%F3%A5%B0%A5%A2%A5%C3%A5%D7%C9%BD%BC%A8" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?HT-03A%A4%CE%A5%AD%A5%E3%A5%EA%A5%D6%A5%EC%A1%BC%A5%B7%A5%E7%A5%F3" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?Android%A4%C7%BC%AB%C6%B0%A5%AA%A5%D5%A4%C7%A4%AD%A4%EB%A5%ED%A5%B0%BD%D0%CE%CF" /> <rdf:li rdf:resource="http://kamoland.com/wiki/wiki.cgi?Android%A4%C7%C5%C5%BB%D2%B9%F1%C5%DA%A4%F2%C9%BD%BC%A8%28Java%29" />
  </rdf:Seq>
 </items>
</channel>

   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9">
    <title>地図ロイド</title>
    <link>http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9</link>
    <description>地図ロイドは，国土地理院の電子国土 の地形図をAndroidで閲覧するためのプログラムです．カモランド作者が独自に開発している，非公式なアプリです．【更新】要求するパーミッション，距離測定機能について追記 (2010-07-25)</description>
    <content:encoded><![CDATA[<p>
地図ロイドは，国土地理院の<a href="http://cyberjapan.jp/">電子国土</a> の地形図をAndroidで閲覧するためのプログラムです．カモランド作者が独自に開発している，非公式なアプリです．

</p>

<h2><a name="i0"> </a>地図ロイド</h2>
<div><span>2010-07-25</span> 要求するパーミッション，距離測定機能について追記</div>

<div><span>2010-06-20</span> ブックマークからマイマップを参照できるようになったため，PCから座標を受ける方法を修正</div>

<div><span>2010-06-12</span> PCから座標を受ける方法を，見るだけマイマップを使う方法に書き換えた</div>

<div><span>2010-05-17</span> ブックマークの説明に，共有機能について追記した</div>

<div><span>2010-05-04</span> PC用Googleマップから地図ロイドに座標を渡す方法を追記</div>

<div><span>2010-04-11</span> Yahoo地図について追記</div>

<div><span>2010-03-21</span> インテントで外部アプリから地図ロイドを呼び出す説明を追記</div>

<div><span>2010-02-14</span> 全面的に書き直し</div>

<div><span>2010-01-16</span> 地形図の著作権について追記</div>

<div><span>2010-01-04</span> コンパスの磁北偏差補正について追記</div>

Android Marketに登録してあります．
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=icon.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="icon.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_69636F6E2E706E67" alt="icon.png" title="icon.png" width="48" height="48" /></a> ホーム > アプリケーション > 旅行 > <a href="http://jp.androlib.com/android.application.com-kamoland-chizroid-xCnj.aspx">地図ロイド</a> (AndroLib.com)
</p>
<ul>
<li>OS 1.5以上が必要です</li>
<li>HT-03Aしか持っていないため，実機での確認はHT-03Aだけです</li>
</ul>
<div></div><h3><a name="i1"> </a>注意事項</h3>
<ul>
<li>もともと<a href="http://cyberjapan.jp/">国土地理院の電子国土</a> は，Andriodでの動作を保証していません</li>
<li><a title="Android" href="http://kamoland.com/wiki/wiki.cgi?Android">Android</a>への対応は，カモランド作者が個人的に行っているものであり，国土地理院は無関係です</li>
<li>そのため，電子国土のAndriodでの動作については，国土地理院に問い合わせないようにしてください</li>
<li>また，今後の国土地理院側の仕様変更には，できるだけ追随するつもりですが，対応しきれずに動作しなくなる可能性があります</li>
</ul>
<div></div><h3><a name="i2"> </a>地形図の著作権について</h3>
地図ロイドで表示している地形図の画像の著作権は，国土地理院にあります．
<a href="http://portal.cyberjapan.jp/kiyaku.html">電子国土共通規約</a> にありますように，
私的利用の範囲でご利用ください．
<p>
また，地図ロイドでは電子国土サーバへの通信負荷削減と操作性改善のために，取得した地形図画像を端末内にキャッシュしています．
</p>
<p>
通常この画像を端末から外に持ち出すことは不可能ですが，
もし何らかの方法で端末の外に持ち出したり，地図ロイド以外の別のアプリから内容を閲覧することは，
著作権の例外規定(第47条の8)が適用されなくなると考えられるため，行わないでください．
</p>
<ul>
<li>参考：<a href="http://www.bunka.go.jp/chosakuken/21_houkaisei.html">文化庁 | 平成21年通常国会 著作権法改正等について</a></li>
</ul>
<p>
この理由のため，地図ロイドでは地形図画像のキャッシュをSDカードに保存するという機能を実装する予定はありません．
</p>
<p>
さらにこれには，公開されている地形図の画像はあくまで閲覧目的に制限されていますので，SDカードに保存して持ち出すことによって他の目的に使用されるということは防がなければならない，という事情もありますのでご理解ください．
</p>
<div></div><h3><a name="i3"> </a>Yahoo地図について</h3>
Yahoo地図の表示には，
<a href="http://developer.yahoo.co.jp/webapi/map/">Yahoo! Open Local Platform</a>
で提供されているAPIであるスタティックマップAPIを使っています．
<p>
元となる地図画像はYahoo! JAPANから取得していますが，それをAndroid端末上で表示する処理は地図ロイド作者が実装しているものであり，
Yahoo! JAPANは無関係です．
</p>
<p>
Yahoo! JAPANから取得した画像をそのまま表示していますが，以下の点などについては地図ロイドの問題でYahoo! JAPANは無関係ですので，
Yahoo! JAPANに問い合わせたりしないようにしてください
</p>
<ul>
<li>ヘディングアップによる回転表示中に生じる文字，図形などのゆがみ</li>
<li>地図画像の境目部分で生じる表示のずれ</li>
</ul>
<div></div><h4><a name="i4"> </a>キャッシュについて</h4>
バージョン4.6以降の地図ロイドでは，Yahoo地図をSDカードにキャッシュしてオフラインで閲覧することが可能です．
<p>
2010/4/20時点の
<a href="http://developer.yahoo.co.jp/webapi/map/">Yahoo! Open Local Platform</a>
のドキュメントにはダウンロード保存についての規約がありませんが，
もし今後規約に変更が入って，ダウンロード保存に制限がかかった場合は，このような利用法ができなくなる可能性があります．
(杞憂ならいいのですが)
</p>
<div></div><h4><a name="i5"> </a>制限事項</h4>
<ul>
<li><a href="http://developer.yahoo.co.jp/webapi/map/">地図Web APIの利用方法</a>において地図で利益を得ることは禁じられていますので，地図ロイドに表示されるYahoo地図を用いて，利益を得る行為は行わないでください</li>
<li>Yahoo側のリクエスト回数制限(24時間あたりの回数)があるため，もし上限に達してしまうと地図が突然表示されなくなると思われます．この回数は，自分が地図をロードした回数ではなく，全ての地図ロイドユーザがロードした回数の合計でのカウントですので，注意してください</li>
</ul>
<p>
規約に基づくクレジットの表示

<a href="http://developer.yahoo.co.jp/about">
<img src="http://i.yimg.jp/images/yjdn/yjdn_attbtn2_105_17.gif" width="105" height="17" title="Webサービス by Yahoo! JAPAN" alt="Webサービス by Yahoo! JAPAN" border="0" style="margin:15px 15px 15px 15px"></a>


</p>
<div></div><h3><a name="i6"> </a>要求するパーミッション</h3>
<table cellspacing="1" border="1">
<tr><th>区分</th><th>詳細</th><th>説明</th></tr>
<tr><td>ネットワーク通信</td><td>完全なインターネットアクセス</td><td>地図データ取得のためのアクセス(通信先：国土地理院，Google，Yahoo)と，勾配計算用の標高データ取得のためのアクセス(通信先：kamoland.com)で使用</td></tr>
<tr><td>現在地</td><td>詳細な位置情報(GPS)</td><td>GPSによる現在位置取得で使用</td></tr>
<tr><td>システムツール</td><td>端末のスリープを無効にする</td><td>GPSによる位置検索実行時に，PARTIAL_WAKE_LOCKを取得するために使用</td></tr>
<tr><td>システムツール</td><td>ショートカットのインストール</td><td>ブックマークから位置のショートカットをHOMEに作成するために使用</td></tr>
<tr><td>ストレージ</td><td>SDカードのコンテンツを修正/削除する</td><td>ブックマークおよびキャッシュのデータ保存と読み込みで使用</td></tr>
<tr><td>ハードウェアの制御</td><td>バイブレーション制御</td><td>距離測定機能で位置決定時にバイブを鳴らすので使用</td></tr>
</table>
<div></div><h3><a name="i7"> </a>主な機能</h3>
<div></div><h4><a name="i8"> </a>地図画面</h4>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v502-screen-1b.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v502-screen-1b.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763530322D73637265656E2D31622E706E67" alt="v502-screen-1b.png" title="v502-screen-1b.png" width="320" height="480" /></a>
<ul>
<li>子画面 - 同じ位置の広域図(15万または120万)を表示します</li>
<li>ズームボタン - 縮尺を変更します</li>
<li>コンパス - 端末の地磁気センサーを使ったコンパスです．消えている場合はタッチすれば起動します．起動している状態でさらにタッチすると，北が上ではなく進行方向が上になるように，地図が回転します(ヘディングアップ)．磁北偏差補正をすれば緑色，していなければ赤色で表示されます</li>
<li>子画面ON/OFFボタン - タッチすると，子画面を表示する/しないが切り替わります</li>
<li>地図再読込ボタン - Yahoo地図と地形図で出ます．現在表示している地図を，再読み込みして最新にします．キャッシュに残っている地図が古い場合に使用してください．特にYahoo地図はよく更新されますので，最新にすると新しい道路や駅などが反映される場合があります</li>
<li>距離測定ボタン - これを押すと，距離測定を開始します．もう一度押すと，測定を終了します．2点を結ぶ直線距離の測定が行えます</li>
</ul>
<p>
地図のスクロールには，パネルのドラッグとトラックボールのどちらも使えます．
また，トラックボールを押したときの動作を設定することができます．
</p>
<div></div><h4><a name="i9"> </a>メニュー</h4>
地図を表示している状態でメニューボタンを押すと，各機能を呼び出せます．
トラックボールを押しても，同じメニューが出ます．(設定を変えていなければ)
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v500-screen-1.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v500-screen-1.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763530302D73637265656E2D312E706E67" alt="v500-screen-1.png" title="v500-screen-1.png" width="224" height="336" /></a>
<ul>
<li>地名検索 - 地名，山名，施設名などを入力して，その位置を検索できます．Google音声検索が入っていれば，音声入力も可能です</li>
<li>ブックマーク - ブックマークを開きます</li>
<li>地図モード - 表示する地図を切り替えます．電子国土の地形図/GoogleMapの地図/GoogleMapの航空写真/Yahoo地図のどれかを選べます．またヘディングアップのON/OFFも設定できます</li>
<li>現在地 - 現在の位置を検索して移動します．検索にはGPS，ネットワークが使えます．どれを使うかは設定できます</li>
<li>共有 - 現在表示している中心位置を他のアプリに共有します．ブラウザで中心位置を開けるURLや，地図画像(Yahoo地図のみ)を渡すことができます</li>
<li>設定 - 地図ロイドに関するあらゆる設定をおこないます</li>
</ul>
<div></div><h4><a name="i10"> </a>地名検索</h4>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v503-screen-3.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v503-screen-3.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763530332D73637265656E2D332E706E67" alt="v503-screen-3.png" title="v503-screen-3.png" width="224" height="336" /></a>
<ul>
<li>次のようなものを入力して検索できます</li>
<ul>
<li>地名(例：西九条)</li>
<li>山名(例：蕨山)</li>
<li>施設名(例：偕楽園，クラブチッタ)</li>
<li>郵便番号(例：1040054)</li>
<li>緯度経度(例：35.910085,139.11397)</li>
</ul>
<li>検索結果は保存されます．あとでブックマークから検索履歴ボタンで呼び出すことができます</li>
</ul>
<div></div><h4><a name="i11"> </a>ブックマーク</h4>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v500-screen-5.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v500-screen-5.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763530302D73637265656E2D352E706E67" alt="v500-screen-5.png" title="v500-screen-5.png" width="224" height="336" /></a>
<ul>
<li>この位置をブックマーク - ブックマークを開く直前の位置を，ブックマークに保存します．保存する名前を聞かれますが，入力せずにOKも可能です．この場合，日付と時刻が名前として使われます．急いでいるときに便利です</li>
<li>右下のボタン</li>
<ul>
<li>検索履歴ボタン(虫眼鏡) - 表示内容が地名検索の履歴に切り替わります．過去に地名検索で検索した場所が表示されます</li>
<li>見るだけマイマップ呼び出しボタン(地球) - <a title="見るだけマイマップ" href="http://kamoland.com/wiki/wiki.cgi?%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7">見るだけマイマップ</a>がインストールされていると表示されます．<a title="見るだけマイマップ" href="http://kamoland.com/wiki/wiki.cgi?%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7">見るだけマイマップ</a>を使って，自分のGoogleマイマップに登録されている目印を選択できます．制限など詳しい説明は，<a title="見るだけマイマップ" href="http://kamoland.com/wiki/wiki.cgi?%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7">見るだけマイマップ</a>を参照してください．</li>
</ul>
<li>横に並んでいるボタン(「グループ2」など)を押すと，そのグループを開きます．ボタンを長押しすると，グループの追加削除，名前の変更ができます</li>
<li>表示されている住所は，緯度経度からGoogleのAPIを使って求められたものです</li>
<li>ブックマークの各行を長押しすれば，メニューが開きます．以下に長押しメニューを説明します</li>
</ul>
<div></div><h5><a name="i12"> </a>ブックマークの長押しメニュー</h5>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v416-screen-1.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v416-screen-1.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763431362D73637265656E2D312E706E67" alt="v416-screen-1.png" title="v416-screen-1.png" width="224" height="336" /></a>
<ul>
<li>ここに移動 - その位置に移動して地図に戻ります</li>
<li>名前の変更 - 名前を変更します</li>
<li>コピー - 住所と座標をクリップボードにコピーします．住所表示がオフの場合は住所はコピーされません．座標の形式は次に表示されるダイアログで選べます</li>
</ul>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v414-screen-2.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v414-screen-2.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763431342D73637265656E2D322E706E67" alt="v414-screen-2.png" title="v414-screen-2.png" width="224" height="336" /></a>
</p>
<table cellspacing="1" border="1">
<tr><th>形式</th><th>説明</th><th>補足</th></tr>
<tr><td>緯度,経度</td><td>例えば「35.896294,139.13197」</td><td></td></tr>
<tr><td>ウオッちずURL</td><td>国土地理院の地図閲覧サービス <a href="http://watchizu.gsi.go.jp/">ウオッちず</a> の経緯度指定地図リンク</td><td>PCからでも地形図を見ることができます．例：<a href="http://watchizu.gsi.go.jp/watchizu.html?b=355346&amp;l=1390755">http://watchizu.gsi.go.jp/watchizu.html?b=355346&amp;l=1390755</a></td></tr>
<tr><td>Google地図URL</td><td><a href="http://maps.google.co.jp/">PC用Googleマップ</a> の経緯度検索URL</td><td></td></tr>
<tr><td>Yahoo地図URL</td><td><a href="http://map.yahoo.co.jp/">PC用Yahoo!地図</a> をその座標を中心にして表示するためのURL</td><td>「印刷する」からその位置の<a href="http://guide2.e-mapcode.com/">マップコード</a> を見ることができます．マップコードはカーナビなどでの位置の入力に使えるようです</td></tr>
<tr><td>Bing航空写真URL</td><td><a href="http://www.bing.com/maps/">Bing地図</a> をその座標を中心にして航空写真モードで開くためのURL</td><td>都市部だと，航空写真のモードを「概観図」に切り替えればさらに詳しい写真を見れます．真上ではなく立体的な写真で，撮影の方向を90度ずつ切り替えて見ることができます</td></tr>
</table>
<ul>
<li>共有 - 他のアプリを，その位置の住所と座標を渡して起動します．渡す内容は「コピー」と同じです．どのアプリを起動するかは端末に入っているアプリによって変わります．例えば私の端末では，以下のダイアログが出て選択できます</li>
</ul>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v414-screen-3.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v414-screen-3.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763431342D73637265656E2D332E706E67" alt="v414-screen-3.png" title="v414-screen-3.png" width="224" height="336" /></a>
</p>
<ul>
<li>ショートカットを作成 - この位置を開くためのショートカットを，ホーム画面に作成します</li>
<li>削除 - 削除します</li>
</ul>
<p>
ブックマークの内容は，内蔵フラッシュまたはSDカードに保存されます．どちらに保存するかは設定できます．
</p>
<p>
SDカードに保存した場合は「/chizroid/bookmark.tsv」というファイル名で保存されます．文字コードはUTF-8で，タブ区切りのテキストファイルです．
</p>
<div></div><h4><a name="i13"> </a>地図モード</h4>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v404-screen-2.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v404-screen-2.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763430342D73637265656E2D322E706E67" alt="v404-screen-2.png" title="v404-screen-2.png" width="224" height="336" /></a>
<div></div><h5><a name="i14"> </a>ヘディングアップ</h5>
地図を，進行方向が上になるように回転して表示します．回転状態でも，スクロール，ズーム等全く同じように操作できます
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v17-screen-1.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v17-screen-1.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_7631372D73637265656E2D312E706E67" alt="v17-screen-1.png" title="v17-screen-1.png" width="224" height="336" /></a>
</p>
<div></div><h5><a name="i15"> </a>地下街 (Yahoo地図)</h5>
Yahoo地図モードの場合，エリアによっては地下街マップを見れます．ズーム19以上で表示していると，右上に地下街への切り替えボタンが出ます
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v404-screen-4.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v404-screen-4.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763430342D73637265656E2D342E706E67" alt="v404-screen-4.png" title="v404-screen-4.png" width="340" height="366" /></a>
</p>
<div></div><h4><a name="i16"> </a>現在地</h4>
現在地を検索してそこに移動しますが，設定によって動作が変わります．
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=sa_location.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="sa_location.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_73615F6C6F636174696F6E2E706E67" alt="sa_location.png" title="sa_location.png" width="224" height="333.9" /></a>
<ul>
<li>GPSのみ - 正確な位置しか使いたくない，ネットワークの変な位置に飛ばされたくない場合は，これを指定します</li>
<li>GPS→確認→network - GPSが駄目なときにネットワークによる不正確な位置でも我慢できるかも知れない場合は，これを指定します．デフォルトです</li>
<li>GPS→network - GPSが駄目なときにネットワークによる不正確な位置でも無条件で我慢できる場合は，これを指定します</li>
<li>network - GPSを使わない場合は，これを指定します</li>
</ul>
<p>
なお地図ロイドでは，現在地を検索する必要最小限の場合だけしか，GPSを起動しません．(電池節約のため)
</p>
<div></div><h4><a name="i17"> </a>現在地の自動追尾</h4>
設定の「現在位置の自動追尾」から，定期的にGPSで現在位置を取得して，そこに移動するという設定ができます．
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v500-screen-3.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v500-screen-3.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763530302D73637265656E2D332E706E67" alt="v500-screen-3.png" title="v500-screen-3.png" width="224" height="336" /></a>
</p>
<ul>
<li>追尾しない - これを設定すると，メニュー-現在地を押した場合だけGPSを起動して，位置を取得します</li>
<li>連続追尾する - GPSをずっと起動し続けた状態で，連続的に位置を取得します．最も電池を消費しますが，誤差は少なくなると思います</li>
<li>10秒間隔〜60秒間隔 - 指定した間隔で位置を取得します．取得する時にGPSを起動して，取得すると次回まではGPSを停止しますので，節約にはなると思います</li>
<li>タイマーを右上に表示する - 前回GPSで位置を取得できた時から経過した時間を表示します．GPSで位置を取得成功してそこに移動するたびに0秒に戻ります．表示されている現在位置が，どれだけ古いのかを知ることができます</li>
<li>追尾中はスリープに入らない - 端末の設定によりますが，何もさわらずにしばらく放置すると自動的に画面が消えてスリープ状態になります．これを禁止するための設定です</li>
</ul>
<p>
メニューから「現在地」を押すと自動追尾が始まりますが，追尾を止めたい場合は，もう一度「現在地」を押すと止まります．
また，ブックマークや設定画面を開いても止まりますので注意してください．
</p>
<p>
この自動追尾機能では，GPSしか使いません．ネットワークは精度が低いため，追尾に使っても意味がないためです．
</p>
<p>
なお地図ロイドでは，My Tracksでできるような移動軌跡の記録はできません．
</p>
<div></div><h4><a name="i18"> </a>距離測定</h4>
左上の距離測定ボタンを押すと，中央の十字マークがピンに変わります．
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v502-screen-2b.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v502-screen-2b.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763530322D73637265656E2D32622E706E67" alt="v502-screen-2b.png" title="v502-screen-2b.png" width="302" height="168" /></a>
</p>
<p>
このピンをタップして点を指定することで，2点間の直線距離を測定できます．
3点以上指定すれば，それぞれをつないだ直線距離の合計を計算します．
</p>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v503-screen-2b.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v503-screen-2b.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763530332D73637265656E2D32622E706E67" alt="v503-screen-2b.png" title="v503-screen-2b.png" width="280" height="118" /></a>
</p>
<p>
また，徒歩の所要時間も表示します．計算に使う歩行速度は「設定」から変更できます．
デフォルトだと不動産の表記(不動産公正取引協議会)による4800m/時 ですが，
これは結構速めなので，自分の速さに合わせると良いと思います．
</p>
<p>
もし「設定」で勾配計算が有効になっている場合は，2点間の平均勾配も求めます．
</p>
<div></div><h5><a name="i19"> </a>平均勾配の計算</h5>
平均勾配は，2点間の標高差 / 直線距離です．
標高差は，NASAが公開している <a href="http://www2.jpl.nasa.gov/srtm/">SRTM3標高データ</a> を使って求めています．
kamoland.com内で，日本を網羅する範囲の標高データと，抽出プログラムが動作しており，
各端末の地図ロイドから通信でそのデータを取得して使います．
<ul>
<li>関連ページ：<a title="SRTM3データから標高を読む" href="http://kamoland.com/wiki/wiki.cgi?SRTM3%A5%C7%A1%BC%A5%BF%A4%AB%A4%E9%C9%B8%B9%E2%A4%F2%C6%C9%A4%E0">SRTM3データから標高を読む</a></li>
</ul>
<p>
元データが3秒単位(約90m)間隔でしか存在しませんし，センサーの誤差もありますので，
標高差，平均勾配にもそれなりに誤差があります．注意してください．
</p>
<div></div><h3><a name="i20"> </a>PC用Googleマップから地図ロイドに座標を渡す方法</h3>
Android端末に<a title="見るだけマイマップ" href="http://kamoland.com/wiki/wiki.cgi?%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7">見るだけマイマップ</a>というアプリをインストールしておくと，簡単に座標の受け渡しができます．
<div></div><h4><a name="i21"> </a>１．PCのGoogleマップで，その位置を自分のマイマップに「目印」として登録します</h4>
<ul>
<li><a href="http://maps.google.com/support/bin/static.py?page=guide.cs&amp;guide=21670&amp;topic=21676&amp;answer=144363">Google マップユーザーガイド「目印の追加と編集」</a></li>
</ul>
<div></div><h4><a name="i22"> </a>２．地図ロイドから見るだけマイマップを起動してその位置を開く</h4>
ブックマークで右下の地球アイコンのボタンを押すと，
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v500-screen-5.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="v500-screen-5.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_763530302D73637265656E2D352E706E67" alt="v500-screen-5.png" title="v500-screen-5.png" width="224" height="336" /></a>
</p>
<p>
見るだけマイマップが起動しますので，先ほど登録した目印を選択すると，
</p>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=mirudake.png&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="mirudake.png"><img src="http://kamoland.com/wiki/attach/C3CFBFDEA5EDA5A4A5C9_6D69727564616B652E706E67" alt="mirudake.png" title="mirudake.png" width="224" height="336" /></a>
</p>
<p>
その位置に移動します
</p>
<div></div><h3><a name="i23"> </a>その他</h3>
<div></div><h4><a name="i24"> </a>コンパスの磁北偏差補正について</h4>
Android内蔵のコンパス機能のAPIは，真北ではなく磁北を返します．真北を求めるためにはずれを補正する必要があります．
このずれの値(偏差)は，東京で約7度です．この場合，コンパスが指す北(=磁北)から東に7度程度ずらしたのが，真北になります．
地図ロイドでは磁北偏差補正を実行すると，コンパスがこのずれを考慮した北(=真北)を指すようになります．(コンパスの色が赤から緑に変わります)
<p>
この補正量を実際に求めるのには，Android内蔵の機能を使っています(android.hardware.GeomagneticField)．
この機能では，以下の仕様が使われているようです．コンパスが存在する現在地の，緯度，経度，標高，時刻を使います．
</p>
<ul>
<li><a href="http://www.ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml">The World Magnetic Model - NGDC</a></li>
</ul>
<div></div><h4><a name="i25"> </a>コンパスのキャリブレーションについて</h4>
地磁気センサー(コンパス)ですが，自分のHT-03Aを見ている限り結構狂うようです．こまめに<a title="HT-03Aのキャリブレーション" href="http://kamoland.com/wiki/wiki.cgi?HT-03A%A4%CE%A5%AD%A5%E3%A5%EA%A5%D6%A5%EC%A1%BC%A5%B7%A5%E7%A5%F3">キャリブレーション</a>することをおすすめします．しかしそれでも，個人的には実際に山で使うのには不安があります．利用時は，狂うという可能性を忘れないでください．
<div></div><h3><a name="i26"> </a>更新履歴</h3>
<ul>
<li>バージョン 5.4: ブックマークで文字サイズ変更に対応．異常終了バグを修正 (2010/7/29)</li>
<li>バージョン 5.3: 距離測定の設定項目を整備(歩行速度，各種ON/OFF)，勾配計算に対応(SRTM3標高データを使用)，バイブ対応．地名検索で「緯度,経度」の入力に対応．地図再読込ボタンの表示期限を設定可能にした (2010/7/24)</li>
<li>バージョン 5.2: 距離測定機能を追加．ブックマーク位置に目印(青)を表示．ブックマーク登録名を音声入力可能に (2010/7/19)</li>
<li>バージョン 5.1: 地図モード画面を横長端末に対応．トラックボール移動速度に超高速を追加．画像バッファ設定の廃止 (2010/7/13)</li>
<li>バージョン 5.0: 左上に地図再取得ボタンを表示．メニュー-共有でYahoo地図画像に対応．ブックマークにグループ装備．GPS周り見直し，連続追尾に対応 (2010/7/10)</li>
<li>バージョン 4.25: GPS ON/OFF判定の内部処理を変更しました (Xperia向けの模索) (2010/6/29) <a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=chizroid425.apk&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="2010/07/09 23:03:19 158.1K"><img src="http://kamoland.com/wiki/image/file.png" width="20" height="20" alt="file" style="border-width:0px" />chizroid425.apk</a>
</li>
<li>バージョン 4.24: GPS ON/OFFの設定を，こまめにチェックするように修正しました (2010/6/26)</li>
<li>バージョン 4.23: GPS処理を見直して，設定にGPS測位精度を追加．測位精度を改善可能に (2010/6/23)</li>
<li>バージョン 4.22: ブックマークからGoogleマイマップの位置を参照可能(「見るだけマイマップ」2.0以上が必要です) (2010/6/20) <a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=chizroid422.apk&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="2010/06/23 22:58:49 155.2K"><img src="http://kamoland.com/wiki/image/file.png" width="20" height="20" alt="file" style="border-width:0px" />chizroid422.apk</a>
</li>
<li>バージョン 4.21: GPS処理の微調整(Desire向けの模索 その2)．強制終了バグ2件修正 (2010/6/9)</li>
<li>バージョン 4.20: GPS位置取得処理の微調整(HTC Desire向けの模索) (2010/6/7)</li>
<li>バージョン 4.19: 設定-位置情報で，位置検索時のGPS起動時間上限(あきらめるまでの時間)を指定可能に．今までは10秒固定でした (2010/6/6) <a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=chizroid419.apk&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="2010/06/07 22:27:24 147.9K"><img src="http://kamoland.com/wiki/image/file.png" width="20" height="20" alt="file" style="border-width:0px" />chizroid419.apk</a>
</li>
<li>バージョン 4.18: 現在位置取得処理の見直し．オフラインモード追加(圏外エリアでの動作速度改善) (2010/6/5) <a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=chizroid418.apk&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="2010/06/07 22:27:07 146.7K"><img src="http://kamoland.com/wiki/image/file.png" width="20" height="20" alt="file" style="border-width:0px" />chizroid418.apk</a>
</li>
<li>バージョン 4.17: ブックマーク長押しメニューに「マップを起動」追加．ショートカット作成時に地図モードを選べる (2010/5/28) <a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=chizroid417.apk&amp;mypage=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9&amp;refer=%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9" title="2010/06/05 02:45:14 145.6K"><img src="http://kamoland.com/wiki/image/file.png" width="20" height="20" alt="file" style="border-width:0px" />chizroid417.apk</a>
</li>
<li>バージョン 4.16: ブックマークからショートカットをHOMEに作成できるように．物理キー(音量+-/検索/カメラ)のカスタマイズ (2010/5/23)</li>
<li>バージョン 4.15: 操作性改善(音量キーでズームが可能に．コンパス2度押しでヘディングアップのON/OFFが可能に)．強制終了バグ2件修正 (2010/5/20)</li>
<li>バージョン 4.14 ブックマークの長押しメニューに「共有」を追加 (2010/5/15)</li>
<li>バージョン 4.13: 再びOS 1.5に対応しました．英語版だと設定画面を開けないというバグ(4.9から)を修正 (2010/5/8)</li>
<li>バージョン 4.12: 地形図で縮尺4500に対応しました(今までは9000まででした) (2010/5/7)</li>
<li>バージョン 4.11: PC用Googleマップから座標を受け取れるようになりました (2010/5/4)</li>
<li>バージョン 4.10: twiccaで開いたGoogleマップ形式URLを，地図ロイドで正しく受け取れるようにしました (2010/5/3)</li>
<li>バージョン 4.9: タッチパネルでドラッグして指を離したときの，慣性スクロールに対応しました (2010/5/2)</li>
<li>バージョン 4.8: GPS検索時に予測誤差を表示．ブックマークのコピーで住所もコピーする (2010/4/26)</li>
<li>バージョン 4.7: 設定を追加しました(ブックマークに住所表示，画面のたてよこ固定) (2010/4/25)</li>
<li>バージョン 4.6: 一部のキャッシュ(Yahoo地図のみ)をSDカードに保存できるようになりました (2010/4/20)</li>
<li>バージョン 4.5: HTC tatooなど低解像度端末でも，表示が切れないように修正 (2010/4/13)</li>
<li>バージョン 4.4: 自動追尾が二重に動くときがあるというバグを修正 (2010/4/12)</li>
<li>バージョン 4.3: Yahoo地図の地下街マップに対応しました．表示可能なエリアとズームの時に，右上に地下街への切り替えボタンが出ます (2010/4/10)</li>
<li>バージョン 4.2: 地図モードにYahoo地図を追加しました(地図キャッシュの容量をかなり使いますのでご注意) (2010/4/10)</li>
<li>バージョン 4.1: HTC tatooなどについているD-Padに対応したつもり(実機がないので自信なし orz (2010/4/3)</li>
<li>バージョン 4.0: Xperiaなどの高解像度端末に対応して設定項目を追加．これ以降はAndroid OS 1.6以上が必須 (2010/3/28)</li>
<li>バージョン 3.18: 外部アプリからの呼び出しに対応しました(geoインテント) (2010/3/21)</li>
<li>バージョン 3.17: 自動追尾にスムーズスクロールを導入．端末たてよこ回転時の動作を改善 (2010/3/7)</li>
<li>バージョン 3.16: 端末の縦横を回転すると表示が乱れるバグが混入していたのを修正 (2010/2/28)</li>
<li>バージョン 3.15: 地名検索，検索履歴の細かい機能改善 (2010/2/28)</li>
<li>バージョン 3.14: ブックマークから地名検索の履歴に移動できるようにした (2010/2/27)</li>
<li>バージョン 3.13: 現在地の自動追尾機能を追加．設定から「現在位置の自動追尾」です (2010/2/21)</li>
<li>バージョン 3.12: 設定に「キャッシュサイズ上限」を追加しました (2010/2/14)</li>
<li>バージョン 3.11: ブックマークの地図プレビューを，設定でオフにできるようにした (2010/2/13)</li>
<li>バージョン 3.10: ブックマークに地図プレビュー表示を追加した (2010/2/11)</li>
<li>バージョン 3.9: GoogleMapモードでも子画面を表示できるようにした (2010/2/6)</li>
<li>バージョン 3.8: 子画面表示ボタンの見栄えを微調整した (2010/2/3)</li>
<li>バージョン 3.7: 子画面表示ボタンを右下に追加 (GoogleMapには対応していません) (2010/2/2)</li>
<li>バージョン 3.6: 設定でスクロールボールを非表示にできるようにした (2010/1/31)</li>
<li>バージョン 3.5: 自動スクロールボール(青)を画面に追加 (2010/1/29)</li>
<li>バージョン 3.4: ブックマークをSDカードに保存できるようになりました (2010/1/24)</li>
<li>バージョン 3.3: GoogleMapで縮尺変更するときに出る縮尺の説明が間違っていたのを修正 (2010/1/22)</li>
<li>バージョン 3.2: GoogleMapでもヘディングアップ表示ができるようになりました (2010/1/18)</li>
<li>バージョン 3.1: GoogleMap表示中もトラックボールが使えるようになりました (2010/1/16)</li>
<li>バージョン 3.0: トラックボールに対応しました．ただしGoogleMapは未対応 (2010/1/13)</li>
<li>バージョン 2.8: 回転地形図で磁北偏差が正しく補正されていなかったのを修正．回転地形図をヘディングアップに名前変更 (2010/1/11)</li>
<li>バージョン 2.7: 地図モードに回転地形図を追加．コンパスに合わせて回転します (2010/1/9)</li>
<li>バージョン 2.6: コンパスに補助線を表示するようにした (2010/1/6)</li>
<li>バージョン 2.5: コンパスの磁北偏差補正機能を追加(メニュー-その他) (2010/1/3)</li>
<li>バージョン 2.4: 電子国土サーバの負荷軽減対応．リクエスト数の削減と，リクエスト間隔をあけた(1秒以上) (2010/1/2)</li>
<li>バージョン 2.3: コンパス機能を搭載(磁北偏差補正は未対応) (2010/1/2)</li>
<li>バージョン 2.2: キャッシュを搭載．電波の届かない場所ではキャッシュを使って地図を見れます (2009/12/31)</li>
<li>バージョン 2.1: 地図のズームに対応した (2009/12/29)</li>
<li>バージョン 2.0: 地図の表示を高速化した．その代わり現在ズームができません (2009/12/29)</li>
<li>バージョン 1.6: 地名検索の音声入力で地名に余分なスペースが入る場合があるのを修正</li>
<li>バージョン 1.5: 地名検索で音声入力に対応した．ブックマークに登録日時も表示 (2009/12/20)</li>
<li>バージョン 1.4: ブックマーク機能を追加した (2009/12/20)</li>
<li>バージョン 1.3: 英語メッセージを搭載した(国際化対応) (2009/12/14)</li>
<li>バージョン 1.2: スクロールの性能を少し改善した (2009/12/13)</li>
<li>バージョン 1.1: 起動時間を少し短縮した (2009/12/13)</li>
<li>バージョン 1.0.1: GPSの起動を必要最小限にした(電池節約)．GPSで検出した位置にマークを表示 (2009/12/12)</li>
<li>バージョン 1.0.0: 初版 (2009/12/12)</li>
</ul>]]></content:encoded>
    <dc:date>2010-07-25T20:45:24+09:00</dc:date>
    <dc:subject>Android</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?GoogleMap%A4%C7%B4%B7%C0%AD%A5%B9%A5%AF%A5%ED%A1%BC%A5%EB">
    <title>GoogleMapで慣性スクロール</title>
    <link>http://kamoland.com/wiki/wiki.cgi?GoogleMap%A4%C7%B4%B7%C0%AD%A5%B9%A5%AF%A5%ED%A1%BC%A5%EB</link>
    <description>AndroidでGoogle Maps APIを使った地図を慣性スクロールさせる方法 (android sdk 1.5)</description>
    <content:encoded><![CDATA[<p>
AndroidでGoogle Maps APIを使った地図を慣性スクロールさせる方法 (android sdk 1.5)

</p>
<p>
慣性スクロールというのは，指で画面をスクロールしたときに，勢いを付けておくと指を離してもしばらくビューンとスクロールし続けるという動作，という意味で使っています．少なくともこの記事では．
</p>
<p>
<span>MainAct.java</span>
</p>
<div>
<pre>
import com.google.android.maps.MapActivity;
import android.os.Bundle;

public class MainAct extends MapActivity {
	private GoogleMapView gmapView;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		gmapView = new GoogleMapView(this, null);
		setContentView(gmapView);
	}

	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}
}
</pre>


</div>
<p>
<span>GoogleMapView.java</span>
</p>
<div>
<pre>
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class GoogleMapView extends MapView {
	private static final String API_KEY = "[自分のAPIキー]";

	private static final boolean USE_KANSEI_SCROLL = true;
	private static final int KANSEI_MIN_DIFF = 3;
	private static final int KANSEI_STEP = 2;
	private static final int KANSEI_LOOP_INTERVAL = 20;

	private Handler handle;
	private boolean curDown;
	private boolean doingKanseiScroll;

	private int lastdownX;
	private int lastdownY;
	private int[] latestTouchedDx = new int[]{0,0};
	private int[] latestTouchedDy = new int[]{0,0};

	public GoogleMapView(Context context, AttributeSet attrs) {
		super(context, API_KEY);
		handle = new Handler();
	}

	@Override
	protected void onAttachedToWindow() {
		setBuiltInZoomControls(true);
		setSatellite(false);

		MapController mc = getController();
		mc.setZoom(17);
		mc.setCenter(new GeoPoint((int)(35.6655 * 1E6), (int)(139.7596 * 1E6)));

		setClickable(true);
		setFocusable(true);
		setFocusableInTouchMode(true);
		requestFocus();
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		int action = event.getAction(); 	 
		int curX = (int) event.getX();
		int curY = (int) event.getY();

		if (action == MotionEvent.ACTION_DOWN) {
			lastdownX = curX;
			lastdownY = curY;
			curDown = true;
			doingKanseiScroll = false;
			
		} else if (action == MotionEvent.ACTION_UP) {
			curDown = false;

			if (USE_KANSEI_SCROLL) {
				int biggerDx = (latestTouchedDx[0] > 0)?
					Math.max(latestTouchedDx[0], latestTouchedDx[1]):
					Math.min(latestTouchedDx[0], latestTouchedDx[1]);
				int biggerDy = (latestTouchedDy[0] > 0)?
					Math.max(latestTouchedDy[0], latestTouchedDy[1]):
					Math.min(latestTouchedDy[0], latestTouchedDy[1]);

				if (biggerDx &lt; -KANSEI_MIN_DIFF || biggerDx &gt; KANSEI_MIN_DIFF
						 || biggerDy &lt; -KANSEI_MIN_DIFF || biggerDy &gt; KANSEI_MIN_DIFF) {
	
					doingKanseiScroll = true;

					redrawForKanseiScroll(biggerDx, biggerDy);
				}
			}

		} else if (curDown &amp;&amp; action == MotionEvent.ACTION_MOVE) {
			int dx = lastdownX - curX;
			int dy = lastdownY - curY;
			lastdownX = curX;
			lastdownY = curY;
			
			scroll(dx, dy);

			if (USE_KANSEI_SCROLL) {
				latestTouchedDx[1] = latestTouchedDx[0];
				latestTouchedDx[0] = dx;
				latestTouchedDy[1] = latestTouchedDy[0];
				latestTouchedDy[0] = dy;
			}
		}
		return true;
	}

	private void redrawForKanseiScroll(int currentKanseiDx, int currentKanseiDy) {
		if (doingKanseiScroll) {
			if (currentKanseiDx > KANSEI_STEP) {
				currentKanseiDx -= KANSEI_STEP;
			} else if (currentKanseiDx &lt; -KANSEI_STEP) {
				currentKanseiDx += KANSEI_STEP;
			} else {
				currentKanseiDx = 0;
			}
			if (currentKanseiDy > KANSEI_STEP) {
				currentKanseiDy -= KANSEI_STEP;
			} else if (currentKanseiDy &lt; -KANSEI_STEP) {
				currentKanseiDy += KANSEI_STEP;
			} else {
				currentKanseiDy = 0;
			}
			scroll(currentKanseiDx, currentKanseiDy);

			if (currentKanseiDx == 0 &amp;&amp; currentKanseiDy == 0) {
				doingKanseiScroll = false;
			} else {
				final int dx = currentKanseiDx;
				final int dy = currentKanseiDy;
				handle.postDelayed(new Runnable() {
					public void run() {
						redrawForKanseiScroll(dx, dy);
					}
				}, KANSEI_LOOP_INTERVAL);
			}
		}
	}

	private void scroll(int dx, int dy) {
		getController().scrollBy(dx, dy);
	}
}
</pre>


</div>
ゼロから試行錯誤で編み出した実装なので，はっきり言ってものすごく泥臭いのですが，動作は快適です．<a title="地図ロイド" href="http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9">地図ロイド</a>ではこの方式を使っています．
<p>
やっていることは，指を離した(ACTION_UP)ら慣性スクロールを開始しているというだけなんですが，
</p>
<ul>
<li>スクロール速度は，過去2回のACTION_MOVEイベントによる移動量のうち大きい方を採用している</li>
<li>その初速を使って，徐々に減衰させながらHandler#postDelayed()でスクロール処理を繰り返し実行している</li>
</ul>
<p>
という内容です．
</p>]]></content:encoded>
    <dc:date>2010-07-12T00:18:25+09:00</dc:date>
    <dc:subject>Android</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?Intent%A4%CB%B2%E8%C1%FC%A4%F2%C5%CF%A4%B9%CA%FD%CB%A1">
    <title>Intentに画像を渡す方法</title>
    <link>http://kamoland.com/wiki/wiki.cgi?Intent%A4%CB%B2%E8%C1%FC%A4%F2%C5%CF%A4%B9%CA%FD%CB%A1</link>
    <description>Bitmap画像をJPEGかPNG形式でインテントに入れて，GMailなどの外部アプリを起動する方法です (Android SDK 1.6)</description>
    <content:encoded><![CDATA[<p>
Bitmap画像をJPEGかPNG形式でインテントに入れて，GMailなどの外部アプリを起動する方法です (Android SDK 1.6)

</p>

<h2><a name="i0"> </a>インテントに画像を渡す方法</h2>
自分のアプリ内部でBitmapのやりとりをする場合は，インテントに直接putExtra()して好きなように扱えば良いと思います．以下が参考になります．
<ul>
<li><a href="http://y-anz-m.blogspot.com/2010/05/androidintent-bitmap.html">Y.A.M の 雑記帳: Android　Intent に Bitmap を渡す方法</a></li>
</ul>
<p>
しかし外部アプリに渡したい場合は，これではうまくいきませんでした．<a title="地図ロイド" href="http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9">地図ロイド</a>への組み込みでかなりハマりましたので，書いておきます．
</p>
<div></div><h3><a name="i1"> </a>内蔵ファイル領域を使って渡す方法 (没)</h3>
Bitmapを直接インテントにputExtraしてActivityを起動した場合，Gmailで受け取るとClassCastExceptionが出ました．なので色々調べてみると，
直接Bitmapを渡すのではなく，自分自身のファイル領域に一旦ファイルとして書き出して，
そのURI(file://〜)をputExtraしたインテントを渡す必要があるようです．
<ul>
<li><a href="http://androidforums.com/android-developers/25988-send-image-action_send.html#post202508">Send an Image ACTION_SEND - Android Forums</a></li>
</ul>
<p>
もちろんその画像ファイルは外部アプリから読み出す必要があるため，
上のリンクに書かれている通り，パーミッションを
Context.MODE_WORLD_READABLE なファイルとして作成するわけです．
</p>
<div></div><h3><a name="i2"> </a>SDカードを使う方法</h3>
ところがこの方法でも，駄目でした
<p>
picasaで受け取って画像を見ることはできたのですが，
</p>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=bitmap_intent-1.png&amp;mypage=Intent%A4%CB%B2%E8%C1%FC%A4%F2%C5%CF%A4%B9%CA%FD%CB%A1&amp;refer=Intent%A4%CB%B2%E8%C1%FC%A4%F2%C5%CF%A4%B9%CA%FD%CB%A1" title="bitmap_intent-1.png"><img src="http://kamoland.com/wiki/attach/496E74656E74A4CBB2E8C1FCA4F2C5CFA4B9CAFDCBA1_6269746D61705F696E74656E742D312E706E67" alt="bitmap_intent-1.png" title="bitmap_intent-1.png" width="224" height="336" /></a>
</p>
<p>
Gmailだと，送信画面には添付ファイルとしてアイコンが出るのですが，
</p>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=bitmap_intent-2.png&amp;mypage=Intent%A4%CB%B2%E8%C1%FC%A4%F2%C5%CF%A4%B9%CA%FD%CB%A1&amp;refer=Intent%A4%CB%B2%E8%C1%FC%A4%F2%C5%CF%A4%B9%CA%FD%CB%A1" title="bitmap_intent-2.png"><img src="http://kamoland.com/wiki/attach/496E74656E74A4CBB2E8C1FCA4F2C5CFA4B9CAFDCBA1_6269746D61705F696E74656E742D322E706E67" alt="bitmap_intent-2.png" title="bitmap_intent-2.png" width="224" height="336" /></a>
</p>
<p>
実際に送信したメールには添付されませんでした
</p>
<p>
なぜGmailがそうなるのか不思議なのですが，
アプリのコンテキストから取得できる内蔵のファイル領域ではなく，SDカードに画像を保存すれば，Gmailでも正しく添付されるようになりました．
</p>
<div></div><h3><a name="i3"> </a>実装例</h3>
<div>
<pre>
public static void shareBitmap(Context context, Bitmap b) {
	String fname = "share.jpg";
	// ファイル保存先 (SDカード)
	String fileFullPath = Environment.getExternalStorageDirectory().getAbsolutePath()
		+ File.separator + "share_test"
		+ File.separator + fname;

	FileOutputStream out = null;

	try {
		// 画像をバイト配列に変換する
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		b.compress(CompressFormat.JPEG, 100, os); // PNGの場合は CompressFormat.PNG にする
		os.flush();
		byte[] w = os.toByteArray();
		os.close();

		// バイト配列をファイルとしてSDカードに書き出す
		out = new FileOutputStream(fileFullPath);
		out.write(w, 0, w.length);
		out.flush();

		// ファイルを示すインテントを作成する
		Uri uri = Uri.fromFile(new File(fileFullPath));

		intent = new Intent(Intent.ACTION_SEND);
		intent.setType("image/jpg"); // PNGの場合は "image/png" にする
		intent.putExtra(Intent.EXTRA_STREAM, uri);

		// 外部アプリを起動する
		try {
			context.startActivity(Intent.createChooser(intent, null));// 常に送信先を選択させる
		} catch (ActivityNotFoundException e) {
			//
		}

	} catch (FileNotFoundException ex) {
		//
	} catch (IOException ex) {
		//
	} finally {
		try {
			if (out != null) {
				out.close();
			}
		} catch (IOException ex) {
			//
		}
	}
}
</pre>


</div>
Gmailは一体何をやっているのだろうか．．．]]></content:encoded>
    <dc:date>2010-07-11T11:25:37+09:00</dc:date>
    <dc:subject>Android</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?SRTM3%A5%C7%A1%BC%A5%BF%A4%AB%A4%E9%C9%B8%B9%E2%A4%F2%C6%C9%A4%E0">
    <title>SRTM3データから標高を読む</title>
    <link>http://kamoland.com/wiki/wiki.cgi?SRTM3%A5%C7%A1%BC%A5%BF%A4%AB%A4%E9%C9%B8%B9%E2%A4%F2%C6%C9%A4%E0</link>
    <description>NASAが公開しているSRTM3標高データファイルから，perlで値を読み込むサンプルです．</description>
    <content:encoded><![CDATA[<p>
NASAが公開しているSRTM3標高データファイルから，perlで値を読み込むサンプルです．

</p>

<h2><a name="i0"> </a>SRTM3データから標高を読む</h2>
公式サイト
<ul>
<li><a href="http://www2.jpl.nasa.gov/srtm/">Shuttle Radar Topography Mission - SRTM</a></li>
</ul>
<p>
日本のデータファイルは，
</p>
<ul>
<li><a href="http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/">http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/</a></li>
</ul>
<p>
のEurasia配下にあります．たくさんありますが，ファイル名の規則はこうなっています．
</p>
<div></div><h3><a name="i1"> </a>ファイル名の規則</h3>
N35E139.hgt の場合
<ul>
<li>左下(南西)の隅が，北緯35度 東経139度</li>
<li>北緯35〜36度，東経139〜140度の範囲を含む</li>
</ul>
<p>
となります．日本全域をカバーしようとすると，全部で270ファイルぐらいになると思います．
</p>
<div></div><h3><a name="i2"> </a>ファイルの内容</h3>
この範囲を3秒ごとに分割した1201×1201のセルの，
ジオイドモデルWGS84/EGM96での標高値が最初から最後まで並んでいるというのが，
ファイルの内容です．
<p>
各標高値は，ビッグエンディアンの2バイト整数で格納されており，欠測値は-1です．
</p>
<p>
ファイルサイズはぴったり2884802(=1201×1201×2)バイトです．
</p>
<div></div><h3><a name="i3"> </a>プログラム例</h3>
<div>
<pre>
#!/usr/bin/perl

use strict;

my $COLS = 1201;
my $RECSIZE = $COLS * 2;

# 対象位置の緯度経度を，起動引数から取得する
my($y, $x) = (shift, shift);

my $fx = int($x);
my $fy = int($y);

my $filename = "N" .$fy. "E" .$fx. ".hgt";

my $base_x = $fx;
my $base_y = $fy + 1;

my $x_pos = int( ($x - $base_x) * 1200 );
my $y_pos = int( ($base_y - $y) * 1200 );

if (open(HGTFILE, $filename)) {
	binmode(HGTFILE);

	seek(HGTFILE, $RECSIZE * $y_pos + $x_pos * 2, 0);

	my $buf;
	read(HGTFILE, $buf, 2);
	close(HGTFILE);

	# ビッグエンディアンのunsigned shortで取得する
	my $h = unpack("n*", $buf);

	# unsignedからsignedに変換する
	$h = $h - 65536 if ($h > 32767);

	print "height=$h\n";
}
</pre>


</div>
<div></div><h3><a name="i4"> </a>動いているサンプル</h3>
<a title="緯度経度取得ツール" href="http://kamoland.com/wiki/wiki.cgi?%B0%DE%C5%D9%B7%D0%C5%D9%BC%E8%C6%C0%A5%C4%A1%BC%A5%EB">緯度経度取得ツール</a>で，実際に位置から標高値を取得するのを試すことができます．]]></content:encoded>
    <dc:date>2010-06-24T21:29:42+09:00</dc:date>
    <dc:subject>地理情報</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7">
    <title>見るだけマイマップ</title>
    <link>http://kamoland.com/wiki/wiki.cgi?%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7</link>
    <description>見るだけマイマップは，自分のGoogleマイマップに登録されているポイント(目印)を，Androidから見るためのアプリです．PCで調べた場所を，マイマップ経由で簡単にAndroid上で見ることができます</description>
    <content:encoded><![CDATA[<p>
見るだけマイマップは，自分のGoogleマイマップに登録されているポイント(目印)を，Androidから見るためのアプリです．PCで調べた場所を，マイマップ経由で簡単にAndroid上で見ることができます

</p>

<h2><a name="i0"> </a>見るだけマイマップ</h2>
Android Marketに登録してあります．
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=icon2.png&amp;mypage=%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7&amp;refer=%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7" title="icon2.png"><img src="http://kamoland.com/wiki/attach/B8ABA4EBA4C0A4B1A5DEA5A4A5DEA5C3A5D7_69636F6E322E706E67" alt="icon2.png" title="icon2.png" width="48" height="48" /></a> ホーム > アプリケーション > 旅行 > <a href="http://jp.androlib.com/android.application.com-kamoland-mirudake-jjnzB.aspx">見るだけマイマップ</a> (AndroLib.com)
</p>
<ul>
<li>OS 1.5以上が必要です</li>
<li>HT-03Aしか持っていないため，実機での確認はHT-03Aだけです</li>
</ul>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v2-screen-1.png&amp;mypage=%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7&amp;refer=%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7" title="v2-screen-1.png"><img src="http://kamoland.com/wiki/attach/B8ABA4EBA4C0A4B1A5DEA5A4A5DEA5C3A5D7_76322D73637265656E2D312E706E67" alt="v2-screen-1.png" title="v2-screen-1.png" width="224" height="336" /></a>
</p>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=v2-screen-2.png&amp;mypage=%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7&amp;refer=%B8%AB%A4%EB%A4%C0%A4%B1%A5%DE%A5%A4%A5%DE%A5%C3%A5%D7" title="v2-screen-2.png"><img src="http://kamoland.com/wiki/attach/B8ABA4EBA4C0A4B1A5DEA5A4A5DEA5C3A5D7_76322D73637265656E2D322E706E67" alt="v2-screen-2.png" title="v2-screen-2.png" width="224" height="336" /></a>
</p>
<p>
マイマップに登録されているポイントについて，次の操作ができます．
</p>
<ul>
<li>地図アプリを起動 (Googleマップ，地図ロイドなど)</li>
<li>座標を他のアプリに共有</li>
<li>地図アプリで開くためのショートカットを，ホーム画面に作成</li>
</ul>
<p>
一度マイマップ情報を取得するとキャッシュに保存するため，それ以後は通信圏外でも動作します．最新の情報に更新する場合は，メニューボタン-更新 を実行してください．
</p>
<div></div><h3><a name="i1"> </a>制限</h3>
<ul>
<li>マイマップの編集機能はありません</li>
<li>対応しているのは目印(ポイント)だけです．トラックログ，直線，シェイプなどには対応していません</li>
</ul>
<div></div><h3><a name="i2"> </a>外部アプリからの呼び出し方(開発者向け)</h3>
外部アプリからインテント経由で起動して，見るだけマイマップ上で選択された目印を，
呼び出し元のアプリから受け取ることができます．
<div>
<pre>
	// 受け取るインテントのextrasに含まれるキー
	private static final String ESTRING_KEY_NAME = "name";
	private static final String ESTRING_KEY_DESCRIPTION = "desc";
	private static final String EFLOAT_KEY_LATITUDE = "lat";
	private static final String EFLOAT_KEY_LONGTITUDE = "lon";
	private static final String ESTRING_KEY_ICON_URL = "iconUrl";
	private static final String ESTRING_KEY_PUB_DATE = "pubDate";

	// インテント識別コード．識別するだけなので値は何でも良い
	private static final int INTENT_CODE_SELECT_ACT = 1;

	// インテントを準備する
	String cpath = "com.kamoland.mirudake.MainAct";
	String pack = cpath.substring(0, cpath.lastIndexOf('.'));

	Intent intent = new Intent(Intent.ACTION_PICK);
	intent.setClassName(pack, cpath);

	// 見るだけマイマップを起動する
	startActivityForResult(intent, INTENT_CODE_SELECT_ACT);

	// 別アクティビティからの戻り時イベント
	@Override
	protected void onActivityResult(int requestCode,int resultCode, Intent data) {
		if (requestCode == INTENT_CODE_SELECT_ACT) {
			// 見るだけマイマップから戻った場合
			if (resultCode == RESULT_OK) {
				Bundle extras = data.getExtras();

				// 選択された目印の情報をインテントから取り出す
				String name = extras.getString(ESTRING_KEY_NAME);
				String desc = extras.getString(ESTRING_KEY_DESCRIPTION);
				float lat = extras.getFloat(EFLOAT_KEY_LATITUDE);
				float lon = extras.getFloat(EFLOAT_KEY_LONGTITUDE);
				String iconUrl = extras.getString(ESTRING_KEY_ICON_URL);
				String pubDate = extras.getString(ESTRING_KEY_PUB_DATE);
			}
		}
		super.onActivityResult(requestCode, resultCode, data);
	}
</pre>


</div>
<div></div><h4><a name="i3"> </a>インテントで受け取れるパラメータ一覧</h4>
<table cellspacing="1" border="1">
<tr><th>キー</th><th>データ型</th><th>内容</th></tr>
<tr><td>name</td><td>String</td><td>名前，タイトル</td></tr>
<tr><td>desc</td><td>String</td><td>説明．HTMLタグは除去してあります(余計なお世話？)．無指定の場合は空文字</td></tr>
<tr><td>lat</td><td>float</td><td>緯度</td></tr>
<tr><td>lon</td><td>float</td><td>経度</td></tr>
<tr><td>iconUrl</td><td>String</td><td>アイコン画像のURL．無指定の場合は空文字</td></tr>
<tr><td>pubDate</td><td>String</td><td>登録された日時．形式は「yyyy-MM-dd HH:mm」</td></tr>
</table>
<div></div><h4><a name="i4"> </a>amコマンドでの起動例</h4>
パラメータを受け取れないので，意味ないですが
<div>
<pre>
adb shell
am start -a android.intent.action.PICK -n com.kamoland.mirudake/.MainAct
</pre>
</div>
<div></div><h3><a name="i5"> </a>謝辞</h3>
本アプリでは，
Google Inc.により <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0ライセンス</a> で公開されている，
MyTracksのソースコードおよび付属ライブラリを一部使用しています
<div></div><h3><a name="i6"> </a>余談</h3>
なお，AndroidのGoogleマップはレイヤーでマイマップに対応していますので，Googleマップだけを使うならこのアプリは不要かも知れません．
<p>
このアプリは，マイマップの座標を他の色々なアプリに渡すことで，できることの可能性が広がるのではないかということで作成しました．そのような使い方こそ，Androidらしいと思いますし．
</p>
<div></div><h3><a name="i7"> </a>更新履歴</h3>
<ul>
<li>バージョン 3.2: フォントサイズを変更できるようにしました (2010/7/26)</li>
<li>バージョン 3.1: 一部の名前が文字化けするのを修正．ショートカットの名前を指定可能にした (2010/7/3)</li>
<li>バージョン 3.0: Android 2.1以上に対応しました．マルチアカウントで使用できます (2010/6/22)</li>
<li>バージョン 2.0: 外部アプリからの呼び出しに対応しました．<a title="地図ロイド" href="http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9">地図ロイド</a>4.22以上から利用できます (2010/6/20)</li>
<li>バージョン 1.0: オフラインで動作するようになりました．更新は，メニュー-更新でできます (2010/6/18)</li>
<li>バージョン 0.2: ポイントにアイコンを表示．長いポイント名を折り返し表示する (2010/6/12)</li>
<li>バージョン 0.1: 初版 (2010/6/12)</li>
</ul>]]></content:encoded>
    <dc:date>2010-06-23T23:35:06+09:00</dc:date>
    <dc:subject>Android</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?%B0%DE%C5%D9%B7%D0%C5%D9%BC%E8%C6%C0%A5%C4%A1%BC%A5%EB">
    <title>緯度経度取得ツール</title>
    <link>http://kamoland.com/wiki/wiki.cgi?%B0%DE%C5%D9%B7%D0%C5%D9%BC%E8%C6%C0%A5%C4%A1%BC%A5%EB</link>
    <description>電子国土の地図を使って，場所の座標(緯度，経度)と標高を取得するツール【更新】標高取得機能を追加した (2010-06-14)</description>
    <content:encoded><![CDATA[<p>
電子国土の地図を使って，場所の座標(緯度，経度)と標高を取得するツール

<div><span>2010-06-14</span> 標高取得機能を追加した</div>




<div id="mapview">
<div style="float:left; width:200px;">


</div>
<div>


</div>
</div>
<div style="clear:both;">


区切り文字 <br>
<img src="http://kamoland.com/image/ball_r.gif">
経度緯度
 緯度経度
<br>
標高 メートル (SRTM3)

<p>

直接移動：
緯度経度



 -->

</p>

<h3><a name="i0"> </a>使い方</h3>
<ul>
<li>地図上でマウスクリックすると，その位置の座標(緯度，経度)と標高が表示されます．</li>
<li>デフォルトでは経度と緯度をカンマで区切って表示しますが，「経度緯度の区切り文字」で変えることができます</li>
<li>緯度と経度を指定して移動することができます</li>
</ul>
<div></div><h3><a name="i1"> </a>標高について</h3>
<ul>
<li>標高データは，NASAが無料で公開している<a href="http://www2.jpl.nasa.gov/srtm/">SRTM3</a>を使用しています</li>
<li>これは3秒ごと(およそ90mごと)に用意されているデータです</li>
<li>詳しくは<a title="SRTM3データから標高を読む" href="http://kamoland.com/wiki/wiki.cgi?SRTM3%A5%C7%A1%BC%A5%BF%A4%AB%A4%E9%C9%B8%B9%E2%A4%F2%C6%C9%A4%E0">SRTM3データから標高を読む</a>を参照してください</li>
</ul>]]></content:encoded>
    <dc:date>2010-06-14T22:17:18+09:00</dc:date>
    <dc:subject>電子国土</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?Desire%A4%CEGPS%BC%E8%C6%C0%A4%C7%A4%CE%BB%EE%B9%D4%BA%F8%B8%ED">
    <title>DesireのGPS取得での試行錯誤</title>
    <link>http://kamoland.com/wiki/wiki.cgi?Desire%A4%CEGPS%BC%E8%C6%C0%A4%C7%A4%CE%BB%EE%B9%D4%BA%F8%B8%ED</link>
    <description>地図ロイドの現在位置機能(GPS)がHTC Desire(Android 2.1)でうまく動かないらしいということで，いくつか試行錯誤したメモです．ただし，まだ完全には解決していないようです．</description>
    <content:encoded><![CDATA[<p>
<a title="地図ロイド" href="http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9">地図ロイド</a>の現在位置機能(GPS)がHTC Desire(Android 2.1)でうまく動かないらしいということで，いくつか試行錯誤したメモです．ただし，まだ完全には解決していないようです．

</p>

<h2><a name="i0"> </a>DesireのGPS取得での試行錯誤</h2>
<div></div><h3><a name="i1"> </a>LocationManager.getBestProviderの不具合</h3>
GPSのLocationProviderを取得するのに，
LocationManager.GPS_PROVIDERを直接使わずに，
LocationManager.getBestProvider()を使って「最も位置が正確なプロバイダー」を取得していたのですが，
この方法では，DesireでGPS_PROVIDERが取得できなかったようです．
<p>
以下のAndroidの不具合だと思われます．
</p>
<ul>
<li><a href="http://code.google.com/p/android/issues/detail?id=7849">LocationManager.getBestProvider returns the less-than-best provider</a></li>
</ul>
<p>
回避策は簡単で，そんな回りくどいことをせずにLocationManager.GPS_PROVIDERを直接使えばいいだけです．
もちろん当然，実際に有効かどうかをLocationManager.isProviderEnabled()でチェックしてから使う必要はあります．
</p>
<p>
この対応で，GPSを使ってくれる(GPSマークがピコピコする)ようにはなったのですが．．．
</p>
<div></div><h3><a name="i2"> </a>onLocationChangedが発生しない？</h3>
どうも，
<div>
<pre>
// 位置検索を始動する
LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
</pre>
</div>
みたいな感じで位置検索を始動しても，位置検出イベントonLocationChangedが発生しないようでした．
もちろん衛星が無い場所だと発生しないのですが，そういう場所でも無いようです．
<p>
この問題は解決できていないのですが，以下の対応である程度改善はしているようです．
</p>
<div>
<pre>
// 初期化時．PARTIAL_WAKE_LOCKの準備をする
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
WakeLock wakelock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.getClass().getName());

// GPS使用開始時．PARTIAL_WAKE_LOCKを取得する
wakelock.acquire();

// 試しにgetLastKnownLocationしてみる
LocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

// 位置検索を始動する
LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this);

 ・・・
// GPS使用終了時．PARTIAL_WAKE_LOCKを解放する
LocationManager.removeUpdates(this);
wakelock.release();
</pre>
</div>
変更したのは以下の3点です
<ol>
<li>LocationManager.requestLocationUpdates()で指定する検出間隔(msec，m)を「0,0」から「1000,1」に変えた</li>
<li>requestLocationUpdatesの前に，getLastKnownLocationを呼び出すようにした</li>
<li>GPS使用している間は，PARTIAL_WAKE_LOCKを取得しておくようにした</li>
</ol>
<p>
ただし3.については，少なくとも1.6ではGPS検索中は自動的にPARTIAL_WAKE_LOCKを取得しているようなので，
いまいち腑に落ちないところではあります．(かといって他の2点も，全然腑に落ちないのですが．．．)
</p>
<p>
まぁ，結果オーライという感じです．
</p>
<p>
HTC Desireの再現する実機が手元にあれば，もう少し切り分けできるのですが，無いので実際に何が効果があるのかわかっていない状況です．
</p>
<p>
これ以上改善するには，一般的なGPSトラッキングアプリのように，GPSを裏で起動しっぱなしにするぐらいしか思いつかないのですが，
地図ロイドの電池節約の方針とは合わないので，悩ましいところです．
</p>
<div></div><h3><a name="i3"> </a>参考</h3>
<ul>
<li><a href="http://android.forums.wordpress.org/topic/geolocation-on-htc-desire">Geolocation on HTC Desire</a></li>
</ul>]]></content:encoded>
    <dc:date>2010-06-12T22:54:50+09:00</dc:date>
    <dc:subject>Android</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?Yahoo%C3%CF%BF%DE%A4%CE%A5%BF%A5%A4%A5%EA%A5%F3%A5%B0">
    <title>Yahoo地図のタイリング</title>
    <link>http://kamoland.com/wiki/wiki.cgi?Yahoo%C3%CF%BF%DE%A4%CE%A5%BF%A5%A4%A5%EA%A5%F3%A5%B0</link>
    <description>Yahoo地図をタイリングで貼り合わせて，連続した地図画像を作る方法について説明します．Yahoo地図API の，スタティックマップを使います</description>
    <content:encoded><![CDATA[<p>
Yahoo地図をタイリングで貼り合わせて，連続した地図画像を作る方法について説明します．<a href="http://developer.yahoo.co.jp/webapi/map/">Yahoo地図API</a> の，スタティックマップを使います

</p>

<h2><a name="i0"> </a>Yahoo地図のタイリング</h2>
スタティックマップの使い方は簡単で，
<ul>
<li>中心の位置: 緯度(lat)，経度(lon)</li>
<li>縮尺レベル: z</li>
<li>画像サイズ (width, height)</li>
</ul>
<p>
を指定して呼び出せば，地図画像を得ることができます．
しかしこれを上下左右にきれいに並べようとすると，結構面倒です．
</p>
<p>
「上の画像」「右の画像」というような指定はできないので，
どの位置を中心にすれば，重ならず，かつ隙間ができずに上下左右の画像を取れるのかを，
考えなければなりません．
</p>
<p>
このあたりの話を説明します．なお，ここで説明するのは私の試行錯誤の結果であり，Yahooの正式な内容ではありません．
</p>
<div></div><h3><a name="i1"> </a>地図画像と緯度経度の関係</h3>
画像幅を300pixelとしたときの，画像1枚当たりの緯度経度差

<table cellspacing="1" border="1">
<tr><th>z</th><th>px(×1E6)</th><th>py(×1E6)</th></tr>
<tr><td>9</td><td>1643520</td><td>1645000</td></tr>
<tr><td>10</td><td>821760</td><td>824320</td></tr>
<tr><td>11</td><td>410880</td><td>412160</td></tr>
<tr><td>12</td><td>205440</td><td>206080</td></tr>
<tr><td>13</td><td>102720</td><td>103040</td></tr>
<tr><td>14</td><td>51360</td><td>51520</td></tr>
<tr><td>15</td><td>25680</td><td>25760</td></tr>
<tr><td>16</td><td>12840</td><td>12880</td></tr>
<tr><td>17</td><td>6420</td><td>6440</td></tr>
<tr><td>18</td><td>3220</td><td>3220</td></tr>
<tr><td>19</td><td>1610</td><td>1610</td></tr>
<tr><td>20</td><td>805</td><td>805</td></tr>
<tr><td>21</td><td>403</td><td>402.6</td></tr>
</table>
<p>
※この値は，私が目視による試行錯誤で求めたものなので，不正確なので注意！
</p>
<p>
この表の意味は，
</p>
<ul>
<li>z=9で幅300pixelの地図画像を取得すると，その左端から右端までの間隔は1.64352度</li>
</ul>
<p>
ということです．
ただし，上端から下端までの間隔も同じように1.645度かというと，そうはいかないのです．
</p>
<p>
地図画像の上端から下端までの間隔は，緯度によって変わります．
そして，取得する画像高さを次の値にしてやれば，この表のpyと合います．
</p>
<div>
<pre>
取得する画像高さ(pixel) = 画像幅(pixel) / cos(着目画像位置の緯度)
</pre>
</div>
例えば，緯度=35.7869158度であれば，
<div>
<pre>
高さ = 300 / cos(35.7869158度) = 370 (pixel)
</pre>
</div>
で地図画像を取得すれば，上端から下端までが1.645度になります．余談ですが，この規則(緯度による間隔の変化)は，国土地理院の電子国土の地図にも当てはまります．
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=ymap2.png&amp;mypage=Yahoo%C3%CF%BF%DE%A4%CE%A5%BF%A5%A4%A5%EA%A5%F3%A5%B0&amp;refer=Yahoo%C3%CF%BF%DE%A4%CE%A5%BF%A5%A4%A5%EA%A5%F3%A5%B0" title="ymap2.png"><img src="http://kamoland.com/wiki/attach/5961686F6FC3CFBFDEA4CEA5BFA5A4A5EAA5F3A5B0_796D6170322E706E67" alt="ymap2.png" title="ymap2.png" width="439" height="534" /></a>
4枚取得してタイリングした例
</p>
<p>
まぁ不正確不正確といいつつ，<a title="地図ロイド" href="http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9">地図ロイド</a>ではこの方法を使っていますので，あの程度の精度にはなります．
</p>]]></content:encoded>
    <dc:date>2010-06-04T21:04:25+09:00</dc:date>
    <dc:subject>地理情報</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?HOME%A4%CB%A5%B7%A5%E7%A1%BC%A5%C8%A5%AB%A5%C3%A5%C8%A4%F2%BA%EE%C0%AE%A4%B9%A4%EB">
    <title>HOMEにショートカットを作成する</title>
    <link>http://kamoland.com/wiki/wiki.cgi?HOME%A4%CB%A5%B7%A5%E7%A1%BC%A5%C8%A5%AB%A5%C3%A5%C8%A4%F2%BA%EE%C0%AE%A4%B9%A4%EB</link>
    <description>Androidアプリからホーム画面にショートカットを作る方法です．(Android SDK 1.6)</description>
    <content:encoded><![CDATA[<p>
Androidアプリからホーム画面にショートカットを作る方法です．(Android SDK 1.6)

</p>

<h2><a name="i0"> </a>ホーム画面にショートカットを作成する</h2>
ホーム画面にショートカットを作るといっても，詳しくはいくつか状況があると思います．
<ul>
<li>(A) HOMEで長押ししたときに出る「ショートカット」からアプリが呼び出されて，作成する (例：Gmailのラベル．ApiDemosのApp/Launcher Shortcuts)</li>
</ul>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=shortcut1.png&amp;mypage=HOME%A4%CB%A5%B7%A5%E7%A1%BC%A5%C8%A5%AB%A5%C3%A5%C8%A4%F2%BA%EE%C0%AE%A4%B9%A4%EB&amp;refer=HOME%A4%CB%A5%B7%A5%E7%A1%BC%A5%C8%A5%AB%A5%C3%A5%C8%A4%F2%BA%EE%C0%AE%A4%B9%A4%EB" title="shortcut1.png"><img src="http://kamoland.com/wiki/attach/484F4D45A4CBA5B7A5E7A1BCA5C8A5ABA5C3A5C8A4F2BAEEC0AEA4B9A4EB_73686F7274637574312E706E67" alt="shortcut1.png" title="shortcut1.png" width="240" height="360" /></a>
</p>

<ul>
<li>(B) アプリの動作中に，選択中のアイテムなどをショートカット化してHOMEに置く (例：標準ブラウザのブックマーク長押し)</li>
</ul>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=shortcut2.png&amp;mypage=HOME%A4%CB%A5%B7%A5%E7%A1%BC%A5%C8%A5%AB%A5%C3%A5%C8%A4%F2%BA%EE%C0%AE%A4%B9%A4%EB&amp;refer=HOME%A4%CB%A5%B7%A5%E7%A1%BC%A5%C8%A5%AB%A5%C3%A5%C8%A4%F2%BA%EE%C0%AE%A4%B9%A4%EB" title="shortcut2.png"><img src="http://kamoland.com/wiki/attach/484F4D45A4CBA5B7A5E7A1BCA5C8A5ABA5C3A5C8A4F2BAEEC0AEA4B9A4EB_73686F7274637574322E706E67" alt="shortcut2.png" title="shortcut2.png" width="240" height="360" /></a>
</p>
<p>
ここで説明するのは，(B)の方です．ちなみに(A)の方は以下の記事が参考になると思います．
</p>
<ul>
<li><a href="http://d.hatena.ne.jp/hyoromo/20100501/1272666318">ショートカットのアプリ作成方法 - hyoromoの日記</a></li>
</ul>
<p>
この(A)と(B)を混同してしまうと，話がごちゃごちゃになるのでご注意．．．
</p>
<div></div><h3><a name="i1"> </a>実装例</h3>
<div>
<pre>
// Activityに以下を実装する

// ショートカットに持たせるインテントの内容
// ここでは MainActというクラスをACTION_VIEWで呼び出すという内容
Intent shortcutIntent = new Intent(Intent.ACTION_VIEW);
shortcutIntent.setClassName(this, MainAct.class.getName());
shortcutIntent.setData(Uri.parse("geo:37.01606,139.39691"));

// ショートカットをHOMEに作成する
Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, pos.name);
Parcelable iconResource = Intent.ShortcutIconResource.fromContext(this, R.drawable.icon);
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
sendBroadcast(intent);
</pre>


</div>
ショートカット作成後に表示される「ショートカットXを作成しました」というtoastは，システムが勝手に出しているようです．
<p>
なお，以下のパーミッションが必要です．(実行すればエラーが出るので一発でわかりますが)
</p>
<div>
<pre>
&lt;uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /&gt;
</pre>
</div>
<a title="地図ロイド" href="http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9">地図ロイド</a>に組み込むために調査したのですが，たったこれだけのために何時間もかかってしまいました．orz
<div></div><h3><a name="i2"> </a>参考</h3>
<ul>
<li><a href="http://www.anddev.org/shortcut_of_application_on_home_screen-t13061.html">Shortcut of Application on Home Screen</a></li>
<li><a href="http://groups.google.com/group/android-developers/browse_thread/thread/2380a5f2e54099d5">How to create home screen short cut?</a></li>
</ul>]]></content:encoded>
    <dc:date>2010-05-23T16:11:54+09:00</dc:date>
    <dc:subject>Android</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?Android%A4%C7%B2%E8%CC%CC%A4%F2%BD%C4%B2%A3%B8%C7%C4%EA%A4%B9%A4%EB%CA%FD%CB%A1">
    <title>Androidで画面を縦横固定する方法</title>
    <link>http://kamoland.com/wiki/wiki.cgi?Android%A4%C7%B2%E8%CC%CC%A4%F2%BD%C4%B2%A3%B8%C7%C4%EA%A4%B9%A4%EB%CA%FD%CB%A1</link>
    <description>Androidで画面の向きを変えても，アプリの画面をたてよこ回転せずに固定する方法(android sdk 1.6)</description>
    <content:encoded><![CDATA[<p>
Androidで画面の向きを変えても，アプリの画面をたてよこ回転せずに固定する方法(android sdk 1.6)

</p>

<h2><a name="i0"> </a>Androidで画面を縦横固定する方法</h2>
以下のメソッドをActivityクラスに記述して，呼び出せばOK
<div>
<pre>
	/**
	 * 縦横固定の設定をActivityに適用する
	 * @param fixOrient 固定するならtrue，回転するように戻すならfalse
	 */
	private void controlOrientationFix(boolean fixOrient) {
		if (fixOrient) {
			int ori = getResources().getConfiguration().orientation;
			if (ori == Configuration.ORIENTATION_LANDSCAPE) {
				setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
			} else {
				setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
			}
		} else {
			setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED );
		}
	}
</pre>
</div>]]></content:encoded>
    <dc:date>2010-04-27T23:09:29+09:00</dc:date>
    <dc:subject>Android</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?GoogleMap%A4%CE%A5%BA%A1%BC%A5%E0%A5%EC%A5%D9%A5%EB%A4%C8%BD%CC%BC%DC">
    <title>GoogleMapのズームレベルと縮尺</title>
    <link>http://kamoland.com/wiki/wiki.cgi?GoogleMap%A4%CE%A5%BA%A1%BC%A5%E0%A5%EC%A5%D9%A5%EB%A4%C8%BD%CC%BC%DC</link>
    <description>AndroidのGoogle Maps APIを使ってGoogleマップを表示する場合の，ズームレベル(zoomLevel)の値と縮尺のおおよその対応について</description>
    <content:encoded><![CDATA[<p>
AndroidのGoogle Maps APIを使ってGoogleマップを表示する場合の，ズームレベル(zoomLevel)の値と縮尺のおおよその対応について

</p>

<h2><a name="i0"> </a>GoogleMapのズームレベルと縮尺</h2>
Android SDKについているGoogleのMaps APIで地図を表示する場合，ズームレベルとして1〜21の値が使えます．
しかしこの値が実際の縮尺とどう対応するのかがわかりません．
<p>
ただ手がかりとして，APIドキュメント(com.google.android.maps.MapController)に以下の説明があります．
</p>
<ul>
<li><a href="http://code.google.com/intl/ja/android/add-ons/google-apis/reference/com/google/android/maps/MapController.html">http://code.google.com/intl/ja/android/add-ons/google-apis/reference/com/google/android/maps/MapController.html</a></li>
</ul>
<div>
<pre>
public int setZoom(int zoomLevel)

zoomLevel - At zoomLevel 1, the equator of the earth is 256 pixels long.
Each successive zoom level is magnified by a factor of 2.
</pre>
</div>
<p>
この内容と，実際に表示される地図を検討すると，おそらくこんな感じではないかと思われます．．．
</p>
<table cellspacing="1" border="1">
<tr><th>zoomLevel</th><th>不正確なおよその縮尺</th></tr>
<tr><td>20</td><td>1,000</td></tr>
<tr><td>19</td><td>2,000</td></tr>
<tr><td>18</td><td>4,000</td></tr>
<tr><td>17</td><td>8,000</td></tr>
<tr><td>16</td><td>16,000</td></tr>
<tr><td>15</td><td>32,000</td></tr>
<tr><td>14</td><td>64,000</td></tr>
<tr><td>13</td><td>128,000</td></tr>
<tr><td>12</td><td>256,000</td></tr>
<tr><td>11</td><td>512,000</td></tr>
<tr><td>10</td><td>1,024,000</td></tr>
<tr><td>・・・</td><td>・・・</td></tr>
</table>
<p>
あくまで，不正確なおおよその値ですので注意してください．
</p>]]></content:encoded>
    <dc:date>2010-01-21T22:32:38+09:00</dc:date>
    <dc:subject>Android</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?Android%A4%C7GoogleMap%A4%F2%A5%D8%A5%C7%A5%A3%A5%F3%A5%B0%A5%A2%A5%C3%A5%D7%C9%BD%BC%A8">
    <title>AndroidでGoogleMapをヘディングアップ表示</title>
    <link>http://kamoland.com/wiki/wiki.cgi?Android%A4%C7GoogleMap%A4%F2%A5%D8%A5%C7%A5%A3%A5%F3%A5%B0%A5%A2%A5%C3%A5%D7%C9%BD%BC%A8</link>
    <description>AndroidでGoogle Maps APIを使って地図をヘディングアップ表示する方法．電子コンパスに合わせて地図が回転するというものです．(android sdk 1.5)</description>
    <content:encoded><![CDATA[<p>
AndroidでGoogle Maps APIを使って地図をヘディングアップ表示する方法．電子コンパスに合わせて地図が回転するというものです．(android sdk 1.5)

</p>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=gmap1.png&amp;mypage=Android%A4%C7GoogleMap%A4%F2%A5%D8%A5%C7%A5%A3%A5%F3%A5%B0%A5%A2%A5%C3%A5%D7%C9%BD%BC%A8&amp;refer=Android%A4%C7GoogleMap%A4%F2%A5%D8%A5%C7%A5%A3%A5%F3%A5%B0%A5%A2%A5%C3%A5%D7%C9%BD%BC%A8" title="gmap1.png"><img src="http://kamoland.com/wiki/attach/416E64726F6964A4C7476F6F676C654D6170A4F2A5D8A5C7A5A3A5F3A5B0A5A2A5C3A5D7C9BDBCA8_676D6170312E706E67" alt="gmap1.png" title="gmap1.png" width="320" height="480" /></a>
</p>
<p>
<span>MainAct.java</span>
</p>
<div>
<pre>
import java.util.List;
import com.google.android.maps.MapActivity;
import android.content.Context;
import android.content.res.Configuration;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

public class MainAct extends MapActivity {
	public float[] mValues;
	private SensorManager mSensorManager;
	private SensorEventListener mSensorEventListener;
	private ViewUpdateHandler mViewUpdateHandler;
	private GoogleMapView gmapView;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
		mSensorEventListener = new SensorEventListener() {
			public void onSensorChanged(SensorEvent event) {
				int ori = getResources().getConfiguration().orientation;
				if (ori == Configuration.ORIENTATION_LANDSCAPE) {
					// 横置きの場合の角度補正
					event.values[0] += 90;
					if (event.values[0] >= 360) {
						event.values[0] -= 360;
					}
				}
				mValues = event.values;
			}
			public void onAccuracyChanged(Sensor sensor, int accuracy) {
			}
		};

		gmapView = new GoogleMapView(this, null);
		
		setContentView(gmapView);
	}

	@Override
	protected void onResume(){
		super.onResume();

		List&lt;Sensor&gt; sl = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
		mSensorManager.registerListener(mSensorEventListener, sl.get(0), SensorManager.SENSOR_DELAY_NORMAL);

		mViewUpdateHandler = new ViewUpdateHandler();
		mViewUpdateHandler.sleep(0);
	}

	@Override
	protected void onPause(){
		super.onPause();
		mSensorManager.unregisterListener(mSensorEventListener);
	}

	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}

	/**
	 * Google Mapを定期的に再描画するためのハンドラ
	 */
	public class ViewUpdateHandler extends Handler {
		@Override
		public void handleMessage(Message msg) {
			gmapView.invalidate();
			if (mViewUpdateHandler != null) {
				mViewUpdateHandler.sleep(100);
			}
		}
		public void sleep(long delayMillis) {
			removeMessages(0);
			sendMessageDelayed(obtainMessage(0),  delayMillis);
		}
	}	 
}
</pre>


</div>
<p>
<span>GoogleMapView.java</span>
</p>
<div>
<pre>
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.view.MotionEvent;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class GoogleMapView extends MapView {
	private MainAct mainAct;

	private int centerX;
	private int centerY;

	private boolean curDown;
	private int lastdownX;
	private int lastdownY;

	private static final String API_KEY = "[自分のAPIキー]";

	public GoogleMapView(Context context, AttributeSet attrs) {
		super(context, API_KEY);
	}

	@Override
	protected void onAttachedToWindow() {
		mainAct = (MainAct)getContext();

		setBuiltInZoomControls(true);
		setSatellite(false);

		MapController mc = getController(); 	   
		mc.setZoom(17);
		mc.setCenter(new GeoPoint((int)(35.6655 * 1E6), (int)(139.7596 * 1E6)));

		setClickable(true);
		setFocusable(true);
		setFocusableInTouchMode(true);
		requestFocus();
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		centerX = w / 2;
		centerY = h / 2;

		super.onSizeChanged(w, h, oldw, oldh);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		int action = event.getAction(); 	 
		int curX = (int) event.getX();
		int curY = (int) event.getY();

		if (action == MotionEvent.ACTION_DOWN) {
			lastdownX = curX;
			lastdownY = curY;
			curDown = true;
			
		} else if (action == MotionEvent.ACTION_UP) {
			curDown = false;

		} else if (curDown &amp;&amp; action == MotionEvent.ACTION_MOVE) {
			int dx = lastdownX - curX;
			int dy = lastdownY - curY;
			lastdownX = curX;
			lastdownY = curY;
			
			scroll(dx, dy);
		}
		return true;
	}

	@Override
	public boolean onTrackballEvent(MotionEvent event) {
		int action = event.getAction(); 	 
		float curX = event.getX();
		float curY = event.getY();

		if (action == MotionEvent.ACTION_MOVE) {
			int dx = (int)(curX * 50); // 50は移動速度
			int dy = (int)(curY * 50);
			
			scroll(dx, dy);
		}
		return true;
	}

	@Override
	public void draw(Canvas canvas) {
		if (mainAct.mValues != null) {
			float r = mainAct.mValues[0];
			canvas.rotate(-r, centerX, centerY);
		}
		
		super.draw(canvas);
	}
	
	private void scroll(int dx, int dy) {
		if (dx != 0 || dy != 0) {
			// 要求された移動ベクトル
			float distance = FloatMath.sqrt(dx*dx + dy*dy);
			float rad = (float)Math.atan2(dy, dx);
			
			// 地図の回転角に合わせて，移動ベクトルを回転する
			rad = rad - (float)Math.toRadians(- mainAct.mValues[0]);

			// 回転後のベクトルをX,Yに変換する
			dx = (int)(distance * FloatMath.cos(rad));
			dy = (int)(distance * FloatMath.sin(rad));
		}

		getController().scrollBy(dx, dy);
	}
}
</pre>


</div>
<a title="地図ロイド" href="http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9">地図ロイド</a>の回転プログラムもほとんどこれと同じですが，さらに磁北偏差の補正処理を入れたりしています．
<p>
GoogleMapを回転させる方法(MapViewのdrawをオーバーライドするという方法)は，以下のページがとても参考になりました．
</p>
<ul>
<li><a href="http://d.hatena.ne.jp/tomo_snowbug/20090808/1249663176">android sdk 1.5r3 で方位によって回転するMapを作る</a></li>
</ul>]]></content:encoded>
    <dc:date>2010-01-19T21:39:17+09:00</dc:date>
    <dc:subject>Android</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?HT-03A%A4%CE%A5%AD%A5%E3%A5%EA%A5%D6%A5%EC%A1%BC%A5%B7%A5%E7%A5%F3">
    <title>HT-03Aのキャリブレーション</title>
    <link>http://kamoland.com/wiki/wiki.cgi?HT-03A%A4%CE%A5%AD%A5%E3%A5%EA%A5%D6%A5%EC%A1%BC%A5%B7%A5%E7%A5%F3</link>
    <description>ドコモのAndroid端末HT-03Aで，地磁気センサー(電子コンパス)をキャリブレーションするときの話．</description>
    <content:encoded><![CDATA[<p>
ドコモのAndroid端末HT-03Aで，地磁気センサー(電子コンパス)をキャリブレーションするときの話．

</p>
<p>
私の機種だけかもしれませんが，地磁気センサー(電子コンパス)が結構狂います．
説明書を見るとキャリブレーションすればよいらしいが，説明書の記述は難解です．
</p>
<div>
<pre>
電子コンパスを調整するには，HT-03Aを10秒程度，手首を返しながら大きく8の字に動かしてください
</pre>
</div>
ということですが，これを読んでもどうすればよいのかさっぱりわかりませんでした．
<p>
それでネットで色々調べて，自分で試したりしたところ，おそらくこういうことだと思います．
HT-03Aを水平に保ったまま，端末が8の字の線路を走っているような動かし方をする．
</p>
<p>
→違うようです．以下に動画の解説がありますので，これをみてください．
</p>
<ul>
<li><a href="http://www.s3sensor.com/s3/calibration/recalibrate/index.html">電子コンパス キャリブレーション</a></li>
</ul>
<p>
とても文章では説明できません．
</p>
<p>
<a href="http://jp.androlib.com/android.application.com-eclipsim-gpsstatus2-zF.aspx">GPS Status</a> などの何らかの地磁気センサーを使うアプリを起動した状態で，上記のような動かし方を行います．
</p>]]></content:encoded>
    <dc:date>2010-01-06T23:43:18+09:00</dc:date>
    <dc:subject>Android</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?Android%A4%C7%BC%AB%C6%B0%A5%AA%A5%D5%A4%C7%A4%AD%A4%EB%A5%ED%A5%B0%BD%D0%CE%CF">
    <title>Androidで自動オフできるログ出力</title>
    <link>http://kamoland.com/wiki/wiki.cgi?Android%A4%C7%BC%AB%C6%B0%A5%AA%A5%D5%A4%C7%A4%AD%A4%EB%A5%ED%A5%B0%BD%D0%CE%CF</link>
    <description>Androidでログを出力する方法．マーケットにアップロードする際に，簡単に全ログ出力をオフにできる方法です．</description>
    <content:encoded><![CDATA[<p>
Androidでログを出力する方法．マーケットにアップロードする際に，簡単に全ログ出力をオフにできる方法です．

</p>

<h2><a name="i0"> </a>Androidで自動オフできるログ出力</h2>
Androidでログを出力する場合，標準のandroid.util.Logクラスを使えばいいので簡単なのですが，
これをそのまま使うと，Android Marketにアップロードするためのapkを作る前に，全てのログをオフにするという作業が面倒です．
<p>
そこで，<a title="地図ロイド" href="http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9">地図ロイド</a>で使っている方法を紹介します．
</p>
<p>
考え方は，以下のページを参考にしました．
</p>
<ul>
<li><a href="http://www.taosoftware.co.jp/blog/2009/03/android_apireleasedebug.html">Taosoftware: Android ApiキーをRelease版とDebug版で切り替える方法</a></li>
</ul>
<p>
読んでいて本当に賢い方法だと感心したのですが，AndroidManifest.xmlの以下の箇所，
android:debuggableの設定を使って，判断します．
これがtrueかfalseかで，ログのオンオフを自動切り替えします．リリース前にandroid:versionCodeを増やしますが，
そのついでにここをfalseに変えてからapkを生成するというフローです．まず作業漏れは起こらないです
</p>
<p>
<span>AndroidManifest.xml</span>
</p>
<div>
<pre>
&lt;application android:debuggable="true" android:icon="@drawable/icon" android:label="@string/app_name"&gt;
</pre>
</div>
<span>Activityクラス</span>
<div>
<pre>
public class MainView extends Activity {
	public static boolean isDebugMode;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		isDebugMode = DeployUtil.isDebuggable(this);
		・・・
	}

	private static void log(String mes) {
		if (isDebugMode) {
			Log.d("**chiz MainView", mes);
		}
	}
}
</pre>
</div>
このように，Activityクラスでは以下のユーティリティメソッドを呼び出して，デバッグモードかどうかを自身の
public staticな変数に格納しています．
<p>
<span>ユーティリティクラス</span>
</p>
<div>
<pre>
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;

public class DeployUtil {
	/**
	 * マニフェストファイルからデバッグモードかどうかを取得する
	 * @param ctx
	 * @return
	 */
	public static boolean isDebuggable(Context ctx) {
		PackageManager manager = ctx.getPackageManager();
		ApplicationInfo appInfo = null;
		try {
			appInfo = manager.getApplicationInfo(ctx.getPackageName(), 0);
		} catch (NameNotFoundException e) {
			return false;
		}
		if ((appInfo.flags &amp; ApplicationInfo.FLAG_DEBUGGABLE) == ApplicationInfo.FLAG_DEBUGGABLE)
			return true;
		return false;
	}

	/**
	 * マニフェストファイルからバージョン名を取得する
	 * @param ctx
	 * @return
	 */
	public static String getVersionName(Context ctx) {
		String versionName = "";
		PackageManager pm = ctx.getPackageManager();
		try {
			PackageInfo info = null;
			info = pm.getPackageInfo(ctx.getPackageName(), 0);
			versionName = info.versionName;
		} catch (NameNotFoundException e) {
		}
		return versionName;
	}
}
</pre>


</div>
getVersionName()は，今回のログ出力には関係ないメソッドです．アプリから自分のバージョン番号を表示する時に，
このメソッドを呼び出しています．
<p>
Activityクラス以外からログを出力する場合は，以下のようなメソッドを各クラスに作成して，
それを呼び出すようにしています．
</p>
<div>
<pre>
private static void log(String mes) {
	if (MainView.isDebugMode) {
		Log.d("**chiz Storage", mes);
	}
}
</pre>
</div>
このメソッドは各クラスに作るのではなく，Activityクラスに移して集約し，それを各クラスから呼び出すという方法もありえますが，
開発中にプログラムにログ出力を入れるときの打鍵数をできるだけ少なくしたかったので，あえてこうしています．]]></content:encoded>
    <dc:date>2009-12-31T14:23:52+09:00</dc:date>
    <dc:subject>Android</dc:subject>
    
   </item>
   
   <item rdf:about="http://kamoland.com/wiki/wiki.cgi?Android%A4%C7%C5%C5%BB%D2%B9%F1%C5%DA%A4%F2%C9%BD%BC%A8%28Java%29">
    <title>Androidで電子国土を表示(Java)</title>
    <link>http://kamoland.com/wiki/wiki.cgi?Android%A4%C7%C5%C5%BB%D2%B9%F1%C5%DA%A4%F2%C9%BD%BC%A8%28Java%29</link>
    <description>国土地理院の電子国土の地図を，Androidで表示するサンプルコード(Java)．ドラッグによるスクロールとズームに対応しています．</description>
    <content:encoded><![CDATA[<p>
国土地理院の電子国土の地図を，Androidで表示するサンプルコード(Java)．ドラッグによるスクロールとズームに対応しています．

</p>

<h2><a name="i0"> </a>Androidで電子国土を表示(Java)</h2>
<div></div><h3><a name="i1"> </a>Android版の注意事項</h3>
<ul>
<li>もともと<a href="http://cyberjapan.jp/">国土地理院の電子国土</a> は，Andriodでの動作を保証していません</li>
<li><a title="Android" href="http://kamoland.com/wiki/wiki.cgi?Android">Android</a>への対応は，カモランド作者が個人的に行っているものであり，国土地理院は無関係です</li>
<li>そのため，電子国土のAndriodでの動作については，国土地理院に問い合わせないようにしてください</li>
<li>また，今後の国土地理院側の仕様変更には，できるだけ追随するつもりですが，対応しきれずに動作しなくなる可能性があります</li>
</ul>
<p>
以上を了解の上，このページの内容を利用してください．
</p>
<div></div><h3><a name="i2"> </a>概要</h3>
国土地理院の電子国土の地図を，Androidアプリで無理矢理表示するサンプルコードです．
<ul>
<li>タッチパッドのドラッグによる，地図のスクロール</li>
<li>ズーム</li>
</ul>
<p>
に対応しています．(ただしスクロールは，結構もたつきます orz) → なお，この方法をアプリとして実装したものが，<a title="地図ロイド" href="http://kamoland.com/wiki/wiki.cgi?%C3%CF%BF%DE%A5%ED%A5%A4%A5%C9">地図ロイド</a>です．
</p>
<p>
<a href="http://kamoland.com/wiki/wiki.cgi?cmd=attach&amp;pcmd=open&amp;file=jpmapview.png&amp;mypage=Android%A4%C7%C5%C5%BB%D2%B9%F1%C5%DA%A4%F2%C9%BD%BC%A8%28Java%29&amp;refer=Android%A4%C7%C5%C5%BB%D2%B9%F1%C5%DA%A4%F2%C9%BD%BC%A8%28Java%29" title="jpmapview.png"><img src="http://kamoland.com/wiki/attach/416E64726F6964A4C7C5C5BBD2B9F1C5DAA4F2C9BDBCA8284A61766129_6A706D6170766965772E706E67" alt="jpmapview.png" title="jpmapview.png" width="377" height="561" /></a>
</p>
<div></div><h3><a name="i3"> </a>ソースコード</h3>
<span>アクティビティ</span>
<div>
<pre>
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.view.Window;
import android.view.ViewGroup.LayoutParams;

public class MainView extends Activity {
	private CyberJpMapView jpMapView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE);

		jpMapView = new CyberJpMapView(this);

		setContentView(jpMapView, new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
				ViewGroup.LayoutParams.FILL_PARENT));
	}
}
</pre>


</div>
アクティビティはシンプルで，実際の処理はWebViewを継承したCyberJpMapViewクラスで行っています．
<p>
このクラスで開いているURL(MAP_URL)は，電子国土APIのURLではありません．このあたりの事情については，
<a title="電子国土をAndroidのブラウザで" href="http://kamoland.com/wiki/wiki.cgi?%C5%C5%BB%D2%B9%F1%C5%DA%A4%F2Android%A4%CE%A5%D6%A5%E9%A5%A6%A5%B6%A4%C7">電子国土をAndroidのブラウザで</a>を参照してください．
</p>
<p>
<span>電子国土の地図を表示するビュークラス</span>
</p>
<div>
<pre>
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.view.MotionEvent;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

/**
 * 電子国土の地図を表示するビュークラス
 */
public class CyberJpMapView extends WebView {
	private static final String MAP_URL = "http://kamoland.com/comp/mapview-android-app.html";
	private static final int SEMAPHORE_TIMEOUT_MILLIS = 5000;
	private static final int SCROLL_UNIT = 2;

	private Activity act;
	private int dx = 0;
	private int dy = 0;

	private JSInterface jsi;

	public CyberJpMapView(Activity act) {
		super(act);
		this.act = act;

		setFocusable(true);
		setFocusableInTouchMode(true);
		clearCache(true);
		setWebViewClient(new WebViewClient());
		addJavascriptInterface(new JSInterface(),"viewer");
		getSettings().setJavaScriptEnabled(true);
		getSettings().setBuiltInZoomControls(true);

		loadUrl(MAP_URL);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_MOVE &amp;&amp; event.getHistorySize() > 1) {
			int xmove = Math.round(event.getHistoricalX(event.getHistorySize() - 1) - event.getHistoricalX(0));
			int ymove = Math.round(event.getHistoricalY(event.getHistorySize() - 1) - event.getHistoricalY(0));
			if (xmove != 0 || ymove != 0) {
				dx += xmove;
				dy += ymove;
				if (dx &gt; SCROLL_UNIT || dx &lt; -SCROLL_UNIT || dy &gt; SCROLL_UNIT || dy &lt; -SCROLL_UNIT) {
					execJs("if (top.map.LT_P) {top.map.LT_P.ScrollImage(" + dx + "," + dy + ");}");
					dx = 0;
					dy = 0;
				}
			}
		} else if (event.getAction() == MotionEvent.ACTION_UP &amp;&amp; event.getHistorySize() &lt;= 1) {
			// ズームバーを表示する
			invokeZoomPicker();
		}
		return true;
	}

	@Override
	public boolean zoomIn() {
		execJs("if (top.map.LT_P) {top.map.LT_P.StartZooming('in'); top.map.LT_P.StopZooming();}");
		return true;
	}

	@Override
	public boolean zoomOut() {
		execJs("if (top.map.LT_P) {top.map.LT_P.StartZooming('out'); top.map.LT_P.StopZooming();}");
		return true;
	}

	private void execJs(String js) {
		loadUrl("javascript:" + js);
	}

	private ProgressDialog createStatusDialog(String text) {
		ProgressDialog prgDlg = new ProgressDialog(act);
		prgDlg.setMessage(text);
		prgDlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		prgDlg.show();
		return prgDlg;
	}

	/**
	 * 現在表示している地図の中心座標を設定します
	 * @param cx
	 * @param cy
	 */
	public void setMapCenter(float cx, float cy) {
		execJs("try {top.map.setMapCenter(" + cx + "," + cy + "); top.map.openMap(); } catch (e) {}");
	}

	/**
	 * 現在表示している地図の中心座標と表示縮尺を設定します
	 * @param cx
	 * @param cy
	 * @param scale
	 */
	public void setMapCenter(float cx, float cy, int scale) {
		execJs("try {top.map.setMapCenter(" + cx + "," + cy + "," + scale + "); top.map.openMap(); } catch (e) {}");
	}

	/**
	 * 現在表示している地図の中心座標と表示縮尺を取得します
	 * @return [0]:x，[1]:y，[2]:scale
	 */
	public float[] getCenter() {
		String mail = jsi.getPositionMailXY();
		String vals[] = mail.substring(3).split(",");

		float[] result = new float[3];
		result[0] = Float.parseFloat(vals[0]);
		result[1] = Float.parseFloat(vals[1]);
		result[2] = Float.parseFloat(vals[2]);

		return result;
	}

	/**
	 * JavaScriptインターフェイス
	 */
	public final class JSInterface {
		private boolean appMainFinished = false;
		private AlertDialog statusDlg;

		public JSInterface() {
			jsi = this;
		}

		public void onBodyStart() {
			statusDlg = createStatusDialog("接続しました ロード中です...");
		}

		public void onAppMainFinished() {
			if (statusDlg != null)	statusDlg.dismiss();

			statusDlg = createStatusDialog("地図の構築中です...");

			appMainFinished = true;
		}

		public void onBodyLoad() {
			if (! appMainFinished) {
				if (statusDlg != null)	statusDlg.dismiss();

				statusDlg = createStatusDialog("JavaScriptエラーです．実行し直してください");

			} else {
				// 地図の構築完了
				if (statusDlg != null)	statusDlg.dismiss();
			}
		}

		private String positionMail;
		private Semaphore positionMailToken;

		String getPositionMailXY() {
			positionMailToken = new Semaphore(1);

			try {
				// JSスレッドにリリースしてもらう分を確保する
				if (! positionMailToken.tryAcquire(SEMAPHORE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) {
					throw new RuntimeException();
				}

				execJs("viewer.notifyPositionMailXY(top.map.getPositionMailXY())");

				// JSスレッドからのコールバックを待機する
				if (! positionMailToken.tryAcquire(SEMAPHORE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) {
					throw new RuntimeException();
				}

				return positionMail;
				
			} catch (InterruptedException ex) {	
				throw new RuntimeException();
			}
		}

		public void notifyPositionMailXY(String mail) {
			positionMail = mail;
			// セマフォをリリースして，メインスレッドに完了を通知する
			positionMailToken.release();
		}
	}
}
</pre>


</div>]]></content:encoded>
    <dc:date>2009-12-10T23:02:34+09:00</dc:date>
    <dc:subject>電子国土</dc:subject>
    
   </item>
  
</rdf:RDF>
