2006年8月アーカイブ

ホテルの口コミ.jpのトラックバックシステムを開発する上で困ったのが
excite blog の「リンクがないトラックバックを受け付けない」設定の回避について。

記事中に
<A href="http://xxx.exblog.jp/xxx">xxx</A>
として相手ブログへの言及リンクを含ませても「言及リンクなし」エラーが発生する。

原因をいろいろと調査したところ
AタグのAが大文字だとリンクタグとして認識していないことがわかった。

<a href="http://xxx.exblog.jp/xxx">xxx</a>
であれば言及リンクとして認識した。

PerlであれPHPであれ、プログラム上で一文字追加するだけで
大文字も同様に認識できるのに
exblogのシステム担当者にはもう少し頑張ってほしいですね。

exblog TB 文字化け問題もあったし、exblogに対応させるのに苦労しました。

【追記】
と思ったら今度はseesaaブログでの言及リンクが認識しなくなった。
どうやらseesaaは<A>でないと言及リンクとみなさないようです。
ということで全てのブログの言及リンクを回避する為に<A>と<a>二通り書くことにしました。

世界初の簡易マーカー&データベースを導入し、
地図を動かす度に高速に検索&表示されるシステムは注目です。
好評ならGpso.infoでも同様のシステムを導入予定です。

もしこの記事を見た方がいらっしゃいましたら、ぜひ訪れてみてください。
ご要望があれば、このサイトでテクニックを公開していきます。

クチコミ宿マップ(ホテル検索)
http://ホテルの口コミ.com/

速度警告板はオービスですか?

速度警告板の表示(「○○kmオーバー」「速度落とせ」など)はあくまで警告です。
その警告が表示されてしまっても、その時点で速度を落とせばオービスに撮影されることはありません。
速度警告板のすぐ先には本物のオービスが待ち構えていることが多いですので注意して走行しましょう。
警告してくれるなんて優しいですね。

被写体(違反運転者)にも肖像権が存在するため、オービスを設置している道路には、警告を示す看板がオービス設置箇所の事前に設置してあります。
なお、オービス自体にライトアップはされないため、夜間では見落としやすいので注意しましょう。

違反事実を認識させるために撮影の瞬間に強烈な赤色のフラッシュが炊かれます。
気づかない間に撮影されていた、ということはまずないでしょう。
ですので弱い白いフラッシュ等は見間違いである可能性が高いです。

オービスに似ているものとして「自動車ナンバー自動読取装置 」(通称:Nシステム)があります。
これはオービスとは違い、自動車のナンバープレートを自動で読み取るだけの装置で、手配車輌の追跡にしか使用されません。
速度も記録しているらしいですが、今のところNシステムからの摘発はないようです。

オービスの種類

・レーダー式
ドップラー・レーダーを利用して車両の速度を測定する方式。車両に対して電波を照射し、反射した電波の周波数から速度を計算する。道路上空に設置したレーダーアンテナの10mほど後ろの中央分離帯または路肩に撮影装置が設置されている。欠点は、雨天時や車間距離が詰まっている場合などに反射波の受信が困難となり、まれに誤測定をすることと、常に電波を発射しているために探知機に発見されやすいこと。
・ループコイル式
道路下5cmのところに、6.9mの間隔を空けて3個のループコイルが埋め込まれている。車両は金属製であるため、ループコイルに近づくと磁界が乱れる。これを利用して、3つのループコイルの磁界の乱れの時間差と距離(6.9m)から速度を計算する。雪に弱く、北国ではあまり見られない。なお、防犯上の観点から撮影装置が網の枠で囲まれている事がほとんどで、撮影地点には白線が引かれている事が多い。探知機には発見されにくいが、ループコイルが車両の重量によって損傷を受けるため、定期的なループコイルの交換が必要である。
・Hシステム
最も多く設置されている取り締まり機。初期のものは「電子画像撮影・伝送方式」と呼ばれるもので、阪神高速道路に多く設置されている。1992年に登場した2代目(高速走行抑止システム)は、CCDカメラ、赤外線ストロボ、通称「はんぺん」と呼ばれる白くて四角いレーダーが備えられており、全国で数多く見られる。名称の「H」は阪神高速の頭文字(HANSHIN EXPRESSWAY)から。
・LHシステム
1994年から登場したもので、「ループコイル式Hシステム」という。Hシステムが速度計測にレーダーを使うのに対し、LHシステムは地中に埋められたループコイルを利用する。ループコイル式同様、撮影地点に白線が引かれている事が多い。Nシステムと見分けがつきにくい。名称の「L」はループコイルの頭文字(LOOP COIL)から。
・SSシステム
外観はHシステムと同じだが、撮影した写真を即座に待機中のパトカーに送り、その場で検挙するという点で異なる。あまり普及していない。
・光電管式
ループコイルの代わりに光源と光電管を設置し(または光源と光電管を隣り合わせて設置、対向に反射板を設置し)、車両が通過する時間を測定する方式。汚れに弱いことと、複数車線での取り締まりが困難であることから普及はしなかった。

