根据两个相同的对象划分数组中的对象,这将是新数组中的第一个和最后一个

Dividing objects in array, according to two identical objects, which will be first and last in new array

提问人:MarcinC 提问时间:11/5/2023 更新时间:11/5/2023 访问量:77

问:

我需要帮助。我在 Javascript 中的数组有问题。我有对象数组,它表示地图上绘图区域的对应关系,但有多多边形。

下面是给出的示例数组:

Array(884) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, … ]
​
0: Object { lat: 54.625115217034, lng: -1.230014164405 }
1: Object { lat: 54.62510382394, lng: -1.2299049064841 }
2: Object { lat: 54.625112383301, lng: -1.2300137052116 }

...还有很多

要形成多边形,需要有重复的对象作为多边形的开始和结束。在这个数组中,有时有很多这种情况,我需要将它们分开才能在地图上绘制许多多边形,而不是一个只有单行的多边形,这导致了这种情况: (https://i.stack.imgur.com/8bvex.png)

代码如下:

 var data = [];

        @foreach ($coordinates as $item)
            data.push({
                lat: {{ $item['lat'] }},
                lng: {{ $item['lng'] }}
            });
        @endforeach

        var flightPlanCoordinates = data;
    
        var flightPath = new google.maps.Polygon({
            path: flightPlanCoordinates,
            geodesic: true,
            strokeColor: '#FF0000',
            fillColor: '#FF0000',
            strokeWeight: 3,
            strokeOpacity: 0.8
        });

        var bounds = new google.maps.LatLngBounds();
        flightPath.getPath().forEach(function(e) {
            bounds.extend(e);
        })
        map.fitBounds(bounds);

        flightPath.setMap(map);

我尝试了很多次迭代数组的方式,如果一个元素有重复项,则循环将停止并将项目添加到其他数组中,循环将嵌套设置为第一个并添加下一个项目,直到找到新第一个项目的下一个副本。

JavaScript 循环 google-maps 对象

评论


答:

0赞 Gesuele Russello 11/5/2023 #1

你可能已经尝试过这个,但只是为了确保我理解你想实现的目标。 你有一个坐标列表,理想情况下,在某个时候你应该有一个闭环,它应该创建一个多边形,例如,为了简化我使用的字母的坐标,假设你的列表应该是这样的: {A、B、C、F、G、A、H、K、L、M、H} 这个列表应该创建两个多边形,一个用于 A 环,一个用于 H 环,对吗? 我所做的另一个假设是第一项将有一个闭环,或者所有事物都只是一个多边形。

如果是这种情况,您的方法应该按以下顺序编写,这是一个我没有测试过的粗略脚本,但它会让你了解如何做到这一点

var newPolygon = 1; -set a flag every time you need to start a new polygon
var data;
var startLat;
var startLng;
@foreach ($coordinates as $item)
  if(newPolygon){
     data= [];
     newPolygon = 0;
     var startLat = $item['lat'];
     var startLng = $item['lng'];

        data.push({
            lat: {{ $item['lat'] }},
            lng: {{ $item['lng'] }}
        });
  }
  else{
        data.push({
            lat: {{ $item['lat'] }},
            lng: {{ $item['lng'] }}
        });
      if (startLat == $item['lat'] and startLng == $item['lng']){
         newPolygon = 0;

    var flightPlanCoordinates = data;

    var flightPath = new google.maps.Polygon({
        path: flightPlanCoordinates,
        geodesic: true,
        strokeColor: '#FF0000',
        fillColor: '#FF0000',
        strokeWeight: 3,
        strokeOpacity: 0.8
    });

    var bounds = new google.maps.LatLngBounds();
    flightPath.getPath().forEach(function(e) {
        bounds.extend(e);
    })
    map.fitBounds(bounds);

    flightPath.setMap(map);
    }
  }

@endforeach

评论

0赞 MarcinC 11/5/2023
感谢您的回答:)我需要做的是通过给定数组在地图上绘制区域,该数组包含具有坐标的对象。$coordinates数组如下所示: array:7244 [▼ 0 => array:2 [▼ “lat” => “53.14054895658” “lng” => “-4.4064610371935” ] ...当我得到数组时,当第一个和最后一个坐标相同时,它就会起作用,因为画线不会超出区域或进入区域,而是在给定的坐标中(在第一个重复之后,下一个先出现,直到它的重复出现等)多边形更多。在地图上绘制所有内容,就像在我添加的打印屏幕上一样。
0赞 Gesuele Russello 11/5/2023
试试我的代码,但它需要一些返工来适应你的代码,看到结果并看看我是否能帮助你会很有趣
1赞 MarcinC 11/6/2023
谢谢,很棒的解决方案。现在,我只添加了一些小的调整。当它们被赋予多个多边形时,它们在地图上单独绘制,而不会相互干扰。只有当给定一个多边形的数组时,才会根据一个 lat i lang 对象在地图上检查一个点,但它们没有相互连接,绘制区域,就像它们是多多边形时一样。