住所から緯度経度に変換して、データベースへ格納する方法

3,933 views
Skip to first unread message

sheva

unread,
Jun 28, 2008, 4:27:12 AM6/28/08
to Google-Maps-API-Japan
はじめまして。いつも拝見させていただいております。
ここ一週間ほど、過去の質問やWeb上で検索してもどうしても解決できなかったため、質問させていただきます。

今やろうとしていることは、
1.PHP5、MySQL
2.管理画面から住所(「東京都千代田区…など」)を入力
3.GoogleMapsのAPI(Geocoding?)などを使って、緯度経度に変換
 →ここでおそらくxmlに変換してSQLにいれるのがいいのでは、というところまでは分かったのですが、このあたりのくだりがどうしても分かりませ

4.変換された緯度経度のxmlを読み込むHTMLを作って、地図に反映

ということです。「4」のHTMLは作れたのですが、「3」の部分が分からず、コードもお見せできるようなものはできていない状態です。

恐らく、以前に出た
http://groups.google.co.jp/group/Google-Maps-API-Japan/browse_thread/thread/98922857793bb2b1/a884feb052445cf9?lnk=st
の方とやりたいことは似ているのだと思っております。

不足している情報はご指摘いただければと思います。
どなたか、ご教授願えますと幸いです。

Masashi.K

unread,
Jun 28, 2008, 11:00:43 AM6/28/08
to Google-Maps-API-Japan
>shevaさん

簡単なものでよろしければ、下記ページあたりを参考にしていただければ幸いです。

http://googlemaps.googlermania.com/map_example_16.html
http://googlemaps.googlermania.com/map_example_17.html

sheva

unread,
Jun 30, 2008, 9:13:11 PM6/30/08
to Google-Maps-API-Japan
Masashi.Kさん

ご返信いただき誠にありがとうございます。
Masashi.Kさんの「Google Maps 活用講座」もかなり参考にさせていただいております。ありがとうございます。

ご提示いただいたページを拝見させていただき、やりたいことはこれに非常に近いと思うのですが、
これに、データベースを介したものにしたいと考えております。

それは、管理画面から入力したものを何百件も積み重ねていって、時間軸などで表示件数を変えたり
したいためです。

と、自分で書いていて、すでにGoogleMapのAPIの範疇を超えた質問になってしまっていると思っております。。。

大変お手数ですが、もし
「管理画面>入力>DBに入れる>HTMLでDB(のXML?)を読み込んで地図に反映」という部分でご教授願えますと
幸いです。





On 6月29日, 午前12:00, "Masashi.K" <elm...@hotmail.com> wrote:
> >shevaさん
>
> 簡単なものでよろしければ、下記ページあたりを参考にしていただければ幸いです。
>
> http://googlemaps.googlermania.com/map_example_16.htmlhttp://googlemaps.googlermania.com/map_example_17.html

Mitu-Koike

unread,
Jul 3, 2008, 6:39:47 AM7/3/08
to Google-Maps-API-Japan
>shevaさん

> これに、データベースを介したものにしたいと考えております。
> 「管理画面>入力>DBに入れる>HTMLでDB(のXML?)を読み込んで地図に反映」という部分でご教授願えますと
> 幸いです。


私が過去サンプルとして作った経験上の話ですが、
まず、Google側で用意されているGeocodingAPIからRESTにて 住所⇔緯度経度(geocoding) を取得することができま
す。

http://maps.google.com/maps/geo?q= (引数等はお調べください)

住所入力 → 検索ボタン等 → (PHPやASP.NET等にて)APIに住所をPOST → ジオコーディングされたXMLをGET → DBへ緯
度経度の保存 → マップ上に表示

という流れでDBに 住所 - 緯度 - 経度 を保存することが可能です。


> それは、管理画面から入力したものを何百件も積み重ねていって、時間軸などで表示件数を変えたり
> したいためです。
> と、自分で書いていて、すでにGoogleMapのAPIの範疇を超えた質問になってしまっていると思っております。。。

GoogleMapsAPIの機能は地図情報をページに表示する事のみと考えたほうがよろしいかと思います。
クライアントサイド(javascript)ではなく、サーバサイドのスクリプトで処理できることは処理してしまうというのも一計です。

