2007/6/19 火曜日

この記録に関連する記録、を見せるためには?

Filed under: 開発メモ — matoyan @ 0:08:26

山行記録を見たあとに関連する記録が表示されていれば、他の人の記録も見やすくなるし、自分と活動範囲が近い人を探しやすいだろうと思ってます。

そこで、ある記録に対して関連する記録リストを見せたいんですが、
そのためには
1)リストに載せるかどうか
2)リスト上の並び順
の2点の観点が必要です。

対応する実現技術としては
1)記録間の関連付け ← リストに掲載するか
2)記録のスコア(ランク付け) ← 並び順
ぐらいだと思ってます。あとはリストの見せ方もあるかな。


■記録のスコアについて

YahooやGoogleの検索を使ってうまく作りたいところですが、各記録に対してリンクが貼られていないので、Pagerankによる順位づけだけではあまり意味がない可能性があります。がやってみる価値はありそう。
これを使う場合、2)の部分として記録からキーワードを抽出する機能を自分で実装することになります。

で、ランク付けを最初から作るなら、

・記録の内容量
・記録の新しさ
・どの程度記録が見られたか
・お気に入りに入っている数
・その山の人気度

とか、いろんな観点の総合スコアになるはず。
パラメータがいろいろあって大変かも。


■記録間の関連付けについて

こっちは、まずは場所の名前を抽出できればいいと思います。
日本語のような文章からキーワードを抽出するには、形態素解析とか、文字の切り出し技術が必要。でも既存のライブラリで山の名前とか正しく抽出してもらえる気がしない。
また勉強かな・・・。

あとは、記録という特性から、キーワードだけじゃなくて、「場所の近さ」のようなロケーションに関する情報でも関連性を抽出できる様な気がします。

このときに別々に表示すればいいかというと、「関連する記録」と「近辺の記録」とか言われても、言葉だけ見ると「近辺の記録」は「関連する記録」に含まれるから、一緒に並べてほしい気もするし、別々の方が探しやすい気もする。

他にも、ジャンルとか、山行の季節とかで関連付けるやり方もありそう。

んー、きちんと整理しないと発散してしまいそう。


■その他

他にも、お勧め的な機能を考えてみると、普段行く山の近くで、自分と近いジャンルの価値ある記録を教えてほしい。というのもあります。

他にも作りかけの機能もあったりして、自分としてやりたいことが一杯出てきてますが、優先度付けしてぼちぼち作っていきますので気長にお付き合いくださいませ。

2007/6/14 木曜日

xoopsのイベント通知のデフォルトを変更する方法

Filed under: xoops — matoyan @ 0:42:00

xoopsはデフォルトのイベント通知はPM(プライベートメッセージ)になっています。
メールをデフォルトのイベント通知にするには、本体のHackが必要です。

kernel/user.php
98行目あたり。

$this->initVar(’notify_method’, XOBJ_DTYPE_OTHER, 1, false);



$this->initVar(’notify_method’, XOBJ_DTYPE_OTHER, 2, false);

とすると、ユーザ新規登録後に「メール」がデフォルト通知になります。


ただ、そもそもPMの存在意義があるのかもよくわからないです。
PMの受信箱にメッセージが届いたかどうかはサイトにログインしないと分からないですし。
せめてメールでメッセージ到着の通知ができればなぁ。

2007/6/9 土曜日

ルートの登録デモを作ってみました。

Filed under: 開発メモ — matoyan @ 11:49:57

ルートの登録方法を見るには、リンク先の緑の再生ボタンを押してください。

mkroute.png

これは、Winkというフリーソフトを使って作りました。

記録する画面範囲を決めてキャプチャするだけで、簡単にswfファイルを作れます。

おまけにキャプチャした動画にコメントとかボタンも入れられて、細かい設定もできるみたいです。

他にも、CamStudio
というソフトもあります。
こっちはAVIファイルとしても記録できるみたいですが、コメントは録画中に入れるようになってるので、編集は難しいような気がします。

細かいコメントとか入れると結構時間がかかるので、他のデモ作成はまたの機会に。

2007/5/24 木曜日

ヤマレコの今後の話

Filed under: 開発メモ — matoyan @ 22:46:14

まだまだ細かい修正や使い勝手を良くして行く必要がありますが、ヤマレコ開設当初からやりたかった山行記録の登録システムはある程度まとまってきた気がします。

と、勝手に一息ついてしまって、次のシステム作りのモチベーションがここ2週間ほど下がってたので、やる気を出すために現状の問題点と今後の方針を考えてました。

