提问人:MarcinC 提问时间:11/5/2023 更新时间:11/5/2023 访问量:77
根据两个相同的对象划分数组中的对象,这将是新数组中的第一个和最后一个
Dividing objects in array, according to two identical objects, which will be first and last in new array
问:
我需要帮助。我在 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);
我尝试了很多次迭代数组的方式,如果一个元素有重复项,则循环将停止并将项目添加到其他数组中,循环将嵌套设置为第一个并添加下一个项目,直到找到新第一个项目的下一个副本。
答:
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 对象在地图上检查一个点,但它们没有相互连接,绘制区域,就像它们是多多边形时一样。
评论