C# 如何刷新谷歌标记的纬度和经度?
我的卡车每10秒向SQL发送一次Lat和Lng,如下表所示C# 如何刷新谷歌标记的纬度和经度?,c#,javascript,google-maps,google-maps-api-3,C#,Javascript,Google Maps,Google Maps Api 3,我的卡车每10秒向SQL发送一次Lat和Lng,如下表所示 dbo.Trucks ID readTime TruckID Lat Lng 1 2014-01-24 18:02:47.983 78 36,785 35,4672 2 2014-01-24 18:03:11.983 78 34
dbo.Trucks
ID readTime TruckID Lat Lng
1 2014-01-24 18:02:47.983 78 36,785 35,4672
2 2014-01-24 18:03:11.983 78 34,785 37,341
3 2014-01-24 18:03:45.541 78 31,785 34,242
.
.
780 2014-01-24 22:42:45.541 . . .
我通过使用JSON.Parse从SQL获取数据在google地图上创建了标记。但我想刷新标记并在地图上移动它们。不像按F5。带有计时器或超时。我不知道如何在这些代码中使用计时器或超时
源代码:
C
这里的典型方法是让JavaScript每隔N秒在服务器上定期轮询一些JSON API以获取更新的位置。简单的方法是在每次投票时下载完整的标记集。从这里,您可以优化到只发送已移动卡车的新位置。还可以发送地图的东北角/西南角边界,以将查询向下过滤到当前地图视口中可见的卡车 JavaScript轮询通常通过XHR XMLHttpRequest(又名AJAX)完成 JavaScript代码大致类似于:
var delay = 10 * 1000 /* milliseconds per second */;
var markers = []; // an array of google.maps.Marker instances
function poll() {
var req = new XMLHttpRequest();
req.open('GET', 'http://www.mozilla.org/', true);
req.onreadystatechange = function (aEvt) {
if (req.readyState == 4) {
if(req.status == 200)
redraw(req.responseText);
else
alert("Error loading data\n");
}
// queue the next polling request
window.setTimeout(poll, delay);
};
req.send(null);
}
// start the polling queue
poll();
// handles updating any changed markers in the global markers array
function redraw(response) {
var data = JSON.parse(response);
// assume data looks something like `[ {id: 1, latitude: 10, longitude: 20 } ]`
data.forEach(function(item) {
markers.some(function(marker) {
if (marker.id === item.id) {
marker.setPosition(new google.maps.LatLng(item.latitude, item.longitude));
return true;
}
});
});
}
这段代码与完整的解决方案相去甚远,但希望它能触及主要概念。请注意,Google Maps API v3没有查询地图画布上标记的方法。您必须通过一些变量(最好不是上面提到的全局变量)自己维护标记的集合。您可以使用window.setTimeout每N毫秒调用一个函数。与递归类似,setTimeout调用的函数在完成时将一个新的超时排队返回给自己
一种更复杂的方法是使用WebSocket将位置上的更改事件推送到浏览器,尽管这需要更高级的技能。您需要Windows Server 2012来支持WebSocket。可能重复谢谢,但我不清楚。可能重复我正在使用asp.net和sql,先生
public string OnlineTrucks() {
DataTable dt = new DataTable();
using (SqlConnection con = new SqlConnection("Data
Source=localhost;Initial Catalog=MyDB;Integrated Security=true"))
{
using (SqlCommand cmd = new SqlCommand("select
title=TruckID,lat=Lat,lng=Lat from Trucks", con))
{
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
System.Web.Script.Serialization.JavaScriptSerializer serializer = new
System.Web.Script.Serialization.JavaScriptSerializer();
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
return serializer.Serialize(rows);
}
}
}
var delay = 10 * 1000 /* milliseconds per second */;
var markers = []; // an array of google.maps.Marker instances
function poll() {
var req = new XMLHttpRequest();
req.open('GET', 'http://www.mozilla.org/', true);
req.onreadystatechange = function (aEvt) {
if (req.readyState == 4) {
if(req.status == 200)
redraw(req.responseText);
else
alert("Error loading data\n");
}
// queue the next polling request
window.setTimeout(poll, delay);
};
req.send(null);
}
// start the polling queue
poll();
// handles updating any changed markers in the global markers array
function redraw(response) {
var data = JSON.parse(response);
// assume data looks something like `[ {id: 1, latitude: 10, longitude: 20 } ]`
data.forEach(function(item) {
markers.some(function(marker) {
if (marker.id === item.id) {
marker.setPosition(new google.maps.LatLng(item.latitude, item.longitude));
return true;
}
});
});
}