简体   繁体   English

将事件点击添加到标记openlayers中

[英]Add event click into marker openlayers

Good day, I'm trying to add events to dynamically programmed markers on a map. 美好的一天,我正在尝试将事件添加到地图上动态编程的标记中。 The markers do show on the screen but when you click to show a div, instead of just showing the div related to the bookmark, activate the event click on all the div on the screen. 标记确实会显示在屏幕上,但是当您单击以显示div而不是仅显示与书签相关的div时,请单击屏幕上的所有div来激活事件。

Where the marker is created is when invoking the function crearMarcadores and send the coordinates and the variable cc to use for the id of the div. 创建标记的位置是在调用函数crearMarcadores并发送坐标和变量cc以用于div的ID时。

var centro = ol.extent.getCenter(boundingBox);
crearMarcadores(centro, cc);

The divs if you create them correctly, as I understand it must be a div for each marker. 如果您正确创建了div,就我所知,每个标记必须是一个div。

And where I'm almost sure is my mistake is in: 我几乎可以确定的地方是:

  var feature = map.forEachFeatureAtPixel(evt.pixel,
        function(feature, layer) {
            return feature;
  });

Since it executes a foreach, and should only return the marker feature. 由于它执行了foreach,因此只应返回标记功能。 But I do not know how to run it only in the current marker. 但是我不知道如何仅在当前标记中运行它。 Although all the examples I have found are with foreach. 尽管我发现的所有示例都与foreach有关。