http://ja.wikipedia.org/wiki/%E8%87%AA%E5%8B%95%E9%80%9F%E5%BA%A6%E9%81%95%E5%8F%8D%E5%8F%96%E7%B7%A0%E8%A3%85%E7%BD%AE
から引用

オービスとは何ですか?

自動速度違反取締装置(じどうそくどいはんとりしまりそうち)とは、アメリカのボーイング社で開発された、道路上に設置されている速度違反を取り締まる装置。通称のオービス(ORBIS)は製品名であるが、他社の取締機も含めての通称として使われることが多い。「ネズミ捕り機」などと呼ばれる事もある。

主要な幹線道路や、速度違反が多発している道路などに設置されており、制限速度を超過して走行している車両を発見すると、当該車両の速度測定と、ナンバープレート及び運転者の撮影を行う。国内の場合は、違反事実を認識させるために撮影の瞬間に赤色のフラッシュが炊かれる。オービスによって速度違反が検挙されると、撮影された写真を元に、後日警察から当該車両の持ち主に出頭通知が送付される。

オービスを設置している道路には、警告を示す看板がオービス設置箇所の事前に設置してある。これは被写体(違反運転者)にも肖像権が存在するためであり、「事前告知」と「証拠として犯罪行為の瞬間の撮影」が設置条件として義務づけられているからである。看板の色は、各都道府県により異なる場合がある。また、在日米軍関係車両の通行が多い沖縄県では "SPEED CHECK" もしくは "SPEED CHECKED" と併記されている。

なお、オービス自体にライトアップはされないため、夜間では見落としやすい。

http://ja.wikipedia.org/wiki/%E8%87%AA%E5%8B%95%E9%80%9F%E5%BA%A6%E9%81%95%E5%8F%8D%E5%8F%96%E7%B7%A0%E8%A3%85%E7%BD%AE
より引用

Q&A

オービスに関する疑問・質問等ありましたらこちらのコメント欄からどうぞ

ご質問・エラー報告スレッド

ご質問、エラーなどありましたら、下のコメントフォームからお願いします。
または、直接メールでも受け付けております。
メールアドレスは携帯サイト(URL同じ)の下部に記載されております。

特に携帯サイト(DoCoMo、SoftBank(旧Vodafone))での動作報告をお願いします。

※お答えできない質問は、掲載、返信されません。予めご了承ください。
※投稿の非公開をご希望であればその旨をご記入ください。一般公開されません。

当サイト「Gpso.info」では皆様からの情報提供で成り立っております。

----------
匿名の方数名より非常にたくさんの全国のオービス設置データをご投稿いただきました。
早速更新いたしますので今しばらくお待ちください。
----------

まだまだ皆様からの情報投稿をお待ちしております。
管理人登録以外の投稿情報は第三者から信憑性が評価され、
100ポイントに到達次第、その情報が管理人によって「登録オービス」として掲載されます。
(掲載するか否かは管理人が全て決定権を有します。)
無事「登録オービス」として登録されました際には、
情報提供のお礼といたしまして、携帯サイト(アドレスはPCと共通)でのAUGPSレーダー機能の使用期限を7日間延長させていだだきます。(AU携帯ご利用の投稿者様に限ります。予めご了承ください。)

投稿のお礼の内容など、変更されることがあります。

AjaxでYahoo検索を二通り作る

