26 (Mon) ▽コマンドラインからの PHP の使用でpg_connectエラー
簡単に作業を終えることができると思った「コマンドラインからのPHPの使用」だったが、何故かpg_connectエラー。
C:\ms4w\Apache\htdocs>php read.php
※read.phpは、リモートフォルダからGPSログをダウンロードし、PostgreSQLへロードし、リモートフォルダに地図画像をフィードバックさせるプログラムを記述している
で、コマンドラインからPHPを実行させると、
Fatal error: Call to undefined function pg_connect() in C:\ms4w\Apache\htdocs\gpsload.php on line 70
とエラー表示され、pg_connect() が実行できない。
ApacheサーバからWeb上で、このPHPスクリプトを作動させれば可能なのに~。原因まったく解らず。。。
一眠りして、原因判明。
コマンドラインで"php -v"と打つと、なぜかphp5のバージョン情報が表示されていた事と、phpのマニュアルで「php.iniを探しに行く」という言葉が頭に残っていたのだが、先程のphpエラーは単純に、PostgreSQL関数が反応していないというもので、コマンドラインのphp動作が、php5 のphp.ini を読み込んでいるものと見た。
案の定、Windowsの環境変数をチェックすると、Path設定で"c:\php5;c:\php4;c:\ms4w\Apache\cgi-bin"と並んでいて、最初のphp5の設定ファイルphp.ini に反応してしまっている模様で、Pathの順番を入れ替えると、きちんと作動した。良かったぁ。
その後、"php C:\ms4w\Apache\htdocs\gpsload.php"と記述したバッチファイルを作成して、Windowsタスクでパソコン起動時に、そのバッチファイルを実行させて完成した。ちなみに、Windowsタスクでは管理者パスワードの設定が必須となっている。
あとは、前回のSSIで画像ファイルの最終更新日を表示させる予定だが、レンタルサーバ会社への問合せ結果は、shtmlの拡張子に変更させる必要があるとの事。とほほ・・・。
拡張子をhtmlからshtmlに変更すると、外部リンクやGoogleページランクに影響があり変えたくないので、.htaccessファイルに
Addtype text/x-server-parsed-html .shtml
Addtype text/x-server-parsed-html .html
と記述し、htmlファイルであってもshtmlと認識させて表示するようにした。
コメント(1) TrackBack(0) ▲topへ
26 (Mon) ▽1日1回自動更新のGPSポイントデータ画像
先日のレポートの通り、ローカルでしか使用できないMapServerの苦肉の策として、GPS携帯から取得したアクセスポイントをMapServerで表示させ、その画像を1日1回自動更新して当サイトで表示させた。
▼これがその画像。

