2

MySQL データベースから多くのマーカーを表示する Google マップ API を使用してマップを作成しようとしています。Google Maps API チュートリアル ( https://developers.google.com/maps/articles/phpsqlajax_v3?hl=de ) に書かれているように、ほぼすべてのことを行いました。

私の問題:

一度にすべてのマーカーをロードするのではなく、現在のビューの境界の間にあるマーカーのみをロードします。

そのために、私の「phpsqlajax_genxml.php」は、現在のビューの 4 つのエッジを GET 変数として取得します。それは問題なく動作しますが、javascript 部分の処理方法がわかりません。

私の最初の試みは、境界が変更されたときにマップを更新するハンドラーを挿入することでした:

google.maps.event.addListener(map, 'bounds_changed', function() {
  var bounds = map.getBounds();

  var swPoint = bounds.getSouthWest();
  var nePoint = bounds.getNorthEast();

  var swLat = swPoint.lat();
  var swLng = swPoint.lng();
  var neLat = nePoint.lat();
  var neLng = nePoint.lng();

  var qs = '&swLat=' + swLat + '&swLng=' + swLng + '&neLat=' + neLat + '&neLng=' + neLng;
  downloadUrl("./includes/phpsqlajax_genxml.php?sess=<?php print session_id(); 
                  ?>"+qs,function(data){

      var xml = data.responseXML;
      var markers = xml.documentElement.getElementsByTagName("marker");
      for (var i = 0; i < markers.length; i++) {
        var name = markers[i].getAttribute("name");
        var address = markers[i].getAttribute("address");
        var type = markers[i].getAttribute("type");
        var point = new google.maps.LatLng(
            parseFloat(markers[i].getAttribute("lat")),
            parseFloat(markers[i].getAttribute("lng")));
        var html = "<b>" + name + "</b> <br/>" + address;
        var icon = customIcons[type] || {};
        var marker = new google.maps.Marker({
          map: map,
          position: point,
          icon: icon.icon,
          shadow: icon.shadow
        });
        bindInfoWindow(marker, map, infoWindow, html);
      }
  });

しかし、マップをスクロールしている間、ミリ秒ごとにマップが更新されます。毎秒だけ更新するにはどうすればよいですか?

主な問題は、新しいキャッシュのみをマップに挿入し、ビューの外にあるものを削除する方法です。どうすればいいのかわかりません。

これまでのところ、「DownloadUrl」関数はその領域のすべてのキャッシュをミリ秒ごとにダウンロードし、既にダウンロードしたものもダウンロードするため、すべてのマーカーが千回表示される可能性があります。

誰か助けてくれませんか?:)

4

1 に答える 1

2

さまざまなアプローチがあるかもしれません。

  1. 指定された境界のすべてのマーカーを常に要求し、以前に追加されたすべてのマーカーを削除します

  2. まだ取得していない特定の境界のマーカーのみを要求します。したがって、ビュー内に既に描画されているマーカー (ID など) を収集し、このリストをパラメーターとして PHP スクリプトに渡す必要があります。これにより、このスクリプトはリストを使用してクエリ内のマーカーをフィルタリングできます (注: POST 経由でデータを送信しないと、URL の長さの制限に非常に速く到達します)

ビュー内にないマーカーの削除に関連: ビュー
の外にあるマーカーを本当に削除する必要がある場合、すべてのマーカーを反復処理してマーカーを削除 (マップ プロパティを null に設定) するよりも良い考えはありません。マップの境界内にないもの ( によって決定される場合がありますLatLngBounds.contains())

リスナーのもう 1 つの問題:idleマップの -event をリッスンする方がよい

于 2013-09-04T23:01:01.327 に答える