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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1115閲覧

Google Maps API マーカーを検索できるようにしたい

chibiyuko_0124

総合スコア18

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2018/11/08 06:21

いつもお世話になっております。
Google Maps APIにて外部jsonファイルを読み込みマーカーを表示させております。
マーカーが日本各地に散らばっているため、検索フォームを設置し地名から座標を取得しそのエリアのマーカーが閲覧しやすいようにしております。

これを、検索値をJSONの住所とし、マーカーが立っている場所のみの座標を取得したく思っています。
trueならその座標へ、falseなら移動しない or 初期表示の座標へ

現在のソースをどのように変更すれば良いのかというところから困っており、検索をしても参考となるページにたどり着けません。

お力添えをいただけますと幸いです。

JavaScript

var place = '東京'; var infowindow = new google.maps.InfoWindow(); var markers; var map; //マップのスタイルシート ★2 var styles = 省略 /* ================================= 検索ボタンの挙動 ==================================*/ $(function () { $('#searchButton').click(function (e) { e.preventDefault(); place = $('#searchPlace').val(); google.maps.event.addDomListener(window, 'load', initialize()); }); }); /* ================================= マップ 基本設定 ==================================*/ function initialize(place, z) { var geocoder = new google.maps.Geocoder(); geocoder.geocode({ 'address': place }, function (result, status) { if (status == google.maps.GeocoderStatus.OK) { var latlng = result[0].geometry.location; var mapOption = { zoom: 12, zoomControl: true, mapTypeControl: false, center: latlng, streetViewControl: false, scrollwheel: false, mapTypeId: google.maps.MapTypeId.ROADMAP, styles: styles, }; map = new google.maps.Map(document.getElementById('map'), mapOption); $(function () { var data = new Array(); markers = []; $.getJSON("JSON.json", function (data) { $.each(data, function (i, obj) { var content = 'infowindowの内容'; myMarker = new google.maps.Marker({ position: new google.maps.LatLng(obj.map_latitude, obj.map_longitude), map: map, icon: { url: "icon.png", } }); attachMessage(myMarker, content); }); markerCluster = new MarkerClusterer(map, markers, { imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m', zoomOnClick: true, maxZoom: 15, gridSize: 20 }); }); }); } else { alert('取得できませんでした…'); } }); } google.maps.event.addDomListener(window, 'load', initialize(place)); function attachMessage(marker, content) { google.maps.event.addListener(marker, 'click', function () { new google.maps.Geocoder().geocode({ latLng: marker.getPosition() }, function (result, status) { if (status == google.maps.GeocoderStatus.OK) { infowindow.setContent(content); infowindow.open(marker.getMap(), marker); } }); }); markers.push(marker); }

HTML

<div class="searchbox"> <form method="search" action="./index.html"> <div class="formarea"> <input type="text" name="sp" id="searchPlace" placeholder="検索" > <input type="submit" name="regist" value="検索" id="searchButton"> </div> </form> </div> <div id="map"></div>

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

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

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

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

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

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

Lhankor_Mhy

2018/11/08 13:08

「trueならその座標へ」とありますが、何が true の時なのか読み取れませんでした。補足願います。
colling

2018/11/09 11:18

検索フォームと比較するのは、住所ですか?それとも店舗名とか他の情報も含めるのでしょうか?jsonデータのサンプルはありますか?
chibiyuko_0124

2018/11/12 04:35

jsonの提示をせず申し訳ありませんでした。colling様が回答いただいたサンプルのjsonとほとんど同じような内容のものですので、こちらで認識いただけますと幸いです。
guest

回答1

0

ベストアンサー

肝心のjsonファイルを提示されていないので、理解して実装できるように多少の解説含みで回答いたします。

検索値をJSONの住所とし、マーカーが立っている場所のみの座標を取得したく思っています。
trueならその座標へ、falseなら移動しない or 初期表示の座標へ

ということですが、もともと地名を入れたら、座標を返すgoogle.maps.Geocoder()を使っているので、住所からキーワード検索して、検索結果が(true)ならば住所を指定して再描画検索結果が(false)ならば何もしない。という実装になります。

まず、jsonから検索用の配列を作りますが、jsonファイルは下記のようなものと想定して話を進めます。

