同一页上的几个不同的传单地图
Several different leaflet maps on same page
我喜欢画几个不同的小段(gpx 文件),每个都在单独的传单地图上
我试图用这段代码来解决这个问题,传单需要一个新的地图层
我使用 "layers" 数组来存储所有地图引用...
<script>
var layers = [];
var i = 0;
var ref;
</script>
@for(segment <- segments) {
<div id="@segment.id" style="height:300px"></div>
<script>
layers[i] = L.map("@segment.id");
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
}).addTo(layers[i]);
var url = '/assets/gpx_files/@segment.gpxPath';
new L.GPX(url, {
async: true,
marker_options: {
startIconUrl: '/assets/images/pinIcon.png',
endIconUrl: '/assets/images/pinIcon.png',
shadowUrl: '/assets/images/pinIconShadow.png'
}
}).on('loaded', function(e) {
layers[i].fitBounds(e.target.getBounds());
}).addTo(layers[i]);
i = i+1;
</script>
(我有一个 "layers" 数组,它为每个片段存储一个新层,因为否则 leaflet 无法处理它)
但是传单不喜欢
layer[i].fitBounds
-> TypeError: layers[i] 未定义
有什么好主意吗?
您在尝试对未定义的对象调用 fitBounds 时出错。
这里的代码块解决了这个问题。请注意我是如何在其选项哈希中将地图引用 (ref:ref
) 传递给 GPX 的,这样我以后就可以清楚地检索它,而不是试图通过 index.The 获取它 GPX 检索操作是异步的,并且没有保证它什么时候完成,所以你需要知道这一点。此代码将延迟排除在等式之外。
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
<script src='https://api.tiles.mapbox.com/mapbox.js/v2.1.9/mapbox.js'></script>
<link href='https://api.tiles.mapbox.com/mapbox.js/v2.1.9/mapbox.css' rel='stylesheet' />
</head>
<body>
<script src="https://rawgithub.com/mpetazzoni/leaflet-gpx/master/gpx.js"></script>
<div id="map0" style="height:300px"></div>
<div id="map1" style="height:300px"></div>
<div id="map2" style="height:300px"></div>
<div id="map3" style="height:300px"></div>
<script>
var layers = [];
var i = 0;
var map = "map";
for(var i=0;i<4;i++){
layers[i] = L.map(map.concat(i));
var ref = layers[i];
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
}).addTo(ref);
var url = 'https://www.mapbox.com/mapbox.js/assets/data/run.gpx';
new L.GPX(url, {
ref:ref,
async: true
}).on('loaded', function(e) {
e.target.options.ref.fitBounds(e.target.getBounds());
}).addTo(ref);
}
</script>
我喜欢画几个不同的小段(gpx 文件),每个都在单独的传单地图上
我试图用这段代码来解决这个问题,传单需要一个新的地图层
我使用 "layers" 数组来存储所有地图引用...
<script>
var layers = [];
var i = 0;
var ref;
</script>
@for(segment <- segments) {
<div id="@segment.id" style="height:300px"></div>
<script>
layers[i] = L.map("@segment.id");
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
}).addTo(layers[i]);
var url = '/assets/gpx_files/@segment.gpxPath';
new L.GPX(url, {
async: true,
marker_options: {
startIconUrl: '/assets/images/pinIcon.png',
endIconUrl: '/assets/images/pinIcon.png',
shadowUrl: '/assets/images/pinIconShadow.png'
}
}).on('loaded', function(e) {
layers[i].fitBounds(e.target.getBounds());
}).addTo(layers[i]);
i = i+1;
</script>
(我有一个 "layers" 数组,它为每个片段存储一个新层,因为否则 leaflet 无法处理它)
但是传单不喜欢
layer[i].fitBounds
-> TypeError: layers[i] 未定义
有什么好主意吗?
您在尝试对未定义的对象调用 fitBounds 时出错。
这里的代码块解决了这个问题。请注意我是如何在其选项哈希中将地图引用 (ref:ref
) 传递给 GPX 的,这样我以后就可以清楚地检索它,而不是试图通过 index.The 获取它 GPX 检索操作是异步的,并且没有保证它什么时候完成,所以你需要知道这一点。此代码将延迟排除在等式之外。
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
<script src='https://api.tiles.mapbox.com/mapbox.js/v2.1.9/mapbox.js'></script>
<link href='https://api.tiles.mapbox.com/mapbox.js/v2.1.9/mapbox.css' rel='stylesheet' />
</head>
<body>
<script src="https://rawgithub.com/mpetazzoni/leaflet-gpx/master/gpx.js"></script>
<div id="map0" style="height:300px"></div>
<div id="map1" style="height:300px"></div>
<div id="map2" style="height:300px"></div>
<div id="map3" style="height:300px"></div>
<script>
var layers = [];
var i = 0;
var map = "map";
for(var i=0;i<4;i++){
layers[i] = L.map(map.concat(i));
var ref = layers[i];
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
}).addTo(ref);
var url = 'https://www.mapbox.com/mapbox.js/assets/data/run.gpx';
new L.GPX(url, {
ref:ref,
async: true
}).on('loaded', function(e) {
e.target.options.ref.fitBounds(e.target.getBounds());
}).addTo(ref);
}
</script>