Google Maps では画面遷移のないシームレスな画像読み込みが行われます。
それにはAjaxと言われる最新技術が使われています。

Ajaxを使わないとシームレスな通信が不可能かと言われるとそうではありません。
今まではフレームを使ってシームレスな通信を行っていました。
実際に体験してもらった方が早いと思いますので以下のページをご覧ください。
Yahoo!検索 画面遷移無し(非同期通信) - フレームバージョン

このフレーム通信には、test2_1.html(親フレーム)、test2_1_sub.html(下フレーム)、test2_1_dummy.html(上フレーム(通信受信用、見えないフレーム))、test2_1.php(Web通信用)が使われています。
test2_1.html

<HTML><HEAD>

<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">

<TITLE>Yahoo!検索 画面遷移無し(非同期通信) - フレームバージョン</TITLE>

</HEAD>

<FRAMESET rows="0,*" frameborder="0" border="0" framespacing="0">

<FRAME src="test2_1_dummy.html" scrolling="NO" noresize marginwidth="0" marginheight="0" frameborder="0" name="up">

<FRAME src="test2_1_sub.html" frameborder="0" name="main">

<NOFRAMES>

<BODY>フレームが使用できないブラウザでは実行できません</BODY>

</NOFRAMES>

</FRAMESET>

</HTML>

rows="0,*"として見えないフレームを作る必要があります。
test2_1_sub.html
<HTML>

<BODY>

<SCRIPT language="JavaScript">

<!--

function get_data(){

  parent.up.location.href = "test2_1.php?key="+document.fo.yahoo.value;

}



function set_data(html){

  document.all("html_div").innerHTML = html;

}

//-->

</SCRIPT>

<FORM name="fo">Yahoo!検索<BR><INPUT size="20" type="text" name="yahoo"><INPUT type="button" value="検索" onclick="get_data();"></FORM>

<HR>

<DIV id="html_div"></DIV>

</BODY>

</HTML>

ここでget_data()は通信開始関数、set_data()は通信受信関数です。
parent.up.location.href =とすることで、見えない「上フレーム」を指定ページに移動させています。(ここでは検索用phpを起動します。)

Yahooの通信はWebページを簡単に取得できるPHPが使われています。
test2_1.php

<?php

$key = $_GET['key'];

$get_html_dat = file("http://search.yahoo.co.jp/search?p=$key");

$all_html_dat = "";

for($i=0;$i<count($get_html_dat);$i++){

  if(!eregi("<li><div>",$get_html_dat[$i])){continue;}

  $get_html_dat[$i] = ereg_replace('"', "", $get_html_dat[$i]);

  $all_html_dat .= rtrim($get_html_dat[$i]);

}



echo "<HTML><BODY><SCRIPT>parent.main.set_data(\"$all_html_dat\");</SCRIPT></BODY></HTML>";



?>


