如何在一个视图中添加多个 django-leaflet 地图?
How to add more than one django-leaflet map in a view?
我能够使用 django-leaflet 在单个页面上显示地图。在另一个页面中,我试图在页面中显示两个(或更多)地图,但我不知道如何显示。
用于在单个页面中显示地图:
<div class="card">
{% leaflet_map "main" callback="map_init" %}
</div>
<script type="text/javascript">
function map_init(map, options) {
// get point lat and lon
var lon = "{{ project.longitude }}";
var lat = "{{ project.latitude }}";
// zoom to point & add it to map
map.setView([lat, lon], 12);
L.marker([lat, lon]).addTo(map);
}</script>
只要需要显示一张地图,上面的方法就可以正常工作。但是我不确定如何修改上面的内容以支持多个地图。
我已经在此处开始 jsfiddle 页面(有点空白),不确定它是否有帮助。
我正在尝试的是在下面的 html 中填写 'img-top' div:
var locations = [
{"lat":27.988098,"lng":86.924925},
{"lat":27.679535,"lng":83.507020}
]
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="card-columns m-5">
<div class="card">
<div class="card-header">Location A </div>
<div class="img-top" id="map-1" style="height:200px"></div>
<div class="card-body">
Some information of A
</div>
</div>
<div class="card">
<div class="card-header">Location B </div>
<div class="img-top" id="map-2" style="height:200px"></div>
<div class="card-body">
Some information of B
</div>
</div>
</div>
不太干,但下面的方法有效吗?
<div class="card">
{% leaflet_map "map_1" callback="map_init_1" %}
</div>
<div class="card">
{% leaflet_map "map_2" callback="map_init_2" %}
</div>
<script type="text/javascript">
function map_init(map, lat, lon) {
// zoom to point & add it to map
map.setView([lat, lon], 12);
L.marker([lat, lon]).addTo(map);
}
function map_init_1(map) {
map_init(map, "{{ project1.latitude }}", "{{ project1.longitude }}")
}
function map2_init_2(map) {
map_init(map, "{{ project2.latitude }}", "{{ project2.longitude }}")
}
</script>
在我看来,django-leaflet 解决了最简单的问题。您可能需要直接使用 leaflet 在 javascript 中编写您的逻辑来实现您想要做的事情。
调用{% leaflet_map ... %}
:
可以看到django-leaflet做了什么
已更新 JS Fiddle:https://jsfiddle.net/cdfrn53L/
编辑:
在 Django 模板中使用 for 循环:
{% for location in locations %}
<div class="card">
{% leaflet_map location.div_id callback=location.callback %}
</div>
{% endfor %}
<script type="text/javascript">
function map_init(map, lat, lon) {
// zoom to point & add it to map
map.setView([lat, lon], 12);
L.marker([lat, lon]).addTo(map);
}
{% for location in locations %}
function {{ location.callback }}(map) {
map_init(map, "{{ location.lat }}", "{{ location.lon }}")
}
{% endfor %}
</script>
假设您的视图构建了位置列表:
locations = [
{'lat': 27.988098, 'lng': 86.924925, 'div_id': 'map-1', 'callback': 'callback_1'},
{'lat': 27.679535, 'lng': 83.507020, 'div_id': 'map-2', 'callback': 'callback_1'}
]
您可以根据位置列表索引构建 div_id
和 callback
值。
这就是我能够在 div 中动态显示两个(或更多)地图的方法。
<script type="text/javascript">
items_json.forEach(item => {
let map = L.map(item.id + "-map").setView([item.fields.latitude, item.fields.longitude], 10);
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
});
</script>
在 HTML 中,此 <div class="img-top" id="{{id}}-map" style="height:200px"></div>
被填充到地图中。
这是 JS Fiddle:https://jsfiddle.net/droidxn/w7d5nqps/10/
我能够使用 django-leaflet 在单个页面上显示地图。在另一个页面中,我试图在页面中显示两个(或更多)地图,但我不知道如何显示。
用于在单个页面中显示地图:
<div class="card">
{% leaflet_map "main" callback="map_init" %}
</div>
<script type="text/javascript">
function map_init(map, options) {
// get point lat and lon
var lon = "{{ project.longitude }}";
var lat = "{{ project.latitude }}";
// zoom to point & add it to map
map.setView([lat, lon], 12);
L.marker([lat, lon]).addTo(map);
}</script>
只要需要显示一张地图,上面的方法就可以正常工作。但是我不确定如何修改上面的内容以支持多个地图。
我已经在此处开始 jsfiddle 页面(有点空白),不确定它是否有帮助。
我正在尝试的是在下面的 html 中填写 'img-top' div:
var locations = [
{"lat":27.988098,"lng":86.924925},
{"lat":27.679535,"lng":83.507020}
]
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="card-columns m-5">
<div class="card">
<div class="card-header">Location A </div>
<div class="img-top" id="map-1" style="height:200px"></div>
<div class="card-body">
Some information of A
</div>
</div>
<div class="card">
<div class="card-header">Location B </div>
<div class="img-top" id="map-2" style="height:200px"></div>
<div class="card-body">
Some information of B
</div>
</div>
</div>
不太干,但下面的方法有效吗?
<div class="card">
{% leaflet_map "map_1" callback="map_init_1" %}
</div>
<div class="card">
{% leaflet_map "map_2" callback="map_init_2" %}
</div>
<script type="text/javascript">
function map_init(map, lat, lon) {
// zoom to point & add it to map
map.setView([lat, lon], 12);
L.marker([lat, lon]).addTo(map);
}
function map_init_1(map) {
map_init(map, "{{ project1.latitude }}", "{{ project1.longitude }}")
}
function map2_init_2(map) {
map_init(map, "{{ project2.latitude }}", "{{ project2.longitude }}")
}
</script>
在我看来,django-leaflet 解决了最简单的问题。您可能需要直接使用 leaflet 在 javascript 中编写您的逻辑来实现您想要做的事情。
调用{% leaflet_map ... %}
:
已更新 JS Fiddle:https://jsfiddle.net/cdfrn53L/
编辑:
在 Django 模板中使用 for 循环:
{% for location in locations %}
<div class="card">
{% leaflet_map location.div_id callback=location.callback %}
</div>
{% endfor %}
<script type="text/javascript">
function map_init(map, lat, lon) {
// zoom to point & add it to map
map.setView([lat, lon], 12);
L.marker([lat, lon]).addTo(map);
}
{% for location in locations %}
function {{ location.callback }}(map) {
map_init(map, "{{ location.lat }}", "{{ location.lon }}")
}
{% endfor %}
</script>
假设您的视图构建了位置列表:
locations = [
{'lat': 27.988098, 'lng': 86.924925, 'div_id': 'map-1', 'callback': 'callback_1'},
{'lat': 27.679535, 'lng': 83.507020, 'div_id': 'map-2', 'callback': 'callback_1'}
]
您可以根据位置列表索引构建 div_id
和 callback
值。
这就是我能够在 div 中动态显示两个(或更多)地图的方法。
<script type="text/javascript">
items_json.forEach(item => {
let map = L.map(item.id + "-map").setView([item.fields.latitude, item.fields.longitude], 10);
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
});
</script>
在 HTML 中,此 <div class="img-top" id="{{id}}-map" style="height:200px"></div>
被填充到地图中。
这是 JS Fiddle:https://jsfiddle.net/droidxn/w7d5nqps/10/