2009-07-01 17 views
0

Googleマップで複数のマーカーに問題があります。現在、情報(位置情報)を格納しているMySQLデータベースがあります。 PHPで私はこの情報を抽出し、各郵便番号をループして、必要なjavascriptを動的に作成し、データベースの各場所のマーカーを配置します。Googleマップ - 複数のマーカーを使用すると情報ウィンドウに同じテキストが表示されます

js関数に正しい情報を渡していることを知っているので、私が達成しようとしているのは、マーカーがクリックされたときに追加の情報を追加することです。

これは私が使用しているJS(私が一番上にアイコンを開始するが、今のコードからこれを除外)である:私はPHPのコードがある

function usePointFromPostcode(postcode, callbackFunction, text) { 

    localSearch.setSearchCompleteCallback(null, 
     function() { 

      if (localSearch.results[0]) 
      {  
       var resultLat = localSearch.results[0].lat; 
       var resultLng = localSearch.results[0].lng; 
       var point = new GLatLng(resultLat,resultLng); 
       callbackFunction(point, text); 
      }else{ 
       alert("Postcode not found!"); 
      } 
     }); 

    localSearch.execute(postcode + ", UK"); 
} 

function placeMarkerAtPoint(point, html, icon) 
{ 
    var marker = new GMarker(point,{icon: icon}); 

    GEvent.addListener(marker,"click",function() { 
     marker.openInfoWindowHtml(html); 
    }); 

    map.addOverlay(marker); 
} 

$query = "SELECT * FROM hospitalInfo"; 
$result = mysql_query($query); 

if($result) { 
    while ($row = mysql_fetch_assoc($result)) { 
     $code .= "usePointFromPostcode('".$row['Postcode']."', placeMarkerAtPoint, 
     '".$row['placeName']."');"; 

    } 
} 

$コードがechoされます。

これがなぜ発生しているのかアドバイスをいただければ幸いです。ありがとう!

+0

ページへのリンクを投稿することができ、任意のチャンス? @Cannonadeには、Google Mapsのコードに間違いがないように思われます。あなたは、PHPコードが正しいものを出力していると確信していますか? –

+0

申し訳ありませんが、私は内部のサーバー上でそれをホストしているので、コードへのリンクを投稿できません。私を助けてくれてありがとう。私はまた、PHPの出力に何か問題があったと思いましたが、私はちょうど警告ボックスに出力&私は私のjavascript – samcooper11

+0

に何か問題があったと思った理由は、私が「検索ですthatsのように、それは別のテキスト毎回提供していることで、これを確認しました使用してM: するvar localSearch =新しいGlocalSearch()。 – samcooper11

答えて

1

あなたがあなたのコメントで述べたように、問題はあなたがどんな結果を得る前に、あなたはいくつかの要求を送っているということで、マーカテキストの値は、あなたがリクエストを送信するたびに変化します。 Maps APIの一部ではないGLocalSearchを使用することが絶対に必要でない限り、GClientGeocoderを使用することでコードを大幅に簡略化できると思います。ジオコーダーの場合はGoogle's tutorialです。

まず、このようなジオコーダを作成:

function usePointFromPostcode(postcode, text) { 
    geocoder.getLatLng(postcode, function(point) { 
     if (!point) { 
      //alert('address not found'); 
     } else { 
      var marker = new GMarker(point, {icon: icon}); 
      GEvent.addListener(marker, "click", function() { 
       marker.openInfoWindowHtml(text); 
      }); 
      map.addOverlay(marker); 
     } 
    }); 
} 

これは私のために素晴らしい仕事:

var geocoder = new GClientGeocoder(); 

次へ]を、ここにあなたの新しいusePointFromPostcode()機能です。試してみて、それがどうなっているか教えてください。あなたは、精度のような返されるポイントに関する詳細な情報を、必要な場合は

、代わりにgetLatLngのgetLocations()()を使用します。このチュートリアルでは、どのように動作するかを説明します

1

Googleマップコードに問題はありません。 placeMarkerAtPointのhtmlパラメータとlocalSearchコールバックのテキストパラメータをロギングすることをお勧めします。 Googleのあなたが使用することができ非常に便利なロギングAPIを持っています。

GLogリファレンス

私はplaceMarkerAtPoint機能の初めに追加します。

GLog.write ("placeMarkerAtPoint - " + html); 

とlocalSearchコールバックで:

GLog.write ("SearchCompleteCallback - " + text); 

私はこれらの2つのコールバック(特に2番目のコールバック)のロギングが、htmlが失われている場所を明白にすると思います。

更新:あなたのログに基づいて、あなたのPHPコードは正常です。 usePointFromPostcodeへの3回の呼び出しを生成しています。

ここでの問題は、google.search.SearchControlコールバックにあります。私は検索が正しく動作していると仮定しています。結果の配列はそれぞれの郵便番号ごとに適切ですか?

もしそうなら、問題はsetSearchCompleteCallbackのtextパラメータにあります。私はGoogle AJAX Searchのものを使用していませんが、問題はこれらのコールバックがどのように起動されるかにあります。 1回の実行でmultiple callbacksを取得できるようです。

+0

[OK]を私はこれを試してみるよ、ありがとう – samcooper11

+0

私はこれを試していない - 間違って何が起こっているかにまだ運...私はしました結果とJavaScriptコードの返信を投稿しました。ありがとう – samcooper11

+0

私はそれをチェックします... – RedBlueThing

0

名前マーカーを再使用しているため、最後に配置したテキストがすべてのマーカーに接続されてしまいます。インデックスを作成してmarker1、marker2などに名前を付けます。PHPループで簡単に実行できます。

2

hereの問題と同様に、スコープ/クロージャの問題が発生している可能性があります。

このコードを交換してみてください。これで

GEvent.addListener(marker,"click",function() { 
    marker.openInfoWindowHtml(html); 
}); 

marker.bindInfoWindowHtml(html); 

問題が解決しない場合、私は閉鎖問題がsetSearchCompleteCallback()関数から来ていることを推測すると思います。実際のページを見ずに推測するのは難しいです。

+0

私はこれを試しましたが、私はまだ同じエラーが発生します - 私は一時的なハックが今のところ動作するように見えた - 私はちょうどsetTimeout 。私は、以前の検索結果が返される前に、usePointFromPostcodeメソッドが再び呼び出されるため、問題が発生したと考えます。検索は非同期でなければなりませんか?コードで修正する方法を知らなかったので、代わりにタイムアウトを使用しました。他の考え? あなたの助けをもう一度ありがとう:-) – samcooper11

+0

あなたは完全に正しいです。 usePointFromPostcode()は、最初の結果が返される前に複数回呼び出されます。私は新しい答えを投稿するつもりです... –

+0

marker.bindInfoWindowHtml(html);私の一日を作った!ありがとう! –

関連する問題