PHPは、$get_html_dat = file(・・・);のたった一行で$get_html_datに配列としてWebページを取得できます。($get_html_dat[0]は一行目、$get_html_dat[1]には二行目・・と格納されています。)
また、結果を表示する際に、取得したデータをそのまま表示するのではなく、<li><div>がある行のみを表示し、存在しない行は飛ばします。
ereg_replace('"', "", $get_html_dat[$i]);では、JavaScriptエラーの原因となるダブルクォーテーション(")を変換しています。
最後にparent.main.set_data(\"$all_html_dat\");で、test2_1_sub.htmlのset_data()関数を引数(検索結果データ)込みで実行します。
そうすると画面に表示されるというわけです。

ちなみにtest2_1_dummy.htmlは何も書く必要はありません。(ダミーファイルです。)

さて、このようにフレームを用いた場合、ほとんどのブラウザで動作するという利点(携帯のフルブラウザでも可能です。たとえばこちら)がありますがデメリットとして、多くのファイルを用意する必要があり、煩わしいものとなっています。

そこでAjaxを使ってみましょう。サンプルを見てみるとわかりますが、動作はフレーム版とほぼ同じです。
Yahoo!検索 画面遷移無し(非同期通信) - Ajaxバージョン

この方法だと、test2_2.html(メインファイル、通信受信兼)、test2_2.php(Web通信用)と、とても少ないファイルで通信できます。
ちなみにAjax共通関数に関してはこちらを参照しました。

さて、内容を見ていきましょう。
test2_2.html

<HTML>

<BODY>

<SCRIPT language="JavaScript">

<!--

function get_data(){

  httpObj = createXMLHttpRequest(set_data);

  if(httpObj){

    httpObj.open("GET","test2_2.php?key="+document.fo.yahoo.value,true);

    httpObj.send(null);

  }

}



function set_data(){

  if((httpObj.readyState == 4) && (httpObj.status == 200)){

    html = httpObj.responseText;

    document.all("html_div").innerHTML = html;

  }

}



// HTTP通信用、共通関数

function createXMLHttpRequest(cbFunc){

  var XMLhttpObject = null;

  try{

    XMLhttpObject = new XMLHttpRequest();

  }catch(e){

    try{

      XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP");

    }catch(e){

      try{

        XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP");

      }catch(e){

        return null;

      }

    }

  }

  if (XMLhttpObject) XMLhttpObject.onreadystatechange = cbFunc;

  return XMLhttpObject;

}

//-->

</SCRIPT>

<FORM name="fo">Yahoo!検索<BR><INPUT size="20" type="text" name="yahoo"><INPUT type="button" value="検索" onclick="get_data();"></FORM>

<HR>

<DIV id="html_div"></DIV>

</BODY>

</HTML>

createXMLHttpRequest(・・・);のカッコ内に受信後に実行される関数名を記述します。ここではset_dataを実行するようにしています。
httpObj.responseTextには受信データが入っています。後はtest2_1_sub.htmlとあまり変わりません。

test2_2.php

<?php

$key = $_GET['key'];

$get_html_dat = file("http://search.yahoo.co.jp/search?p=$key");

$all_html_dat = "";

for($i=0;$i<count($get_html_dat);$i++){

  if(!eregi("<li><div>",$get_html_dat[$i])){continue;}

  $get_html_dat[$i] = mb_convert_encoding($get_html_dat[$i],"UTF-8","auto");

  $all_html_dat .= $get_html_dat[$i];

}

echo $all_html_dat;

?>

mb_convert_encoding($get_html_dat[$i],"UTF-8","auto");
で、文字コードをUTF-8に変換します。そうしないと文字化けします。
今回はダブルクォーテーションを変換したり、最後の出力を<SCRIPT></SCRIPT>で囲む必要はありません。

このように二通り試しましたが、あなたならどちらを使いますか?

当サイトのトップページhttp://gpso.info/
アクセスした端末によってトップページを切り替えています。
Perlでも可能ですが、今回はPHPを使うことにします。

まずは画面の切り替えが発生するバージョンです。
index.phpと名前をつけてアップロードしてください。
この他にも、各ケータイ用ページが必要です。(au.htmlやpc.htmlなど)
たとえばAUのケータイでhttp://gpso.info/にアクセスするとhttp://gpso.info/au.htmlに移動します。

<?php

$USER_AGENT = $_SERVER["HTTP_USER_AGENT"];
$REMOTE_HOST = $_SERVER["REMOTE_HOST"];
$REMOTE_ADDR = $_SERVER["REMOTE_ADDR"];
if ($REMOTE_HOST == "") { $REMOTE_HOST = gethostbyaddr($REMOTE_ADDR);}

if(ereg("ezweb",$REMOTE_HOST) || eregi("UP\.Browser",$USER_AGENT)){
  header('Location: ./au.html');

}else if(eregi("DoCoMo",$USER_AGENT)){
  header('Location: ./docomo.html');

}else if(eregi("Vodafone",$USER_AGENT) || eregi("J-PHONE",$USER_AGENT)){
  header('Location: ./vodafone.html');

}else{
  header('Location: ./pc.html');

}

exit;

?>

次に画面の切り替えが発生しないバージョンです。
たとえばAUのケータイでhttp://gpso.info/にアクセスするとアドレスはhttp://gpso.info/のままで、http://gpso.info/au.htmlの内容が表示されます。

<?php

$USER_AGENT = $_SERVER["HTTP_USER_AGENT"];
$REMOTE_HOST = $_SERVER["REMOTE_HOST"];
$REMOTE_ADDR = $_SERVER["REMOTE_ADDR"];
if ($REMOTE_HOST == "") { $REMOTE_HOST = gethostbyaddr($REMOTE_ADDR);}

if(ereg("ezweb",$REMOTE_HOST) || eregi("UP\.Browser",$USER_AGENT)){
  read_html("au.html");

}else if(eregi("DoCoMo",$USER_AGENT)){
  read_html("docomo.html");

}else if(eregi("Vodafone",$USER_AGENT) || eregi("J-PHONE",$USER_AGENT)){
  read_html("vodafone.html");

}else{
  read_html("pc.html");

}

exit;

//ファイルを読み込む
function read_html($file){
  $fp = fopen($file, 'r');
  while (!feof($fp)) {
    $line = fgets($fp,1024);
    echo $line;
  }
  fclose($fp);
}

?>

最初は地道に個数分マーカープログラムを並べる方法です

var point = new GPoint(139.69167,35.68949);
var pophtml1 = '<div style="width: 200px; font-size: 12px">東京都</div>';
var marker = new GMarker(point);
GEvent.addListener(marker1, "click", function() {
marker1.openInfoWindowHtml(pophtml1);
});
map.addOverlay(marker1);

たとえば関東地方の7都道府県を表示したければこれを7つ並べなければなりません。
また、赤文字部分の数字をマーカー毎に変更しなければならないので効率が悪すぎます。
サンプル1

そこで改良版を作りました。
データベースなどから取得してきたデータを一気に表示するようにしました。

function make_marker(){

  get_data = '茨城県,栃木県,群馬県,埼玉県,千葉県,東京都,神奈川県
<>140.44717,139.88347,139.06062,139.649,140.12313,139.69167,139.64259
<>36.34108,36.56555,36.39093,35.85742,35.60455,35.68949,35.4477';

  get_data_split = get_data.split("<>");

  ken_name = get_data_split[0].split(",");
  point_lon = get_data_split[1].split(",");
  point_lat = get_data_split[2].split(",");

  for(i=0;i<point_lon.length;i++){
    var point = new GPoint(point_lon[i],point_lat[i]);
    var pophtml = '<div style="width: 200px; font-size: 12px"><B>'+ken_name[i]+'</B>を表示しています</div>';
    var marker = show_marker(point,pophtml);
    map.addOverlay(marker);
  }
}

function show_marker(point,pophtml){

  var marker = new GMarker(point);

  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(pophtml);
  });
  return marker;
}
make_marker();