とりあえず思いつく範囲で、以下の3つぐらいが課題かと。
1.たまにしか山に行かない人にも見てもらいたい
2.登録していただいたユーザ間の横の繋がりを作りたい
3.探している記録を簡単に見つけられるようにしたい

1と2をやるためには、mixiみたいなシステムの山バージョンが作れればいい気がするのですが、技術的にも時間的にも一人でやるのは道のりが長い…。
3はどこから手をつけるかまだ考え中。

まぁ、方針は大体見えてきたし、ペースは遅いですが、これまでと同じように継続してコツコツ作り込んでいきます。
技術的な興味で色々寄り道もするだろうし。

あとは開設当初からずっと苦労してきた広報/宣伝活動をどうするかだなぁ…。

2007/4/17 火曜日

ヤマレコが週刊アスキーに掲載されました!

Filed under: 未分類 — matoyan @ 12:55:07

本日発売の週刊アスキーにヤマレコが紹介されました!
これを機会に少しでも多くの人に知って、使ってもらいたいです。

「週間アスキー 5/1号」

wascii20070417-1.jpg


145ページに掲載されています。
★特集7
睡眠時間、歩数、食べたもの
記録サイトで生活ログをすべて残す


では、今後ともよろしくお願いします!

2007/4/11 水曜日

山の3D画像を作成できるTerragen

Filed under: 未分類 — matoyan @ 23:59:04

山の風景画像を標高データから作れないか探していたら、Terragenというツールのページに辿り着きました。


このツール、出来上がった作品や名前は何度か聞いたことがあったのですが、いい機会なので少し遊んでみました。


まえの日記に書いたSRTMというNASAの標高データをTerragenに読み込んで、富士山を描いてみました。


1)標高データ入手

まず対象のデータをダウンロード&解凍します。

データはftp://e0srp01u.ecs.nasa.gov/srtm/から入手できます。

富士山だと「N35E138」にデータが入ってます。



2)データ変換

入手したファイルを3DEMというツールに読み込みます。

“File”->”Load Terrain Model”->”SRTM”から読み込めます。


読み込んだ状態で、

“Operation”->”F7 Patch Missing Data”を選ぶと、SRTMの欠落したデータを補正してくれます。


そのあと、”File”->”Save Terragen Terrain” で “Entire Terrain” (全地形図)か “Selected Area” (選択区域)から書き出します。



3)Terragenへ読み込む

今回はTerragen2のTechnology Preview版を使って作ってみました。

Terrainの編集画面で「Add Terrain」から上で書き込んだTerrainのファイルを読み込めば、標高データをもとに山を描いてくれました。

あとは曇や光源などの設定をして出来上がり。


↓パラメータを適当にいじっただけでこんな感じになります。

mtfuji.png


なお、Terragen2の使い方は「散歩ジャーナル」というページを参考にさせてもらいました。


ツールの使い方次第でかなりリアルな画像ができてすごいです。

でも使い道が思いつかない。。。

スクリプトで山の画像をリアルタイムに生成できるようなソフトがあればなぁ。

2007/4/9 月曜日

now loadingの画像を生成してくれるAjaxload

Filed under: ライブラリ — matoyan @ 22:12:46

Ajaxでプログラムを作ると、いつデータを読み込んでいるのかブラウザの表示だけでは判断できません。


そのため、データの読み込み中はnow loadingのアニメーションGIFを表示させて、読み込みが完了したら非表示にするようにすれば、直感的に分かりやすくなります。


そんなときに使える「Ajaxload」というサービスがありました。


これを使えば自分でGIFを作らなくても、を使えば、簡単に作成できます!

表示パターンと色を選ぶだけなので、数秒でカッコいいLoading画像が作成できます。


ヤマレコでも使わせてもらいました。


↓サンプル

5-0.gif
8-0.gif


プログラミングをしていると、デザイン面がおざなりになってしまうのですが、こういうサービスがあると非常に助かります。

2007/3/11 日曜日

GPSデータからグラフ作り:4)経度・緯度で指定した各地点の標高データを求める(SRTMから標高取得)

Filed under: 開発メモ — matoyan @ 21:13:52

前回まででGPXファイルの標高データをもとにグラフを描くことができました。ただ、標高データがないGPXファイルの場合はグラフを描くことができないので、別の標高データを取ってくる必要があります。



