Я начинающий, поэтому у меня сложный проект. У меня есть карта, которая обновляется каждые 10 секунд, и кнопка, которая генерирует координаты, время и событие (маркер) для каждого идентификатора. Когда я нажимаю эту кнопку в первый раз, новые данные генерируются для нечетных идентификаторов, когда я нажимаю ее второй раз, они генерируются для четных идентификаторов.

Аякс:

function callAjax() {
        console.log('ajax');
        $.ajax({
            url: '/device_new',
            type: 'GET',
            dataType: 'json',
            success: function(data) {
                var coordinates = data;

                markerLayer.clearLayers();

                for (var i = 0; i < coordinates.length; i++) {
                    var icon = getMarkerType(coordinates[i].event);
                    if (coordinates[i].x && coordinates[i].y) {

                        marker = L.marker([coordinates[i].x, coordinates[i].y], {
                                icon: icon
                            })

                            .bindPopup("Device ID: " + coordinates[i].deviceId + '<br>' + "Time: " + coordinates[i].datetime);

                        marker.addTo(markerLayer).addTo(map);
                    }
                }
                map.fitBounds(markerLayer.getBounds(), { padding: [50, 50] });
            },
        });
        setTimeout(callAjax, 10000);
    }

Обновить скрипт:

function updatedev() {
        $.ajax({
            //the route pointing to the post function
            url: '/device/update/',
            data: {
                id: updateDeviceNew
            },
            type: 'GET',
            // remind that 'data' is the response of the AjaxController
            success: function(data) {
                updateDeviceNew++;
            },
        });
    }

Контроллер:

public function update(Request $request)
{
    $value =$request->id;

    $number=Device_new::get()->count();


    //while i < broj zapisa u tabeli $device_new = Device_new::where('deviceId',1)->update(['x' => $x, 'y' => $y, 'datetime' => $datetime]); prvi put za neparne drugi put za poarne itd
    if($value%2!=0)
    $i=1;
    else
    $i=2; 
    for ($i; $i<=$broj; $i+=2){
        $x = rand(44450000, 45000000) / 1000000;
        $y = rand(16400000, 17900000) / 1000000;
        $event=rand(1,4);
        $datetime = new Carbon('now','Europe/Belgrade');


        $device_new = Device_new::where('deviceId',$i)->update(['x' => $x, 'y' => $y, 'datetime' => $datetime, 'event' => $event]);
    }
    return $number;
}

Как вы можете видеть в callAjax (), есть команда markerLayer.clearLayers();, которая удаляет слой с маркерами, а в конце цикла снова создает слой. Это проблема для меня, потому что он обновляет карту и снова пишет новые и старые маркеры.

Можно ли как-то помешать переписать неизмененные маркеры?

0
goran_bl 20 Дек 2019 в 17:23

1 ответ

Вы добавляете каждый новый слой как на markerLayer, так и на карту. Очистка слоев от markerLayer не удаляет их с карты. Предлагаю не добавлять их на карту, поэтому измените

marker.addTo(markerLayer).addTo(map);

К

marker.addTo(markerLayer);

Добавив markerLayer на карту один раз.

1
peeebeee 22 Дек 2019 в 00:30