3 votos

La sustitución de atributos de OpenLayers falla en el archivo KML

Estoy tratando de leer en marcadores de millas para un maratón de un archivo KML y utilizar el atributo MILE para establecer la etiqueta. El código de mi capa es el siguiente:

// add layer
mile_markers_layer = new OpenLayers.Layer.Vector('Mile Markers',
   {
    projection: new OpenLayers.Projection('EPSG:4326'),
    protocol: new OpenLayers.Protocol.HTTP({
        url: 'Mile_Markers.kml',
        format: new OpenLayers.Format.KML({
            extractAttributes: true 
                    //extractStyles:  true
        })
    }),
    strategies: [new OpenLayers.Strategy.Fixed()],
            style: {
                'fillColor': '#888888',
                'fillOpacity': 1,
                'fontColor': '#000000',
                'fontFamily': 'arial, sans-serif',
                'fontSize': '.9em',
                'fontWeight': 'bold',
                'label': '${MILE}',
                'pointRadius': 8,
                'strokeColor': '#ff0000',
                'strokeWidth': 3
            }
});

He mirado en Firebug y todas las características del mile_markers_layer tienen atributo de MILE con un valor de "1" a "26" (como se esperaba).

La capa se muestra con una etiqueta de ${MILE} - con esto quiero decir que los 26 marcadores de millas se muestran y cada uno tiene una etiqueta de ${MILE}

En cambio, esperaba el valor de MILE. Soy un novato, así que podría estar haciendo algo extremadamente estúpido.

El archivo KML infractor está en:

https://docs.google.com/open?id=0BxhE8rRos0u1X2ExNldTdWwwWkk

Gracias por la sugerencia, pero todos los hitos terminaron con ${MILE.value} como etiqueta.

0 votos

¿Podría compartir el archivo kml o su ejemplo en vivo?

5voto

Soldarnal Puntos 2646

Debe utilizar context del objeto Style:

options = {
    div: "map",
    zoom: 12,
    center: [-9074392.9993436, 5021122.97485],
    layers: [
        new OpenLayers.Layer.OSM()
    ]
};

map = new OpenLayers.Map(options);

OpenLayers.Util.extend(
    OpenLayers.Feature.Vector.style.default,
    {
        label: "${getLabel}",
        pointRadius: 15
    }
);

var mystyle = new OpenLayers.Style(
    OpenLayers.Feature.Vector.style.default,
    {
        context: {
            getLabel: function(f) {
                return f.attributes.MILE.value;
            }
        }
    }
);

var sm = new OpenLayers.StyleMap({'default': mystyle});

var myKML = new OpenLayers.Layer.Vector(
    "KML layer", {
        strategies: [new OpenLayers.Strategy.Fixed()],
        styleMap: sm,
        projection: new OpenLayers.Projection("EPSG:4326"),
        protocol: new OpenLayers.Protocol.HTTP({
            url: "Mile_Markers.kml",
            format: new OpenLayers.Format.KML()
        })
});
map.addLayer(myKML);

Ver demostración en vivo aquí .

0 votos

Gracias drnextgis, por fin he descubierto mi cuenta de StackExchange

1voto

Vasu Puntos 11

El MILE es un objeto Object { value="3", displayName="MILE"}

Por lo tanto, intente hacer algo como 'label': '${MILE.value}',

1voto

pmaiorana Puntos 323

Lo siento, pero mi cuenta de Stack Exchange se ha restablecido desde que entré con Google, así que soy yo, Dennis.

Muchas gracias drnextgis, eso funciona.

Hay un ejemplo ligeramente diferente que encontré en: http://openlayers.org/dev/examples/styles-context.html

Una vez que supe que lo que buscaba era el contexto, me resultó más fácil encontrar información.

Como aclaración para los que lean esto después, lo entiendo como:

Como mis atributos de características KML son OBJETOS y no simples valores, el normal '${}' no funciona - el simbolizador no puede asignar un objeto como etiqueta.

El Contexto de Estilo especifica los sustitutos de los atributos por defecto utilizados por el simbolizador. Así que usted consigue escribir una función que puede asignar el VALOR del objeto, por ejemplo, o lo que quieras.

Gracias de nuevo - Definitivamente soy un novato que lucha, pero ahora tengo números para los marcadores de millas.

Dennis

0 votos

Drnextgis Me gustaría poder aceptar tu respuesta, ya que ha sido extremadamente útil, pero mi antigua cuenta con la que puse la pregunta se ha convertido en este nuevo usuario 8894 una vez que he entrado con Google, y no puedo entrar en mi antigua cuenta (mismo correo electrónico). Pero acepta mi agradecimiento.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X