こんはんばー。
現在、phpををつかって、sqlから引っ張った名前、緯度、経度、電話番号のデータをもとに描画し、sqlの検索結果の一覧が地図の下に羅列されている状態です。
(イメージは不動産サイトの「地図から探す」です)
見ている人が地図を縮小・拡大するにしたがって、もちろん表示されているマーカー数は変化しますが、今のままでは、php側で絞り込みしているので、それができないときづいてしまいました。
js側で絞込をする場合、どのタイミングで緯度経度の範囲をしていればいいのか、むしろ緯度経度の範囲指定を追記するだけでこのコードは動くのかおしえてください。
よろしくお願いいたします。
<?php
/*** get_markers.php抜粋*/
$sql = 'SELECT';
$sql .= ' `ido`';
$sql .= ', `keido`';
$sql .= ', `name` ';
$sql .= ', `tel` ';
$sql .= 'FROM `table`';
$sql .= 'WHERE 1 ';
//$sql .= 'AND `ido` BETWEEN :min_lat AND :max_lat ';
//$sql .= 'AND `keido` BETWEEN :min_lng AND :max_lng ';
//↑ここじゃない
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':min_lat', $min_lat);
$stmt->bindValue(':max_lat', $max_lat);
$stmt->bindValue(':min_lng', $min_lng);
$stmt->bindValue(':max_lng', $max_lng);
$stmt->execute();
$rows = $stmt->fetchAll();
header('Content-type: application/json; charset=utf-8');
echo json_encode($rows);
} catch (Exception $ex) {
header('Content-type: application/json');
}
<!DOCTYPE HTML>
<html lang="ja">
<head><meta charset="UTF-8"><title></title></head>
<body>
<div id="map" data-lat="35" data-lng="136"></div>
<ul id="lists"><li>test</li></ul>
<script>
"use strict";
function initMap() {
var div = document.getElementById('map');
var map = new google.maps.Map(div, {
zoom: 15,
center: {
lat: parseFloat(div.getAttribute('data-lat'))
, lng: parseFloat(div.getAttribute('data-lng'))
}
});
var markers = [];
var ul = document.getElementById('lists');
var str;
var xhr = new XMLHttpRequest();
map.addListener('idle', function () {
xhr.onreadystatechange = function ()
{
console.debug(this);
if (this.readyState === 4 && this.status === 200)
{
var response = this.response;
for (var i = 0; i < response.length; i++)
{
markers[i] = new google.maps.Marker({
position: {
lat: parseFloat(response[i].ido)
, lng: parseFloat(response[i].keido)
},
map: map
});
//リスト表示
var str = "";
str +='<li><p>' + response[i].name +'<br>' + response[i].tel+'</p></li>';
ul.innerHTML +=str;
}//for
} else if (this.status === 500) {
}//if
};
var sw = map.getBounds().getSouthWest(); //地図の緯度経度取得
var ne = map.getBounds().getNorthEast();
var url = 'get_markers.php?';
url += 'min_lat=' + sw.lat();
url += '&max_lat=' + ne.lat();
url += '&min_lng=' + sw.lng();
url += '&max_lng=' + ne.lng();
xhr.responseType = 'json';
xhr.open('GET', url, true);
xhr.send(null);
});//addListener
}//iniMap
</script>
<script src="https://maps.googleapis.com/maps/api/js?key=ーーー&callback=initMap" async defer></script>
</body>
</html>
No.1ベストアンサー
- 回答日時:
こんにちは
>js側で絞込をする場合、どのタイミングで緯度経度の範囲をしていれば~~
ご質問が、単にリストの表示/非表示を制御したいだけという意味なら、表示中の範囲に入っているかいないかでリストの表示制御をすれば良いと思われます。
タイミングとしては、「初期表示時」と「ユーザが地図を移動/拡大/縮小した時」ですね。
ユーザによる表示範囲の変更は、map classのbounds_changedイベントで取得可能と思います。
範囲を移動したときに、再度データをsqlから取得し直したいという意味でしたら、ajaxで取得すれば良いのですが、少しでも変更する度にリクエストしていたのでは煩雑すぎるでしょうから、ある程度のエリアを設定しておいて、そのエリア単位で読み込むなどといった工夫が必要になると思います。
(データ取得済みエリアをチェックしておいて、未取得エリアが表示されたらリクエストするとか…)
全体のデータ量にもよりますが、さほど多くない場合は、最初に全部読み込んでしまって、表示/非表示の制御だけですましてしまうのが簡単だとは思いますが…
ご質問とは関係はありませんが・・・
マーカの密度がわかりませんが、縮小表示するとマーカだらけになってしまうような場合は、「地図のzoomに応じて表示するマーカを絞る」ようにするとか、あるいは、「何か所かをまとめてグループ化して表示する」ようなことも必要かもしれませんね。
ありがとうございます!
何とかできました!!
でも、データ量を考えると重くならないか不安・・・。
いただいたアドバイスをもとに考えてみまーす
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript WordPressのコンタクトフォーム7にて送信者の位置情報を送らせたい 2 2022/09/14 23:28
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jQueryのload()を使用して外部...
-
google apps scriptの終了のさせ方
-
C#OpenCv V4にのエラーに関する...
-
Javaで避けるゲームを作ってい...
-
【JavaScript】数当てゲームを...
-
C#で、ContextMenuStripに動的...
-
javaScript textareaの一行あた...
-
翌月を取得するGASが分かりません
-
ASP.NETのコントロールの値をJa...
-
javascriptにお詳しい方に質問...
-
商品コードを入力で、商品名、...
-
JavaScriptで決まった「時刻」...
-
ホームページの最終更新日を他...
-
C# 演算 奇数と偶数 表現の仕方
-
特定のclassを表示、非表示にする
-
なぜmatchメソッドがエラーにな...
-
javascriptでカウントダウンタ...
-
ASP.NET MVCでObjectをjsに渡す
-
idを使わずにonclickで自身の要...
-
Linux バイナリ実行できない "...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
C#OpenCv V4にのエラーに関する...
-
メールフォームの日付入力フォ...
-
GASでundefinedエラーが出ます
-
ジェネレーターの作り方
-
GASでGoogleフォームの自動返信...
-
なぜmatchメソッドがエラーにな...
-
翌月を取得するGASが分かりません
-
ローカルにあるファイルを検索...
-
HTMLで作った時報アプリが動き...
-
ASP.NETのコントロールの値をJa...
-
C# 演算 奇数と偶数 表現の仕方
-
html javascript リンク先アド...
-
gas スプレッドシートがアクテ...
-
javascriptでテーブルに追加し...
-
VSCODE[Python]の設定について
-
JavaScriptで決まった「時刻」...
-
ASP.NET MVCでObjectをjsに渡す
-
イベントが初めの一回しか起き...
-
jqGridについて
おすすめ情報