□世界地図を使ってグリッドロケータを基にしたリンクマップを作る
まず世界地図だけど
上記サイトからミラー図法の白地図をもらってくる。
ここの地図は地図としての精度はアバウトでサイズも正しくないので、
大体のところに自分で加工しないといけない。とりあえずミラー図法を
落としてくるが、きちんとしたグリッドロケーターにしたいなら、より
正確な地図を用意する必要がある。
で、ミラー図法だけど
ミラー図法
http://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A9%E3%83%BC%E5%9B%B3%E6%B3%95
↑というように、緯度方向については補正が必要。
緯度をy、経度をxとしたとき、Miller図法では緯度が上記のように補正
される。
でも、この式の通りにPHPで書くと、というか書き方が間違えているの
かもしれないけど、なぜかうまく計算できないので、ここの説明どおり
にメルカトル図法の式をPHPで起こして、そこから補正値を作って、その
結果を0~90度までのテーブル(array)にした。
で、コールサインのプリフィックスと所在地の確認だが、
http://www.arrl.org/awards/dxcc/dxcclist.txt
http://dvi.elcom.cz/ok2pbq/prog/dxcclist.php
で現在のカントリリストが得られるが、より細かい地域までは得られない。
コールサインから直接グリッドロケータを得るのがいいのだが、さすがに
それはないので、コールサインで国を特定して、あとはルートヘッダーに
書いてある地域(?)からある程度引っ張ってくるしかないか。
Yahoo!APIを使おうと思ったら、日本のYahoo!APIは「Minas Brazil」とか
での検索に対応していない…ダサ。
というわけで、GoogleMapAPIを使うことにする。
・まずはAPI-IDの取得。
http://code.google.com/intl/ja/apis/maps/signup.html
ABQIAAAACfjwIpOZi2MmzXkniFTDURT_fxjiJ6IOwJpxFDXgOhcn9rl2vxSs3cnH-hgVRzCmV6SgvMo2xTmZSg
・続いてデベロッパガイドを読め、と。
http://code.google.com/intl/ja/apis/maps/documentation/index.html
この中に「サービス」として「ジオコーディング」があって、そこに
「HTTP リクエスト経由のジオコーディング」というのがある。
http://code.google.com/intl/ja/apis/maps/documentation/services.html#Geocoding_Direct
ここを参考に以下のようなスクリプトを作る。
<?
// 環境変数を設定する
date_default_timezone_set(“Asia/Tokyo”);
// 地図ローカルサーチ
$API_URL = ‘http://maps.google.com/maps/geo’;
// API ID
$API_ID = ‘ABQIAAAACfjwIpOZi2MmzXkniFTDURT_fxjiJ6IOwJpxFDXgOhcn9rl2vxSs3cnH-hgVRzCmV6SgvMo2xTmZSg’;
?>
<?
// 検索する地域文字列を設定
$TARGET_ADDR = htmlentities(“Minas Brazil”);
$TARGET_URL = $API_URL.’?key=’.$API_ID.’&q=’.$TARGET_ADDR.’&output=xml’;
// 指定した地域の緯度経度を取ってくるスクリプト for YAHOO!
// RSS(XML)読み込み
$RESULT_XML = simplexml_load_file($TARGET_URL);
// 取得できたなら
if ($RESULT_XML)
{
print “<PRE>\n”;
print_r($RESULT_XML);
// print $RESULT_XML->Response->Placemark->Point->coordinates.”\n”;
print “</PRE>\n”;
}
?>
とすると、以下のような構造のXMLが返ってくる。
最後の方に緯度経度が入ってきている。
> SimpleXMLElement Object
> (
> [Response] => SimpleXMLElement Object
> (
> [name] => Minas Brazil
> [Status] => SimpleXMLElement Object
> (
> => 200
> [request] => geocode
> )
>
> [Placemark] => SimpleXMLElement Object
> (
> [@attributes] => Array
> (
> [id] => p1
> )
>
> [address] => Minas Gerais, Brazil
> [AddressDetails] => SimpleXMLElement Object
> (
> [@attributes] => Array
> (
> [Accuracy] => 2
> )
>
> [Country] => SimpleXMLElement Object
> (
> [CountryNameCode] => BR
> [CountryName] => Brasil
> [AdministrativeArea] => SimpleXMLElement Object
> (
> [AdministrativeAreaName] => MG
> )
>
> )
>
> )
>
> [ExtendedData] => SimpleXMLElement Object
> (
> [LatLonBox] => SimpleXMLElement Object
> (
> [@attributes] => Array
> (
> [north] => -12.4189187
> [south] => -23.2752013
> [east] => -35.5950443
> [west] => -51.9866463
> )
>
> )
>
> )
>
> [Point] => SimpleXMLElement Object
> (
> [coordinates] => -43.7908453,-17.9301780,0
> )
>
> )
>
> )
>
> )
>
で、実際には
$RESULT_XML->Response->Placemark->Point->coordinates
が判ればいいので、これを経度,緯度で分離すればよい。
ちなみに東経(西経)0度(=グリニッジ子午線)、北緯(南緯)0度(=赤道)が基準。