当サイト(リモートファイル)のGPS位置情報ログをダウンロードしてから、ローカルのMapServerで地図画像を生成して、当サイトにアップロードするまでの一連の動作をひとつのPHPスクリプトで行なうことができたので、次はパソコンを立ち上げた際にWindowsタスクでそのPHPスクリプトをコマンドラインで動作させたら、完了。
ちなみに、PHP/MapScriptは地図を表示させるだけでなく、ちょっとしたPHPのソースで地図画像を生成できるので、このような使い方をする時にも非常に便利と痛感。
一応、毎日更新のGPS画像を当サイトの「GPS携帯 位置情報 基礎知識」に表示させておこう。
あとは、その画像の最終更新日をSSIで表示させようとしたが、何故かエラーで表示されず。以前に試したときはできた筈なのに。
<!--#include file="hoge.php" -->
仕方なく、レンタルサーバへ問い合わせる。
横道にそれたが、これら一連の作業は、4月のゲストスピーカーの準備で、後はGPS画像のファイルをGPSログと共にリモートフォルダからダウンロードして、ローカルサーバで作動しているp.mapper2で表示させようにする予定で、これを当日の発表時に実演したいのだが。。。
コメント(0) TrackBack(0) ▲topへ
25 (Sun) ▽ローカルでしか使用できないMapServerの苦肉の策
自宅サーバを公開できず、ローカルでしか使用できない現在のMapServer作動環境の苦肉の策として、レンタルサーバのGPSをダウンロードし、ローカルPostGISへロードして、その後PHP/MapScriptで表示させた地図画像をレンタルサーバへフィードバックさせる。
これら一連の動作を自宅パソコンを使用する度に自動で作動させれば、1日に1回は地図画像が更新されることになる。
ただ、PHPを使用して外部のレンタルサーバへ画像ファイルを移動させるためには、ローカルからcopyさせても無理だし、レンタルサーバ側のスクリプトを作動させても、ローカルアドレスは固定でないし、自宅サーバを公開する必要がある。
結果、ローカルからレンタルサーバにファイルを転送するためには、ftp接続でファイルを送信する必要があるという事で、PHPのftp関数を使用したが、いくら試しても
Warning: ftp_put() [function.ftp-put]: PORT command successful in C:\ms4w\Apache\htdocs\upload_file.php on line 15
Fatal error: Maximum execution time of 30 seconds exceeded in C:\ms4w\Apache\htdocs\upload_file.php on line 15
というメッセージが返ってきて、アップロードされる画像ファイルは0バイト。ソースをいくら眺めてもおかしい所がない。ひょっとするとレンタルサーバに特殊な設定が必要なのかとレンタルサーバのヘルプを見ると、
ADSLやLAN環境でご利用の場合、ご利用のFTPクライアント側で、「パッシブモード」(PASV、PSVなどと表記される事もあります)の設定が必要な場合があります。
との事。もしやと思い、PHPのソースに"ftp_pasv()"を加えると、うまくいきました。
ソースは次の通り。
<?
$ftps = ftp_connect($host);
if($ftps){
$result = ftp_login($ftps, $username, $password);
if (!$result) {
echo "接続に失敗しました。\n";
return;
}else{
ftp_pasv($ftps, true);
$upload = ftp_put($ftps, $remote_file,$local_file,FTP_BINARY);
}
}
if (!$upload) {
echo "FTP upload has failed!";
} else {
echo "Uploaded $local_file to $host as $remote_file";
}
ftp_close($ftps);
?>
コメント(0) TrackBack(0) ▲topへ
21 (Wed) ▽GPSポイントをPostGISへ自動的にロードし表示
GPS携帯の位置情報ポイントデータが記録されているリモートファイルをローカルからアクセス・取得し、PHPスクリプトでPostGISへ自動的にロードさせ、MapServerで表示。

今回の作業は、今では珍しい事ではない。ただ今回は外部のレンタルサーバーにある位置情報のログファイルを、ローカルで作動しているMapServerで自動的に表示させる事を想定して行なっている。つまり企業などイントラネットでMapServerを稼動させている場合の環境を想定。
当然の事ながら、WMSなどを使用しない限りMapServerで表示することはできないので、次の方法で行なおうというもの。
----------------------------
■レンタルサーバー(PHPを使用)
GPS携帯でアクセスした位置情報をログファイルに書き込む
(完成系はGPS写真とGPSメールにも対応)
IDとパスワードでセキュリティーを保持
----------------------------
↑
----------------------------
■ローカルサーバー(MapServer+PHP+PostGIS)
IDとパスワードで位置情報ログファイル(GPS写真も)にアクセスしダウンロード
PostGISへデータをアップし、MapServerで表示
この作業をPHPスクリプトで1分置きに自動更新
----------------------------
ちなみに、アクセスされた携帯会社によって色分けしているが、分かり難いので、拡大した地図は次の通り(首都圏の地図)

