Почему я получаю сообщение об ошибке «объект не поддерживает метод» при попытке ограничить границы слоя Leaflet JS в пределах указанной области? - PullRequest
0 голосов
/ 28 апреля 2020

Я знаю, как назначить слои Leaflet JS и редактировать их ... но я не хочу, чтобы это было go вне границ всей карты (как показано на рисунке ниже):

enter image description here

Я хочу, чтобы изображение оставалось в максимальных пределах, как показано на этом изображении из этой демонстрации Codepen (https://codepen.io/mikila85/pen/dNwpxM?editors=0010):

enter image description here

Я пытался скопировать код из CodePen в Plunkr, но я получаю сообщение об ошибке, показанное ниже: enter image description here

Вот мой код Plunkr (https://plnkr.co/edit/HP4C5PAWHX9T5G9j?open=lib%2Fscript.js); Я думаю, что это происходит из исходных файлов (в файле html, а не в файле js), но я не знаю, что я делаю неправильно:

<!DOCTYPE html>
<html> 
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width", initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">


    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css">
    <script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js"></script>
    <script src="https://npmcdn.com/leaflet.path.drag@0.0.5/src/Path.Drag.js"></script>
    <script src='https://leaflet.github.io/Leaflet.Editable/src/Leaflet.Editable.js'></script>  

</head>

<body>
    <div id="map"></div>
    <!-- <script src="lib/script.js"></script> -->
</body>

<script>
  var startPoint = [0, 0];
var map = L.map('map', {
  editable: true,
  maxBounds: [
    [-90, -180],
    [90, 180]
  ]
}).setView(startPoint, 0);

L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
  noWrap: true,
  bounds: [
    [-90, -180],
    [90, 180]
  ]
}).addTo(map);

// create custom vertex marker editor
var vertexMarkerClass = L.Editable.VertexMarker.extend({
  onDrag: function(e) {
    e.vertex = this;
    var iconPos = L.DomUtil.getPosition(this._icon),
      latlng = this._map.layerPointToLatLng(iconPos);

    // fix out of range vertex
    if (latlng.lng < -180) {
      e.latlng.lng = latlng.lng = -180;
      this.setLatLng(latlng);
    }
    if (latlng.lng > 180) {
      e.latlng.lng = latlng.lng = 180;
      this.setLatLng(latlng);
    }

    this.editor.onVertexMarkerDrag(e);

    this.latlng.update(latlng);
    this._latlng = this.latlng; // Push back to Leaflet our reference.
    this.editor.refresh();
    if (this.middleMarker) this.middleMarker.updateLatLng();
    var next = this.getNext();
    if (next && next.middleMarker) next.middleMarker.updateLatLng();
  }
});

// attach custom editor
map.editTools.options.vertexMarkerClass = vertexMarkerClass;

var rec = L.rectangle([
  [50, 50],
  [-50, -50]
]).addTo(map).enableEdit();

rec.on('dblclick', L.DomEvent.stop).on('dblclick', rec.toggleEdit);
</script>
</html>

1 Ответ

0 голосов
/ 28 апреля 2020

вы определяете rec переменную как editLayer, а не как прямоугольник.

Измените свой код на:

var rec = L.rectangle([
  [50, 50],
  [-50, -50]
]).addTo(map);
rec.enableEdit();
rec.on('click',function(e){console.log(e)});

Обновление: карта также не отображается из-за отсутствия ширины и высоты определяется в css.

#map{
  width: 500px;
  height: 500px;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...