独自のタイル オーバーレイと KML 要素を使用して、Web サイトに Google マップを実装する作業を行っています。たとえば、特定の URL からページが読み込まれたときに、既に有効になっているタイル オーバーレイのいずれかで初期化されるように、コードを作成するよう以前に依頼されました。最近、特定の URL のページに到達すると、建物の情報を自動的にズーム、中央揃え、表示するように、KML 要素によって輪郭が描かれている建物に対して同じことを行うように依頼されました。
ただし、最初はタイル オーバーレイは機能しますが、建物の KML は機能しません。いくつかのテストを行った後、URL をチェックするコードが実行されると、ページはまだ KML 要素をロードしているため、比較または使用するコードが存在しないことがわかりました。
URL を評価するためのコード(onLoad="initialize()" の最後に配置)
function urlClick() {
var currentURL = window.location.href; //Retrieve page URL
var URLpiece = currentURL.slice(-6); //pull the last 6 digits (for testing)
if (URLpiece === "access") { //If the resulting string is "access":
access_click(); //Display accessibility overlay
} else if (URLpiece === "middle") { //Else if the string is "middle":
facetClick('Middle College'); //Click on building "Middle College"
};
};
facetClick();
function facetClick(name) { //Convert building name to building ID.
for (var i = 0; i < active.placemarks.length; i++) {
if (active.placemarks[i].name === name) {
sideClick(i) //Click building whose id matches "Middle College"
};
};
};
Firebug コンソール エラー
active is null
for (var i = 0; i < active.placemarks.length; i++) {
active.placemarks はページに読み込まれる KML 要素で、null は KML がまだ読み込まれていないことを意味します。要するに、タイミングがずれており、KMl がロードされた後に実行する URL コードを配置する適切な場所が見つからないようです。上記のように、onLoad="initialize()" の最後に配置しましたが、KML が関数の前半で完全に読み込まれるのを待つ代わりに、関数の残りの部分が実行されているように見えます。
onLoad="initialize()"
information(); //Use the buttons variables inital state to set up description
buttons(); //and button state
button_hover(0); //and button description to neutral.
//Create and arrange the Google Map.
//Create basic tile overlays.
//Set up parser to work with KML elements.
myParser = new geoXML3.parser({ //Parser: Takes KML and converts to JS.
map: map, //Applies parsed KML to the map
singleInfoWindow: true,
afterParse: useTheData //Allows us to use the parsed KML in a function
});
myParser.parse(['/maps/kml/shapes.kml','/maps/kml/shapes_hidden.kml']);
google.maps.event.addListener(map, 'maptypeid_changed', function() {
autoOverlay();
});
//Create other tile overlays to appear over KML elements.
urlClick();
私の問題の 1 つは、KML ファイルを Javascript に変換する geoxml3 パーサー ( http://code.google.com/p/geoxml3/ ) の使用にあると思われます。ページはすべての要素の読み込みを完了していますが、KML 要素を含め、ページ上の地図はまだ読み込み中です。また、すべての形状が解析された後に実行されるように見えるパーサー自体のさまざまな場所に urlClick() を配置しようとしましたが、そこでも成功しませんでした。
パーサーを取り除くつもりでしたが、パーサーが KML 形状を返した後に「urlClick」を実行する方法があるかどうか知りたいです。理想的には、さまざまなブラウザーがすべて異なる時間にページをロードするため、「3 秒待ってから開始する」など、待機時間を任意に定義する方法を使用したくありません。むしろ、「パーサーが完了したら実行する」または「Google マップが完全にロードされたら実行する」、あるいは「urlClick に進む前にパーサーが完了するまで保留する」と言う方法を探しています。
編集:上記の問題の基本的な形式を含むマップへのリンクを次に示します。私はテスト サーバーでマップの次の更新を開発しているので、facetClick() はこのライブ バージョンの一部ではなく、代わりにその出力関数 sideClick(); を使用します。ただし、この配置でもエラーは同じです。
active is null
google.maps.event.trigger(active.gpolygons[poly],'click');
地図: http://www.beloit.edu/maps/
アクセス可能な地図: http://www.beloit.edu/maps/?access
建物クリック付き地図: http://www.beloit.edu/maps/?middle
EDIT : Javascript でパーサーの機能を再構築する作業に 1 日のほとんどを費やしましたが、パーサーがなくても問題なく動作します。パーサーによって渡されるのを待つのではなく、コードの前に各形状を個別に定義する必要があるため、これは明らかだと思います。答えは「一意の URL が必要な場合は、パーサーを削除する」であるように思われます。>_<