get_data = '';に三つの要素「県名、経度、緯度」を<>区切りで入れてください。
(画面の都合上改行されていますがデータは一行にまとめて入力してください)
また各々の要素は、カンマ区切りでいくつでも追加できます。
最後に、make_marker();を実行するとマーカーが全て表示されます。
サンプル2

Google Maps で全国オービスマップ

Google Maps API は無償であなたのWEBページに動く地図が設置できるという
夢のようなサービスです。当サイトはそれを利用して全国オービスマップを作成しています。
地図提供のゼンリンさんにも感謝して使いましょう。
設置は簡単なJavaScript及びHTML言語の知識があると簡単です。
当サイトではそれらの知識があること前提で説明していきます。
JavaScriptに関する質問等はお答えできませんので予めご了承ください。

Google Maps API の導入はこちらのサイトを参考にしました。
・Google MAPS APIプログラミング
・Google Maps API解説

このブログでは主にGpso.info開発する上で役立ったポイントを解説していきます。

経度・緯度の表し方と変換

まず知っておかなければならないことが、
経度、緯度の表し方がいろいろとあるということです。

まず大きな違いが、日本測地系と世界測地系です。
同じ地点でも、この違いにより世界測地系の方が
南東におよそ450mずれた地点を表すことになります。

【参考】東京都庁の経度、緯度
日本測地系・・経度:139.69487、緯度:35.68627
世界測地系・・経度:139.69167、緯度:35.68949

それでは、それぞれの値を変換するにはどうすればいいでしょうか。
次のような式があります。変数の定義は次の通りです。
(ln:入力経度、la:入力緯度、lng:変換後経度、lat:変換後緯度)

日本→世界