国土地理院の提供する標高情報で言うと「数値地図50mメッシュ(標高)」という標高データがあります。が、これをサービスとして提供するには結構な手続きが必要になります。

具体的にはCD-ROM3枚を購入した上で、測量法第29条又は第30条の規定に従って 「測量成果の複製・使用承認手続」が必要になります。申請の際には開発目的とか開発計画を届け出て承認が出るまで数週間待つようです。



そこでもっと簡単に使える標高データがないか探してみました。

最終的に使えそうなデータとして

・国土地理院の地球地図日本

というデータと、

・NASAの提供するスペースシャトル地形データ(SRTM)

の2つぐらいに絞れました。



どちらのデータも登山ルートの標高グラフを作ってみたのですが、地球地図の方の標高メッシュデータは精度が低すぎてグラフが本来の形とはかけ離れたものになってしまいました。



SRTMを使った標高取得プログラムを作って、グラフ作成をしました。

標高データの入手からプログラム作成までの流れをまとめると、、、



1)標高データを入手

SRTMの標高データはFTPサーバ(ftp://e0srp01u.ecs.nasa.gov/srtm/)から入手できます。



2)データフォーマットを理解

地形データは緯度経度ごとに分けられていて、例えばN37E138.hgtファイルには北緯37度、東経138度〜北緯38度、東経139度までのデータが入っています。日本のデータはEurasiaの中にあります。

データフォーマットなどの詳細は

ftp://e0srp01u.ecs.nasa.gov/srtm/version2/Documentation/SRTM_Topo.pdf

に書かれています。



仕様書とデータを見て、分かったところだけざっくり説明すると、(間違っているかもしれませんが・・・)



・各ファイルには縦に1201個、横に1201個のデータが入っていて、境界部分のデータは2つのファイルに同じデータが重なって入っている。

 ⇒ 一番北西の標高データから東に向かって1201個の標高データが並んだ後、一段南に下がって次の1201個のデータが西から東に向かってならんでいくイメージです。

srtmの説明1
srtmの説明2


・データにヘッダはなく、標高データだけがバイナリ形式で16バイトのBigEndianで並んでいる。

 ⇒ 例えば0x0115なら、277mという感じ。



サンプルコードも貼り付けておきます。

LatLng2Height:::緯度経度から標高算出APIのような機能を自分のサーバ内で作りたい方はご利用ください。

PHP:
  1. <html><head><title>SRTM標高計算サンプル</title></head><body>
  2. <?php
  3.  
  4. $lat=36.3423;   // 経度:度で指定
  5. $lon=138.1245// 緯度:度で指定
  6.  
  7. $b1=intval($lat);
  8. $l1=intval($lon);
  9. $fn = "./srtm/N".$b1."E".$l1.".hgt";
  10.  
  11. if(is_file($fn)) {
  12.   $b=$lat;
  13.   $l=$lon;
  14.   $ofs = (floor((1-($b-$b1))*1200)*1201 + floor(($l-$l1)*1200)) * 2;
  15.  
  16.   $fhandle = fopen($fn, "rb");
  17.   #左上の標高
  18.   fseek($fhandle, $ofs);
  19.   $h1 = unpack("n", fread($fhandle, 2));
  20.   #右上の標高
  21.   $h2 = unpack("n", fread($fhandle, 2));
  22.   #左下の標高
  23.   fseek($fhandle, ($ofs+2402));
  24.   $h3 = unpack("n", fread($fhandle, 2));
  25.   #右下の標高
  26.   $h4 = unpack("n", fread($fhandle, 2));
  27.  
  28.   $tmp=1-($b-$b1)*1200;
  29.   $d=$tmp-floor($tmp); #下との距離
  30.   $c=1-$d; #上との距離
  31.   $tmp=($l-$l1)*1200;
  32.   $a=$tmp-floor($tmp); #左との距離
  33.   $b=1-$a; #右との距離
  34.  
  35.   $ele1 = $a/($a+$b)*($h2[1]-$h1[1])+$h1[1];
  36.   $ele2 = $a/($a+$b)*($h4[1]-$h3[1])+$h3[1];
  37.   $ele = round($c/($c+$d)*($ele2-$ele1)+$ele1);
  38.  
  39.   print "【座標】<br />\n";
  40.   print "経度:".$lat." - 緯度:".$lon."<br />\n<br />\n";
  41.   print "【四隅の標高】<br />\n左上:".$h1[1]."m - 右上:".$h2[1]."m<br />\n";
  42.   print "左下:".$h3[1]."m - 右下:".$h4[1]."m<br />\n<br />\n";
  43.   print "【距離】<br />\n左".$a."<br />\n";
  44.   print "右".$b."<br />\n";
  45.   print "上".$c."<br />\n";
  46.   print "下".$d."<br />\n<br />\n";
  47.   print "【結果】:".$ele."m";
  48. } else {
  49.   print "file open error:".$fn;
  50. }
  51.  
  52. ?>
  53. </body></html>



