【问题标题】:Identifying the polygon to delete识别要删除的多边形
【发布时间】:2016-02-11 18:48:24
【问题描述】:

我想知道如何在传单(.draw) 中为多边形提供(和检索)ID。我需要这个,因为我希望能够告诉数据库要删除/编辑哪个多边形。

提前致谢

编辑:

在我的数据库中,我保存了一个 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);
";

}

我真的希望这能澄清一些事情。

【问题讨论】:

  • 取决于您存储多边形的格式,我们无法从您的简短问题中弥补这一点。请阅读:stackoverflow.com/help/how-to-ask
  • 很抱歉不够清楚。在我的数据库中,我存储了多边形手柄的所有纬度和经度位置,并且我拥有每个多边形的 ID。我的问题是如何将传单和 mysql ID 链接在一起,以便我可以告诉数据库要删除哪个多边形。我使用 AJAX 来执行查询。也许你现在可以帮助我?
  • 仍然取决于您如何初始化多边形以及将它们添加到地图的方式。您能否编辑您的问题并添加您在评论中添加的信息,并包含有关如何将多边形添加到地图的相关代码?单个多边形?特征层?地理JSON?变量太多,无法给出好的答案
  • 我编辑了我的问题
  • 是的,完美。当我有时间时,我会在今天晚些时候回答。谢谢!

标签: javascript php mysql leaflet leaflet.draw


【解决方案1】:

您可以将 ID 作为选项参数传递给您的多边形实例:

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

    });

});

现在在服务器端,捕获iGET 参数并从数据库中删除多边形:

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 以来已经很长时间了。但据我所知,应该没问题。祝你好运!

【讨论】:

  • 不,谢谢,不客气,这就是 SO 的意思 :) 我想警告你,我不知道这是否会成为你的实际实现相当不安全。您确实需要在服务器端进行一些输入验证和身份验证,因为这样很容易被滥用。只需访问 url inc/send.php?a=delete&amp;t=polygon&amp;i=(guess some id's) 就可能会删除任何多边形。恶意用户将有一个现场日
  • 我知道,我将其放入 CMS(当然需要安全登录),只有特定用户有权编辑/删除多边形/折线/等。
猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2015-01-16
  • 1970-01-01
  • 2017-06-15
  • 2010-11-21
相关资源
最近更新 更多