2010-11-19 9 views
1

私のウェブサイトには、ユーザーが登録できるフォームがあります。ユーザーに都市、州、国を提供するように求めます。また、その都市、州、国の組み合わせ($場所)から描画された緯度/経度に基づいて、各ユーザーのマーカーをドロップするマップがあります。クラスタ同じlat/lng gmaps v3

私はスーパー特有ではないため(実際の住所を求めているわけではありません)、同じ緯度/経度のユーザーが多数います。マップ上でマーカーを表示しようとすると問題が発生します。

クラスタリングサービスを使用する必要がありますか?もしそうなら、どんな提案もありますか?私が言ったように、情報はmySQLデータベース - > XML - > PHPから流れます。

もしそうなら、私は同じlat/lngと言ったように、最もズームされたレベルでクラスタリングされます。その結果、私はその特定の場所で各ユーザーを選択できる情報ウィンドウが必要になります。

アイデア?提案?とても有難い!!!

ジェレミー

答えて

2

MarkerClusterer:(!大体 - サンプルコードのみ)http://gmaps-utility-library.googlecode.com/svn/trunk/markerclusterer/1.0/docs/examples.html

それとも手で

 var latlng = new google.maps.LatLng(-33.8671390, 151.2071140); 
     var myOptions = { 
      zoom: 8, 
      center: latlng, 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
     }; 
     var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

     var markers = []; 
     var newmarkers = []; 

     for(var j=0; j<5; j++) { 
      markers.push({lat:-33.8671390, lng:151.2071140, title:'This is marker #' + i }); 

      if(j==0) newmarkers.push(markers[j]); 
      for(var i=0; i<newmarkers.length; i++) { 
       if(newmarkers[i].lat == markers[j].lat && newmarkers[i].lng == markers[j].lng) { 
        newmarkers[i].title += ' AND ' + markers[j].title; 
        continue; 
       } 
       newmarkers.push(markers[j]); 
      } 
     } 

     for(var i=0; i<newmarkers.length; i++) { 
      var mkr = new google.maps.Marker({ 
       position: new google.maps.LatLng(newmarkers[i].lat, newmarkers[i].lng), 
       map: map, 
       title: newmarkers[i].title 
      }); 
     } 
+0

ジョナサン:そのリンクを見ていました。それを送ってくれてありがとう。私はそれが私に必要なことをしているかどうかはわかりません。ほとんどのマーカーが異なるlat/lngセットから描画されているようです。一方、私の多くは同じだろう。提案? – jthespartan

+0

そのライブラリは平方ベースのクラスタリングを行います。つまり、距離をピクセル単位で設定すると、ボックス内のすべてのものがクラスタリングされます。だから、あなたは小さな距離値を設定しようとすることができます。 それ以外の場合は、ロケーションコレクションを解析して、別のコレクションに追加し、それぞれのロケーションを新しいコレクションのものと照合する必要があります。 – Jonathan

+0

私は、彼らの場所として「Vance AFB、OK、USA」と記載された多数の人々を持っています。これに対するlat/lngは、lat = "36.343071" lng = " - 97.907806"です。だから私はあなたのデータベースにその情報を入力するとき、私は最後の数字を毎回変換する必要があると言っている?小さな空間に複数のマーカーを置くことは涼しいかもしれません。次に、ユーザーは誰がそこにいるかを見るためにズームインする必要があります。このマップは、主に「効果」目的のためのものです。ソート可能なデータベースは、すべての実際の情報を提供します。 – jthespartan

0

思想私は自分のコードを貼り付けたい:

function load() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map")); map.addControl(new GSmallMapControl()); map.addControl(new GMapTypeControl()); map.setCenter(new GLatLng(47.614495, -122.341861), 2); map.enableScrollWheelZoom();

GDownloadUrl("world_xml.php", function(data) { var xml = GXml.parse(data); var markers = xml.documentElement.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { var first_name = markers[i].getAttribute("first_name"); var last_name = markers[i].getAttribute("last_name"); var email = markers[i].getAttribute("email"); var affiliation = markers[i].getAttribute("affiliation"); var status = markers[i].getAttribute("status"); var service = markers[i].getAttribute("service"); var rank = markers[i].getAttribute("rank"); var specialty = markers[i].getAttribute("specialty"); var city = markers[i].getAttribute("city"); var state = markers[i].getAttribute("state"); var country = markers[i].getAttribute("country"); var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng"))); var marker = createMarker(point, rank, first_name, last_name, email, affiliation, status, service, specialty, city, state, country); map.addOverlay(marker); } });

} }

function createMarker(point、rank、first_name、last_name、電子メール、所属、ステータス、サービス、専門、市、州、国){ var marker = new GMarker(point); var html = "" + rank + "" + first_name + "" + last_name + "
" +サービス+ "、+ステータス+"
"+専門+"
"+所属+"
"+都市+ "、" +状態+ "" +国+ "
" +電子メール+ "
" + ""; GEvent.addListener(marker、 'click'、function(){ marker.openInfoWindowHtml(html); }); リターンマーカー。 }

関連する問題