【发布时间】:2014-02-12 01:47:49
【问题描述】:
我正在使用 javascript 和传单地图来创建类似这样的东西:我在屏幕上有一张地图,地图上应该有多个箭头形状的多边形,可以根据地图上不断变化的数据进行旋转。问题是当我在 javascript 中添加警报时 javascript 工作正常,但如果没有,那么箭头只会显示在最后一个位置的屏幕上,在这种情况下没有动作。我试图将代码放在 window.onload 中,但它仍然不起作用。它仅在我有警报时才有效。
数据输入来自一个 json 文件。 此外,在我开始使用传单多多边形而不是 geojson 多边形之前,我没有这个问题。
下面是我的代码。我可以提供任何其他需要的细节。 感谢您的帮助!
window.onload = function () {
var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/4fd891040a8a4ecb805c388019e23d46/64082/256/{z}/{x}/{y}.png';
var basemap = new L.TileLayer(cloudmadeUrl, {maxZoom: 18});
var latlng = new L.LatLng(30, -88);
var delay = 350; // animation delay (larger is slower)
var Npoints; // number of points per track
var isRunning = true;
var multiPolygon = [];
var pts =[];
var arrowSize = [];
var arrowAngle = [];
var arrowsDataMap = new Map();
var pointLength;
var arrowLength;
function showTimeStep(p) {
var point = [];
var latLngPoints = [];
//for loop to create one layer of multipolygons
for (var j = 0; j < arrowLength; j++) {
alert(arrowLength);
for (var m = 0; m < pointLength; m++) {
if(j>0)
map.removeLayer(multiP);
parts.push(0.00);
//some code to create polygon
parts.push(0.00+size/3);
var combined = parts.join(" ");
var a = combined.split(":");
var ans = [];
for(var k=0;k<a.length;k++){
var latLong = a[k].split(",");
ans.push([ parseFloat(latLong[0]), parseFloat(latLong[1]) ]);
}
domain = {"type": "Polygon", "coordinates": [ans]};
var sine = Math.sin(-angle);
var cos = Math.cos(-angle);
for (var i=0;i<ans.length;i++){
var px=ans[i][0];
var py=ans[i][1];
//rotate
var xnew = (px*cos)-(py*sine);
var ynew = (px*sine)+(py*cos);
//translate
px=((xnew+latLngPoint[0]));
py=((ynew+latLngPoint[1]));
ans[i][0]=px;
ans[i][1]=py;
//polygon
point[i] = L.latLng(py,px);
}
//Array of multipolygons
multiPolygon[m] = point;
}
var multiP = L.multiPolygon(multiPolygon);
map.addLayer(multiP); //Plotting polygon on the map
if (p == arrowLength) {
nextp = (p + 1) % Npoints;
setTimeout(function(i) {
return function() {
showTimeStep(i);
}
}(nextp), delay);
}
}
}
//function to load data from json file and create map
function animateLines(data) {
pointLength = data.points.length;
arrowLength = data.points["0"].point.length;
for (var viewEntryKey in data.points) {
var arrowsMap = new Map();
for (var i = 0; i < data.points[viewEntryKey].point.length; i++) {
var arrowMap = new Map();
arrowMap.set(1,data.points[viewEntryKey].point[i].latLng);
arrowMap.set(2,data.points[viewEntryKey].point[i].size);
arrowMap.set(3,data.points[viewEntryKey].point[i].angle);
arrowsMap.set(i,arrowMap);
}
arrowsDataMap.set(viewEntryKey,arrowsMap);
}
showTimeStep(0);
}
var tracks = L.layerGroup([])
var map = new L.Map('map', {center: latlng, zoom: 7, layers: [basemap, tracks]});
map.addControl(new MyButton({layer: tracks}));
var tracklines = null;
//json file holding data
var url1 = "pointsData.json";
$.getJSON(url1, function(mydata) {
tracklines = mydata;
//$.each(mydata.points.point,function(index,value){ alert(value.size);})
})
.fail(function(xhr, statustext) {
tracklines = JSON.parse(xhr.responseText.replace(/NaN/g,'null'));
})
.done(function() {
// assume all lines have the same number of points
Npoints = 301;
animateLines(tracklines);
});
};
Json(由于数据被复制并且可以更好地结构化,它有点粗糙):
{
"points": [
{
"point": [
{
"latLng": [-88.9999988477954, 29.999999681521295],
"size": "0.15",
"angle": "0.79"
},
{
"latLng": [-88.9999988477954, 29.999999681521295],
"size": "0.15",
"angle": "0.69"
}
,
{
"latLng": [-88.9999988477954, 29.999999681521295],
"size": "0.15",
"angle": "0.49"
}
]
},
{
"point": [
{
"latLng": [-89.9999988477954, 29.999999681521295],
"size": "0.15",
"angle": "0.79"
},
{
"latLng": [-89.9999988477954, 29.999999681521295],
"size": "0.15",
"angle": "0.69"
}
,
{
"latLng": [-89.9999988477954, 29.999999681521295],
"size": "0.15",
"angle": "0.49"
}
]
}
]
}
【问题讨论】:
-
根据您的描述,我会说您在异步请求之间存在竞争条件。
-
代码格式不正确 - 太难读了,抱歉。
-
@Mathletics 好的..感谢您的帮助。我将尝试查找比赛条件。 (我对 javascript 相当缺乏经验,所以我对比赛条件一无所知!)
-
@hgoebl ..对此我很抱歉。我会以更好的格式重新发布。
-
嗨@hgoebl,我试图更好地格式化和注释我的代码。如果有帮助,请告诉我!
标签: javascript jquery json leaflet