【问题标题】:Creating Radar Map on Google Maps JavaScript API在 Google Maps JavaScript API 上创建雷达地图
【发布时间】:2021-07-03 12:08:45
【问题描述】:

我有来自雷达层 API 的响应数据,如下所示:

{
 "Date": "2020-04-18T04:00:05+03:00",
 "Source": 2,
 "Kml": [
  {
  "Polygons": [
    {
      "Polygon": [
        { "Cordinates": [25.8409, 51.6199] },
        { "Cordinates": [25.8341541, 51.619873] },
        { "Cordinates": [25.834177, 51.61238] },
        { "Cordinates": [25.8308582, 51.5936356] },
        { "Cordinates": [25.8275185, 51.5823822] }
        ....
        ....
      ]
    }
  ],
  "Color": "#47C247"
 },
 {
  "Polygons": [
    {
      "Polygon": [
        { "Cordinates": [26.1740189, 50.5239372] },
        { "Cordinates": [26.1841354, 50.5238838] },
        { "Cordinates": [26.1909122, 50.53136] },
        { "Cordinates": [26.1977215, 50.5463562] }
        ....
        ....
      ]
    }
  ],
  "Color": "#47C247"
 },
 ...
 ...

我想使用这些数据创建一个雷达地图。

我尝试使用每个数据创建多边形,并创建了一个设置间隔函数来循环每个多边形 250 毫秒,以便它充当动画。

setInterval(() => {
        deleteAllShape();
                // console.log(data);
                data.Kml.map((polygons) => {
                    const shape = polygons.Polygons.map((polygon) => {
                        const newMapData = [];
                        polygon.Polygon.map((obj) => {
                            const path = { lat: obj.Cordinates[0], lng: 
                                   obj.Cordinates[1] };
                                 newMapData.push(path);
                        });
                        poly = new google.maps.Polygon({
                            paths: newMapData,
                            strokeColor: polygons.Color,
                            strokeOpacity: 0.8,
                            strokeWeight: 0,
                            fillColor: polygons.Color,
                            fillOpacity: 0.35,
                            draggable: false,
                            editable: false,
                        });
                        poly.setMap(map);
                        allPolygons.push(poly);
                    });
                });
    },250)
    function deleteAllShape() {
      poly = null;
      for (let i = 0; i < allPolygons.length; i++) {
          allPolygons[i].setMap(null);
           }
       }

这在很大程度上是有效的。但问题是地图和浏览器在创建一些多边形后速度变慢并挂起。

当我研究了几张雷达图(例如:windy.com)时:-

我发现他们正在地图上渲染图像。我的问题是如何使用上述数据创建图像并创建雷达图?

【问题讨论】:

  • “地图和浏览器在创建一些多边形后变慢并挂起” - 你的 javascript 在创建多边形时看起来像什么?请将其添加到您的问题中。我怀疑“在每个多边形中循环 250 毫秒的设置间隔函数”会导致速度变慢。
  • @duncan 我在问题中添加了我的代码的 setInterval 部分。我认为可能会发生一些内存泄漏,导致地图挂起。但根据我的研究,多边形不用于创建雷达图,图像作为图层用于创建雷达图。请提供最合适的解决方案以获得更好的性能。
  • 尝试在每个间隔之后将allPolygons 中的多边形总数打印到控制台,我认为它们仍然存在,并且在每个新间隔上,将它们与地图取消链接的for 有处理它们。

标签: javascript node.js google-maps


【解决方案1】:

这可能无法回答您的问题,因为我不清楚您要对图像而不是多边形做什么。但是,它可能会加快速度。

目前,您每 250 毫秒循环一次 allPolygons,以防止所有先前的多边形出现在地图上。 然后绘制一个新多边形,并将其添加到 allPolygons 中,以便在 250 毫秒内的下一次迭代中将其删除。没关系。

但是,随着多边形数量的增加,您每次都会增加 for 循环的大小:

for (let i = 0; i < allPolygons.length; i++) {

因此,当您绘制更多多边形时,它会逐渐变慢。您没有说要添加多少个多边形,但我猜应该很多。

相反,您需要做的就是隐藏最近创建的多边形。 allPolygons 中之前的所有多边形都已被隐藏,因此您无需在每个多边形上调用 setMap(null),因为它只是尚未设置为 null 的最新多边形。

可能是这样的:

function deleteAllShape() {
    allPolygons[allPolygons.length - 1].setMap(null);
}

或者,只是这样,如果您不需要 allPolygons 做其他任何事情,则不必将它们存储在该数组中。

poly.setMap(null);

另外,不要创建poly 然后调用poly.setMap(map);,而是这样做

poly = new google.maps.Polygon({
    paths: newMapData,
    strokeColor: polygons.Color,
    strokeOpacity: 0.8,
    strokeWeight: 0,
    fillColor: polygons.Color,
    fillOpacity: 0.35,
    draggable: false,
    editable: false,
    map
});

【讨论】:

  • 感谢您抽出时间详细解答。问题就像你和 Germanio 说的,allPolygons 数组一直在增加。但不幸的是,您提供的代码不起作用。因此,我尝试在每个间隔后强制清空数组,它运行良好,没有任何挂起或减速。感谢您的提示。
猜你喜欢
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2015-09-25
  • 2020-01-26
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
相关资源
最近更新 更多