Идентификация полигона для удаления

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

заранее спасибо

РЕДАКТИРОВАТЬ:

В моей базе данных я сохраняю polygon_ID и координаты полигона. Это код, в котором я сохраняю многоугольник: (это срабатывает, когда я заканчиваю рисовать многоугольник)

map.on('draw:created', function(e) {
  var type = e.layerType,
    layer = e.layer;

  if (type == "polygon") {

    var polygon = {};
    polygon['geometry'] = {};
    polygon['geometry']['type'] = "Polygon";

    var coordinates = [];
    latlngs = layer.getLatLngs();
    for (var i = 0; i < latlngs.length; i++) {

      coordinates.push([latlngs[i].lat, latlngs[i].lng])

    }

    polygon['geometry']['coordinates'] = [coordinates];

    coordinates = JSON.stringify(coordinates);

    //console.log(coordinates);

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (xhttp.readyState == 4 && xhttp.status == 200) {
        //alert("Sent!");
      }
    };
    xhttp.open("POST", "inc/send.php?a=add&t=polygon&c=" + coordinates, true);
    xhttp.send();

  }

  drawnItems.addLayer(layer);

});

Это мой send.php:

if(isset($_GET['c']) && isset($_GET['t']) && isset($_GET['a'])){

  $coordinates = $_GET['c'];
  $type		 = $_GET['t'];
  $action		 = $_GET['a'];

  if($type == "polygon" && $action == "add"){

    $sth = $dbh->prepare('INSERT INTO polygons (coordinates) VALUES (:coordinates)');
    $sth->bindParam(':coordinates', $coordinates);
    $sth->execute();

  }

} else {



}

Вот как я загружаю свои полигоны:

$polygonsth = $dbh->prepare("SELECT * FROM polygons");
$polygonsth->execute();
$polygonresult = $polygonsth->fetchAll();

...

foreach ($polygonresult as $row) {
	
echo "L.polygon(" . $row['coordinates'] . ")
	.addTo(drawnItems);
	//console.log(pol.options.id);
";

}

Я действительно надеюсь, что это проясняет ситуацию.


person Jeroen Steinfort    schedule 11.02.2016    source источник
comment
Зависит от того, в каком формате вы храните свои полигоны, и мы не можем решить это из вашего очень короткого вопроса. Прочтите это: stackoverflow.com/help/how-to-ask   -  person iH8    schedule 11.02.2016
comment
Я извиняюсь за то, что был недостаточно ясен. В моей базе данных я храню все позиции широты и долготы ручек многоугольника, и у меня есть идентификатор для каждого многоугольника. Мой вопрос заключается в том, как я могу связать листовку и идентификатор mysql вместе, чтобы я мог сообщить базе данных, какой полигон удалить. Я использую AJAX для выполнения запроса. Может быть, вы могли бы помочь мне сейчас?   -  person Jeroen Steinfort    schedule 12.02.2016
comment
Все еще зависит от того, как вы инициализируете свои полигоны и как вы добавляете их на карту. Не могли бы вы отредактировать свой вопрос и добавить к нему информацию, которую вы указали в своем комментарии, и включить соответствующий код о том, как вы добавляете полигоны на свою карту? Отдельные полигоны? FeatureLayer? ГеоJSON? Слишком много переменных, чтобы дать хороший ответ   -  person iH8    schedule 12.02.2016
comment
я отредактировал свой вопрос   -  person Jeroen Steinfort    schedule 15.02.2016
comment
Да, идеально. Я попробую ответить позже сегодня, когда у меня будет немного времени. Спасибо!   -  person iH8    schedule 15.02.2016


Ответы (1)


Вы можете передать идентификатор своему экземпляру полигона в качестве параметра опции:

foreach ($polygonresult as $row) {

    echo "L.polygon(" . $row['coordinates'] . ", { id: " . $row['id'] . "}).addTo(drawnItems);";

}

Теперь, когда вы удаляете полигоны из слоя drawnItems, перехватывайте и обрабатывайте событие draw:deleted. Он возвращает L.LayerGroup, который вы можете повторить для обработки удаленных полигонов:

map.on('draw:deleted', function (e) {

    var layers = e.layers;

    layers.eachLayer(function (layer) {

        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
            if (xhttp.readyState == 4 && xhttp.status == 200) {
                //alert("Deleted!");
            }
        };
        xhttp.open("POST", "inc/send.php?a=delete&t=polygon&i=" + layer.options.id, true);
        xhttp.send();

    });

});

Теперь на стороне сервера ловим параметр GET для i и удаляем полигон из базы данных:

if(isset($_GET['i']) && isset($_GET['t']) && isset($_GET['a'])){

    $id = $_GET['i'];
    $type = $_GET['t'];
    $action = $_GET['a'];

    if ($type == "polygon" && $action == "delete") {

        $sth = $dbh->prepare('DELETE FROM polygons WHERE id = :id');
        $sth->bindParam(':id', $id);
        $sth->execute();

    }

}

Вот и все. Имейте в виду, отказ от ответственности: я не могу протестировать его, поэтому мне пришлось от руки, и прошло много времени с тех пор, как я сделал PHP. Но насколько я знаю, должно быть нормально. Удачи!

person iH8    schedule 15.02.2016
comment
Нет, спасибо, всегда пожалуйста, это то, для чего предназначен SO :) Я хотел бы предупредить вас, хотя я не знаю, будет ли это вашей фактической реализацией, это довольно небезопасно. Вам действительно понадобится некоторая проверка ввода и аутентификация на стороне сервера, потому что этим можно легко злоупотребить. Простое посещение URL-адреса inc/send.php?a=delete&t=polygon&i=(guess some id's) может привести к удалению любого полигона. У злонамеренного пользователя будет день поля - person iH8; 15.02.2016
comment
Я знаю, я помещаю его в CMS (конечно, с безопасным входом в систему), где только определенные пользователи будут иметь право редактировать/удалять полигоны/полилинии/и т. д. - person Jeroen Steinfort; 16.02.2016