我正在JavaScript和傳單地圖上創建類似這樣的東西:我有一個地圖在屏幕上,並在地圖上應該是多個多邊形的箭頭形狀按照地圖上的數據正在變化。問題是javascript在JavaScript中添加警報時工作正常,但如果不是,那麼箭頭只顯示在最後一個位置的屏幕上,在這種情況下沒有任何動作。我試圖把代碼放入window.onload中,但它仍然不起作用。它只有當我有警報時纔有效。JavaScript與單張 - javascript代碼不工作沒有提醒
數據輸入來自json文件。 另外我沒有這個問題,然後我開始使用傳單multipolygon而不是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
代碼格式不正確 - 太難閱讀,對不起。 – hgoebl
@Mathletics好的..感謝您的幫助。我會嘗試查找比賽條件。 (我在JavaScript上相當缺乏經驗,所以我對競爭條件有點無知!) – user3267015