サンプルコードを実行してみる。

サンプルコードをダウンロード



あとはSRTMのデータの欠落部分を修正し、メッシュデータと座標位置との変換をしつつグラフを作ることができました。

makegrp4.png
↑完成したグラフ

2007/2/24 土曜日

GPSデータからグラフ作り:3)経度・緯度で指定した2地点間の距離を求める

Filed under: 開発メモ — matoyan @ 16:16:50

PHPでGPXファイルを取得することができたので、その取得した経度・緯度座標のリストから、距離を求める必要があります。



Webで検索したところ、正式っぽい数式が国土地理院のページにありました。

2点の平面直角座標x,yから測地線長および方向角を求める計算



・・・が、さっぱり理解できない。

仕方がないので他のページも調べてみると、Javascriptのプログラムまでついているページがありました。球面三角法という計算手法を使うようです。

緯度と経度による距離計算



内容を理解し切れてないのですが、ソースコードを参考(そのままコピー・・・)して使わせていただきました。

PHP向けに作り直したコードを乗せておきます。

PHP:
  1. function cal_len($na, $ta, $nb, $tb){
  2.     $na=pi()*$na/180;
  3.     $nb=pi()*$nb/180;
  4.     $ta=pi()*$ta/180;
  5.     $tb=pi()*$tb/180;
  6.     $na=$na-((11.55/60)*pi()/180)*sin(2*$na);
  7.     $nb=$nb-((11.55/60)*pi()/180)*sin(2*$nb);
  8.     $c=cos($na)*cos($nb)*cos($ta-$tb)+sin($na)*sin($nb);
  9.     $s=sqrt(1-$c*$c);
  10.     $t=$s/$c;
  11.     $z=atan($t);
  12.     $z=6378.137*$z; // 地球の半径を6378.137kmで計算
  13.     return $z;
  14. }



これを使って、やっとルートのグラフを生成するプログラムができました!

↓グラフはこんな感じです。




あとは、GPSに標高データが入っていないときでもグラフが作れるように、座標から標高データを取得する方法です。できるのかな・・・。

GPSデータからグラフ作り:3)経度・緯度で指定した2地点間の距離を求める

Filed under: 開発メモ — matoyan @ 16:16:02

PHPでGPXファイルを取得することができたので、その取得した経度・緯度座標のリストから、距離を求める必要があります。



Webで検索したところ、正式っぽい数式が国土地理院のページにありました。

2点の平面直角座標x,yから測地線長および方向角を求める計算



・・・が、さっぱり理解できない。

仕方がないので他のページも調べてみると、Javascriptのプログラムまでついているページがありました。球面三角法という計算手法を使うようです。

緯度と経度による距離計算



内容を理解し切れてないのですが、ソースコードを参考(そのままコピー・・・)して使わせていただきました。

PHP向けに作り直したコードを乗せておきます。

PHP:
  1. function cal_len($na, $ta, $nb, $tb){
  2.     $na=pi()*$na/180;
  3.     $nb=pi()*$nb/180;
  4.     $ta=pi()*$ta/180;
  5.     $tb=pi()*$tb/180;
  6.     $na=$na-((11.55/60)*pi()/180)*sin(2*$na);
  7.     $nb=$nb-((11.55/60)*pi()/180)*sin(2*$nb);
  8.     $c=cos($na)*cos($nb)*cos($ta-$tb)+sin($na)*sin($nb);
  9.     $s=sqrt(1-$c*$c);
  10.     $t=$s/$c;
  11.     $z=atan($t);
  12.     $z=6378.137*$z; // 地球の半径を6378.137kmで計算
  13.     return $z;
  14. }



これを使って、やっとルートのグラフを生成するプログラムができました!

↓グラフはこんな感じです。




あとは、GPSに標高データが入っていないときでもグラフが作れるように、座標から標高データを取得する方法です。できるのかな・・・。

GPSデータからグラフ作り:2)GPXのファイル読み込み

Filed under: 開発メモ — matoyan @ 0:25:24

