質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

POSTで渡された住所から緯度・経度に変換するにはどうしたら良いのでしょうか?

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,633

chapp

score 219

お世話になります。GoogleMapのAPIを利用しPOSTで渡された住所や郵便番号、Googleで認識可能な施設名から、緯度・経度を取得したいと考えています。

取得できたか否かにより処理が異なるので、プログラムの初期段階で取得し、そして変数に入れたいと考えています。

POSTで渡された住所から緯度・経度に変換するにはどうしたら良いのでしょうか?

以下は有料となる前まで問題なかったスクリプト

//*** 検索の中心となる緯度・経度を取得 ***

/*
有料に移行したことに伴い、APIキーを入れるとエラーとならないが、
チェックツールがAPIに問題あり(赤いマーク)を表示(下のコメントアウトした行です)
問題ありの原因を確認すると「キャッシュを削除し再度アクセス」とのメッセージがあり、
それを試みるも状況は全く変わらず。
*/
//$json = file_get_contents("https://maps.googleapis.com/maps/api/geocode/json?address=". $landmark."&key=".$googlemap_api."&v=quarterly&sensor=false", false,
//対して以下のキーを含まない場合は、チェックツールは有効であるものの、$jsonの部分で403エラーが表示。
$json = file_get_contents("https://maps.googleapis.com/maps/api/geocode/json?address=". $landmark."&sensor=false", false,

    stream_context_create(array(
        'http' => array(
        'timeout'=>10 // タイムアウト
        )
    ))
);


unset($effective);
// HTTPリクエストがエラー
if($json === FALSE){
    if(count($http_response_header) > 0){
        $stat_tokens = explode(' ', $http_response_header[0]);

        $error =  $stat_tokens[1] . PHP_EOL;
    }else{
        // タイムアウトの場合
        $error = "タイムアウト" . PHP_EOL;
    }
}else{

    $obj = json_decode($json, true);

    // 上限一杯の場合
    if($obj['status'] == 'OVER_QUERY_LIMIT'){

        $error =  "Google Map APIへのリクエストが上限に達しました。" . PHP_EOL;

    }elseif($obj['status'] == 'INVALID_REQUEST'){

        $error = "Google Map APIで緯度・経度を取得できませんでした。" . PHP_EOL;

    }else{
        // 住所情報が取れた場合
        if(isset($obj['results'][0])){
            $lat = $obj['results'][0]['geometry']['location']['lat'];
            $lng = $obj['results'][0]['geometry']['location']['lng'];

            $effective = "ok";

        }else{

            $error = "Google Map APIで住所から緯度経度を変換できませんでした。" . PHP_EOL;
        }
    }
}

これにより、昨日から「住所から緯度・経度を取得」すべく色々と調べていますが、全て上手く行かない状態です。以下は現在のスクリプト。

<?php
$address = "住所や施設名など";
$googlemap_api = "**********";

$apiurl = "https://maps.googleapis.com/maps/api/geocode/json?address=".$address."&key=".$googlemap_api;

$google_leapis_url = "https://maps.googleapis.com/maps/api/geocode/json";

// エンコードして半角空白をgeometry用に変換する
$url_encode = urlencode($address);

$pattern    = "/+/";
$url_encode = preg_replace($pattern, "%20", $url_encode); 
$googleMapsApiData = json_decode(file_get_contents($google_leapis_url."?address=".$url_encode."&key=".$googlemap_api, false, $contect), true);

// 緯度経度を取得
$lat    = $googleMapsApiData["results"][0]["geometry"]["location"]["lat"];
$lng    = $googleMapsApiData["results"][0]["geometry"]["location"]["lng"];
$status = $googleMapsApiData["status"];

APIは取得済み(一昨日取得)で、有効なAPIは、以下の6種です。

Geocoding API
Maps JavaScript API
Directions API
Maps Embed API
Maps Static API
Places API

このような状況ですが、POSTで渡された住所から緯度・経度に変換するにはどうしたら良いのでしょうか?

お忙しいところ恐縮ですが、アドバイスのほど頂戴出来れば幸いです。
よろしくお願い申し上げます。

追記
APIエラーが生じているとのアドバイスをいただきましたが、その原因を調べる策はありますでしょうか?
この度の各種設定は、
http://www.webdesignleaves.com/pr/plugins/googlemap_01.html
こちらを参考に行い、それ以外の設定は行っていないと認識しています。
こちらも含めてアドバイス頂けると助かります。

追記2
支払いの設定も済ませております。「お支払い」メニューの概要には、クレジット残高と残り日数(来年の9月まで)が表示されている状態です。

イメージ説明

お手数おかけし恐縮ですが、他にも確認すべき事項ありましたらお教えください。

追記3
Geocoding APIの設定状況です。
イメージ説明

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/09/17 23:32

    APIのレスポンスがなんらかのエラーを返しているものと思われます。

    キャンセル

  • CHERRY

    2018/09/18 11:54

    最近取得された API キーの場合、課金情報を登録しないとAPIエラーになることがあるようなのですが、課金情報の登録は完了しているということでよろしいですか?

    キャンセル

回答 2

+1

取得できたか否かにより処理が異なるので

POSTで渡す前に Maps JavaScript API で確認してから処理すればよいのでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/18 00:43

    これ「$pattern = "/[+]/";」かなー

    キャンセル

  • 2018/09/18 01:46

    kei344さん

    早々のお返事をありがとうございます。
    javascriptのこと全くの素人同然なのですが、もう少し具体的にお話し頂くことは可能でしょうか?

    この度の目的は、住所から緯度、経度を取得し、PHPの変数に渡したい(POSTした後にPHPの変数に入れたい)のですが、もう少し具体的にご教示頂くことは可能でしょうか?

    質問投稿後もいくつも試していますが、いずれも状況は変わらずな状態です。
    引き続き、対応いただけたら幸いです。

    よろしくお願いいたします。

    キャンセル

  • 2018/09/18 01:47

    tonkun4osさん

    貴重なご指摘、ありがとうございます。

    キャンセル

checkベストアンサー

0

自分も使う予定が有ったので
やってみました!

$google_leapis_url = "https://maps.googleapis.com/maps/api/geocode/json";

$pattern    = "/[+]/";
$address = preg_replace($pattern, "%20", $address);
// エンコードして半角空白をgeometry用に変換する
$url_encode = /*urlencode(*/$address/*)*/;

$googleMapsApiData = json_decode(file_get_contents($google_leapis_url."?address=".$url_encode."&key=".$googlemap_api, false, stream_context_create(array(
    'http' => array(
        'timeout'=>10 // タイムアウト
    )
))), true);

var_dump($googleMapsApiData);


urlencodeは不要でした。
課金しないと1日5回しか実行できません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/18 21:49

    tonkun4osさん

    了解しました。
    確認して欲しかったのですが、あまりお手数おかけするのは申し訳ないですよね。

    ありがとうございました。これまでだけでも十分感謝しています。

    キャンセル

  • 2018/09/18 21:52

    asahina11979さん

    ご親切なアドバイスをありがとうございます。
    *.example.com/*
    とだけ設定すればOKなんですね。あるサイトに、httpとhttpsを両方設定するよう書かれていたので・・・こちらの方がシンプルで良いですね。

    キャンセル

  • 2018/09/19 01:18

    tonkun4osさん

    色々と試した結果、位置情報を取得するためのAPIであるジオコーディングはリファラーによる制限は掛けるとエラーとなるようです。
    まだまだ理解が不十分なところあるかと思いますが、今回の不具合が理解できたのと、その対策を考える切っ掛けを持つことが出来ました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る