es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Creando un estilo complejo en OpenLayers (polígono con un hueco y una línea en un lado)

Hubo una dificultad al crear un estilo de polígono complejo.
La descripción es la siguiente:
– el polígono debe ser dibujado como un polígono con un agujero y un borde en el exterior.

De una forma difícil (según me parece), logré dibujar un polígono con un agujero:
1) convertir a turf
2) usando turf.buffer y un valor de búfer negativo, obtengo un búfer interno
3) usando turf.difference (polígono fuente y búfer) obtengo un polígono con un agujero

Pero no entiendo cómo dibujar únicamente el borde desde el exterior%)
Si en la misma función intento devolver 2 estilos (línea + polígono), obtengo un error (Uncaught TypeError: s.simplifyTransformed no es una función).

En general, ¿es posible devolver 2 geometrías diferentes en el estilo?

En la imagen, el polígono rojo es lo que necesito obtener al final.

También hice un ejemplo mínimo en CodePen: enlace

¡Estaría agradecido por tu ayuda!


Actualización.

Bucles
Imagen

y alejar el zoom
Imagen

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para crear un estilo de polígono complejo

    Para lograr el estilo de polígono deseado, puedes seguir los siguientes pasos:

    1. Crea un polígono con un orificio utilizando TurfJS como se describe en la pregunta.
    2. Crea una entidad LineString separada que represente el límite del polígono sin orificio.
    3. Establece el estilo de las entidades de polígono y LineString por separado utilizando OpenLayers.

    Aquí tienes un ejemplo de implementación del enfoque anterior:

    // Crea el polígono principal con un orificio utilizando TurfJS
    var polyWithHole = turf.difference(polygon, turf.buffer(polygon, -10, {units: 'meters'}));
    
    // Crea un LineString para el límite del polígono
    var boundary = turf.polygonToLine(polyWithHole);
    
    // Crea entidades separadas de OpenLayers para el polígono y el LineString
    var polyFeature = new ol.Feature({
      geometry: new ol.format.GeoJSON().readGeometry(polyWithHole)
    });
    var boundaryFeature = new ol.Feature({
      geometry: new ol.format.GeoJSON().readGeometry(boundary)
    });
    
    // Establece el estilo de las entidades de polígono y LineString por separado
    polyFeature.setStyle(new ol.style.Style({
      fill: new ol.style.Fill({
        color: [255, 0, 0, 0.5]
      }),
      stroke: new ol.style.Stroke({
        color: [255, 0, 0, 1],
        width: 2
      })
    }));
    boundaryFeature.setStyle(new ol.style.Style({
      stroke: new ol.style.Stroke({
        color: [255, 0, 0, 1],
        width: 2
      })
    }));
    
    // Agrega ambas entidades a una capa vectorial y agrega la capa al mapa
    var vectorLayer = new ol.layer.Vector({
      source: new ol.source.Vector({
        features: [polyFeature, boundaryFeature]
      })
    });
    map.addLayer(vectorLayer);
    

    Este código asume que tienes un objeto mapa existente de OpenLayers (map) y un objeto polígono de TurfJS (polygon).

    La función turf.polygonToLine se utiliza para convertir el polígono con un orificio en una entidad LineString que representa el límite del polígono sin orificio. Esto es necesario porque OpenLayers no admite aplicar un estilo al límite de un polígono con un orificio directamente.

    Las entidades resultantes de polígono y LineString se estilizan por separado utilizando estilos de OpenLayers. El polígono se rellena con un color rojo semitransparente y tiene un borde rojo sólido, mientras que el LineString tiene un borde rojo sólido sin relleno.

    Las dos entidades se agregan a una capa vectorial y se agrega la capa al mapa.

    Este código debería producir el estilo de polígono complejo deseado, como se muestra en la imagen proporcionada.

    Además, cabe destacar que no es posible devolver múltiples geometrías en un solo objeto de estilo. Cada objeto de estilo solo puede representar una sola geometría. Por lo tanto, se deben utilizar objetos de estilo separados para cada geometría que se desea estilar de manera diferente.

Comments are closed.