2012-06-07 5 views
0

У меня есть этот слой с помощью Google Maps: (обратите внимание на функцию generateAPIKey() внутри функции getTileUrl)OpenLayers слой а-ля Google Maps ImageMapType

var options ={ 
     center:new google.maps.LatLng(somelat,somelon), 
     zoom:14, 
     disableDefaultUI:true, 
     mapTypeId: google.maps.MapTypeId.ROADMAP, 
     minZoom:11, 
     maxZoom:16, 
    }; 

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

    var myLayerOptions = { 
     getTileUrl: function(coord, zoom) { 
     return 'http://localhost/mylayer/'+zoom+'/'+coord.x+'/'+coord.y+'.png&apikey='+ generateAPIKey(); 
     }, 
     tileSize: new google.maps.Size(256, 256), 
     isPng: true, 
     opacity:1.0 
    }; 
    var myLayerMapType = new google.maps.ImageMapType(myLayerOptions); 
    map.overlayMapTypes.insertAt(0, myLayerMapType); 

Так что моя основная проблема заключается в том, что у меня есть динамический ключ API для сервис я использую, с открытыми слоями я получил это:

var mylayer = new OpenLayers.Layer.XYZ(
    "mylayer", 
    [ 
     "http://localhost/mylayer/${z}/${x}/${y}.png&apikey='+ generateAPIKey() 
    ], { 
     sphericalMercator: true, 
     wrapDateLine: true, 
     transitionEffect: "resize", 
     buffer: 1, 
     numZoomLevels: 17 
    } 
); 

var map = new OpenLayers.Map({ 
    div: "map_canvas", 
    layers: [mylayer], 
    controls: [ 
     new OpenLayers.Control.Attribution(), 
     new OpenLayers.Control.Navigation({ 
      dragPanOptions: { 
       enableKinetic: true 
      } 
     }), 
     new OpenLayers.Control.Zoom(), 
     new OpenLayers.Control.Permalink({anchor: true}) 
    ], 


     center: [somelat,somelon], 
     zoom: 14 

}); 

Я понимаю, что это неправильно, функция generateAPIKey выполняется только один раз. Есть что-то вроде Google getTileUrl?

ответ

2

Дa, XYZ-слой имеет метод getURL, который вызывается для каждой плитки и выглядит следующим образом:

/** 
    * Method: getURL 
    * 
    * Parameters: 
    * bounds - {<OpenLayers.Bounds>} 
    * 
    * Returns: 
    * {String} A string with the layer's url and parameters and also the 
    *   passed-in bounds and appropriate tile size specified as 
    *   parameters 
    */ 
    getURL: function (bounds) { 
     var xyz = this.getXYZ(bounds); 
     var url = this.url; 
     if (OpenLayers.Util.isArray(url)) { 
      var s = '' + xyz.x + xyz.y + xyz.z; 
      url = this.selectUrl(s, url); 
     } 

     return OpenLayers.String.format(url, xyz); 
    } 

Просто переопределить этот метод и добавить ключ API.

Смежные вопросы