无法使用传单动态添加标记

Cannot add marker dynamically with leaflet

我正在使用 Leafletjs 库为我的应用程序创建可视化销售模块。我可以使用 OnMapClick 事件添加标记,但不能使用来自服务的数据。

    function onMapClick(e) {

        var newPosition = e.latlng;
        var field = GetFieldInfo();
        if (field) {
            if (bounds.contains(newPosition)) {

                AddMarkerToMap(e.latlng.lat, e.latlng.lng, field);

            }
        }
    }

在 AddMarkerToMap 函数中在地图上添加标记。

    function AddMarkerToMap(_lat, _lng, field) {

        var lat = JSON.parse(_lat);
        var lng = JSON.parse(_lng);
        var geojsonFeature = {
            "type": "Feature",
            "properties": {},
            "geometry": {
                "type": "Point",
                "coordinates": [lat, lng]
            }
        }

        var newMarker;

        L.geoJson(geojsonFeature, {

            pointToLayer: function (feature, latlng) {

                newMarker = CreateMarker(lat, lng, field);

                return newMarker;
            }
        }).addTo(map);

        var lastValidPosition;
        newMarker.on("drag", function (event) {
            var latLng = newMarker.getLatLng();
            if (bounds.contains(latLng)) {
                lastValidPosition = latLng;
            } else {
                if (lastValidPosition) {
                    newMarker.setLatLng(lastValidPosition);
                }
            }
        }, newMarker);
        var popupContent = CreatePopupContent(field);
        newMarker.bindPopup(popupContent);

        newMarker.on("popupopen", onPopupOpen);
    }


    function CreateMarker(lat, lng, field) {
        var position = [lat, lng];
        var newMarker;

            newMarker = new customFieldMarker(position, {
                icon: L.icon({
                    iconUrl: 'Sources/css/images/Outside-Chartreuse.png',
                    iconSize: [48, 48], // size of the icon
                    iconAnchor: [24, 48], // point of the icon which will correspond to marker's location
                    popupAnchor: [0, -48],
                }),

                draggable: "true",
                options: {
                    field: field
                }
            });

        return newMarker;
    }

在我的代码中,field 是一个来自 OData 服务的 JSON 对象,它包含先前保存的标记的经纬度信息。为什么动态添加的标记没有显示在地图上?

有些事情在这里没有太大意义:

  1. 由于您使用服务来加载功能,因此您应该在服务中定义相关事件,因为它是异步的并且没有 return.
  2. addTo(map) 应在创建标记后应用。默认的 pointToLayer 回调只提供了一个选项,可以利用要素属性和几何图形来创建类似信息窗口,您不应该将它用于 return 标记。解决方法如下面的代码所示——您只需将其视为 xhr 调用并获取数据,然后使用 if 仅获取数据,然后使用响应进行可视化。但更好的方法是使用本机 XHR 调用或 Ajax 调用来获取数据,然后使用您的 addMarker 函数。

function AddMarkerToMap(lat, lng, field) {

  var newMarker = CreateMarker(lat, lng, field);

  newMarker.addTo(map);

  var lastValidPosition;
  newMarker.on("drag", function(event) {
    var latLng = newMarker.getLatLng();
    if (bounds.contains(latLng)) {
      lastValidPosition = latLng;
    } else {
      if (lastValidPosition) {
        newMarker.setLatLng(lastValidPosition);
      }
    }
  }, newMarker);
  var popupContent = CreatePopupContent(field);
  newMarker.bindPopup(popupContent);

  newMarker.on("popupopen", onPopupOpen);

  return newMarker;

}

function LoadFields() {

    var selectedFloor = $("#cmbFloors").val();
    if (selectedFloor && selectedFloor !== "0") {
      var serviceURL = "http://localhost/VisualSalesModuleWeb/FakeOrganizationData.svc";
      var ODataURL = serviceURL + "/ProductSet?$format=json&$filter=new_projectfloorid eq guid'" + selectedFloor + "'";

      $.ajax({
        type: "GET",
        url: ODataURL,
        dataType: 'json',
        async: false,
        contentType: "application/json; charset=utf-8",
        beforeSend: function(XMLHttpRequest) {
          //ShowDialog();
          XMLHttpRequest.setRequestHeader("Accept", "application/json");
        },
        success: function(data, textStatus, XmlHttpRequest) {
          var fields = data.value;

          for (var i = 0; i < fields.length; i++) {
            var field = fields[i];
            var lat = JSON.parse(field.Lattitude);
            var lng = JSON.parse(field.Longitude);
            AddMarkerToMap(lat, lng, field);
          }
        },
        error: function(XmlHttpRequest, textStatus, errorObject) {
          alert("OData Execution Error Occurred");
        },
        complete: function() {
          //HideDialog();
        }
      });
    }
    function GetAllMarkers() {

        var allMarkersObjArray = [];
        var allMarkersGeoJsonArray = [];

        $.each(map._layers, function (ml) {
            //console.log(map._layers)
            if (map._layers[ml].feature) {

                allMarkersObjArray.push(this)
                allMarkersGeoJsonArray.push(JSON.stringify(this.toGeoJSON()))
            }
        })
      
        return allMarkersObjArray;
    }