またGoogleのGeocodingAPIだけでは取得できない住所(正しい住所を指しているか疑問なデータ)があったりしますので、Yahoo!の
ジオコーディングAPIを重ねて使うなどの方法もあります。
(Yahoo!で取得できる緯度経度はGoogleと形式が違いますので変換しなければなりませんが・・・)


ここまで長々とご説明しましたが、shevaさんが考えておられるアプリは上記を元に作れると思います。
ですが、業務系アプリへの組み込みや閉鎖されたサイト等での GoogleMapsAPI 及び、Yahoo!デペロッパーにて公開されているAPI
群 の使用方法・規約の厳守には十分ご注意をお願いいたします。

Mitu-Koike

unread,
Jul 4, 2008, 2:26:56 AM7/4/08
to Google-Maps-API-Japan
ちょっと時間ができたので追加メモ&追加説明


-------------------------------------------------------------------------
サービス - Google Maps API - Google Code:
http://code.google.com/intl/ja/apis/maps/documentation/services.html
-------------------------------------------------------------------------
> HTTP 要求経由のジオコーディング

> サーバー側スクリプトを使用してマップ API ジオコーダに直接アクセスするには、URI に次のパラメータを指定して
http://maps.google.com/maps/geo? に要求を送信します。
> * q -- ジオコーディングする住所。
> * key -- API キー。
> * output -- 生成される出力の形式。 xml、kml、csv、または json を指定できます。

個人的にはマップやジオコーダ使うためだけに海外まで飛ばすのはなんだかな~と思っているので http://maps.google.com/~
を http://maps.google.co.jp/~ にして取得しています。
詳細についてはGoogleMapsAPIのドキュメントを参照してください。

Googleのジオコーディングでは、現存する住所でもデータがない場合は広域の緯度経度を返すことは確認されているかと思います。
例えば 「千葉県成田市○○町3丁目42番地」 をジオコーディングして緯度経度データが存在しなかった(一致しなかった?)場合、 「千葉県成田市
○○町3丁目」 の緯度経度を返すということがあります。

「ゼンリンとアルプスでは持っているジオコーディングデータは違うだろう」という前提で、両方のジオコーダーから取得したデータをユーザーに(同一
MAP上で)選ばせるというのもいいかもしれません。「両データの緯度経度差が○○以内だったら同一のポイントを指している」という判定をするのもいい
でしょう。
『何らかのアクシデントによってどちらかのジオコーダーが止まってしまった場合』もこれで対処できるのではないでしょうか?

ちなみにYahoo!ローカルサーチAPIの緯度経度は日本則地系、Googleジオコーディングサービスの緯度経度が世界測地系ですので下記の変換が
必要。。。
と、思いだしてYahoo!デペロッパーネットワークで確認したところ、Yahoo!側でも世界測地系の緯度経度を返してくれるようになっているそうで
す。
ご参考までに以下のサイトをご一読ください。

-------------------------------------------------------------------------
Yahoo!デベロッパーネットワーク - Yahoo!地図 - ローカルサーチAPI
http://developer.yahoo.co.jp/map/localsearch/V1/localsearch.html
-------------------------------------------------------------------------
-------------------------------------------------------------------------
Gpso.info 開発ブログ経度・緯度の表し方と変換
http://blog.gpso.info/2006/08/post_2.html
-------------------------------------------------------------------------


また、GoogleジオコーディングサービスとYahoo!ローカルサーチAPIの速度比較をされている方がおられましたのでリンク。
-------------------------------------------------------------------------
GoogleジオコーディングAPIとYahooローカルサーチAPIの比較 - Google-Maps-API-Japan
http://groups.google.com/group/googlemapsapi-japan/browse_thread/thread/ec9e35741acab9aa/d7306bed34743cb8?#d7306bed34743cb8
-------------------------------------------------------------------------


長々とメモしてしまいましたが、他にこんな方法もあるよ!こんなのだめだ!とかご意見いただけるとうれしいです。

sheva

unread,
Jul 4, 2008, 9:29:17 AM7/4/08
to Google-Maps-API-Japan
Mitu-Koikeさん

ご返信いただき誠にありがとうございます。

>住所入力 → 検索ボタン等 → (PHPやASP.NET等にて)APIに住所をPOST → ジオコーディングされたXMLをGET → DBへ緯
>度経度の保存 → マップ上に表示

流れにつきまして、ご教授ありがとうございます。
基本的にPHPを使っているのですが、おおまかな流れをイメージすることができました。
ただ、如何せんまだプログラミング自体を始めて数ヶ月なもので、ご指摘いただいた

>APIに住所をPOST → ジオコーディングされたXMLをGET
の部分で詰まっております。これ自体は私の力不足による部分であり、ここで質問させていただくのも場違いかと思いますため、
四苦八苦しながらやってみたいと思います。

YahooのAPIも調べてみたいと思います。他にも色々な方法がありそうなのですね。
引き続きご報告させていただければと思います。

Mitu-Koike

unread,
Jul 7, 2008, 8:23:47 PM7/7/08
to Google-Maps-API-Japan
> shevaさん

>基本的にPHPを使っているのですが、おおまかな流れをイメージすることができました。

ASP.NET寄りの人間ですので、PHPは未経験でしたのでちょっと調べてみました。


>> APIに住所をPOST → ジオコーディングされたXMLをGET
> の部分で詰まっております。これ自体は私の力不足による部分であり、ここで質問させていただくのも場違いかと思いますため、
> 四苦八苦しながらやってみたいと思います。


表現の仕方が悪いのかもしれないので、詳しくは以下の PHP用語集 GETメソッド をご覧ください。

http://www.phppro.jp/word/GET

GETメソッドにて「APIに住所を送信し、ジオコーディングされたXMLを取得」と言い直したほうがいいかもしれません。
失礼しました。

また、 引数q= の住所文字列はURLエンコード(文字コード:UTF-8)を必ず行ってください。


東京都江戸川区江戸川○-8-×

%e6%9d%b1%e4%ba%ac%e9%83%bd%e6%b1%9f%e6%88%b8%e5%b7%9d%e5%8c%ba
%e6%b1%9f%e6%88%b8%e5%b7%9d%e2%97%8b%2d8%2d%c3%97

YON

unread,
Jul 9, 2008, 9:21:15 PM7/9/08
to Google-Maps-API-Japan
>>検索ボタン等 → (PHPやASP.NET等にて)APIに住所をPOST → ジオコーディングされたXMLをGET
についてですが、PHPでGoogleからXMLを受取るだけなら簡単です。
セキュリティ上の考慮は抜けていますが、下の用にすれば出来ます。
フォームから ’addr' という名前で住所がサブミットされたとして、
phpでは、
if (!empty($_POST["addr"])){
$addr=$_POST["addr"];
}else{
$value="";
print "住所を入力して下さい";
 exit;
}
mb_convert_variables("UTF-8","auto",$addr);
$apikey = "ご使用のGoogle APIキー";
$GeoUrl = "http://maps.google.com/maps/geo?";
$addr = urlencode($addr);
$request = "&q=" . $addr . "&key=" . $apikey . "&output=xml" ;
$xml = file_get_contents( $GeoUrl . $request);
とすれば、$xmlに取得したXMLが入ります。
※ただし、php.iniでallow_url_fopenが許可されてないならfile_get_contents関数
で直接読め込めません。その場合はPEARのHTTP/Requestを使えば簡単です。
取得したXMLから、検索結果情報をを取り出すのは、phpでやっても、javascript側
でも出来ます。DBへ格納するならphpですね。
DBは詳しく知らないのですが、xmlをそのまんま格納出来るのですか?

sheva

unread,
Jul 10, 2008, 9:41:17 AM7/10/08
to Google-Maps-API-Japan
Mitu-Koikeさん
YONさん

ご返信いただきありがとうございます。

現在、お二人がご指摘くださったやり方を一から噛み砕いている最中でございます。
PHPもJSも初心者なもので、少し時間がかかっておりますが、どうしても実現したいのでやり遂げたいと思います。

>YONさん
>$xml = file_get_contents( $GeoUrl . $request);
>とすれば、$xmlに取得したXMLが入ります。
の部分が、特に理解できませんでした。file_get_contentsはphpの関数だと思いますが、
( $GeoUrl . $request);となっているのは、上で定義している$GeoUrlと$requestの部分を
xmlで取得する、と言う意味でしょうか?

コピペさせていただき使わせていただいたのですが、他の部分がおかしいためか、うまく動作しませんでした。
もし可能でしたら、ソースコードの全体を見せていただけると大変助かります。

YON