住所キー address 最寄駅キー station

json

1[ 2 { 3 "address": "東京都渋谷区道玄坂”, 4 "station": "渋谷駅”, 5 “shop_name”: “ショップA”, 6 "map_latitude": 35.6580339, 7 "map_longitude": 139.6994418 8 }, 9 { 10 "address": "〒150-0001 東京都渋谷区神宮前 1 丁目 18", 11 "station": "原宿駅", 12 "shop_name": “ショップB”, 13 "map_latitude": 35.6702285, 14 "map_longitude": 139.7005036 15 }, 16 { 17 "address": "〒160-0023 東京都新宿区西新宿1丁目10-2", 18 "station": "新宿駅", 19 "shop_name": “ショップC”, 20 "map_latitude": 35.6895924, 21 "map_longitude": 139.6982191 22 } 23]

住所だけの検索だと最寄駅名とか他のキーワードを後から入れたくなるのが想定されますので、
作る配列は検索用のwordsというキーと、結果(マップのセンターにしたい場所)を返すreturnというキーの連想配列を作ります。

javascript

1var searchArray = []; 2$.getJSON("JSON.json", function (data) { 3 $.each(data, function (i, obj) { 4 searchArray.push( 5 { 6 'return':data[i].address,//最寄駅を地図の真ん中にしたい場合はここを data[i].station にします 7 'words':data[i].address + data[i].station //他に検索に入れたいキーがある場合はここに付け足し ex.店名とか店の種類とか 8 } 9 ); 10 }); 11});

配列はこのような中身になるかと思います。

0: {return: "東京都渋谷区道玄坂", words: "東京都渋谷区道玄坂渋谷駅"} 1: {return: "〒150-0001 東京都渋谷区神宮前 1 丁目 18", words: "〒150-0001 東京都渋谷区神宮前 1 丁目 18原宿駅"} 2: {return: "〒160-0023 東京都新宿区西新宿1丁目10−2", words: "〒160-0023 東京都新宿区西新宿1丁目10−2新宿駅"}

そして、words に検索キーがあれば、return の中身を返す関数を作ります。

javascript

1function arrayDataSearch(place){ 2 var retArray = new Array();//return用検索結果の配列 3 retArray = searchArray.filter(function(item, index){ 4 if ((item.words).indexOf(place) >= 0) return true;//wordsの中から検索 5 }); 6 if(retArray.length == 0){ 7 return false; 8 }else{ 9 console.log(retArray.length + '件 見つかりました');//ログへ出力 10 return retArray[0].return;//結果の配列の1番目の return の内容のみを返しています。 11 } 12}

検索フォームでボタンを押すたびに先ほど作った関数を通るように改造します。
結果が返ってくれば、マップを再描画、結果がなければ何もしません。

javascript

1$(function () { 2 $('#searchButton').click(function (e) { 3 e.preventDefault(); 4 place = $('#searchPlace').val(); 5 if(place!=''){//検索キーが空以外のとき 6 if(arrayDataSearch(place)){//placeをarrayDataSerach関数でチェックする 7 var newPlace = arrayDataSearch(place);//結果があればnewplaceに代入 8 console.log(newPlace); 9 initialize(newPlace,15);//newplaceの場所でmapを再描画 拡大 15 10 }else{//--検索結果がない場合何もしない(地図の移動はしない) 11 console.log(place + 'には何もありません');//ログ出力 12 } 13 }//検索キーが空なら何もしない(地図の移動はしない) 14 }); 15});

全部つなげると、このような感じです。

javascript

1/* ================================= 2検索ボタンの挙動 3==================================*/ 4$(function () { 5 $('#searchButton').click(function (e) { 6 e.preventDefault(); 7 place = $('#searchPlace').val(); 8 if(place!=''){//検索キーが空なら何もしない 9 if(arrayDataSearch(place)){//placeをjasonの中から探す 10 var newPlace = arrayDataSearch(place);//newplaceに代入 11 console.log(newPlace); 12 initialize(newPlace,15);//newplaceの場所でmapを再描画 拡大 15 13 }else{//--検索結果がない場合 14 console.log(place + 'には何もありません');//ログ出力 15 } 16 } 17 }); 18}); 19 20//--- 検索用 function wordsの中から検索してreturnの内容を返します。 21function arrayDataSearch(place){ 22 var retArray = new Array();//return用検索結果の配列 23 retArray = searchArray.filter(function(item, index){ 24 if ((item.words).indexOf(place) >= 0) return true;//wordsの中から検索 25 }); 26 if(retArray.length == 0){ 27 return false; 28 }else{ 29 console.log(retArray.length + '件 見つかりました');//ログ出力 30 return retArray[0].return;//結果の配列の1番目の return の内容のみを返しています。 31 } 32} 33 34//---- 追加 新規にjasonから検索用の配列を作る 35var searchArray = []; 36$.getJSON("JSON.json", function (data) { 37 $.each(data, function (i, obj) { 38 searchArray.push( 39 { 40 'return':data[i].address,//最寄駅を地図の真ん中にしたい場合はdata[i].station にします 41 'words':data[i].address + data[i].station //他に検索に入れたいキーがある場合はここに付け足し 42 } 43 ); 44 }); 45});

——-
そして、本題とは関係ありませんが、ズームが効いていないようなので、、、。
var mapOption = {}の中のzoomの部分を修正してください。

var mapOption = { zoom: z||12,//縮尺 zの値 初期値 z=12 zoomControl: true, mapTypeControl: false, center: latlng, streetViewControl: false, scrollwheel: false, mapTypeId: google.maps.MapTypeId.ROADMAP styles: styles, };

追記

移動するだけの方がいいですね
最終的にこちらをコールしてください

javascript

1function moveMap(place,z){ 2 var geocoder = new google.maps.Geocoder(); 3 geocoder.geocode( 4 { 5 'address': place 6 }, 7 function(results, status){ 8 if(status==google.maps.GeocoderStatus.OK){ 9 //処理 10 map.setZoom(z); 11 map.setCenter(results[0].geometry.location); 12 } 13 } 14 ); 15}

検索フォーム部分

javascript

1$(function () { 2 $('#searchButton').click(function (e) { 3 e.preventDefault(); 4 place = $('#searchPlace').val(); 5 if(place!=''){//検索キーが空なら何もしない 6 if(arrayDataSearch(place)){//placeをjasonの中から探す 7 var newPlace = arrayDataSearch(place);//newplaceに代入 8 console.log(newPlace); 9 moveMap(newPlace,15);//newplaceの場所にmapを移動 拡大 15 10 }else{//--検索結果がない場合 11 console.log(place + 'には何もありません');//ログ出力 12 } 13 } 14 }); 15});

投稿2018/11/10 12:22

編集2018/11/11 09:31
colling

総合スコア798

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

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

chibiyuko_0124

2018/11/12 04:42

colling様 ご丁寧にありがとうございます。本当に助かります。 いただいたソースを元に実装できました! ただ、複数ワードを入れての検索だとヒットしないようです。(「イオン 千葉」のような入力) 上記のソースはこういった複数入力も対応されているのでしょうか。 searchArray.pushのwordsの中は、住所、郵便番号、駅名のキーを入れております。 よろしくお願いいたします。
colling

2018/11/12 06:48 編集

回答したコードでは、複数ワードはヒットしません。 もっと複雑な処理を入れなければなりません。 ワードをスペースで区切った配列にして、複数回検索をかけるという処理にしなければなりません。
chibiyuko_0124

2018/11/12 06:59 編集

colling様 承知しました。 複数ワードにしたいと考えておりますので、調べてみます! 解決しなければ再びこちらに新規投稿で現れるかもしれません…。 ひとまず表題は解決しましたのでベストアンサーをさせていただきます。 ご丁寧にありがとうございました。
colling

2018/11/12 10:15

複数ワードでの検索に対応するにはarrayDataSearch()の中を.match()を使って処理するように改造するということになると思います。 次に質問されるときには、検索の要件をもう少し丁寧に書いた方が良いと思います。 複数ワードをAND検索なのか OR検索なのかとか、、。 たくさんヒットしても、地図なので1箇所しか必要ないというのも少々気になっております。 いろんなワードで検索できるようにしてしまって、それが東京と大阪だった場合どちらを優先させるのか?とかも考えておかないと、、と思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問