2012-04-25 10 views
2

私はこの奇妙な問題があります。別々のKMLファイルから1つのマップウィンドウに多くのKMLレイヤーを生成する必要があります。金額はカップルのようなものから50ドル未満のものまでさまざまです。現時点では、私のコードは、1,4、または15のKMLファイル(URIとして)を配列として与えているときに正しい動作を生成しています。さて、基本的に私のコードは機能的で、KMLファイルは十分に有効であることが分かります。ここで Google Maps APIベースのページで15以上のKMLレイヤーが表示されない

は、私が23 KML URIの配列で、私のマップの初期化を呼び出す方法の例です:

私は16を持っている配列私のコードを与えているときしかし、問題は、発生する<body id="body" onload="initmap(new Array('https://CENCORED/kml/project64.kml', 'https://CENCORED/kml/project65.kml', 'https://CENCORED/kml/project66.kml', 'https://CENCORED/kml/project67.kml', 'https://CENCORED/kml/project69.kml', 'https://CENCORED/kml/project70.kml', 'https://CENCORED/kml/project71.kml', 'https://CENCORED/kml/project72.kml', 'https://CENCORED/kml/project75.kml', 'https://CENCORED/kml/project76.kml', 'https://CENCORED/kml/project80.kml', 'https://CENCORED/kml/project81.kml', 'https://CENCORED/kml/project82.kml', 'https://CENCORED/kml/project83.kml', 'https://CENCORED/kml/project84.kml', 'https://CENCORED/kml/project85.kml', 'https://CENCORED/kml/project86.kml', 'https://CENCORED/kml/project87.kml', 'https://CENCORED/kml/project88.kml', 'https://CENCORED/kml/project89.kml', 'https://CENCORED/kml/project90.kml', 'https://CENCORED/kml/project91.kml', 'https://CENCORED/kml/project92.kml'))">

(16 )以上のKML URI。これらのKMLファイルはマップキャンバスにレンダリングされません。しかし、どこにでもエラーは出現せず、また、私はKMLファイルがマップ上にあることを知っています。これをどうやって知るのですか?私のコードではKMLファイルごとにInfoWindowが生成されていますが、一部のKMLファイルがどこにあるのか知っているので、クリックしても表示されません。レンダリングされず、InfoWindowが表示されます。ちょうど意図通り。

ここに、私のmap_display.jsの完全な内容があります。そこには、呼び出された関数initmap()が含まれています。

function initmap(urls){ 
    // Creating an option object for the map 
    var myLatlng = new google.maps.LatLng(63.349501, 26.817627); 
    var options = { 
     zoom: 6, 
     center: myLatlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 

    // Initializing the map 
    var map = new google.maps.Map(document.getElementById('map_canvas'), options); 

    if(urls != null) { 
     for(var i=0;i<urls.length;i++) { 
      var url = urls[i]; 
      url = url+"?dummy="+(new Date()).getTime(); 
      var ctaLayer = createKML(url); 
      ctaLayer.setMap(map); 
     } 
    } 

    function createKML(url){ 

     var ctaLayer = new google.maps.KmlLayer(url, {suppressInfoWindows: true, preserveViewport: true}); 

     // Creating a correct reference for project edit URL 
     var editUrl = urls[i]; 
     var s1 = editUrl.indexOf("project"); 
     s1 = s1+7; 
     var s2 = editUrl.indexOf(".kml"); 
     editUrl = editUrl.substring(s1, s2); 

     var baseUrl = getbaseUrl(); 

     var infoItems = new Array(); 
     infoItems = getInfo(editUrl); 

     editUrl = '<b>' + infoItems[1] + '</b><br />' + infoItems[0] + '<br /><br /><a href="' + baseUrl + '/frontend/viewproject/' + editUrl + '">Katso projektin tiedot</a>'; 
     // Creating an InfoWindow object 
     var infowindow = new google.maps.InfoWindow({ content: editUrl }); 

     google.maps.event.addListener(ctaLayer, 'click', function(kmlEvent) { 
      var clickPos = kmlEvent.latLng; 
      var posX = new google.maps.LatLng(clickPos.lat(), clickPos.lng()); 

      infowindow.close(); 
      infowindow.setPosition(posX); 
      infowindow.open(map); 

     }); 

     return ctaLayer; 
    } 

    function getbaseUrl(){ 

     var baseUrl = "https://" + window.location.hostname; 
     var firstpath = window.location.pathname; 
     var first_slash = firstpath.indexOf("/", 1); 
     firstpath = firstpath.substring(0, first_slash); 
     baseUrl = baseUrl + firstpath; 

     return baseUrl; 
    } 

    function getInfo(pid){ 

     var jsoninfo = new Array(); 

     var xmlhttp; 
     if (window.XMLHttpRequest) 
     { 
      xmlhttp=new XMLHttpRequest(); 
     } 
     else 
     {// code for IE6, IE5 
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 

     var json_location = getbaseUrl() + '/frontend/project_json/' + pid; 

     xmlhttp.open("GET",json_location,false); 
     xmlhttp.send(); 

     var json_answer = eval('(' + xmlhttp.responseText + ')'); 

     jsoninfo[0] = json_answer["projectName"]; 
     jsoninfo[1] = json_answer["builder"]; 

     return jsoninfo; 
    } 

} 

誰か助けてもらえますか?申し訳ありませんが、パスワードで保護されている大きなページの一部であるため、ライブシステムを参照することはできません。

答えて

3

デフォルトのKMLレイヤーGoogleが提供します。 GeoXML3またはgeoxml-v3(同じプロジェクトではない)を試してみることをおすすめします。私はcampus mapのためにGeoXML3を使用し、自分の教育のためにhello world GeoXML3 map on Githubを作成しました。

+1

GeoXML3は、少なくとも今のところ私の問題を解決しました。 :) –

1

kmlレイヤの仕組みは、thr kmlのURLが各タイルのURLに含まれていることです。非常に多くのkmlレイヤーを追加すると、タイルURLは2048文字より長くなります。これはURLの制限です。 kmlレイヤーのURLを短縮することができます。 the Google docsから

1

単一Googleマップ上に表示することができKMLレイヤの数に制限があります。この制限を超えると、レイヤーのいずれも表示されません。 この制限は、すべてのURLの合計長さに基づいています。 はKMLLayerクラスに渡されます。したがって、 アプリケーションによって異なります。平均では、制限を打ち負かすことなく、10から20の間のレイヤーをロードすることができます。

関連する問題