For your valuable help, thank you very much. 对于您的宝贵帮助,非常感谢。

  var iconFeature = new ol.Feature({ geometry: new ol.geom.Point([-90.204114, 13.866291]), name: 'nombre', population: 4000, rainfall: 500 }); var iconStyle = new ol.style.Style({ image: new ol.style.Icon( /** @type {olx.style.IconOptions} */ ({ anchor: [0.5, 46], anchorXUnits: 'fraction', anchorYUnits: 'pixels', opacity: 0.75, src: 'http://openlayers.org/en/v3.9.0/examples/data/icon.png' })) }); iconFeature.setStyle(iconStyle); var vectorSource = new ol.source.Vector({ features: [iconFeature] }); var vectorLayer = new ol.layer.Vector({ source: vectorSource }); var layer = new ol.layer.Vector({ /*layer con los poligonos*/ source: new ol.source.Vector() }) function crearMarcadores(centroPoligono, CentroCosto) { var iconFeature = new ol.Feature({ geometry: new ol.geom.Point(centroPoligono), name: CentroCosto, population: 4000, rainfall: 500 }); vectorSource.addFeature(iconFeature); iconFeature.setStyle(iconStyle); //------------start creation popup var div = document.createElement('div'); div.setAttribute("id", CentroCosto); div.setAttribute("style", "width: 580px; height: 400px; float: left"); document.body.appendChild(div); var element = document.getElementById(CentroCosto); var popup = new ol.Overlay({ element: element, positioning: 'bottom-center', stopEvent: false }); map.addOverlay(popup); //------------end creation popup // --------------display popup on click map.on('click', function(evt) { var feature = map.forEachFeatureAtPixel(evt.pixel, function(feature, layer) { return feature; }); if (feature) { var geometry = feature.getGeometry(); var coord = geometry.getCoordinates(); popup.setPosition(coord); $(element).popover({ 'placement': 'top', 'html': true, 'content': feature.get('name') }); $(element).popover('show'); } else { $(element).popover('destroy'); } }); //---------------end display popup on click } //termina funcion crearMarcadores function generarMapas() { var FechaInicial = ''; var FechaFinal = ''; var Finca = ''; $.ajax({ type: "POST", url: "FrmMapaAvanceRiego.aspx\\/FillMapas", data: '{FechaInicial: "' + FechaInicial + '", FechaFinal: "' + FechaFinal + '", Finca: "' + Finca + '"}', contentType: "application/json; charset=utf-8", dataType: "json", success: function(msg) { var data = JSON.parse(msg.d); coordenadas = []; cc = []; $.each(data, function(i, item) { coordenadas[i] = item.Coordenadas; cc[i] = item.CentroDeCostoLote; crearPoligonos(coordenadas[i], cc[i]); }); }, error: errores }); } function errores(msg) { alert('Error: ' + msg.responseText); } function crearPoligonos(coordenada, cc) { //console.log(coordenada); console.log(cc); var coordenadas = coordenada.split(' ') // Separamos por espacio .map(function(data) { var info = data.split(','), // Separamos por coma coord = { // Creamos el obj de coordenada lat: parseFloat(info[1]), lng: parseFloat(info[0]) }; return coord; }); var parserJSTS = new jsts.io.OL3Parser(); var poly = new ol.Feature({ geometry: new ol.geom.Polygon([coordenadas.map(function(_ref) { var lng = _ref.lng, lat = _ref.lat; return [lng, lat]; })]) }); var boundingBox = poly.getGeometry().getExtent() var polybbox = new ol.Feature({ geometry: ol.geom.Polygon.fromExtent(boundingBox) }) var [xmin, ymin, xmax, ymax] = boundingBox var porcentaje = 0.50 var newXmax = xmin + ((xmax - xmin) * porcentaje) var newBoundingBox = [xmin, ymin, newXmax, ymax] var polybbox50 = new ol.Feature({ geometry: ol.geom.Polygon.fromExtent(newBoundingBox) }) var polybbox50jsts = parserJSTS.read(polybbox50.getGeometry()) var polyjsts = parserJSTS.read(poly.getGeometry()) var intersectionJSTSGeometry = polyjsts.intersection(polybbox50jsts) var intersectionGeometry = parserJSTS.write(intersectionJSTSGeometry) var newPoly = new ol.Feature({ geometry: intersectionGeometry }) //console.log(boundingBox) newPoly.setStyle(new ol.style.Style({ fill: new ol.style.Fill({ color: '#02ABFF' }) })) // Descomentar para ver los bounding boxes // layer.getSource().addFeature(polybbox) // layer.getSource().addFeature(polybbox50) layer.getSource().addFeature(poly) layer.getSource().addFeature(newPoly) var centro = ol.extent.getCenter(boundingBox); //console.log(centro); crearMarcadores(centro, cc); } //------------start creation map var map = new ol.Map({ layers: [ new ol.layer.Tile({ source: new ol.source.BingMaps({ key: 'AudCyoI6al0eAZmQhwmI1IG9AOdGH8DHHk6PsiGta1faEACulxawFU9KV-XAvZ8f', imagerySet: 'AerialWithLabels' }) }), layer, vectorLayer ], target: 'map', controls: ol.control.defaults({ attributionOptions: ({ collapsible: false }) }), view: new ol.View({ center: [-90.365730, 13.954185], zoom: 9, projection: 'EPSG:4326' }) }); // --------------end creation map 
 <link href="https://openlayers.org/en/v4.5.0/css/ol.css" rel="stylesheet"/> <script src="https://openlayers.org/en/v4.5.0/build/ol.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.2/moment.min.js"></script> <div id="map" class="map" tabindex="0"> </div> <div id="popup"></div> 

forEachFeatureAtPixel ( api doc ) goes through every feature of every layer at that location. forEachFeatureAtPixelapi doc )会遍历该位置每个图层的每个要素。 So you might get unexpected results from other layers. 因此,您可能会从其他层获得意外结果。

But the function also let's you define a layerFilter which decides if you want to include a layer or not. 但是该函数还让您定义一个layerFilter,它决定是否要包含一个图层。

Example: 例:

map.addLayer(new ol.layer.Vector({
  source: vectorSource1,
  myKey: 'magic' // arbitrary property to distinguish between the layers
});

map.addLayer(new ol.layer.Vector({
  source: vectorSource2,
  myKey: 'someotherlayer'
});

// this only gives back the first feature at this position
// on the layer with the property `myKey` equal to `'magic'`
const feature = map.forEachFeatureAtPixel(
  pixel,
  function(someFeature){ return someFeature; }, // stop at the very first feature
  {
    layerFilter: function(layer) { return layer.get('myKey') === 'magic'; }
  }
);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM