メシのタネ

Webプログラミング 備忘録

  • DOMをPHPで操作できたらいいよね

    そうだよね。そう思うよね。JavaScriptでやると、画面がガタついたりするもんね。そうならないようにする方法もあるかもしれないけど、僕はできませんので、サーバー側でなんとかできたらええなぁと思って挑戦したけど、できませんでしたよ。PHP標準でHTMLをDOMにできるらしい今、技[...]

    続きを読む
  • 設計書ってなんで書くの?

    設計書をなぜ書くのかから始めてかれこれ3年近くこの禅問答をやっているわけですが、いまだに答えは出ません。ただ、その禅問答をやる中で設計書に対する取り組み方は大きく変わったので、その一部でも書いていきたい。基本設計はとにもかくにも必要だと思う設計書はいらぬ!という話をよく聞くし、自分[...]

    続きを読む
  • 書ききってやる。

    久々に書いてみる。久々に文章を書くということをやってみようと思う。伝える作業を観察したいと思ったからそうしたいと考えた。情緒的な文章は基本的にゴミ箱にぽいしてきましたが、情緒的なのも自分だと思う。「文章をかくという作業は、とりもなおさず自分と自分をとりまく事物との距離を確認すること[...]

    続きを読む
  • 普通の会社で2年普通に働いて思う事

    えらい寒くなりました。文句言いながらも現職を続けて2017年12月1日にめでたく2年がたちました。分かりやすいが乱暴に言えばITドカタと呼ばれる業界に入って案件のヒエラルキーの無慈悲さを痛感しながらも、それでもしょうがないと頑張る人たちに心を打たれながら「じゃあ俺も」と頑張れない自分に挫折して、とあ[...]

    続きを読む
  • jQueryUiのDatepicker利用時にminDate設定するとバグる件

    題名の通りなんですが、DatepickerでminDate使うとバグります。また後でキャプチャ見て貰いますけど、灰色の部分が、minDateで設定した日付が反復して出るようになるんですね。こういうの気が付かない人がいるかも知れませんが、ChoromeでminDate設定してる人は気にしてみてくだ[...]

    続きを読む

現在地の緯度、経度から住所を絞り出してtxtファイルに保存してみた

newwebweb
最近ちょっとアレな感じでブログが滞ってます。最近ネタ切れ気味でありましたけど、これだけ頻繁に書いていると書いてみたくなるもんで、プログラム書きながらどうやってブログ書こうかなとか考えてました。忙しかったのは、プログラム書く事でもデザインでもなく、4800行のデータ入力と、それの確認が一番忙しかったです。もうデータ入力嫌です。嫌だからもう酒飲んで書いてます。本日3杯目です。というわけで、今日はこないだのジオロケーションの続きで、逆ジオコーディングというやつをやります。逆ジオコーディングっていうのは、グーグルさんによれば、地図上の地点を人が判読できる住所に変換するプロセスということらしいです。リバースコーディングとか言ったりしますが、英語にしただけです。

緯度、経度を検索する

これはgeolocationAPIというのを使ってやります。が、これはちょっと前に書いた記事にやり方が全部載ってるので省略します。

グーグルからAPIを取得する

緯度経度から住所を取得したい場合、グーグルのAPIを使います。これをXMLHttpRequestを使ってやると、クロスドメインのoriginがつくエラーが出るので、scriptタグを使ってAPIを使います。こんな感じでやります。

<br />
&lt;script type=&quot;text/javascript&quot; src=&quot;http://maps.google.com/maps/api/js?sensor=false&quot;&gt;&lt;/script&gt;<br />

こんな感じで良いんじゃないでしょうか。こうすることによって、逆ジオコーディングに必要なオブジェクトを呼ぶ事が出来ます。
流れとしては「緯度、経度を取得する」→「住所を取得する」→「phpに投げてtxtに保存する」って感じでやって行きたいと思います。

緯度、経度から住所を取得する

緯度、経度を取得して、googlemapのAPIが呼べた所で、コーディングをして行きます。この時点でコードはこんな感じになっています。

<br />
navigator.geolocation.getCurrentPosition(okCallback, erCallback);</p>
<p>//成功時に実行される<br />
function okCallback(pos) {</p>
<p>//posに経度と緯度が入ってくる</p>
<p>    lat = pos.coords.latitude<br />
    lng = pos.coords.longitude</p>
<p>    function reverseGeo(lat,lng) {<br />
        var geoObj;<br />
            geoObj = new google.maps.Geocoder()<br />
        var latlng = new google.maps.LatLng(lat,lng)</p>
<p>        if (geoObj) {</p>
<p>            geoObj.geocode({'latLng': latlng}, function(results, status) {<br />
                if(status == &quot;OK&quot;) {<br />
                    alert(results[0].formatted_address)<br />
                } else {<br />
                    alert(status)<br />
                }<br />
            });</p>
<p>        }<br />
    }</p>
<p>    reverseGeo(lat,lng)</p>
<p>}<br />

