使用 Spring MVC 框架工作,如何迭代列表并在 bingmap 中创建引脚?
Using Spring MVC Frame work , How to iterate a list and create pins in bingmap?
我正在使用 API 版本 8,而 运行 这段代码,我可以得到
只有一个引脚在列表中的第一个 object 中有数据。
这里的列表有 object 来自 object 我们有 Latitude 、 Longitude 、 Title 和 Description 。
迭代已成功完成,但只有第一个数据反映在 BingMap 中。
如何从列表中获取所有引脚并反映在 BingMap 中。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script type='text/javascript'
src='http://www.bing.com/api/maps/mapcontrol?callback=GetMap' async
defer></script>
<style>
#myMap {;
width: 800px;
height: 600px;
}
#inputForm {;
top: 200px;
left: 250px;
padding: 10px;
background-color: white;
border: 1px solid #000;
border-radius: 10px;
}
</style>
</head>
<body>
<div id="myMap" style=""></div>
<script type='text/javascript'>
var map, infobox, currentPushpin;
function GetMap() {
map = new Microsoft.Maps.Map('#myMap', {
credentials : 'bing map key',
zoom : 0
});
document.getElementById('inputForm').style.display = '';
var lat = document.getElementById('lat').value;
var lon = document.getElementById('lon').value;
var center = new Microsoft.Maps.Location(lat, lon);
//Create a pushpin.
currentPushpin = new Microsoft.Maps.Pushpin(center);
currentPushpin.metadata = {
title : document.getElementById('title').value,
description : document.getElementById('description').value
};
//Add a click event to the pushpin.
Microsoft.Maps.Events.addHandler(currentPushpin, 'click',
pushpinClicked);
//Add the pushpin to the map.
map.entities.push(currentPushpin);
}
function pushpinClicked(e) {
//Create an infobox that will render in the center of the map.
infobox = new Microsoft.Maps.Infobox(e.target.getLocation(), {
title : e.target.metadata.title,
description : e.target.metadata.description
});
//Assign the infobox to a map instance.
infobox.setMap(map);
}
</script>
<div id="inputForm" style="display: none;">
<TABLE>
<c:forEach var="message" items="${list}">
<tr>
<td><input id="lat" type="hidden" value="${message.lat}" /> <input
id="lon" type="hidden" value="${message.lon}" /> <input
id="title" type="hidden" value="${message.title}" /> <input
id="description" type="hidden" value="${message.description}" />
</td>
</tr>
</c:forEach>
</TABLE>
</div>
</body>
</html>
这实际上不是 Bing 地图问题,而是 Spring MVC 问题。查看您的 HTML,我看到的第一个问题是您 table 中的每个项目都分配了一个 ID。 ID 在 HTML 中应该是唯一的,但是使用您拥有的代码,您最终将创建具有相同 ID 的多个元素,这在技术上创建了一个无效的 HTML,您将只能检索ID 的最后一项。像这样从 t a table 中提取数据可能不是实现应用程序的最佳方式。可能有一些方法可以使用 Spring MVC 生成 JSON 对象,但是我不熟悉 Spring MVC 开发。如果您想继续使用您正在使用的方法,我建议将 ID 更改为 classes,然后您将能够通过 class 名称检索元素。这是一个值得尝试的例子。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script type='text/javascript'
src='http://www.bing.com/api/maps/mapcontrol?callback=GetMap' async
defer></script>
<style>
#myMap {;
width: 800px;
height: 600px;
}
#inputForm {
padding: 10px;
background-color: white;
border: 1px solid #000;
border-radius: 10px;
}
</style>
</head>
<body>
<div id="myMap" style=""></div>
<script type='text/javascript'>
var map, infobox, currentPushpin;
function GetMap() {
map = new Microsoft.Maps.Map('#myMap', {
credentials : 'bing map key',
zoom : 0
});
//Create a reusable infobox
infobox = new Microsoft.Maps.Infobox(map.getCenter(), {visible: false});
infobox.setMap(map);
document.getElementById('inputForm').style.display = '';
var lats = document.getElementsByClassName('lat');
var lons = document.getElementsByClassName('lon');
var titles = document.getElementsByClassName('titles');
var descriptions = document.getElementsByClassName('description');
//The lats, lons, titles and descriptions values should be arrays of equal length.
var loc, pin;
for(var i = 0, len = lats.length; i < len; i++){
loc = new Microsoft.Maps.Location(parseFloat(lats[i].value), parseFloat(lons[i].value));
pin =
pin.metadata = {
title : titles[i].value,
description : descriptions[i].value
};
Microsoft.Maps.Events.addHandler(pin, 'click', pushpinClicked);
map.entities.push(pin);
}
}
function pushpinClicked(e) {
//Create an infobox that will render in the center of the map.
infobox.setOptions({
location: e.target.getLocation(),
title : e.target.metadata.title,
description : e.target.metadata.description,
visible: true
});
}
</script>
<div id="inputForm" style="display: none;">
<TABLE>
<c:forEach var="message" items="${list}">
<tr>
<td><input class="lat" type="hidden" value="${message.lat}" /> <input
class="lon" type="hidden" value="${message.lon}" /> <input
class="title" type="hidden" value="${message.title}" /> <input
class="description" type="hidden" value="${message.description}" />
</td>
</tr>
</c:forEach>
</TABLE>
</div>
</body>
</html>
我正在使用 API 版本 8,而 运行 这段代码,我可以得到 只有一个引脚在列表中的第一个 object 中有数据。
这里的列表有 object 来自 object 我们有 Latitude 、 Longitude 、 Title 和 Description 。
迭代已成功完成,但只有第一个数据反映在 BingMap 中。
如何从列表中获取所有引脚并反映在 BingMap 中。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script type='text/javascript'
src='http://www.bing.com/api/maps/mapcontrol?callback=GetMap' async
defer></script>
<style>
#myMap {;
width: 800px;
height: 600px;
}
#inputForm {;
top: 200px;
left: 250px;
padding: 10px;
background-color: white;
border: 1px solid #000;
border-radius: 10px;
}
</style>
</head>
<body>
<div id="myMap" style=""></div>
<script type='text/javascript'>
var map, infobox, currentPushpin;
function GetMap() {
map = new Microsoft.Maps.Map('#myMap', {
credentials : 'bing map key',
zoom : 0
});
document.getElementById('inputForm').style.display = '';
var lat = document.getElementById('lat').value;
var lon = document.getElementById('lon').value;
var center = new Microsoft.Maps.Location(lat, lon);
//Create a pushpin.
currentPushpin = new Microsoft.Maps.Pushpin(center);
currentPushpin.metadata = {
title : document.getElementById('title').value,
description : document.getElementById('description').value
};
//Add a click event to the pushpin.
Microsoft.Maps.Events.addHandler(currentPushpin, 'click',
pushpinClicked);
//Add the pushpin to the map.
map.entities.push(currentPushpin);
}
function pushpinClicked(e) {
//Create an infobox that will render in the center of the map.
infobox = new Microsoft.Maps.Infobox(e.target.getLocation(), {
title : e.target.metadata.title,
description : e.target.metadata.description
});
//Assign the infobox to a map instance.
infobox.setMap(map);
}
</script>
<div id="inputForm" style="display: none;">
<TABLE>
<c:forEach var="message" items="${list}">
<tr>
<td><input id="lat" type="hidden" value="${message.lat}" /> <input
id="lon" type="hidden" value="${message.lon}" /> <input
id="title" type="hidden" value="${message.title}" /> <input
id="description" type="hidden" value="${message.description}" />
</td>
</tr>
</c:forEach>
</TABLE>
</div>
</body>
</html>
这实际上不是 Bing 地图问题,而是 Spring MVC 问题。查看您的 HTML,我看到的第一个问题是您 table 中的每个项目都分配了一个 ID。 ID 在 HTML 中应该是唯一的,但是使用您拥有的代码,您最终将创建具有相同 ID 的多个元素,这在技术上创建了一个无效的 HTML,您将只能检索ID 的最后一项。像这样从 t a table 中提取数据可能不是实现应用程序的最佳方式。可能有一些方法可以使用 Spring MVC 生成 JSON 对象,但是我不熟悉 Spring MVC 开发。如果您想继续使用您正在使用的方法,我建议将 ID 更改为 classes,然后您将能够通过 class 名称检索元素。这是一个值得尝试的例子。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script type='text/javascript'
src='http://www.bing.com/api/maps/mapcontrol?callback=GetMap' async
defer></script>
<style>
#myMap {;
width: 800px;
height: 600px;
}
#inputForm {
padding: 10px;
background-color: white;
border: 1px solid #000;
border-radius: 10px;
}
</style>
</head>
<body>
<div id="myMap" style=""></div>
<script type='text/javascript'>
var map, infobox, currentPushpin;
function GetMap() {
map = new Microsoft.Maps.Map('#myMap', {
credentials : 'bing map key',
zoom : 0
});
//Create a reusable infobox
infobox = new Microsoft.Maps.Infobox(map.getCenter(), {visible: false});
infobox.setMap(map);
document.getElementById('inputForm').style.display = '';
var lats = document.getElementsByClassName('lat');
var lons = document.getElementsByClassName('lon');
var titles = document.getElementsByClassName('titles');
var descriptions = document.getElementsByClassName('description');
//The lats, lons, titles and descriptions values should be arrays of equal length.
var loc, pin;
for(var i = 0, len = lats.length; i < len; i++){
loc = new Microsoft.Maps.Location(parseFloat(lats[i].value), parseFloat(lons[i].value));
pin =
pin.metadata = {
title : titles[i].value,
description : descriptions[i].value
};
Microsoft.Maps.Events.addHandler(pin, 'click', pushpinClicked);
map.entities.push(pin);
}
}
function pushpinClicked(e) {
//Create an infobox that will render in the center of the map.
infobox.setOptions({
location: e.target.getLocation(),
title : e.target.metadata.title,
description : e.target.metadata.description,
visible: true
});
}
</script>
<div id="inputForm" style="display: none;">
<TABLE>
<c:forEach var="message" items="${list}">
<tr>
<td><input class="lat" type="hidden" value="${message.lat}" /> <input
class="lon" type="hidden" value="${message.lon}" /> <input
class="title" type="hidden" value="${message.title}" /> <input
class="description" type="hidden" value="${message.description}" />
</td>
</tr>
</c:forEach>
</TABLE>
</div>
</body>
</html>