Не удается заставить resetStyle работать в листе ngx - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь сделать что-то подобное в Angular6 с помощью ngx-leaflet, как описано здесь: https://leafletjs.com/examples/choropleth/

Я уже могу показать всплывающее окно по умолчанию и изменить стиль onmouseover, но могу '*

Я загружаю несколько наборов данных GeoJSON и добавляю их как отдельные слои, используя универсальную функцию.С этими слоями я хочу изменить стиль «onmouseover» и сбросить его «onmouseout», и когда я нажимаю на эту функцию, я хочу показать диаграмму в div в правом верхнем углу моей страницы.Также в моем коде не работает событие click.

Моя общая функция для получения данных GeoJSON из моего бэкэнда:

private loadGeoJsonDataSet(path: string, dataset: string, geometryType: string, layerName: string, fitBounds: boolean): void {
  this.mapService.getGeoJson(path, dataset).pipe(first()).subscribe(json => {
    // Create layer and add to map:
    const geoJsonLayer = L.Proj.geoJson(null, {
        // onEachFeature: (feature, layer) => {
        //   layer.bindPopup('<h5> Test:' + feature.properties.gid + '</h5>');
        // },
        onEachFeature: this.onEachFeature.bind(this),
        attribution: 'CloudHydro'
      }
    ).addTo(this.map);

    // Set options:
    switch (geometryType) {
      case 'point': {
        geoJsonLayer.options.style = this.getPointStyle;
        geoJsonLayer.options.pointToLayer = (feature, latlng) => {
          return L.circleMarker(latlng, this.circleMarkerOptions);
        };
        break;
      }
      case 'polyline': {
        geoJsonLayer.options.style = this.getPolylineStyle;
        break;
      }
      case 'polygon': {
        geoJsonLayer.options.style = this.getPolygonStyle;
        break;
      }
      default: {
        geoJsonLayer.options.style = this.getPolygonStyle;
        break;
      }
    }
    // Add data to the layer:
    geoJsonLayer.addData(json);
    // Add layer to the layer control:
    this.layersControl.overlays[layerName] = geoJsonLayer;
    if (fitBounds) {
      this.map.flyToBounds(geoJsonLayer.getBounds());
      this.map.fitBounds(geoJsonLayer.getBounds());
    }
  });
}

Мои функции onEachFeature и style:

private highlightFeature(e) {
  const layer = e.target; 
  layer.setStyle({
    weight: 3, color: '#333',
  });
  if (!L.Browser.ie && !L.Browser.opera12) {
    layer.bringToFront();
  }
}

private resetHighlight(e) {
  const layer = e.target;
  --> Not working: layer.resetStyle(layer);
}

private clickedOnFeature(feature, layer) {
  --> Not working: console.log('In clickedOnFeature', feature);
}

private onEachFeature(feature, layer) {
  layer.bindPopup('<h5> GID:' + feature.properties.gid + '</h5>');
  layer.on({
    mouseover: this.highlightFeature,
    mouseout: this.resetHighlight,
    click: this.clickedOnFeature(feature, layer)
  });
}

Любая помощь будет очень признательна.Преобразование примеров из leafletjs.com в Angular + ngx-leaflet также поможет таким новичкам, как я.

1 Ответ

0 голосов
/ 12 октября 2018

Я сам нашел решение:

this.mapService.getGeoJson(path, dataset).pipe(first()).subscribe(json => {
  // Create layer and add to map:
  const geoJsonLayer = L.Proj.geoJson(null, {
      onEachFeature: (feature, layer) => {
        // Create popup with all properties of the layer:
        let popupContent = '<h5>' + layerName + '</h5><p style="width: 100%; line-height: 1.5;">';
        for (const key in feature.properties) {
          popupContent += '<b style="min-width:25%; margin-right: 5px; display: block; float: left;">' + key + '</b>' +
            '<span>' + feature.properties[key] + '</span><br>';
        }
        popupContent += '</p>';
        layer.bindPopup(popupContent, {minWidth: 250, maxWidth: 400});
        layer.on('mouseover', (e) => this.highlightFeature(e));
        layer.on('mouseout', (e) => geoJsonLayer.resetStyle(e.target));
        layer.on('click', () => this.selectedFeature(feature));
      },
      attribution: layerName + ' &copy; CloudHydro'
    }
  ).addTo(this.map);

Хитрость заключается в том, чтобы не использовать отдельную функцию для onEachFeature, а создать встроенную функцию.Затем у вас есть доступ к geoJsonLayer объекту, который необходим с resetStyle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...