unread,
Jul 10, 2008, 10:18:56 PM7/10/08
to Google-Maps-API-Japan
>file_get_contentsはphpの関数だと思いますが、 ( $GeoUrl . $request);となって
>いるのは、上で定義している$GeoUrlと$requestの部分を xmlで取得する、と言う
>意味でしょうか?

file_get_contents(ファイル名)関数は、ファイル名のファイルの内容を全て文字列に読み込む関数ですが、ファイル名にURLを指定す
れば、HTTPを通してURL上のファイルも読み込めます。
file_get_contents( $GeoUrl . $request); は変数$GeoUrlの中身と変数$requestの
中身を . で連結して、URLを作り、HTTP経由のリクエストの結果を変数$xmlに代入しているだけです。

>ソースコードの全体を見せていただけると大変助かります。

shevaさんの住所を入力する管理画面は、XMLを取得するPHPプログラムと別のページだと、勝手に勘違いしていました。で、以下のソースコード
は、お助けにはならないと思いますが、一応載せます(PHP4です。)

(POSTされた住所を受取り緯度・経度を返すPHPプログラム)
<?php
//XMLを取得するだけなら下記2行は不要です。
set_include_path(get_include_path() . PATH_SEPARATOR . '../local-
pear');
require_once("XML/Unserializer.php");
//スーパーグローバル変数$_POSTより、住所を取り出します
if (!empty($_POST["addr"])){
$addr=$_POST["addr"];
}else{
print "住所を入力して下さい";
  exit;
}
//住所をUTF-8に変換します。
mb_convert_variables("UTF-8","auto",$addr);
$func = "googleGeoCoding";
list ($sarched_addrG,$latG,$lngG) = $func($addr);
print " 住所: $sarched_addrG <br>" ;
print " 緯度: $latG <br>";
print " 経度: $lngG <br>";
//ここからがジオコーディングしているファンクションです。
function googleGeoCoding($addr){
$apikey = "ご使用のGoogle APIキー";
$GeoUrl = "http://maps.google.com/maps/geo?";
//住所をURLエンコード(%xx%xx%...)します。
$addr = urlencode($addr);
//リクエストのパラメーターを連結します。
$request = "&q=" . $addr . "&key=" . $apikey . "&output=xml" ;
//GoogleのURLとリクエストパラメーターを連結したものを、ファイル名
//としてfile_get_contents関数に渡し、読み込んだ結果を$xmlに代入
//しています。
$xml = file_get_contents( $GeoUrl . $request);

//以下は、XMLをパースして検索結果の住所・緯度・経度を
//取り出している部分ですので、取得したXMLをそのまま返す
//なら不用です。
$options = array('encoding' => 'UTF-8');
$unserializer =& new XML_Unserializer($options);
$unserializer->setOption('parseAttributes', TRUE);
$status = $unserializer->unserialize($xml);
if (PEAR::isError($status)) {
die($status->getMessage());
}
$data = $unserializer->getUnserializedData();
if ($data[Response][Status][code] == 200 &&
$data[Response][Placemark][AddressDetails][Country]
[CountryNameCode] == "JP"){
$sarched_addr = $data[Response][Placemark][AddressDetails][Country]
[AddressLine];
list($sarched_Lon,$sarched_Lat,$altitude) =
explode(",",$data[Response][Placemark][Point][coordinates]);
//検索結果の住所をEUC-JPに戻しているだけです。
$sarched_addr = mb_convert_encoding($sarched_addr, "EUC-JP",
"auto");
}else{
$sarched_addr = '不明';
$sarched_Lat = '';
$sarched_Lon = '';
}
return array($sarched_addr,$sarched_Lat,$sarched_Lon);
}
?>

上記PHPプログラムに住所をPOSTするHTMLのフォーム
<form name="subform" id="subform" action="受取るPHPプログラムの名前"
method="post" >
<input type="text" name="addr" id="addr" size="40" />
<input type="submit" name="submitbotton" id="submitbotton" value="実行" /
>
<input type="reset" name="reset" value="クリア" />
</form>

sheva

unread,
Jul 12, 2008, 10:18:32 AM7/12/08
to Google-Maps-API-Japan
YONさん

ソースコード公開いただき、誠にありがとうございます。
現在、皆さまにお教えいただいたものを検証しつつ試行錯誤しております。
また報告させていただこうと思います。

ひとまず、ご報告までで失礼します。

sheva

unread,
Jul 15, 2008, 4:38:42 AM7/15/08
to Google-Maps-API-Japan
お世話になります。質問させていただきました者です。

>YONさん
いただいたコードを利用させていただき、色々と試させていただいたのですが、
Notice: Undefined variable: apikey
Notice: Undefined variable: GeoUrl
Warning: file_get_contents(&q=&key=&output=xml) [function.file-get-
contents]: failed to open stream: No such file or directory
Fatal error: Class 'XML_Unserializer' not found

などのエラーが取れず、私の力ではクリアすることが出来ませんでした。。
教えていただいたのに申し訳ありません。

当初の「管理画面>入力>DBに入れる>HTMLでDB(のXML?)を読み込んで地図に反映」がやりたいことなのは変わらないのですが、
いかんせん先に進めませんため、別のツールなりで住所をlat、lngに変換し、それをコピペしてDBに入力する、というやり方をするしか
ないのかなという気がしています。

または、たとえば「東京都新宿区西新宿1-1-1」などをxml内に記載し、それを直接読み込むことで地図に反映させる方法などが
あるのでしょうか?

素人すぎてすみません。。 ちょっと暗礁に乗り上げてしまったようです・・・

Mitu-Koike

unread,
Jul 15, 2008, 7:43:40 AM7/15/08
to Google-Maps-API-Japan
>shevaさん

>別のツールなりで住所をlat、lngに変換し、それをコピペしてDBに入力する、というやり方をするしか
>ないのかなという気がしています。
>または、たとえば「東京都新宿区西新宿1-1-1」などをxml内に記載し、それを直接読み込むことで地図に反映させる方法などが
>あるのでしょうか?

はっきりと言わせていただければ、このようなツールは探せばいくらでもあります。
ただし『便利なツールは買うしかない』と思ってください。
いくら高価でも。
あなたが作ろうとしているプログラムが社内業務で使うようなものなのであれば、予算を申請して必要なツールを買うことができるのではないでしょうか?

-------------------------------------------------------------------------
住所正規化コンバータ
http://www.addressmatch.jp/
-------------------------------------------------------------------------


私はPHPという言語が全然わかりませんが、せっかくPHPを教えていただけるYONさんがいらっしゃいますので、ひとつひとつ課題をクリアしていくの
をおすすめします。

-------------------------------------------------------------------------
日本テレビの住所:東京都港区東新橋一丁目6-1
http://maps.google.com/maps/geo?q=%e6%9d%b1%e4%ba%ac%e9%83%bd%e6%b8%af%e5%8c%ba%e6%9d%b1%e6%96%b0%e6%a9%8b%e4%b8%80%e4%b8%81%e7%9b%ae6%2d1%0d%0a&key=ABQIAAAAnfs7bKE82qgb3Zc2YyS-oBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxSySz_REpPq-4WZA27OwgbtyR3VcA&output=xml
-------------------------------------------------------------------------

上記のURLを開いて、GoogleジオコーディングAPIから返ってくるデータを確認してください。


http://~~~~/maps/geo?q=≪住所をURLエンコードした文字列≫&key=≪GoogleMapsを使うためのKey≫&output=≪出力する形式≫

見ていただければ分かるように、上記のようなURLを作り、送信することができれば必ず住所を緯度経度に変換したデータを返してくれます。


① 入力された住所をPHPでURLエンコードする

② PHPでGoogleジオコーディングAPIを開くためのURLをつくる
     ↑ ここで作ってみたURLに飛んでみてください。
     ↑ データがちゃんと表示されて帰ってくれば成功です。


まずはここまで頑張ってみたらいかがでしょうか?
先は長いですが何事も一気に階段を飛び越えることはできません。

sheva

unread,
Jul 18, 2008, 9:56:00 AM7/18/08
to Google-Maps-API-Japan
>Mitu-Koikeさん
アドバイスいただき、ありがとうございます。
今作ろうとしているのは個人的なものですので、有料のものの導入はそのうち検討してみたいと思います。

また、流れにつきまして再度ご教授いただきありがとうございます。
基本ができていないことを痛感しましたため、仰るとおり少しずつ実現していきたいと思います。

またご報告させていただきます。ありがとうございました。

Reply all
Reply to author
Forward
0 new messages