lng = ln - la * 0.000046038 - ln * 0.000083043 + 0.010040;

lat = la - la * 0.00010695 + ln * 0.000017464 + 0.0046017;

世界→日本
lng = ln + la * 0.000046047 + ln * 0.000083049 - 0.010041;

lat = la + la * 0.00010696 - ln * 0.000017467 - 0.0046020;


次の違いが度表示、度分秒表示などによる違いです。
(時間の計算で「12分15秒→12.25分」などと同じような変換です)

【参考】東京都庁の経度、緯度
日本測地系(度)・・経度:139.69487、緯度:35.68627
日本測地系(度分秒)・・経度:139.41.41.53、緯度:35.41.10.57

JavaScriptでの変換プログラム例です。
Perl、PHPで使用したい場合は適宜変更してください。

度→度分秒(ddd.mm.ss.ss)
(innum:入力数値(ddd.ddd形式)、outnum:変換後数値)

EH = parseInt(innum);

EM = parseInt((innum-EH)*60);

ES = (innum-EH-(EM/60))*3600;

ESS = (Math.round(ES*10)/10);

if(EM<10){EM = "0"+EM;}

if(ESS<10){ESS = "0"+ESS;}

if((ESS+"").indexOf(".") == -1){ESS = ESS+".0";}

outnum = EH+'.'+EM+'.'+ESS;

度分秒(ddd.mm.ss.ss)→度
(innum:入力数値(ddd.nn.ss.ss形式)、outnum:変換後数値)

tmp_in = innum.split(".");

outnum = parseInt(tmp_in[0])+(((tmp_in[1]*60+parseInt(tmp_in[2])+tmp_in[3]/10)*1000)/3600000);

困ったことに現在の対応状況は
・Google Maps API 【世界測地系】 【度表示】
・mapionなど国内主要地図サイト 【日本測地系】 【度分秒表示】
・AUGPSケータイ 【どちらも可(datum、unit変数で指定)】
と、バラバラですので変換して統一する必要があります。

ということで、当サイトは、Google Maps API などで表示するデータも
すべて日本測地系、度分秒表示に変換して表示しています。

登録に関して

当サイトにて情報を投稿するには
事前に携帯サイトでIDを取得する必要があります。
携帯サイトのアドレスはPCサイトと同じ( http://gpso.info/ )で、<br />
携帯電話でアクセスの際に自動的に対応サイトが表示されます。
面倒なID、パスワードの設定もなく、メールアドレスの登録も必要ありません。<br />
アクセスするだけで、1分もあれば登録が完了します。
※IDは1つの携帯電話につき1つしか発行できません。
※また、一度登録を抹消された場合、二度とその携帯電話で登録できなくなります。

<blockquote>【ID登録の目的】
・なりすまし、荒らし行為を防ぐ
・個別TOPページの表示
・投稿ポイントの管理(未実装)</blockquote>

また、登録後、現在地情報を送信するよう促されます。
この目的は以下の通りでそれ以外の用途には使用されません。

※心配な方は現在地を登録しないことも、後で登録することもできます。

<blockquote>【現在地登録の目的】
・投稿情報の信憑性を高める( 居住地域に近い場所の投稿・投票は信憑性が高いと判断します )
・居住都道府県に適した情報を表示</blockquote>

また、投稿の際はIDは暗号化され、他人に使用されることはありません。
IDは決して他の方に教えないようお願いします。
不正な投稿を繰り返すユーザーはこちらの判断でIDを抹消し、以後登録できなくなります。

開発日記を公開していきます

はじめまして。管理者のNです。
このブログではGPSO.info の更新状況や、テクニック等を公開していきたいと思います。

Q. Gpso.info って?
A. オービスやねずみ捕り情報をGoogle Maps APIを利用して閲覧できるサイトです。

Q. Gpso.info の由来は?
A. 「GPS Orbis Information」 GPSオービス情報の略となっています。

Q. 携帯があればできることは?
A. AUのGPS携帯ではPCサイトのデータを連続受信してGPSレーダー探知機と同等の機能を提供しています。

このアーカイブについて

このページには、2006年8月に書かれたブログ記事が新しい順に公開されています。

次のアーカイブは2006年9月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 5.031