9

我正在服务器端开发一个带有 vb.net 的网页,并在 .aspx 页面上为谷歌地图开发一些 javascript。该网页是一个大型的 GIS 事物,它绘制出格鲁吉亚某些县内的所有街区组,因此它是 .js 文件中大约 15MB 的纯 [纬度,经度] 点。在 chrome/firefox 中,地图加载,然后加载脚本,触发回调以绘制它定义的多边形,并将多边形绘制到地图上。在 IE 中,地图被加载,当脚本被加载时,控制台有一个SCRIPT14: error -2147024882在线 1。除了地图上的多边形之外,一切都正确显示。.js 文件的结构是只有几个变量的声明。

var allPolys = [
    [
      //poly1 points
      [x1,y1],
      [x2,y2],
      ...
    ],
    [
      //next poly
      [x1,y1],
      ...
    ]
]

^^ 是每个多边形在 .js 中的定义方式。这是一个大小问题,因为所有点都在一个数组中吗?

映射代码:

            function drawPolys() {
                for (var i = 0; i < allTracts.length; i++) {
                    var tract = "new google.maps.Polygon({ strokeWeight: 0.7, path: [";
                    for (var j = 0; j < allTracts[i].length; j++)
                        tract += " new google.maps.LatLng(" + allTracts[i][j][0] + "," + allTracts[i][j][1] + "),";
                    tract = tract.substring(0, tract.length - 1) + "], map: map });";
                    eval(tract);
                }

                //this is all for other 'multipolygons' that are in some maps
                var colors = ['red', 'blue', 'green', 'orange', 'yellow', 'white'];

                for (var i = 0; i < multiPolys.length; i++) {
                    for (var j = 0; j < multiPolys[i].length; j++) {
                        var subTract = "new google.maps.Polygon({ strokeWeight: 1.5, strokeColor: '" + colors[i % colors.length] + "', fillColor: '" + colors[i % colors.length] + "', path: [";
                        for (var k = 0; k < multiPolys[i][j].length; k++)
                            subTract += " new google.maps.LatLng(" + multiPolys[i][j][k][0] + "," + multiPolys[i][j][k][1] + "),";
                        subTract = subTract.substring(0, subTract.length - 1) + "], map: map });";
                        eval(subTract);
                    }
                }
            }

在 Chrome 中,页面加载精美。

编辑:没有 eval() 的新映射函数

            function drawPolys() {
                for (var i = 0; i < allTracts.length; i++) {
                    var path = [];
                    for (var j = 0; j < allTracts[i].length; j++)
                        path.push(new google.maps.LatLng(allTracts[i][j][0],allTracts[i][j][1]));
                    new google.maps.Polygon({ strokeWeight: 0.7, path: path, map: map });
                }

                var colors = ['red', 'blue', 'green', 'orange', 'yellow', 'white'];

                for (var i = 0; i < multiPolys.length; i++) {
                    var path = [];
                    for (var j = 0; j < multiPolys[i].length; j++) {
                        path[j] = [];
                        for (var k = 0; k < multiPolys[i][j].length; k++)
                            path[j].push(new google.maps.LatLng(multiPolys[i][j][k][0],multiPolys[i][j][k][1]));
                    }
                    new google.maps.Polygon({ strokeWeight: 1.5, strokeColor: colors[i % colors.length], fillColor: colors[i % colors.length], paths: path, map: map });
                }
            }
4

2 回答 2

13

我相信我已经找到了这个错误的确切原因。

编辑:我相信这个错误是从 IE 10 开始修复的

我的测试表明,IE 将拒绝执行其中包含超过 2 16 -3 个数字的 Javascript 文件。所以,如果一个 .js 文件有65533个数字,IE 会执行它。但是如果它包含65534或更多的数字,你会得到 error −2147024882

我在这里提出了一个测试用例来演示这个问题:

http://ie-error-2147024882.s3.amazonaws.com/ie_error_-2147024882.html

我正在开发的网站从托管在 S3 上的 Javascript 文件加载大量 JSON 数据。起初我认为这是由于 IE 中的一些 Javascript 源文件大小限制。−2147024882但是一些测试表明,IE 可以处理比引发这个神秘错误的文件大得多的 .js 文件。

就我而言,解决方法是在生成 .js 文件时将整数和浮点数编码为字符串,并使用 parseInt 和 parseFloat 来解释它们。

于 2012-08-10T21:32:04.267 回答
2

就我的谷歌搜索而言,这似乎是一个“内存不足”问题:

“错误 -2147024882 没有足够的可用内存来执行操作。- MAPI_E_NOT_ENOUGH_MEMORY(Microsoft Exchange Server 信息存储)

检查你的循环长度(multiPolys 和 allTracts)

还要检查你的字符串长度和子长度,它们可能太长了

于 2012-08-06T18:46:06.743 回答