geocodeオブジェクトを使うと、googleのapiから回答を受け取るコールバック関数を扱う事ができます。コールバック関数っていうのは、呼び出した関数が実行する関数です。LatLngメソッドは、緯度経度をAPIが理解できる形に整形してくれるもんだと思ってます。このメソッドを使うと、緯度を度で、経度を度で返します。三つ目の引数にtrueを入れると、範囲外の値を修正しませんが、多分あんまし三つ目の引数は気にしなくて良いんだと思います。この引数のresultsから.formatted_addressプロパティを参照すれば住所を取得することができます。

メソッド等の詳しい説明
Google Maps API V3
ジオコーディング サービス

phpにpostする

HTTPとはWebサーバーがユーザーからのリクエストや送信に応答する方法を規定したものです。普通HTTP通信が行われるのはユーザがリクエストを要求した時です。リンクをクリックしたり、フォームを送信したり、URLを入力したりそういう時ですが、これらをjavascriptが制御する事ができます。なのでjavascriptからphpにデータを渡す事も可能です。こんな感じでやります。

</p>
<p>                    var xhr = new XMLHttpRequest()<br />
                    xhr.open(&quot;POST&quot;,&quot;test.php&quot;,true)<br />
                    xhr.setRequestHeader(&quot;Content-Type&quot; , 'application/x-www-form-urlencoded') //これつけないとエラーになる<br />
                    xhr.send('data='+resAddress)<br />
                    xhr.onreadystatechange = function () {<br />
                       if(xhr.readyState == 4 &amp;&amp; xhr.status == 200) { //これやらないと.responseTextが三回帰ってくる<br />
                            var resTxt = xhr.responseText<br />
                            console.log(resTxt)<br />
                            alert(resTxt)<br />
                       }<br />
                    }</p>
<p>

XMLHttpRequestは今は全てのブラウザでサポートされています。このオブジェクトには、HTTPを制御するAPIが定義されています。ちなみにこのXMLHttpRequestのXMLっていうのは当時流行だったからつけたらしいです。openメソッドはリクエストを初期化するメソッドで引数は5つつける事が出来ます。1つめがメソッド、2つ目がurl、3つめが、非同期かどうかで4つ目と5つ目は認証がある場合userとpasswordを指定します。詳しくは、MDNみてください。sendでデータを送りますが、データの形式はdata=値みたいにしないと駄目みたいです。二つ以上渡したい場合はhoge=value&hoge2=valueみたいにすれば良いと思われます。ちなみにこうして送信されるデータはmimeタイプを持つので、 xhr.setRequestHeader(“Content-Type” , ‘application/x-www-form-urlencoded’)これが必要になります。

サーバーにデータを保存する

こっからはphpのコードを書きます。

</p>
<p>&lt;?php</p>
<p>$processMessage = array('ok' =&gt; '書き込めました','ng' =&gt; '書き込めませんでした。');<br />
$getPost = htmlspecialchars($_POST['data']);<br />
list($pref,$city) = explode(',',$getPost);</p>
<p>if(gettype($pref) == 'string' &amp;&amp; gettype($city) == 'string') :</p>
<p>	$address = explode(' ',ltrim($city));</p>
<p>	foreach($address as $val) :<br />
		if(preg_match('/^〒\d{3}-\d{4}$/', $val, $match)) :<br />
			$zipCode = array_shift($address);<br />
		else :<br />
			echo $val.&quot;\n&quot;;<br />
		endif;<br />
	endforeach;</p>
<p>	if(file_put_contents('test.txt', implode(',',$address).&quot;\n&quot;, FILE_APPEND | LOCK_EX)) :<br />
		echo $processMessage['ok'];<br />
	else :<br />
		echo $processMessage['ng'];<br />
	endif;</p>
<p>else :</p>
<p>	echo $processMessage['ng'];</p>
<p>endif;</p>
<p>

APIから取得してくるデータが日本,住所みたいな感じなのでまず,を基準に配列にして、変数にぶちこんでます。変数に入れた値の型をシャレ程度にstringかどうか聴いて、取得するデータが郵便番号 住所1 住所2 住所3 みたいになってるので今度は半角スペースを基準に配列化します。で、今回郵便番号はテキストに保存したくないので、こいつを取っ払う為にpreg_matchで一致した奴はzipって変数に退避させています。そして、file_put_contentsでデータを書き込みする訳ですが、FILE_APPENDで追記するようにできて、LOCK_EXする事で同時に書き込む事を不可能にできるので、こういう風にしてます。implodeで配列を再結合して、これを一行として入力しています。文章で書くと全然意味不明ですが、とりあえず、こうやってやるとサーバーにXMLHttpRequestから渡されたデータを保存できます。

ちなみに!その他の人の書き込み権限をオッケーにしておかないと書き込みが出来ないので、パーミッションの変更をchownなりファイル転送ソフトなりで変更してください!どうでもいいですけど、XMLHttpRequestって名前長いですよねー。

関連記事

  1. PHPサムネイル

コメントをお待ちしております