sup*_*ves 4 google-maps requirejs stamen-maps
我正在尝试编写一个模块`来加载Require.js下的Stamen tile图,但我不确定如何最好地使用Require.
如果您之前没有看过Stamen地图,他们的网站就在Stamen Maps.
这是地图视图的代码view.js
define([
'jquery',
'underscore',
'backbone',
'maps',
'text!templates/map/view.html'
], function($, _, Backbone, maps, mapTemplate){
var mapView = Backbone.View.extend({
el: $(".map"),
displayMap: function() {
this.options = {
center: new maps.LatLng(-37.8, 144.9),
zoom: 11,
mapTypeId: google.maps.MapTypeId.ROADMAP,
scrollwheel: false
};
this.render();
},
render: function(){
var compiledTemplate = _.template(mapTemplate);
var $el = $(this.el);
$el.html(compiledTemplate);
this.map = new maps.Map($el.find('.map').get(0), this.options);
}
});
return new mapView;
});
Run Code Online (Sandbox Code Playgroud)
我正在加载以下模块的地图API:
map.js
define(['google!maps/3/sensor=false'], function() {
return google.maps;
});
Run Code Online (Sandbox Code Playgroud)
哪个有google.js的依赖
define(['http://www.google.com/jsapi?key=THE_API_KEY&callback=define'], {
load: function( name, req, load, config ) {
if (config.isBuild) {
onLoad(null);
} else {
var request = name.split('/');
google.load(request[0], request[1], {
callback: load,
language: 'en',
other_params: ((typeof request[2] === 'string')?request[2]:'')
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
问题是,Stamen地图图层似乎直接编辑Google地图实例.您可以在此处查看Stamen地图实现:http://maps.stamen.com/js/tile.stamen.js?v1.1.1
google.maps.StamenMapType = function(name) {
//Implementation
}
Run Code Online (Sandbox Code Playgroud)
它似乎依赖于全球google.maps对象,这是我认为问题来自的地方.
我不确定如何最好地重写Stamen插件是require.js友好,或者如果我需要,我真的热衷于使用它.除非我将Google地图和Stamen从Require.js中取出并正常加载(就像我使用Modernizr一样),但我更愿意尝试使用Require.js方式.如果有这样的事情.
任何建议或提示将不胜感激.
我负责tile.stamen.js.对不起头疼.
这里的问题是我们的脚本需要访问Google Maps名称空间(google.maps),以便它可以创建StamenMapType类并让它继承Google的方法ImageMapType.如果你绝对需要使用RequireJS(我不会建议,正是因为它使得这样的简单东西变得笨拙),你需要重写tile.stamen.js的整个Google特定部分(第155-177行)看起来像这样:
exports.makeStamenMapType = function(name, gmaps) {
if (!gmaps) gmaps = google.maps;
var provider = getProvider(name);
return new gmaps.ImageMapType({
"getTileUrl": function(coord, zoom) {
var index = (zoom + coord.x + coord.y) % SUBDOMAINS.length;
return [
provider.url
.replace("{S}", SUBDOMAINS[index])
.replace("{Z}", zoom)
.replace("{X}", coord.x)
.replace("{Y}", coord.y)
];
},
"tileSize": new gmaps.Size(256, 256),
"name": name,
"minZoom": provider.minZoom,
"maxZoom": provider.maxZoom
});
};
Run Code Online (Sandbox Code Playgroud)
那你就用了:
var toner = makeStamenMapType("toner", gmaps);
Run Code Online (Sandbox Code Playgroud)
gmaps您需要的Google Maps API对象在哪里.