今まで数値データでの表示振分けしか知らなかったが、character(文字データ)を振分ける場合は、MapfileのCLASS Obj においてEXPRESSIONでフィールド名をシングルクォーテーション(')で、次のように指定する
CLASS
NAME 'au'
EXPRESSION ('[corp]'eq'au')
COLOR 0 128 255
TEMPLATE "void"
STYLE
COLOR 255 128 0
SIZE 6
SYMBOL 'point'
END
END
コメント(0) TrackBack(0) ▲topへ
19 (Mon) ▽PostgreSQLメモ/データの最大値を取得する
PostgreSQLのメモ
データを最大値を取得する(PHPで操作)
<?
//PostgreSQLに接続する
$dbHandle = pg_connect("host=localhost dbname=$dbname user=postgres password=$pass");
if ($dbHandle == False) {
print ("データーベースと接続できません\n");
exit;
}
//SQL文 テーブルから取り出す
//フィールド$fnameの最大値を取得する
$sql = " SELECT MAX($fname) FROM $tbname";
$rs = pg_query($dbHandle,$sql);
//$sqlで取得した(最大値の)データだけを取得する(0,0は0行目の0列→データはひとつだけなので0,0となる)
$data = pg_fetch_result($rs,0,0);
pg_free_result($rs);
pg_close($dbHandle);
//結果表示
echo $data;
?>
コメント(0) TrackBack(0) ▲topへ
11 (Sun) ▽リモートファイルではロックができない?
リモートファイルの操作ではロックができないのだろうか?
以下の通り、テスト作動を行なったが、
<?
//ファイルキャッシュをクリアにする
clearstatcache();
//コピーするファイル名を指定
$fp = "http://id:pass@www.serverurl/path/log.dat";
//コピーするファイルをオープンにする
$file = fopen($fp, "r");
flock($fp, LOCK_EX);
....
?>
次の通り、エラーとなる
Warning: flock() [function.flock]: 2657 bytes of buffered data lost during conversion to FILE*! in C:\ms4w\Apache\htdocs\local\test.php on line 11
通常の作動レベルであれば問題ないのだが、他から同時にファイルアクセスがあった場合にファイル破壊の可能性があるのは、明らかにバグ。困った~。
思い出した。phpにはsleep関数(sleep(int seconds))があって、実行を指定秒数だけ遅らせることができたんだった。
ということは、リモートログファイルへアクセスする前にリモート実行ファイルで、ロック→コピー→ロック解除して、それから数秒後に、リモートファイルをローカルへコピーする。これでokか?
コメント(0) TrackBack(0) ▲topへ
11 (Sun) ▽ブログ検索の対応にPing送信
最近流行りだしたブログ検索に対応するため、当サイトのページもPing送信しなければと、試してみる。
もちろん流行に鈍感なので、まず「Ping送信」自体が分らない。
ネットで検索するものの、Pingの何たるかが理解できる初心者向けのサイトは見当らず。仕方なしに、GoogleとYahooのヘルプを確認すると、どうやら「XML-RPCクライアント」と「RESTクライアント」のどちらかで送信するみたい。
次に、XML-RPCクライアントの何たるかをネットで検索するものの、詳しいサイトは発見するが、PHPでの平易な構築の仕方を解説しているサイトは発見できず。
Googleヘルプを見ると、RESTクライアントの方が断然、簡単そうので、これで試してみる。
これは、ping送信用のurlへ決められたパラメーターをくっつけて送信したらokというもので、必要な項目は、ブログのタイトルとurlアドレスとrss用urlのみ。
一度試しで、次のようなファイルを作成し、ローカルサーバで実行してみると
------Ping送信用ファイル-----
<?
$ping_rest="http://blogsearch.google.co.jp/ping";
$name="?name=YaskeyDiary";
$url="&url=http%3A%2F%2Fwww.yaskey.cside.tv%2Fmapserver%2Fdiary%2Fdiary.php";
$changesURL="&changesURL=http%3A%2F%2Fwww.yaskey.cside.tv%2Fmapserver%2Fdiary%2Findex.xml";
$ping_rest .=$name;
$ping_rest .=$url;
$ping_rest .=$changesURL;
readfile($ping_rest);
?>
-----------------------------
Thanks for the ping.
と表示され、うまくいったみたい。
ちなみに、Googleのブログ検索の更新通知履歴(http://blogsearch.google.co.jp/changes.xml)がxml形式で公開されているので確認してみるとあった!

Google ブログ検索に反映されるまでには少し時間が掛かりそう。
ちなみに、Yahoo!Japanでは、「http://api.my.yahoo.co.jp/rss/ping?u=あなたのサイトのRSSファイルのアドレス」とあるので、
------Ping送信用ファイル-----
<?
$ping_rest= "http://api.my.yahoo.co.jp/rss/ping?u=";
$ping_rest .="http%3A%2F%2Fwww.yaskey.cside.tv%2Fmapserver%2Fdiary%2Findex.xml";
readfile($ping_rest);
?>
----------------
をローカルで実行すると、次のコメントが表示される。
Refresh requested: http://www.yaskey.cside.tv/mapserver/diary/index.xml Blog Search: Successfully refresh requested My Yahoo! RSS reader: Refresh requested About "Blog Search", see "http://blog-search.yahoo.co.jp/" About "My Yahoo! RSS reader", "http://my.yahoo.co.jp/promo_jp/rss_reader/index.html"
Refresh requestedと表示されれば、成功とのことなので、これもok。
あとは、この動作を自分のブログに組み込めば完成。
で、httpのあとに"%3A%2F%2F"と表示されているのは、URLエンコードされた文字で、"://"を表している。Googleヘルプでサンプルを見るとスペースは"+"に変換されているため、PHPでこれらの特殊な文字をURLエンコードするためには、urlencode()を使用する。
で、何度かGoogleブログ検索で試すものの、検索結果になかなか反映されないので確かめてみると、なんとping送信した当サイトのURLの後に半角スラッシュ"/"がくっ付いているではないか。はてやこれのせい?ともう一度正しいURLでping送信してみると
The feed URL is invalid.
と返ってきた。訳すと"フィードURLは無効です"となる。ん~どうしよう。
コメント(0) TrackBack(0) ▲topへ
10 (Sat) ▽PHPでリモートファイルを操作
先日からPHPでリモートファイル操作を行なうためのプログラムを作成しているのだが、今まで作成したことがないため、ちょっと難儀している。
今まで他のサーバにあるファイルの事を「外部ファイル」とか言ってたが、これをプログラムの世界では「リモートファイル」と呼ぶという事がわかった(私は専門家でないので、所詮この程度の者)
具体的には、GPS携帯の位置情報ログファイル(リモートファイル)を、イントラネットで作動しているMapServer(p.mapper2)で表示させるために、一旦ローカルのPostgreSQLへロードさせるというプログラム。ローカルに取り込むのはログファイル以外に画像ファイルがある。
単純に、リモートファイルをコピー(phpでcopy(リモートファイル,ローカルファイル)で可能)すれば簡単なのだが、コピーしたアクセスログは削除する事とセキュリティーを考慮して、他者には操作できないようする必要があるので、これが厄介。
それで、まず最初に考えたのが、ローカルからIDとパスワードを送って、正しければ正しいパラメータを送り返して、コピーを開始するという方法だが、正しいというパラメータを送り返すことが簡単にはできない為、この案は没。またそもそもそのログファイル自体がアクセスできないようにする必要がある
そのために、アクセスログがあるフォルダへのアクセスには、Basic認証を設けておく必要があり、今度はPHPスクリプト操作でBasic認証を通す必要が出てきた。
普段は、手動でidとパスワードを入力して、Basic認証を通るのだが、PHPスクリプト自体が文字を入力してOKボタンをクリックできる訳もなく、困ったと思ったら、PHPでは
fopen("http://user:password@urlアドレス", "r");
でリモートファイルを操作できることが分った。
ラッパーとかストリームとかリソースとか正確には良く分らないが、ひとまず何とかなりそう。
コメント(0) TrackBack(0) ▲topへ
09 (Fri) ▽phpで外部ファイルを操作するためには
単純なことだけど、混乱してしまうプログラム(自分だけか?)
外部サーバにあるPHPファイルを実行させるためには、どうしたら良いか?
例えば、外部のサーバにphpファイル(外ファイル)があって、その外ファイルをイントラネットのphpファイル(内ファイル)で実行させるためには、
内ファイルで
echo "http://hoge.php";
と書けば(外ファイルの hoge.php には「<? echo "Hello!"; ?>」と記述されている )当然の事だが
http://hoge.php
と表示されるだけ。
なので、この場合は、
内ファイルで
readfile("http://hoge.php");
と書けば、
Hello!
と表示される。
単純なことだが、混乱するプログラム処理。
コメント(0) TrackBack(0) ▲topへ
07 (Wed) ▽ka-Map。beta1がとれて1.0へ
MapTools.orgのページを見るとka-MapのBeta版がなくなり正式のVersion1.0がリリースされている。
コメント(0) TrackBack(0) ▲topへ
06 (Tue) ▽「GISアクションプログラム2010」(案)の意見募集
株式会社クリエイト・クルーズが発行しているメールマガジンの情報で知ったのだが、測位・地理情報システム等推進会議が「『GISアクションプログラム2010』(案)に関する意見の募集について」を行なっている。募集開始は2月3日からということ(知らなかった。自分の情報収集能力が低いのか、または公開の要領が悪いのか。。。)
国土交通省が以前にも、国土数値情報ダウンロードサービスの意見を募集していて、この時はシェープファイルでの提供を!と希望を出した所(私の意見を取り入れて頂いてかどうかは分らないが)すんなりとシェープファイルでの提供が始められた。
どうしても、官僚・役所というと『遅い・国民の意見を聴かない・形式主義など』悪いイメージが付き纏い、「構造改革をやるぞ!」と言っていた小泉さんがいなくなったら、GISアクションプランは放ったらかしかなぁと思っていて、実際前回の国会に提出された「測位・空間情報基本法案」も議長預りで望み薄とのことだったが、そうでなないかも知れない。
勘違いしていた。今回は国土交通省ではなく「測位・地理情報システム等推進会議」のパブリックコメント募集であった。
アクションプログラム(案)を読むと、GIS関係者(特にオープンソースGIS)にとっては、ありがたい施策ばかりで、なんとか実現いただきたい内容ばかりだと思う。もちろん国民にとってもあらゆる面で利便性の向上につながると思う。
募集期限は2月26日13時までとなっており、掲載されている「GISアクションプログラム2010」(案)についての具体的な意見を募集という形式となっている。
私も意見を述べる予定。もちろん紳士的に、数値地図がいつまで試験公開なのかとか、人材育成に関する意見とか。。。
コメント(0) TrackBack(0) ▲topへ
04 (Sun) ▽p.mapper2で画像のアップロード
p.mapper2.1.2で画像のアップロードをテスト。
できた~!

それほど時間は掛からなかったのだが、不明な点が何個か。
まず、ポイントデータ追加用の拡張ファイルにアップロードファイル用のPHP関数を追加して、試す。
ファイルのディレクトリの指定などで手間取ったが、なんとか完成。

しかし、Auto Identify機能でポイントを表示させるが、なぜかJavaScriptエラーとなる。PHPエラーログを調べるとどうやらGeometryフィールドの名前が"geom"となっていた事が原因のようで、p.mapper2はthe_geomとしなければならない模様。
それでpgadmin3でフィールド名を変更するが、ポイントデータ自体が地図上に表示されなくなってしまった。コマンドプロンプトでフィールド名をチェックしてもthe_geomで表示されているのに、正しく変更できてないようだ。
それで、仕方なしに、ポイントデータのテーブルを削除して、最初からフィールド名をthe_geomで指定して、PostgreSQLへポイントデータをロードして、Auto Identify機能でポイントへマウスを乗せると表示した。
infoではこのように表示される

ちなみに、PHPで画像をアプロードさせる際に、サムネイル画像を生成して、アップロードさせて、Auto Identifyでは小さいサイズの画像を表示させている。
あとは、携帯からGPS画像をメールで送信して表示させる機能を追加したら、ひとまず完成の予定
コメント(0) TrackBack(0) ▲topへ
04 (Sun) ▽p.mapper2.1.2/PostGISポイント追加
p.mapper2.1.2の改良。次はPostGISへのポイント追加。
とりあえず、p.mapper1.2.0の拡張用スクリプトをコピーして作動させてみるが、当然のことながら、作動しない。
まず、mapserver.jsとphp_config.phpで画面メニューでポイント追加用のボタンと地図上で専用カーソルが表示されるように改良。さらに専用のWindowが開くようにする。ここまではなんなくクリア。

次に、ポイント登録のために、地図上でクリックした緯度経度と登録するPostGISのテーブルのパラメータを取得する必要があるが、何度試しても「common.phpが読み込めない」というPHPエラーが表示されて、取得できない。Ajaxが多く組み込まれたために、他に独自関数用ファイルを作る必要があるのか?と思って、色々と試すがうまくいかない。
なぜ、p.mapperを起動した時点で読み込めたファイルが、読み込めなくなっているのだろう?それで他のファイルがどのような作りになっているか確かめるためにprintmap.phtmlを開いてみると、require_once("$PM_INCPHP/globals.php");という新しいファイルが記述されていたので、試しにこれを追加すると、いけた~。

でも、いざデータを登録すると登録した筈のポイントデータが表示されない。PostGISにデータは追加されているのに~。よく調べてみると経度緯度がきちんと取得できてい。原因はJavaScriptからパラメータが渡せてなかった為と判明し修正(ちなみにJavaScriptでは"ダブルクォーテーションと'シングルクォーテーションの取扱いに注意が必要)
最後に残ったのが、データ登録後のマップリロード。以前に使用していたやり方では、ページがリロードしない事が判明し、PHPソース上でAjax(JavaScriptのfounction)をどうやって動かすのかが分からず、四苦八苦して、ようやく分かった。
$jsRunStr = "\n<SCRIPT LANGUAGE=\"JavaScript\">\n";
$jsRunStr .= ((infoWin == "frame" ? "" : "opener.") ."reloadMap()");
$jsRunStr .= "\n</SCRIPT>";
echo $jsRunStr;
ようやく完成した、苦労の跡

コメント(0) TrackBack(0) ▲topへ