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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

解決済

2回答

6873閲覧

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

chapp

総合スコア233

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

0クリップ

投稿2018/09/17 14:29

編集2018/09/18 03:17

お世話になります。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の設定状況です。
イメージ説明

イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/09/17 14:32

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

2018/09/18 02:54

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

回答2

0

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

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

投稿2018/09/17 14:34

kei344

総合スコア69398

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tonkun4os

2018/09/17 14:42

これ「$pattern = "/+/";」まずくないですか?
kei344

2018/09/17 14:55

To: tonkun4osさん すみません、どういうことかがわかりませんでした。 「POSTするページ上の JavaScript で事前に確認処理してからPOSTするようにすればどうでしょう」という意図なので、現在のPHPコードは読んでいません。
tonkun4os

2018/09/17 15:43

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

2018/09/17 16:46

kei344さん 早々のお返事をありがとうございます。 javascriptのこと全くの素人同然なのですが、もう少し具体的にお話し頂くことは可能でしょうか? この度の目的は、住所から緯度、経度を取得し、PHPの変数に渡したい(POSTした後にPHPの変数に入れたい)のですが、もう少し具体的にご教示頂くことは可能でしょうか? 質問投稿後もいくつも試していますが、いずれも状況は変わらずな状態です。 引き続き、対応いただけたら幸いです。 よろしくお願いいたします。
chapp

2018/09/17 16:47

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

0

ベストアンサー

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

php

1 2$google_leapis_url = "https://maps.googleapis.com/maps/api/geocode/json"; 3 4$pattern = "/[+]/"; 5$address = preg_replace($pattern, "%20", $address); 6// エンコードして半角空白をgeometry用に変換する 7$url_encode = /*urlencode(*/$address/*)*/; 8 9$googleMapsApiData = json_decode(file_get_contents($google_leapis_url."?address=".$url_encode."&key=".$googlemap_api, false, stream_context_create(array( 10 'http' => array( 11 'timeout'=>10 // タイムアウト 12 ) 13))), true); 14 15var_dump($googleMapsApiData);

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

投稿2018/09/18 01:27

編集2018/09/18 01:28
tonkun4os

総合スコア321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chapp

2018/09/18 02:18

tonkun4osさん ご親切にもソースのご提示をありがとうございます! ただ、既存のソースと見比べ、動作確認をとそのまま拝借し実行してみると、以下のようなエラーとなっています。 array (size=3) 'error_message' => string 'API keys with referer restrictions cannot be used with this API.' (length=64) 'results' => array (size=0) empty 'status' => string 'REQUEST_DENIED' (length=14) 改め、APIの有効状態は Geocoding API Directions API Maps Embed API Maps JavaScript API Maps Static API Places API です。 引き続き、ご指導いただければ幸いです。 よろしくお願いいたしたします!
tonkun4os

2018/09/18 02:21

ソースの文字コードはUTF-8ですか? UTF-8の必要が有ります。
chapp

2018/09/18 02:33

早々のお返事ありがとうございます。 文字コードはUTF-8となっています。 APIの有効状態もそれぞれ一日の上限設定が出来るので、再度余裕を持った値にしているのですが・・・
chapp

2018/09/18 03:19

tonkun4osさん 色々とお手数おかけしているようで申し訳ありません。 ご紹介いただいた内容も拝見しましたが、こちらも有効状態として設定されているかと思います。 念のため、質問欄に「追記」としてコントロールパネルの状態を画像でアップしました。
tonkun4os

2018/09/18 03:24

うむー、こちらで再現されないのでごめんなさいです。
chapp

2018/09/18 04:33

この手のやり取りは難しいですよね・・ また何かお気づきの点などありましたら、書き込んで頂けると幸いです。 ご親切な対応ありがとうございました。
chapp

2018/09/18 07:19

tonkun4osさん お世話になっております。 お手数お掛けし申し訳ないのですが、お手元のAPIキーのリファラー設定はどうなっていますか? 外部からのアクセスを防ぐためとして推奨されている、URLを登録する設定です。 当方、サブドメインでテストをしているため、 http://*.example.com/* https://*.example.com/* と設定しているのですが、試しにとこの設定を外したら、先にアドバイス頂いたスクリプトが正常に機能したのです。 他のマップはリファラー制限をかけていても問題なかったので、「まさかリファラー制限?」と思いながら解除でしたが、状況をまとめると、緯度・経度を求めるスクリプトがあるファイルの場合、リファラー制限がかかっていると(該当するURL内でも)エラーとなる。といった具合です。 恐れ入りますが、お手元の設定確認して頂いても宜しいでしょうか? よろしくお願いいたします。
tonkun4os

2018/09/18 07:22

確認していた時は未設定です(動作確認が目的だったので・・・)今はサービス自体を無効にしてます。
退会済みユーザー

退会済みユーザー

2018/09/18 07:34

chapp pleaseholder をみるに http/https 不要
chapp

2018/09/18 12:49

tonkun4osさん 了解しました。 確認して欲しかったのですが、あまりお手数おかけするのは申し訳ないですよね。 ありがとうございました。これまでだけでも十分感謝しています。
chapp

2018/09/18 12:52

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

2018/09/18 16:18

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問