2016-02-11 2 views
0

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

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

EDIT:

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

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 \t \t = $_GET['t']; 
 
    $action \t \t = $_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) { 
 
\t 
 
echo "L.polygon(" . $row['coordinates'] . ") 
 
\t .addTo(drawnItems); 
 
\t //console.log(pol.options.id); 
 
"; 
 

 
}

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

+1

Зависит от того, в каком формате вы храните свои полигоны, и мы не можем сделать это из вашего очень короткого вопроса. Пожалуйста, прочтите следующее: http://stackoverflow.com/help/how-to-ask – iH8

+0

Прошу прощения за то, что вы недостаточно ясны. В моей базе данных я сохраняю все позиции по ширине и долготе многоугольных ручек, и у меня есть идентификатор для каждого полигона. Мой вопрос заключается в том, как я могу связать листовку и идентификатор mysql вместе, чтобы я мог указать базе данных, какой полигон удалить. Я использую AJAX для выполнения запроса. Может быть, ты поможешь мне сейчас? –

+0

Все еще зависит от того, как вы инициализируете свои полигоны и как их добавить на карту. Не могли бы вы отредактировать свой вопрос и добавить информацию, которую вы добавили в свой комментарий к ней, и включить соответствующий код о том, как вы добавляете полигоны на свою карту? Индивидуальные полигоны? FeatureLayer? GeoJSON? Слишком много переменных, чтобы дать хороший ответ – iH8

ответ

0

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

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(); 

    }); 

}); 

Сейчас на ServerSide, поймать параметр 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. Но, насколько я знаю, все должно быть хорошо. Удачи!

+0

Спасибо, это сработало! –

+0

Нет, спасибо, вы всегда приветствуете, вот что значит SO для :) Я бы хотел предупредить вас, я не знаю, будет ли это ваша фактическая реализация, это довольно небезопасно.Вам действительно нужна проверка правильности ввода и аутентификация на сервере, так как это можно легко злоупотреблять. Просто посещение url 'inc/send.php? A = delete & t = polygon & i = (угадайте некоторые идентификаторы)' потенциально удалит любой полигон. У злонамеренного пользователя будет полевой день – iH8

+0

Я знаю, я помещаю его в CMS (с безопасным входом, конечно), где только некоторые пользователи будут иметь право редактировать/удалять полигоны/полилинии/и т. Д. –

Смежные вопросы