グラフを描く環境ができたので、次はPHPでGPXのファイルを読み込んで各地点の経度・緯度座標と標高を求める方法を検討しました。


XMLファイルの解析はPHPに解析用のライブラリが用意されているので、解析するのは非常に簡単です。


---------------------------------------

$fname="sample2.xml";

$data=implode("",file($fname));

$xml_parser = xml_parser_create('UTF-8');

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);

xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1);

xml_parse_into_struct($xml_parser, $data, $values, $idx);

xml_parser_free($xml_parser);

---------------------------------------


とするだけで、XMLの解析が完了します。

ちょっと理解しにくいのですが、$valuesと$idxにデータが分けて入ってます。

GPSの最初のデータにアクセスする場合、

緯度: $values[$idx['trkpt'][0]]['attributes']['lat']

経度: $values[$idx['trkpt'][0]]['attributes']['lon']

標高: $values[$idx['ele'][0]]['value']

時刻: $values[$idx['ele'][0]]['time']

にデータが入ってます。


これでGPSのデータを読み込むことができました。

ちなみに元のGPXファイルがこちら

プログラムで解析した結果はこちら(ソースコードを見ると改行された表示が見えます)


⇒ 次は経度・緯度で指定した2地点間の距離を求める方法です。

2007/2/23 金曜日

GPSデータからグラフ作り:1)折れ線グラフを書く

Filed under: 開発メモ — matoyan @ 0:38:12

GPSからグラフを作るために、まずは折れ線グラフを書いてくれるライブラリを探しました。

自分の使える言語はPerlとPHPぐらいなので、その中からPHPで使えるJpGraphというライブラリを使いました。

「PHPで、 高機能なグラフ生成ライブラリーJpGraphを使いグラフを描いてみました」

というページにインストール方法からサンプルまでがまとまってます。これと公式マニュアルがあれば大体のグラフは描けそうです。



このライブラリを使えば↓のようなグラフが簡単に作成できます。




プログラムは非常に簡単です。

PHP:
  1. <?php
  2. //折れ線グラフ 作成手順サンプル
  3. include ("jpg/jpgraph.php");
  4. include ("jpg/jpgraph_line.php");
  5. $ydata = array(17,21,41,14,30,9); //(各月の最高温度)
  6. $xdata = array("Jan","Feb","Mar","Apr","May","Jun");
  7. $graph = new Graph(300,200,"auto")
  8. $graph->img->SetImgFormat("png");
  9. $graph->SetScale("textlin");
  10. $graph->title->Set("Line Plot Example");
  11. $graph->xaxis->SetTickLabels($xdata);
  12. $graph->xaxis->title->Set("Month");
  13. $graph->yaxis->title->Set("y-title");
  14.  
  15. $lp1 = new LinePlot($ydata); //<font color=red>*2</font>
  16. $lp1->SetLegend("Temperature");
  17. $graph->Add($lp1);
  18. $graph->Stroke();
  19. ?>






★[PHP]: JpGraph

公式HP:アシアル社

http://www.asial.co.jp/jpgraph/

マニュアル(オンライン/ダウンロード)

http://www.asial.co.jp/jpgraph/manual/jpgraph_manual/toc.html

http://www.asial.co.jp/jpgraph/download.php

解説/設定

「PHPで、 高機能なグラフ生成ライブラリーJpGraphを使いグラフを描いてみました」

http://www.linkclub.or.jp/~ma3ki/webutil/jpgraph/howtomake-jpgraph.html



Perlにも同じようなライブラリがあるみたいです。結局使いませんでしたが、おそらく同等の機能が実現できると思います。

★[Perl]: GD::Graph

公式HP:CPAN

http://cpan.uwinnipeg.ca/module/GD

解説/設定

http://www.linkclub.or.jp/~ma3ki/webutil/gdgraph/perlgd-install.html





その他、むかし大学の研究室時代によく使っていたツールも紹介しておきます。複雑な数式とかを使うときにはこちらの方がいいのかもしれません。

★[tool]: gnuplot

公式HP:

http://www.gnuplot.info/

解説/設定

http://t16web.lanl.gov/Kawano/gnuplot/



★[tool]: PGPLOT

公式HP:

http://www.astro.caltech.edu/~tjp/pgplot/

解説/設定:

http://www.fluidlab.naoe.t.u-tokyo.ac.jp/~minnie/pgplot/



⇒ 次はGPXファイルの読み込みです

« 前のページ次のページ »

HTML convert time: 1.867 sec. Powered by WordPress ME